Prepare-se para sua próxima entrevista SQL com esta lista de mais de 35 perguntas e respostas obrigatórias. Este artigo abrange uma ampla variedade de tópicos SQL, desde instruções SELECT básicas até operações JOIN avançadas. Ao ler este artigo, você estará no caminho certo para sua próxima entrevista SQL
A maioria dos aplicativos de software usa algum banco de dados e os Sistemas de Gerenciamento de Banco de Dados Relacional (RDBMS) são os mais populares entre todos os SGBDs. Como desenvolvedor de software, a maioria das empresas espera que você conheça SQL. SQL é a linguagem usada para trabalhar com bancos de dados relacionais, como SQL Server, MySQL e Oracle. Aqui está uma lista das 35 perguntas mais populares sobre entrevistas SQL e suas respostas.
A linguagem de consulta estruturada (SQL) é usada em sistemas de gerenciamento de banco de dados relacional (RDBMS) para consultar, atualizar e excluir dados. SQL é uma linguagem de consulta padrão para RDBMS. As consultas da linguagem SQL também são conhecidas como comandos SQL ou instruções SQL. Existem quatro tipos de junções no SQL.
Existem quatro tipos de junções no SQL.
As junções padrão no SQL são INNER JOIN. Aqui está um exemplo que é aplicado a duas tabelas.
Exemplo
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
SQL LEFT JOIN
A palavra-chave LEFT JOIN retorna todas as linhas da tabela esquerda (tabela1) com as linhas correspondentes na tabela direita (tabela2). O resultado é NULL no lado direito quando não há correspondência.
SQL LEFT JOIN Syntax
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
SQL RIGHT JOIN
A junção à direita retorna todas as linhas na tabela à direita, ou seja, a tabela 2, com as correspondentes na tabela à esquerda (tabela 1).
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
SQL COMPLETO EXTERIOR
A junção completa retorna todas as linhas da tabela esquerda (tabela1) e da tabela direita (tabela2).
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
UNIÃO SQL
O operador UNION combina o conjunto de resultados de duas ou mais instruções SELECT.
Observe que cada instrução SELECT dentro de UNION deve ter o mesmo número de colunas. As colunas também devem ter tipos de dados semelhantes. Além disso, as colunas em cada instrução SELECT devem estar na mesma ordem.
Observação: o operador UNION seleciona apenas valores distintos por padrão.
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
SQL UNIÃO TODOS
SQL UNION ALL Syntax
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
Permite valores duplicados.
Um índice clusterizado é aquele em que a ordem do índice é organizada de acordo com a ordem física das linhas na tabela. Por esse motivo, só pode haver um índice clusterizado por tabela. Normalmente, esta é a chave primária.
Um índice não clusterizado é aquele em que a ordem do índice não é pela ordem física das linhas na tabela.
Criar sintaxe de índice
CREATE INDEX [ CLUSTERED | NONCLUSTERED ] PIndex ON Persons (LastName, FirstName)
Aqui
Procedimento armazenado
Os procedimentos armazenados são códigos reutilizáveis em um banco de dados compilado pela primeira vez e seu plano de execução é salvo. O código compilado é executado toda vez que é chamado.
Função
Uma função é um objeto de banco de dados no SQL Server. É um conjunto de instruções SQL que aceita apenas parâmetros de entrada, executa ações e retorna o resultado. Ele é compilado toda vez que é invocado. A função pode produzir apenas um único valor ou uma tabela. Não podemos usar funções para Inserir, Atualizar e Excluir registros na(s) tabela(s) do banco de dados.
Diferença básica
A função deve retornar um valor, mas em Stored Procedure isso é opcional (Procedure pode retornar zero ou n valores).
As funções podem ter apenas parâmetros de entrada, enquanto os procedimentos podem ter parâmetros de entrada/saída.
As funções podem ser chamadas a partir do procedimento, enquanto os procedimentos não podem ser chamados a partir da função.
Diferenças Avançadas
Um cursor SQL é um objeto de banco de dados usado para recuperar dados de um conjunto de resultados, uma linha por vez. Um cursor SQL é usado quando os dados precisam ser atualizados linha por linha.
Em bancos de dados relacionais, as operações são feitas em um conjunto de linhas. Por exemplo, uma instrução SELECT retorna um conjunto de linhas chamado conjunto de resultados. Às vezes, a lógica do aplicativo deve funcionar com uma linha por vez, em vez de todo o conjunto de resultados simultaneamente. Isso pode ser feito usando cursores.
Um gatilho é um tipo especial de procedimento armazenado ou programa armazenado que é acionado ou executado automaticamente quando algum evento (inserir, excluir e atualizar) ocorre.
Se você escrever um gatilho para uma operação de inserção em uma tabela, ele criará uma tabela chamada "INSERTED" na memória após disparar o gatilho. Em seguida, ele faz a operação de inserção e as instruções dentro do gatilho são executadas. Podemos consultar a tabela "INSERTED" para manipular ou usar a(s) linha(s) inserida(s) do gatilho. Da mesma forma, escrever um gatilho para uma operação de exclusão em uma tabela cria uma tabela na memória chamada "DELETED" e, em seguida, exclui a linha.
Usamos um gatilho quando queremos que algum evento aconteça automaticamente em determinados cenários desejáveis.
Visualizações são objetos de banco de dados como tabelas virtuais sem armazenamentos físicos e contendo dados de uma tabela ou de várias tabelas. Uma View não possui armazenamento físico, portanto, não contém nenhum dado. Quando atualizamos, inserimos ou aplicamos qualquer operação na View, essas operações são aplicadas na(s) tabela(s) em que a view foi criada.
Existem dois tipos de visualizações:
As visualizações definidas pelo usuário são essenciais, portanto, descrevo apenas as visualizações definidas pelo usuário. Eles são dois tipos.
Escrevi a consulta abaixo para descobrir o enésimo salário mais alto (por exemplo: aqui estou encontrando o 3º salário mais alto ).
SELECT TOP 1 Salary AS 'Higest Salary',Name FROM (SELECT DISTINCT TOP 3 Salary,Name FROM tblSalary ORDER BY Salary DESC) a ORDER BY Salary ASC
A função Count retorna o valor que o tipo de dado é INT. A função Count_Big retorna um valor cujo tipo de dado é BIG_INT.
O tipo de dados CHAR.
Sobre o tipo de dados VARCHAR.
O tipo de dados NCHAR.
O tipo de dados NVARCHAR:
A função Cast() é usada para converter uma variável de tipo de dados ou dados de um tipo de dados para outro tipo de dados. A função Cast() fornece um tipo de dados para um parâmetro dinâmico (?) ou um valor NULL.
Sintaxe
CAST ( [Expression]
AS Datatype)
A função CONVERT() pode exibir dados de data/hora em vários formatos. Quando você converte expressões de um tipo para outro, muitas vezes será necessário dentro de um procedimento armazenado ou outra rotina converter dados de um tipo DateTime para um tipo varchar. A função Convert é usada para essas coisas.
Sintaxe
CONVERT(data_type(length), expression, style)
O tipo de dados bigint representa um valor inteiro. Pode ser armazenado em 8 bytes.
Fórmula
2^(n-1) é a fórmula do valor máximo de um tipo de dados Bigint.
Na fórmula anterior, N é o tamanho do tipo de dados. O operador ^ calcula a potência do valor.
Int representa um valor inteiro que pode ser armazenado em 4 bytes. INT é a forma abreviada de um inteiro.
Fórmula
2^(n-1) é a fórmula para encontrar o máximo de um tipo de dados INT.
Na fórmula anterior, N é o tamanho do tipo de dados. O operador ^ calcula a potência do valor.
Commit é usado para mudanças permanentes. Quando usamos o Commit em qualquer consulta, a alteração feita por essa consulta será permanente e visível. Não podemos fazer rollback após o commit.
Sintaxe
begin tran tranName
Command for operation
commit tran tranName
Rollback é usado para desfazer as alterações feitas por qualquer comando, mas somente antes de um commit ser feito. Não podemos reverter dados que foram confirmados no banco de dados com a ajuda da palavra-chave commit.
Sintaxe
begin tran tranName
Command for operation
Rollback tran tranName
Uma função com valor escalar no SQL Server 2012 retorna um único valor de qualquer tipo de dados T-SQL. Uma instrução CREATE FUNCTION é usada para criar uma função com valor escalar. O nome da função não deve ter mais de 128 caracteres. Não é uma regra, mas convencionalmente, o nome da função deve começar com o prefixo fn.
O valor é retornado por uma função com valor escalar usando a cláusula RETURNS. Até 1.024 parâmetros de entrada podem ser definidos para funções com valor escalar. Uma função com valor escalar, no entanto, não pode conter um parâmetro de saída.
PIVOT e UNPIVOT são dois operadores relacionais usados para converter uma expressão de tabela em outra. PIVOT é usado quando queremos transferir dados do nível da linha para o nível da coluna, e UNPIVOT é usado para converter dados do nível da coluna para o nível da linha. Os operadores relacionais PIVOT e UNPIVOT são usados para gerar relatórios multidimensionais. Hoje vamos discutir os dois operadores. Os operadores relacionais PIVOT e UNPIVOT geram uma tabela interativa que combina e compara rapidamente uma grande quantidade de dados.
Os conceitos de User-Defined Table Types (UDTTs) e Table-Valued Parameters (TVPs) foram introduzidos no SQL Server 2008. Antes do SQL Server 2008, não era possível passar uma variável de tabela em um procedimento armazenado como um parâmetro; depois do SQL Server agora, podemos passar o parâmetro com valor de tabela para enviar várias linhas de dados para um procedimento armazenado ou uma função sem criar uma tabela temporária ou passar tantos parâmetros.
Antes de passar a variável de tabela, primeiro precisamos criar uma variável de tabela definida pelo usuário. Portanto, agora criamos um tipo de tabela definido pelo usuário.
TRY_PARSE
Ele converte o tipo de dados de string em tipo de dados de destino (data ou numérico). Por exemplo, os dados de origem são um tipo de string e devemos convertê-los em um tipo de data. Se a tentativa de conversão falhar, ela retornará um valor NULL.
TRY_CONVERT
Ele converte o valor em um tipo de dados especificado e retorna NULL se a conversão falhar; por exemplo, o valor de origem está no formato de string e precisa do formato de data/inteiro. Então isso nos ajudará a conseguir o mesmo.
TRY_CAST
Ele converte o valor em um tipo de dados especificado e retorna NULL se a conversão falhar; por exemplo, o valor de origem está no formato de string e precisamos dele no formato duplo/inteiro. Então isso nos ajudará a alcançá-lo.
Para localizar a instrução FETCH mais recente no SQL Server 2012, usamos a função de sistema @@FETCH_STATUS. Podemos usar a função de sistema @@FETCH_STATUS com um loop while no SQL Server 2012. A função de sistema @@FETCH_STATUS retorna três valores no SQL Server 2012, que são explicados a seguir.
Quando a função do sistema @@FETCH_STATUS retorna 0, o FETCH é próspero e igual a zero.
Quando a função do sistema @@FETCH_STATUS retorna -1, o FETCH não é bem-sucedido.
Quando a função do sistema @@FETCH_STATUS retorna -2, o FETCH não é bem-sucedido porque a linha foi excluída.
Row_number desempenha um papel muito importante no servidor SQL. A função Row_Number pode ajudar a executar ordenações de linhas mais complexas no formato de relatório, permitindo a cláusula over a no padrão SQL.
Sintaxe
ROW_NUMBER () OVER ([PARTITION BY value_exp, ... [ n ]] ORDER BY_clause)
@@IDENTITY não está limitado a um escopo específico. @@IDENTITY retornará o último valor de identidade inserido em uma tabela. Suponha que criamos uma tabela e definimos o valor de identidade como verdadeiro para uma coluna na tabela. Depois disso, quando inserimos dados na tabela, obtemos o último valor de identidade usando @@IDENTITY. Se a instrução não afetou nenhuma tabela com colunas de identidade, @@IDENTITY retornará NULL. Você também pode acessar o valor @@IDENTITY em seu aplicativo.
SCOPE_IDENTITY retorna os últimos valores de identidade gerados em qualquer tabela na sessão atual. Você sempre obterá o último valor inserido por sua instrução de inserção na coluna de identidade, independentemente de a inserção ocorrer com suas instruções de inserção em qualquer tabela ou se você executar qualquer procedimento que faça qualquer operação de inserção em qualquer tabela.
Após disparar o gatilho após a execução de uma consulta de ação, isso pode ser instruções DDL como Create, Alter e Drop ou instruções DML como Insert, Update e Delete.
Em vez disso, os gatilhos Trigger disparam antes da execução de uma consulta de ação que só pode ser instruções DML como Insert, Update e Delete, mas após a execução dessa consulta. Os dados da tabela não serão afetados; em outras palavras, se você deseja inserir ou atualizar os dados da tabela, precisará escrevê-los no gatilho usando tabelas virtuais "inseridas" ou "excluídas".
A função ISNULL() substitui NULL pelo valor de substituição especificado. Esta função contém apenas dois argumentos.
A função Coalesce() retorna o primeiro valor não nulo entre seus argumentos. Esta função não limita o número de argumentos; todos eles devem ser do mesmo tipo de dados.
No SQL Server, os índices clusterizados são uma consideração crítica na arquitetura geral do banco de dados. Eles geralmente são negligenciados, mal compreendidos ou considerados sem importância se o banco de dados for pequeno. Eles determinam a ordem lógica na qual os dados da tabela são armazenados porque o nível folha/inferior do índice clusterizado consiste nas páginas de dados reais da tabela. Um índice clusterizado classifica e armazena as linhas ou exibições de dados da tabela em ordem com base na chave do índice clusterizado.
Os índices não clusterizados são armazenados separadamente da tabela. Eles são criados fora da tabela do banco de dados e contêm uma lista classificada de referências à própria tabela. No SQL Server 2005 e anteriores, um máximo de 249 índices não clusterizados podem ser criados em uma tabela, mas agora no SQL Server 2008, esse limite foi aumentado e agora 999 índices não clusterizados podem ser criados em uma única tabela. Os índices não clusterizados são a classificação das colunas, não cópias da tabela; você especifica esse "ponto" de volta para as páginas de dados no índice clusterizado. O índice clusterizado escolhido é muito importante porque afeta todos os outros índices.
CROSS APPLY para trabalhar como uma INNER JOIN linha por linha. CROSS APPLY retorna apenas linhas da tabela externa que produzem um conjunto de resultados da função com valor de tabela. Em outras palavras, o resultado de CROSS APPLY não contém nenhuma linha da expressão da tabela do lado esquerdo para a qual nenhum resultado é obtido da expressão da tabela do lado direito.
OUTER APPLY retorna ambas as linhas que produzem um conjunto de resultados e aquelas que não produzem, com valores NULL nas colunas produzidas pela função com valor de tabela. OUTER APPLY para trabalhar como LEFT OUTER JOIN.
As tabelas temporárias estão disponíveis apenas para a sessão que as criou.
Essas tabelas são destruídas automaticamente no término do procedimento ou sessão que as criou.
O uso de tabelas temporárias no MS SQL Server é mais amigável ao desenvolvedor e elas são amplamente utilizadas no desenvolvimento. As tabelas temporárias locais são visíveis apenas na sessão atual.
Tabelas temporárias são criadas usando a mesma sintaxe de CREATE TABLE, exceto que o nome da tabela começa com um sinal '#'. Quando a tabela consiste em um único sinal '#', ela é definida como uma tabela temporária local e seu escopo é limitado à sessão em que é criada.
O procedimento armazenado "sp_MSforeachtable" nos permite processar facilmente algum código em cada tabela em um único banco de dados. Isso significa que ele é usado para processar um único comando T-SQL ou vários comandos T-SQL diferentes em cada tabela do banco de dados.
As funções de classificação fornecem um recurso excelente de atribuição de numeração aos registros no conjunto de resultados em SQL. Row_Number é uma dessas funções disponíveis no SQL Server que nos permite atribuir classificações ou números às linhas dos dados do conjunto de resultados. Valores diferentes são atribuídos a linhas diferentes com base no tipo de função de classificação usada.
Essa função funciona atribuindo uma classificação contínua aos registros sem pular nenhum número no conjunto de resultados, seja ele particionado ou não. No final da discussão, veremos o que queremos dizer com classificação contínua e não pular nenhum registro.
Uma chave substituta no SQL Server é um identificador exclusivo para cada linha da tabela. Usando esta chave, podemos identificar uma linha individual. Não há nenhum significado comercial para chaves substitutas. É apenas uma chave. Esse tipo de chave é gerado pelo banco de dados ou por meio de outro aplicativo (não fornecido pelo usuário).
Uma chave substituta é um identificador exclusivo para cada linha e pode ser usada como uma chave primária. Há apenas um requisito para uma chave primária substituta: cada linha deve ter um valor exclusivo para essa coluna. Uma chave substituta também é conhecida como chave artificial ou chave de identidade. Pode ser usado em data warehouses.
Podemos recuperar linhas excluídas se soubermos quando os dados são excluídos. Podemos atingir esse objetivo usando LSN ( Log Sequence Numbers ). A Microsoft diz: "Cada registro no log de transações do SQL Server é identificado exclusivamente por um número de sequência de log (LSN)". Usaremos esses LSNs para recuperar nossos dados excluídos.
Para recuperar linhas excluídas da tabela no banco de dados, o banco de dados deve ser FULL Recovery ou BULK-LOGGED Recovery Model.
Às vezes, um design de banco de dados que parece bom à primeira vista pode ter problemas ocultos. Um desses tipos de problema são os valores não atômicos. Isso significa que o valor armazenado em uma única coluna no banco de dados é uma combinação de vários valores, o que torna o banco de dados mais difícil de trabalhar porque você sempre precisará de expressões para extrair o valor individual. E vem com um grande impacto no desempenho também.
Um projeto de banco de dados sofre redundância se permitir que várias cópias do mesmo fato (dados) sejam armazenadas, o que é ruim por vários motivos, conforme mencionado abaixo -
O terceiro problema que pode prejudicar o banco de dados são as Anomalias de Modificação.
Como todos sabemos, vários usuários precisam acessar bancos de dados simultaneamente. Portanto, os bloqueios entram em cena para evitar que os dados sejam corrompidos ou invalidados quando vários usuários tentam executar operações como ler, gravar e atualizar o banco de dados.
"O bloqueio é definido como um mecanismo para garantir a integridade e consistência dos dados enquanto permite o acesso simultâneo aos dados. Ele é usado para implementar o controle de simultaneidade quando vários usuários acessam um banco de dados para manipular seus dados simultaneamente."
Para qualquer negócio, as transações que compreendem muitas operações individuais e até mesmo outras transações desempenham um papel fundamental.
As transações são essenciais para manter a integridade dos dados para várias operações relacionadas e quando vários usuários atualizam o banco de dados simultaneamente.
Quatro propriedades caracterizam uma transação, muitas vezes chamadas de propriedades ACID: atomicidade, consistência, isolamento e durabilidade.
O isolamento é uma das propriedades das transações SQL. Isolar/separar transações umas das outras para manter a integridade dos dados no banco de dados é chamado de isolamento.
Antes de ir para a parte de implementação do isolamento, entenderemos por que o isolamento é necessário no banco de dados.
Durante o desenvolvimento de aplicativos significativos de rede pública/empresarial em que muitos usuários acessam o mesmo banco de dados e a mesma tabela, ao mesmo tempo, podem ocorrer situações de simultaneidade de dados. Discutiremos esta situação em 4 partes.
A diferença entre TRUNCATE, DELETE e DROP está entre as perguntas de entrevista mais comuns. Aqui estão algumas das diferenças comuns entre eles.
Existem muitas vulnerabilidades, permitindo que hackers roubem dados de organizações, e o SQL Injection é um deles. É talvez uma das técnicas de ataque de camada de aplicativo mais comuns de hoje. Quando a codificação imprópria do aplicativo da web é feita, um hacker pode injetar comandos SQL. Usando comandos SQL, um hacker pode roubar seus dados, modificar seus detalhes e excluir seus dados permanentemente.
Em termos simples, a injeção de SQL nada mais é do que uma técnica em que usuários mal-intencionados podem injetar comandos SQL em uma instrução SQL por meio da entrada da página da Web, e essa entrada pode quebrar a segurança do aplicativo da Web.
Espero que você tenha gostado deste artigo. Eu perdi alguma coisa que você pode achar que é necessário? Você achou este post útil? Por favor, compartilhe-me suas valiosas sugestões e feedback.
#sql