25 Perguntas frequentes
05 Exercícios
10 desafios de leetcode
curado por: datauniverse.com.br
Ebook de perguntas para entrevistas de SQL
Uma coleção de 25 perguntas e respostas sobre SQL e DBMS além de exercícios de leetcode realizados em entrevistas para vagas de SQL como cientista de dados, engenheiro de dados, arquiteto de dados e analista de business intelligence.
Sistemas de Gerenciamento de Banco de Dados Relacional (SGBDR) são sistemas que mantêm registros de dados e índices em tabelas.
Relacionamentos podem ser criados e mantidos entre e entre os dados e tabelas.
Em um banco de dados relacional, os relacionamentos entre itens de dados são expressos por meio de tabelas. As interdependências entre essas tabelas são expressas por valores de dados, em vez de ponteiros. Isso permite um alto grau de independência de dados.
Um SGBDR tem a capacidade de recombinar os itens de dados de diferentes arquivos, fornecendo ferramentas poderosas para o uso de dados.
Características/ Propriedades de um SGBD:
Quais são as propriedades de um SGBD (RDBMS)?
1
curado por: datauniverse.com.br
As propriedades A.C.I.D. referem-se a um conjunto de características fundamentais que garantem a integridade e confiabilidade das transações em sistemas de banco de dados relacionais. Aqui está uma explicação de cada propriedade A.C.I.D.:
1. Atomicidade (Atomicity):
A atomicidade garante que uma transação seja tratada como uma unidade indivisível. Isso significa que todas as operações dentro da transação são executadas ou nenhuma delas é. Se uma parte da transação falhar, a transação inteira é revertida para garantir que o banco de dados permaneça em um estado consistente.
2. Consistência (Consistency):
A consistência assegura que uma transação leve o banco de dados de um estado consistente para outro. Antes e depois da execução da transação, o banco de dados deve satisfazer todas as regras de integridade referencial e restrições definidas. Se uma transação violar a consistência, ela será revertida para manter a integridade do banco de dados.
3. Isolamento (Isolation):
A propriedade de isolamento garante que o resultado de uma transação seja invisível para outras transações até que ela seja concluída. Isso evita que uma transação veja dados não confirmados ou parcialmente atualizados de outras transações em execução simultânea. O isolamento ajuda a evitar conflitos e mantém a integridade do banco de dados.
4. Durabilidade (Durability):
A durabilidade garante que, uma vez que uma transação seja confirmada, suas alterações permaneçam permanentes, mesmo em caso de falha do sistema, energia ou outros problemas. Os dados alterados pela transação devem ser persistentes e não podem ser perdidos, garantindo que o banco de dados se recupere para um estado consistente após uma falha.
Essas propriedades A.C.I.D. são essenciais para garantir a confiabilidade e a integridade dos dados em sistemas de banco de dados relacionais, fornecendo uma estrutura robusta para o gerenciamento de transações.
Descreva o que são as propriedades A.C.I.D de uma transação em um banco de dados
2
curado por: datauniverse.com.br
Em um Sistema de Gerenciamento de Banco de Dados (DBMS), as "chaves" referem-se a elementos fundamentais que ajudam a organizar, identificar e relacionar dados dentro do banco de dados.
Existem vários tipos de chaves, cada uma com um propósito específico. Vamos explorar alguns dos principais tipos de chaves:
1. Chave Primária (Primary Key):
A chave primária é uma coluna (ou conjunto de colunas) em uma tabela que possui valores únicos para identificar exclusivamente cada linha. Além de garantir unicidade, a chave primária é usada como referência em relacionamentos com outras tabelas.
2. Chave Estrangeira (Foreign Key):
A chave estrangeira é uma coluna (ou conjunto de colunas) em uma tabela que estabelece um vínculo entre os dados em duas tabelas. A chave estrangeira normalmente faz referência à chave primária de outra tabela, criando um relacionamento entre elas.
3. Chave Surrogada (Surrogate Key):
Uma chave surrogada é uma chave artificial, frequentemente um número sequencial, que é introduzida exclusivamente para servir como chave primária. É útil quando não existe uma chave natural ou quando se deseja garantir a estabilidade dos identificadores.
As chaves desempenham um papel crucial na estruturação e relacionamento dos dados em um banco de dados, fornecendo meios eficientes de identificar registros, estabelecer relações entre tabelas e garantir a integridade dos dados.
O que são chaves (keys) em um SGBD?
3
curado por: datauniverse.com.br
O escalonamento vertical e horizontal são duas abordagens distintas para lidar com o aumento de carga ou a necessidade de recursos em um sistema, seja ele um banco de dados, aplicação, servidor, ou outro componente. Aqui estão as principais diferenças entre escalonamento vertical e horizontal:
No escalonamento vertical, também conhecido como "scaling up", a abordagem consiste em aumentar a capacidade de um único recurso, geralmente adicionando mais poder de processamento, memória, ou armazenamento ao mesmo servidor ou máquina.
Características: Aumento de Recursos:* Adição de recursos (CPU, RAM, armazenamento) à máquina existente.
Custo: Pode ser mais caro, pois máquinas mais poderosas geralmente têm um preço mais alto.
Limitações: Existe um limite para a quantidade de recursos que uma máquina única pode suportar.
No escalonamento horizontal, também conhecido como "scaling out", a abordagem consiste em adicionar mais instâncias (máquinas ou servidores) ao sistema para distribuir a carga.
Características: Aumento de Instâncias:* Adição de mais máquinas ao sistema.
Custo: Pode ser mais eficiente em termos de custo, pois você pode usar máquinas mais simples e adicionar mais conforme necessário.
Elasticidade: Geralmente é mais fácil escalar horizontalmente, permitindo maior elasticidade conforme a demanda varia.
Qual é a diferença entre escalonamento vertical e horizontal de uma arquitetura?
4
curado por: datauniverse.com.br
Os comandos SQL (Structured Query Language) podem ser categorizados em diferentes tipos, cada um com uma função específica no gerenciamento e manipulação de dados em um banco de dados. Aqui estão alguns dos principais tipos de comandos SQL:
DDL (Data Definition Language): São comandos usados para definir e gerenciar a estrutura de objetos no banco de dados como:
DML (Data Manipulation Language): São comandos usados para manipular dados armazenados no banco de dados.
DCL (Data Control Language): São comandos usados para controlar as permissões de acesso aos dados no banco de dados.
TCL (Transaction Control Language): São comandos usados para gerenciar transações em um banco de dados.
Quais são os diferentes tipos de comandos SQL?
5
curado por: datauniverse.com.br
Os tipos de dados primários em SQL são utilizados para definir o tipo de valor que uma coluna em uma tabela pode armazenar. Cada banco de dados pode ter suas próprias implementações específicas, mas aqui estão alguns dos tipos de dados primários comuns em SQL:
1.INTEGER (ou INT): Armazena números inteiros, geralmente com tamanho fixo.
2.VARCHAR (ou CHAR ou VARCHAR2): Armazena strings de caracteres variáveis. O tamanho pode variar até um valor máximo especificado.
3.CHAR: Similar ao VARCHAR, mas armazena strings de tamanho fixo, preenchendo com espaços em branco se necessário.
4.FLOAT (ou DOUBLE ou REAL): Armazena números de ponto flutuante (números decimais) com precisão variável.
5.DECIMAL (ou NUMERIC ou MONEY): Armazena números decimais com precisão fixa.
6.DATE: Armazena valores de data, geralmente no formato 'YYYY-MM-DD'.
7.TIME: Armazena valores de hora, geralmente no formato 'HH:MM:SS'.
8.DATETIME (ou TIMESTAMP): Armazena valores de data e hora combinados.
9.BOOLEAN: Armazena valores de verdadeiro (TRUE), falso (FALSE) ou nulo (NULL).
10.BLOB (Binary Large Object): Armazena dados binários, como imagens, vídeos ou outros tipos de arquivos binários.
Quais são os principais tipos de dados?
6
curado por: datauniverse.com.br
1.INNER JOIN: Retorna apenas as linhas que têm correspondências em ambas as tabelas. Linhas que não têm correspondência em ambas as tabelas são excluídas do resultado.
2.LEFT JOIN (ou LEFT OUTER JOIN): Retorna todas as linhas da tabela à esquerda e as linhas correspondentes da tabela à direita. Se não houver correspondência na tabela à direita, são retornados valores NULL.
3.RIGHT JOIN (ou RIGHT OUTER JOIN): Retorna todas as linhas da tabela à direita e as linhas correspondentes da tabela à esquerda. Se não houver correspondência na tabela à esquerda, são retornados valores NULL.
4.FULL JOIN (ou FULL OUTER JOIN): Retorna todas as linhas quando há uma correspondência em uma das tabelas. Se não houver correspondência em ambas as tabelas, são retornados valores NULL.
5.CROSS JOIN: Retorna o produto cartesiano de ambas as tabelas, ou seja, cada linha da primeira tabela é combinada com todas as linhas da segunda tabela.
6.SELF JOIN: É um join onde uma tabela é combinada com ela mesma. Geralmente usado quando você deseja relacionar linhas dentro da mesma tabela.
Explique os diferentes tipos de JOINS em SQL
7
curado por: datauniverse.com.br
SQL (Structured Query Language): É uma linguagem padrão usada para gerenciar e manipular bancos de dados relacionais. Ela fornece comandos para criar, recuperar, atualizar e excluir dados em um banco de dados.
Oracle: É um Sistema de Gerenciamento de Banco de Dados (DBMS) amplamente utilizado. É uma marca registrada da Oracle Corporation e oferece uma variedade de recursos avançados, suporte a transações complexas, e é conhecido por sua escalabilidade e confiabilidade.
Diferenças: Oracle é um DBMS específico, enquanto SQL é a linguagem padrão que pode ser usada com vários sistemas de banco de dados relacionais.
MySQL: É um Sistema de Gerenciamento de Banco de Dados de Código Aberto (RDBMS) que utiliza a linguagem SQL. É conhecido por ser rápido, confiável e fácil de usar.
O MySQL é amplamente utilizado em aplicativos da web e é de propriedade da Oracle Corporation.
SQL Server: É um Sistema de Gerenciamento de Banco de Dados desenvolvido pela Microsoft. Ele oferece um ambiente integrado para desenvolvimento, administração e consultas de bancos de dados, além de ser compatível com a linguagem SQL.
Diferenças: SQL Server é um produto específico da Microsoft, enquanto SQL é a linguagem padrão. O SQL Server utiliza a linguagem SQL para interação com o banco de dados.
Explique a diferença entre SQL, ORACLE, MySQL e SQL Server
8
curado por: datauniverse.com.br
Uma "view" em um banco de dados relacional é uma representação virtual de uma tabela resultante de uma consulta SQL. Ela não armazena dados fisicamente, mas é uma maneira de criar uma visão personalizada ou filtrada dos dados armazenados em uma ou mais tabelas.
As views são criadas usando a linguagem SQL e podem ser usadas para simplificar consultas complexas, implementar camadas de segurança, e fornecer uma visão lógica diferente dos dados.
Aqui estão algumas situações em que você pode considerar usar uma view:
1. Simplificação de Consultas: Quando você tem consultas complexas ou frequentemente usadas, pode criar uma view para encapsular a lógica da consulta. Isso simplifica a interação com os dados, pois os usuários podem consultar a view em vez de escrever consultas complexas repetitivas.
2. Segurança e Controle de Acesso: Você pode usar views para limitar as colunas ou linhas que os usuários têm permissão para acessar. Isso é útil para restringir o acesso a dados confidenciais.
3. Abstração de Dados: Views podem ser usadas para criar uma camada de abstração sobre as tabelas subjacentes. Isso é útil quando você precisa ocultar detalhes de implementação e fornecer uma visão mais simples ou específica dos dados.
4. Reutilização de Lógica: Se você tem lógica de consulta que é compartilhada em várias partes de sua aplicação, criar uma view pode ajudar a centralizar essa lógica e facilitar a manutenção.
5. Facilitação de Migrações: Views podem ser úteis ao migrar de um esquema de banco de dados para outro, pois você pode manter as views existentes enquanto ajusta as consultas subjacentes para se adaptarem à nova estrutura.
Em resumo, as views oferecem uma maneira poderosa de organizar e interagir com os dados em um banco de dados relacional. Elas são especialmente úteis quando se trata de simplificar consultas complexas, controlar o acesso aos dados e fornecer uma camada de abstração para os usuários finais.
O que é uma view? Quando você deve utilizar uma?
9
curado por: datauniverse.com.br
View (Visão): É uma representação virtual de uma ou mais tabelas resultante de uma consulta SQL. Ela não armazena dados fisicamente, mas fornece uma visão lógica dos dados.
Armazenamento: Não armazena dados fisicamente. Cada vez que uma view é consultada, a consulta subjacente é executada em tempo real para obter os dados mais recentes.
Atualização: Os dados não são armazenados na view, portanto, não há necessidade de atualizar ou sincronizar os dados. Cada consulta gera resultados com base nos dados atuais nas tabelas subjacentes.
Use Views quando:
View Materializada: É uma tabela física que armazena os resultados de uma consulta SQL. Esses resultados são pré computados e armazenados, o que pode melhorar significativamente o desempenho de consultas frequentes.
Armazenamento: Armazena dados fisicamente em uma tabela separada. Os dados são atualizados periodicamente com base na lógica definida durante a criação da view materializada.
Atualização: Requer um processo de atualização para manter os dados sincronizados com as tabelas subjacentes. Essa atualização pode ser agendada em intervalos regulares ou acionada por eventos específicos.
Use Views Materializadas quando:
Explique a diferença entre uma view e uma view materializada
10
curado por: datauniverse.com.br
Sim, se uma tabela contiver linhas duplicadas, uma consulta SQL padrão exibirá todos esses valores duplicados. No entanto, você pode eliminar linhas duplicadas do resultado de uma consulta usando a cláusula DISTINCT ou funções de agregação, dependendo da sua necessidade.
A cláusula DISTINCT retorna apenas valores distintos de uma coluna ou conjunto de colunas.
Exemplo:
Se uma tabela contiver linhas duplicadas, uma consulta exibirá valores duplicados por padrão? Como você pode eliminar linhas duplicadas do resultado de uma consulta?
11
curado por: datauniverse.com.br
Uma função de agregação em SQL é uma função que opera em um conjunto de valores e retorna um único valor resumido. Essas funções são frequentemente usadas com a cláusula GROUP BY para realizar cálculos em grupos de linhas em uma tabela, como a soma, a média, a contagem ou o valor máximo.
Aqui estão algumas das funções de agregação mais comuns:
1. SUM(): Retorna a soma dos valores em uma coluna.
2. AVG(): Retorna a média dos valores em uma coluna.
3. COUNT(): Retorna o número de linhas em um conjunto ou o número de valores não nulos em uma coluna.
4. MIN(): Retorna o valor mínimo em uma coluna.
5. MAX(): Retorna o valor máximo em uma coluna.
6. GROUP_CONCAT(): Retorna uma string que é a concatenação de valores de uma coluna em linhas agrupadas.
Essas funções são frequentemente usadas em conjunto com a cláusula GROUP BY para realizar cálculos em grupos de dados específicos.
Por exemplo, você pode usar SUM() com GROUP BY para calcular a soma de valores para cada categoria em uma tabela.
Essa consulta retornaria a soma dos valores agrupados por categoria. Funções de agregação são ferramentas poderosas para analisar e resumir grandes conjuntos de dados em bancos de dados relacionais.
Explique o que é uma função de agregação
12
curado por: datauniverse.com.br
Em SQL, em geral não é possível aninhar diretamente funções de agregação uma dentro da outra. Isso ocorre porque as funções de agregação, como SUM(), AVG(), etc., operam em conjuntos de dados (grupos definidos pela cláusula GROUP BY).
Em alguns casos específicos você pode ter funções de agregação aninhadas até dois níveis de profundidade. Por exemplo, você pode usar MAX(COUNT(*)).
Tentar aninhar essas funções pode resultar em comportamentos indefinidos ou inesperados.
Vamos considerar um exemplo:
Neste exemplo, tentamos calcular a média dos valores somados por categoria. Isso não é permitido, pois a função SUM() já opera em um conjunto de dados agregado e aninhar outra função de agregação como AVG() diretamente não faz sentido.
Em vez disso, você deve realizar cada operação de agregação separadamente e, se necessário, combiná-las em consultas mais complexas usando subconsultas ou outros mecanismos de combinação de dados.
É possível aninhar funções de agregação?
13
curado por: datauniverse.com.br
Uma "window function" (função de janela) ou "analytics function" (função analítica) em SQL é uma categoria especial de funções que opera em um conjunto de linhas relacionadas a uma linha específica em uma consulta.
Essas funções são frequentemente utilizadas em conjunto com a cláusula OVER para definir uma "janela" ou conjunto de linhas para as quais a função será aplicada.
Principais características das funções de janela:
1. Operação em Conjuntos de Linhas Relacionadas: Ao contrario das funções de agregação que operam em conjuntos de dados agregados (como GROUP BY), as funções de janela operam em conjuntos de linhas relacionadas a uma linha específica.
2. Preservação das Linhas: As funções de janela geralmente preservam a quantidade de linhas na saída, não reduzindo o número de linhas como as funções de agregação. Cada linha na saída corresponde a uma linha de entrada.
3. Cláusula OVER: É usada para definir a janela sobre a qual a função de janela será aplicada. Ela pode incluir uma cláusula PARTITION BY para dividir o conjunto de dados em partições e uma cláusula ORDER BY para definir a ordem das linhas dentro de cada partição.
Principais funções de janela comuns incluem:
Explique o que é uma window function ou função analítica
14
curado por: datauniverse.com.br
A função UNION em SQL é utilizada para combinar os resultados de duas ou mais consultas em uma única lista de resultados. Esta operação remove automaticamente as duplicatas das linhas do resultado, garantindo que apenas valores únicos sejam incluídos.
A principal diferença entre UNION e UNION ALL está na abordagem de tratamento de duplicatas:
1. UNION:
Use UNION quando: Você deseja garantir que o resultado final não contenha linhas duplicadas. A remoção de duplicatas é mais importante do que a performance.
2. UNION ALL:
Use UNION ALL quando: Você não se preocupa com a presença de linhas duplicadas no resultado final. Prioriza o desempenho, pois UNION ALL geralmente é mais rápido, já que não precisa verificar e remover duplicatas.
Portanto, a escolha entre UNION e UNION ALL depende das necessidades específicas da consulta e se a presença de duplicatas é ou não desejada no resultado final.
Explique o que faz a função UNION e qual a diferença entre UNION x UNION ALL
15
curado por: datauniverse.com.br
UNION: É usado para combinar os resultados de duas ou mais consultas em uma única lista de resultados. Ele remove automaticamente duplicatas, garantindo que apenas valores únicos sejam incluídos no resultado final.
JOIN: É utilizado para combinar linhas de duas ou mais tabelas com base em uma condição de relação entre elas. Ele não remove duplicatas automaticamente, e o resultado inclui todas as combinações possíveis que atendem à condição de junção.
Diferenças Principais:
1. Finalidade:
2. Remoção de Duplicatas:
3. Condições:
Explique a diferença entre UNION e JOIN
16
curado por: datauniverse.com.br
Lidar com valores NULL em consultas SQL envolve considerar a possibilidade de que algumas colunas ou expressões podem ter valores nulos. Aqui estão algumas abordagens comuns para lidar com NULL em SQL:
1. Verificação de NULL:
Use IS NULL ou IS NOT NULL para verificar se uma coluna ou expressão é nula.
2. Coalescência (COALESCE):
Use a função COALESCE para retornar o primeiro valor não nulo em uma lista de expressões.
3. Manuseio de Valores Nulos em Funções de Agregação:
Ao usar funções de agregação, como SUM ou AVG, você pode usar a função IFNULL (em alguns sistemas de gerenciamento de banco de dados) ou CASE para tratar valores nulos.
4. Substituição de NULL em Resultados:
Use a função COALESCE ou IS NULL em colunas selecionadas para substituir valores nulos por um valor padrão ou fornecer uma condição específica.
5. Tratamento de NULL em Junções:
Considere como os valores nulos nas colunas de junção afetarão os resultados e, se necessário, utilize COALESCE ou IS NULL nas condições de junção.
6. Utilização de NULLIF:
A função NULLIF retorna NULL se os dois valores fornecidos são iguais; caso contrário, ela retorna o primeiro valor. Isso pode ser útil para converter valores específicos em NULL.
Lidar com valores NULL depende do contexto específico da consulta e do que você deseja realizar. Essas técnicas fornecem diferentes abordagens para tratar valores nulos com base nas necessidades da sua consulta.
Como você lida com valores NULL em SQL Queries?
17
curado por: datauniverse.com.br
A normalização em SQL refere-se ao processo de organização de um banco de dados relacional de maneira eficiente, minimizando a redundância de dados e mantendo a integridade dos dados.
Existem várias formas normais (1NF, 2NF, 3NF, BCNF, etc.), cada uma com regras específicas, mas, em geral, o objetivo é evitar a duplicação de dados e garantir que as dependências funcionais sejam bem gerenciadas.
Aqui estão algumas razões pelas quais a normalização é importante:
1. Redução da Redundância: A normalização reduz a redundância de dados, eliminando a necessidade de armazenar as mesmas informações em várias tabelas. Isso ajuda a economizar espaço de armazenamento e evita inconsistências nos dados.
2. Maior Eficiência nas Atualizações: Em um banco de dados normalizado, as atualizações precisam ser feitas em menos lugares, pois os dados estão distribuídos em tabelas relacionadas. Isso reduz a probabilidade de inconsistências e facilita a manutenção dos dados.
3. Maior Consistência: A normalização ajuda a garantir a consistência dos dados, uma vez que as informações são armazenadas de maneira padronizada em tabelas relacionadas. Isso evita problemas de atualizações parciais ou inconsistentes.
4. Melhor Desempenho em Consultas Específicas: Em certos casos, um banco de dados normalizado pode resultar em consultas mais eficientes, especialmente em operações de leitura e consulta de dados. No entanto, em algumas situações, pode ser necessário desnormalizar para otimizar consultas específicas de leitura.
5. Facilitação de Alterações na Estrutura: A normalização facilita a modificação da estrutura do banco de dados sem afetar negativamente a integridade dos dados. Isso é especialmente útil em sistemas que evoluem ao longo do tempo.
O que é a normalização em SQL e porque é importante?
18
curado por: datauniverse.com.br
A cláusula LIMIT em SQL é utilizada para restringir o número de linhas retornadas por uma consulta. Ela é especialmente útil quando você está lidando com grandes conjuntos de dados e deseja limitar a quantidade de informações recuperadas.
Onde quantidade de linhas é o número máximo de linhas que você deseja incluir no resultado.
Objetivos da cláusula LIMIT em SQL:
1. Melhor Desempenho:
Limitar a quantidade de linhas recuperadas pode resultar em consultas mais rápidas, especialmente quando você está interessado apenas em uma pequena porção dos dados.
2. Economia de Recursos de Rede:
Reduzir a quantidade de dados transferidos entre o banco de dados e o aplicativo cliente. Isso é particularmente útil em ambientes onde a largura de banda de rede é um recurso limitado.
3. Usabilidade em Aplicações Paginadas:
Facilitar a implementação de navegação por páginas em aplicações web ou sistemas paginados. Por exemplo, se estiver exibindo resultados em uma página web, você pode recuperar e exibir uma página de cada vez.
4. Controle Fino sobre o Resultado:
Permitir um controle mais fino sobre quais dados são retornados. Isso é útil quando você está explorando dados e deseja visualizar apenas uma parte inicial ou uma amostra dos resultados.
É importante observar que a sintaxe exata da cláusula LIMIT pode variar entre diferentes sistemas de gerenciamento de banco de dados (DBMS).
Por exemplo, no MySQL, você usaria LIMIT 10, enquanto no PostgreSQL, seria LIMIT 10 OFFSET 0. Portanto, é recomendável consultar a documentação específica do DBMS que você está usando para garantir a sintaxe correta.
Qual é o objetivo da cláusula LIMIT em SQL?
19
curado por: datauniverse.com.br
Aqui estão algumas dicas gerais que podem ajudar a melhorar o desempenho de consultas lentas:
Quais formas você utilizaria para lidar com uma query em SQL que está lenta?
20
curado por: datauniverse.com.br
A ordem de execução das instruções SQL geralmente segue uma sequência lógica que pode ser resumida nas seguintes fases:
1. FROM e JOINs: As tabelas são selecionadas e combinadas. Esta é a fase em que as cláusulas FROM e JOIN são aplicadas.
2. WHERE: É usada para filtrar as linhas resultantes da fase anterior, aplicando condições específicas.
3. GROUP BY: As linhas são agrupadas com base nos critérios especificados.
4. HAVING: É usada para filtrar grupos resultantes da fase de GROUP BY com base em condições específicas.
5. SELECT: É feita nesta fase. Isso inclui projeções de colunas e a aplicação de funções agregadas, se necessário.
6. ORDER BY: As linhas resultantes são ordenadas com base nos critérios especificados.
7. LIMIT e OFFSET: É aplicada para limitar o número de linhas no resultado final. Em alguns sistemas de gerenciamento de banco de dados (DBMS), OFFSET também é usado para pular um número específico de linhas.
É importante observar que nem todas as consultas SQL incluirão todas essas fases. A ordem exata pode variar dependendo da estrutura da consulta. Por exemplo, consultas simples de seleção podem apenas executar as fases de FROM, WHERE, SELECT, e ORDER BY se necessário.
Defina a ordem de execução padrão de consultas SQL
21
curado por: datauniverse.com.br
Uma CTE (Common Table Expression) em SQL é uma expressão de tabela temporária nomeada que pode ser referenciada dentro de uma consulta SELECT, INSERT, UPDATE ou DELETE. Ela é definida usando a cláusula WITH e é frequentemente usada para simplificar consultas complexas, melhorar a legibilidade do código e permitir a reutilização de partes da consulta.
A sintaxe básica de uma CTE é a seguinte:Principais características de CTEs:
1. Nomeação:
A CTE é nomeada usando um identificador após a palavra-chave WITH. Esse identificador é usado como um nome de tabela temporária para referenciar a CTE na consulta principal.
2. Definição:
A cláusula AS é usada para definir a CTE. A definição geralmente envolve uma consulta SELECT que pode incluir filtragem, junções e outras operações.
3. Uso na Consulta Principal:
Após a definição da CTE, ela pode ser referenciada na consulta principal como se fosse uma tabela ou subconsulta.
O que é uma CTE?
22
curado por: datauniverse.com.br
Não, NULL não é o mesmo que zero ou espaço em branco em bancos de dados. Cada um deles representa conceitos diferentes:
1. NULL: É um valor especial em bancos de dados que representa a ausência de um valor conhecido ou a falta de dados em uma coluna. Quando um campo contém NULL, significa que não há valor atribuído àquela posição.
2. Zero: É um valor numérico. Representa a quantidade zero ou a ausência de valor em um contexto numérico. Zero é um valor válido e diferente de NULL.
3. Espaço em Branco: Se refere a caracteres de espaço, como espaços, guias ou quebras de linha. Em contextos de texto, um campo que contém apenas espaços em branco é considerado diferente de NULL.
Diferenças Principais:
NULL representa a ausência de um valor conhecido.
NULL é usado para indicar que um valor é desconhecido, não se aplica ou não está disponível.
NULL é tratado de forma diferente em comparações; uma comparação com NULL usando = resulta em um valor desconhecido (não verdadeiro, não falso).
Em resumo, NULL é usado para indicar a ausência de um valor conhecido, enquanto zero e espaço em branco representam valores específicos em diferentes contextos (numérico e de texto, respectivamente). As diferenças são importantes em consultas e lógica de programação, especialmente quando se trata de lidar com valores desconhecidos ou ausentes.
NULL é o mesmo que zero ou espaço em branco? Se não, qual é a diferença
23
curado por: datauniverse.com.br
TCL (Transaction Control Language) é uma categoria de comandos em SQL utilizada para gerenciar transações em um banco de dados relacional. As transações são unidades de trabalho compostas por uma ou mais instruções SQL que são tratadas como uma única operação. TCL fornece comandos que permitem iniciar, confirmar (commit) ou desfazer (rollback) transações, fornecendo controle sobre a integridade e consistência dos dados no banco de dados.
Aqui estão alguns dos comandos TCL mais comuns:
1. COMMIT: É utilizado para confirmar as alterações feitas durante uma transação. Isso efetivamente torna as alterações permanentes e as reflete no banco de dados.
2. ROLLBACK: É usado para desfazer todas as alterações feitas durante uma transação que ainda não foram confirmadas (commit). Isso restaura o estado do banco de dados para o início da transação.
3. SAVEPOINT: É utilizado para criar um ponto de salvamento dentro de uma transação. Isso permite que você volte para esse ponto em caso de necessidade de desfazer apenas parte da transação.
4. ROLLBACK TO SAVEPOINT: É desfaz todas as alterações feitas desde o ponto de salvamento especificado, mas mantém as alterações feitas após esse ponto.
5. RELEASE SAVEPOINT: É remove um ponto de salvamento, indicando que as alterações até esse ponto podem ser confirmadas.
6. SET TRANSACTION: É é utilizado para definir características específicas da transação, como isolamento e leitura consistente.
Esses comandos são fundamentais para garantir a consistência e a integridade dos dados em um banco de dados ao lidar com operações complexas que envolvem múltiplas instruções SQL. Eles ajudam a controlar o escopo e o resultado das transações no contexto de sistemas de gerenciamento de banco de dados relacionais.
O que é TCL? Forneça uma explicação de alguns dos comandos
24
curado por: datauniverse.com.br
Se você não incluir uma cláusula WHERE em um DELETE statement em SQL, todas as linhas da tabela especificada serão excluídas.
Isso é conhecido como uma operação de exclusão irrestrita ou "DELETE sem condição". É uma ação poderosa e deve ser usada com extrema cautela, pois pode resultar na perda de todos os dados contidos na tabela.
Exemplo de DELETE com WHERE:
O que acontece se você não incluir uma cláusula WHERE em um DELETE statement?
25
curado por: datauniverse.com.br
Exercícios e problemas para resolver em SQL
Possíveis exercícios que podem surgir em processos de entrevista. É importante frisar que não necessariamente a mesma exata pergunta será feita, mas a lógica se aplica para diversas situações diferentes.
curado por: datauniverse.com.br
Resposta:
Não há uma cláusula GROUP BY, e isso resultará em um erro. Como usamos a função COUNT, que é uma função de agregação, juntamente com um campo de banco de dados, precisamos adicionar uma cláusula GROUP BY.
Deve-se agrupar pela coluna department_id.
Resolva o problema
1
O que há de errado com a seguinte Query?
SELECT department_id, count(*)
curado por: datauniverse.com.br
Resposta:
A cláusula WHERE não pode incluir verificações na coluna de agregação, mesmo se um GROUP BY tiver sido realizado. Isso ocorre porque a cláusula WHERE ocorre antes do agrupamento, então não há maneira para a cláusula WHERE saber qual é o valor da função COUNT.
Para resolver isso, utilize a cláusula HAVING para verificar se COUNT(*) > 5.
Resolva o problema
2
O que há de errado com a seguinte Query?
SELECT department_id, count(*)
FROM department
WHERE count(*) > 5
GROUP BY department_id;
curado por: datauniverse.com.br
Resposta:
Você pode usar subconsultas ou funções de janela (por exemplo, ROW_NUMBER) para encontrar o segundo maior ou o enésimo maior valor em uma coluna.
Resolva o problema
3
Como você pode encontrar o segundo maior ou o enésimo maior
valor em uma coluna?
curado por: datauniverse.com.br
Resposta:
Na consulta incorreta acima, a janela está sendo definida sem uma cláusula PARTITION BY, e isso pode causar um erro. Quando você usa uma função de janela, como SUM() OVER, sem especificar uma partição, o SQL assume que você deseja operar sobre toda a resultante da consulta. No entanto, a cláusula ORDER BY coluna1 indica que a função de janela deve ser aplicada de forma ordenada em relação a coluna1.
Na consulta correta, foi adicionada uma cláusula PARTITION BY alguma_coluna para a função de janela SUM() OVER. Isso define uma partição dentro da qual a soma acumulada deve ser calculada, agrupando os dados com base em alguma_coluna.
Agora, a função de janela opera dentro de cada partição definida pela cláusula PARTITION BY, evitando o erro que ocorreria na consulta incorreta.
Consulta correta:
SELECT
coluna1,
coluna2,
SUM(coluna3) OVER (PARTITION BY alguma_coluna ORDER BY coluna1) AS soma_acumulada
FROM
minha_tabela;
Resolva o problema
4
O que há de errado com a seguinte query?
SELECT
coluna1,
coluna2,
SUM(coluna3) OVER (ORDER BY coluna1) AS soma_acumulada
FROM
minha_tabela;
curado por: datauniverse.com.br
Resposta:
Na consulta correta, adicionamos a coluna3 à definição da CTE MinhaCTE. Isso permite que a CTE inclua todas as colunas necessárias para a consulta principal. Agora, a referência a coluna3 na cláusula WHERE está devidamente definida na CTE.
É crucial garantir que todas as colunas necessárias estejam definidas na CTE, para que possam ser referenciadas corretamente na consulta principal que usa a CTE. Caso contrário, o SQL não reconhecerá essas colunas, resultando em erros ou em resultados incorretos.
Consulta correta:
WITH MinhaCTE AS (
SELECT coluna1, coluna2, coluna3
FROM minha_tabela
)
SELECT coluna1, coluna2
FROM MinhaCTE
WHERE coluna3 > 100;
Resolva o problema
5
WITH MinhaCTE AS (
SELECT coluna1, coluna2
FROM minha_tabela
)
SELECT coluna1, coluna2
FROM MinhaCTE
WHERE coluna3 > 100;
curado por: datauniverse.com.br
Leet Code
Possíveis exercícios que podem surgir em processos de entrevista.
É importante frisar que não necessariamente a mesma exata pergunta será feita, mas a lógica se aplica para diversas situações diferentes.
curado por: datauniverse.com.br
Company: Linkedin, Dropbox
Dificuldade: Fácil
1
Escreva uma consulta que calcule a diferença entre os maiores salários encontrados nos departamentos de marketing e engenharia. Produza apenas a diferença absoluta de salários.
db_employee
db_dept
curado por: datauniverse.com.br
Resultado esperado:
1
SELECT
ABS(MAX(CASE
WHEN dept.department = 'marketing' THEN emp.salary
ELSE 0
END)
MAX(CASE
WHEN dept.department = 'engineering' THEN emp.salary
ELSE 0
END)) AS salary_difference
FROM db_employee emp
JOIN db_dept dept ON emp.department_id = dept.id
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Amazon, Apple
Dificuldade: Fácil
2
Encontre o número de trabalhadores por departamento que ingressaram em abril ou depois. Produza o nome do departamento junto com o número correspondente de trabalhadores. Classifique os registros com base no número de trabalhadores em ordem decrescente.
tabela worker
curado por: datauniverse.com.br
Resultado esperado:
2
-Solução 01
SELECT
department,
COUNT (worker_id)
FROM worker
WHERE joining_date >= '2014-04-01'
GROUP BY worker.department
ORDER BY COUNT (worker_id) DESC
--------------------------------------------------------
-Solução 02
SELECT
department,
COUNT (worker_id)
FROM worker
WHERE EXTRACT (MONTH FROM joining_date) >= 4
GROUP BY worker.department
ORDER BY COUNT (worker_id) DESC
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Google, Netflix
Dificuldade: Fácil
3
Conte quantos filmes que Abigail Breslin indicou ao Oscar
oscar_nominees
curado por: datauniverse.com.br
Resultado esperado:
3
SELECT
count(distinct movie) AS n_movies_by_abi
FROM oscar_nominees
WHERE
nominee = 'Abigail Breslin'
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Forbes
Dificuldade: Média
4
Encontre as 3 empresas mais lucrativas do mundo.
Produza o resultado junto com o nome da empresa correspondente.
Classifique o resultado com base nos lucros em ordem decrescente.
forbes_global_2010_2014
curado por: datauniverse.com.br
Resultado esperado:
4
SELECT company, profits
FROM forbes_global_2010_2014
ORDER BY profits DESC
LIMIT 3;
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Google
Dificuldade: Média
5
Encontre a classificação da atividade de e-mail para cada usuário. A classificação da atividade de email é definida pelo número total de emails enviados. O usuário com maior número de e-mails enviados terá classificação 1 e assim por diante.
Mostre o usuário, o total de e-mails e sua classificação de atividade. Ordene os registros pelo total de e-mails em ordem decrescente. Classifique os usuários com o mesmo número de e-mails em ordem alfabética.
Nas suas classificações, retorne um valor único (ou seja, uma classificação única), mesmo que vários usuários tenham o mesmo número de e-mails. Para desempate, use a ordem alfabética dos nomes de usuário dos usuários.
google_gmail_emails
curado por: datauniverse.com.br
Resultado esperado:
5
SELECT from_user,
count(*) as total_emails,
ROW_NUMBER() OVER(ORDER BY count(*) DESC, from_user ASC)
FROM google_gmail_emails
GROUP BY from_user
ORDER BY 2 DESC, 1
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Linkedin
Dificuldade: Média
6
Identifique projetos que correm o risco de ultrapassar o orçamento. Um projeto é considerado acima do orçamento se o custo de todos os funcionários atribuídos ao projeto for maior que o orçamento do projeto.
Você precisará ratear o custo dos funcionários de acordo com a duração do projeto. Por exemplo, se o orçamento para um projeto que leva meio ano para ser concluído for de US$ 10 mil, o salário total semestral de todos os funcionários designados para o projeto não deverá exceder US$ 10 mil. O salário é definido anualmente, por isso tome cuidado ao calcular os salários dos projetos que duram menos ou mais de um ano.
Produza uma lista de projetos que estão acima do orçamento com o nome do projeto, o orçamento do projeto e as despesas totais com funcionários rateadas (arredondadas para o próximo valor em dólares).
DICA: para simplificar, considere que todos os anos têm 365 dias. Você não precisa pensar nos anos bissextos.
linkedin_projects
linkedin_emp_projects
linkedin_employees
curado por: datauniverse.com.br
Resultado esperado:
6
SELECT title,
budget,
CEILING((DATEDIFF(end_date, start_date) * SUM(salary)/365)) AS prorated_employee_expense
FROM linkedin_projects a
INNER JOIN linkedin_emp_projects b ON a.id = b.project_id
INNER JOIN linkedin_employees c ON b.emp_id=c.id
GROUP BY title, budget, end_date, start_date
HAVING prorated_employee_expense > budget
ORDER BY title ASC
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Amazon
Dificuldade: Difícil
7
Dada uma tabela de compras por data, calcule a variação percentual mês a mês na receita. A saída deve incluir a data ano-mês (AAAA-MM) e a variação percentual, arredondada para a segunda casa decimal e classificada do início ao final do ano.
A coluna de alteração percentual será preenchida a partir do segundo mês e pode ser calculada como ((receita deste mês - receita do mês passado) / receita do mês passado)*100.
sf_transactions
curado por: datauniverse.com.br
Resultado esperado:
7
SELECT DATE_FORMAT(created_at,'%Y-%m') AS ym,
ROUND((SUM(value) - LAG(SUM(value)) OVER ())
/ LAG(SUM(value)) OVER ()
* 100, 2) AS revenue_diff_pct
FROM sf_transactions
GROUP BY ym
ORDER BY ym
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Google, Netflix
Dificuldade: Difícil
8
Dada uma tabela de compras por data, calcule a variação percentual mês a mês na receita. A saída deve incluir a data ano-mês (AAAA-MM) e a variação percentual, arredondada para a segunda casa decimal e classificada do início ao final do ano.
A coluna de alteração percentual será preenchida a partir do segundo mês e pode ser calculada como ((receita deste mês - receita do mês passado) / receita do mês passado)*100.
fraud_score
curado por: datauniverse.com.br
Resultado esperado:
8
WITH pctls AS
(SELECT *,
PERCENT_RANK() over(partition BY STATE
ORDER BY fraud_score DESC) AS pctl
FROM fraud_score)
SELECT policy_num,
state,
claim_cost,
fraud_score
FROM pctls
WHERE pctl <= .05
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Yelp
Dificuldade: Difícil
9
Encontre os 5 principais estados com o maior número de empresas 5 estrelas. Produza o nome do estado junto com o número de empresas 5 estrelas e ordene os registros pelo número de empresas 5 estrelas em ordem decrescente.
Caso haja empate no número de negócios, retorne todos os estados únicos. Se dois estados tiverem o mesmo resultado, classifique-os em ordem alfabética.
yelp_business
curado por: datauniverse.com.br
Resultado esperado:
9
select state, five_star_counts
from (
select state,
count(business_id) as five_star_counts,
rank() over (order by count(business_id) desc) as state_rank
from yelp_business
where stars = 5
group by state
order by state_rank, state
) t
where state_rank <= 5
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
Company: Airbnb
Dificuldade: Difícil
10
Você recebe um conjunto de dados de pesquisas de propriedades no Airbnb. Para simplificar, digamos que cada resultado da pesquisa (ou seja, cada linha) representa um host único.
Encontre a cidade com mais comodidades em todas as propriedades do anfitrião. Produza o nome da cidade.
airbnb_search_details
curado por: datauniverse.com.br
Resultado esperado:
10
select city from airbnb_search_details
group by city
order by sum(length(amenities)) desc
limit 1
SUGESTÃO DE RESPOSTA:
curado por: datauniverse.com.br
datauniverse.com.br
Entrevistas para posições que exigem habilidades intensivas em SQL, como desenvolvedor ETL, desenvolvedor de BI e analista de dados, podem parecer desafiadoras devido à ampla variedade de perguntas técnicas que podem ser feitas.
No entanto, elas não precisam ser assim. Conhecer seus fundamentos e ter um bom nível de SQL necessário para a posição para a qual está se candidatando é tudo o que o entrevistador desejará saber.
Estude essas perguntas, compreenda os tópicos e, juntamente com qualquer experiência que você tenha, você estará bem preparado para uma entrevista de SQL.
Boa sorte!
Obrigado!
Acesse mais conteúdos
@datauniverseblog
linkedin.com/in/alexandrepolselli/
eu@alexandrepolselli.com.br