Voltar para a lista de artigos Artigos
8 minutos de leitura

10 exercícios sobre NULL para iniciantes

Quer praticar a manipulação de valores NULL em suas consultas? Confira estes 10 novos exercícios práticos sobre NULL!

Dominar o SQL requer muita prática. Embora o aprendizado da teoria seja importante, a prática é uma das melhores maneiras de manter suas habilidades em SQL atualizadas. Neste artigo, apresentamos 10 exercícios de NULL para você analisar, com soluções e explicações completas.

Lidar com NULLs pode pegar os iniciantes em SQL desprevenidos. O NULL não se comporta como os dados normais; ele representa a ausência total de informações, o que pode dificultar sua compreensão em um primeiro momento.

Os exercícios de SQL a seguir o ajudarão a aprimorar suas habilidades no tópico de NULLs. Abordaremos todas as complexidades do trabalho com NULLs e praticaremos uma ampla gama de casos de uso que envolvem dados ausentes.

E se você quiser praticar um pouco mais depois disso - não apenas com NULLs, mas com todo o SQL - experimente a nossa Trilha de Práticas em SQL . Ela tem mais de 1250 exercícios práticos para ajudá-lo a dominar o SQL. E como tudo acontece em seu navegador, não há nada para configurar ou fazer download.

Pronto para alguns exercícios práticos de SQL NULL? Vamos mergulhar de cabeça!

Conheça os dados

Para este conjunto de exercícios, usaremos duas tabelas: employee e department. Dê uma olhada em alguns dados de amostra de cada tabela:

employee

idnamesalarybonuspositiondepartment_idmanager_id
1John Doe55001250CEO1NULL
2Jane Doe47501100CTO1NULL
3Mike Johnson2900NULLHead Accountant2NULL
4Sarah Brown23500Accountant23
5James Clark2500NULLHead of Marketing3NULL
6Emily Davis3100NULLSoftware Developer42

Na tabela employee, algumas colunas podem ter valores ausentes (NULL). Por exemplo, manager_id é NULL para todos os funcionários que não têm outro funcionário supervisionando-os (ou seja, o próprio gerente). E as informações salary e bonus podem estar ausentes caso não se apliquem a esse funcionário específico.

department

idnameregion
1Executive TeamCentral Hub
2AccountingNorthwest
3SalesWest Coast
4DevelopmentNULL

Na tabela department tabela, apenas a região pode ser NULL. Isso indica que o departamento opera on-line. Voltaremos a esse assunto nos exercícios.

Exercícios de SQL NULL

1. Líderes de equipe

Exercício: Exibir informações sobre todos os líderes de equipe (ou seja, funcionários que não têm um manager_id).

Solução:

SELECT *
FROM employee
WHERE manager_id IS NULL;

Explicação: Para filtrar os funcionários que não têm um manager_id, precisamos usar o operador IS NULL. O uso de operadores regulares como = ou != com NULLs não funciona como esperado no SQL. Se você usá-los, o resultado será sempre NULL e a condição WHERE falhará.

Se quiséssemos mostrar todos os funcionários que não são líderes de equipe, a condição de filtragem seria WHERE manager_id IS NOT NULL. Você pode ler mais sobre o que são NULLs e como eles funcionam em NULLs and Handling Missing Data in SQL.

2. Departamentos estabelecidos

Exercício: Exiba todos os departamentos físicos (ou seja, aqueles que têm um valor de região). Os departamentos sem uma região operam on-line.

Solução:

SELECT *
FROM department
WHERE region IS NOT NULL;

Explicação: Use o mesmo princípio de filtragem que discutimos no exercício anterior. Nesse caso, você precisará usar o operador IS NOT NULL.

3. Bônus ausentes

Exercício: Exibir o número de funcionários que têm um bônus faltante.

Solução:

SELECT COUNT(*)
FROM employee
WHERE bonus IS NULL;

Explicação: Filtre os funcionários sem bônus usando o operador IS NULL. Use a função de agregação COUNT() para contar o número de funcionários sem bônus.

Observação: Certifique-se de usar o argumento adequado para a função COUNT(), pois COUNT(bonus) WHERE bonus IS NULL sempre retornará 0.

4. Bônus pequenos

Exercício: Exiba todos os funcionários que receberam um bônus menor que 300, incluindo os funcionários que não têm bônus registrado. Mostre primeiro os funcionários sem bônus registrado e, em seguida, ordene-os do menor para o maior bônus.

Solução:

SELECT *
FROM employee
WHERE bonus < 300
  OR bonus IS NULL
ORDER BY bonus NULLS FIRST;

Explicação: Aqui, a condição é dividida em duas partes:

  1. Bônus menores que 300 e
  2. Bônus ausentes.

Podemos usar o operador < (menor que) na primeira parte, mas a segunda parte precisará do operador IS NULL.

Lembre-se de que NULL não é "maior" ou "menor" que 300, portanto, você precisa usar especificamente IS NULL. Junte as duas condições com o operador OR.

Para classificar as linhas por bônus, use uma cláusula ORDER BY. Por padrão, as linhas serão classificadas em ordem crescente (ou seja, do menor para o maior bônus). Para especificar explicitamente que as linhas NULL devem vir primeiro no resultado, use a cláusula NULLS FIRST.

5. Funcionários on-line

Exercício: Encontre todos os funcionários que trabalham em departamentos remotos (ou seja, aqueles em que a região é NULL). Exiba o nome do funcionário e o nome do departamento.

Solução:

SELECT 
  employee.name AS employee,
  department.name AS department
FROM employee
JOIN department
  ON employee.department_id = department.id
WHERE department.region IS NULL;

Explicação: Junte os campos employee e department para obter acesso às tabelas do funcionário e do departamento name. Renomeie as colunas com a palavra-chave AS para evitar nomes duplicados. Em seguida, filtre o resultado pelo region do departamento, mantendo apenas as linhas em que a região é IS NULL.

6. Funcionários e regiões

Exercício: Para cada funcionário, exiba o nome dele, o nome do departamento atribuído e a região em que o departamento está localizado. Para os funcionários de departamentos com uma região ausente, exiba ‘Online’ como a região.

Solução:

SELECT 
  employee.name AS employee,
  department.name AS department,
  COALESCE(region, ‘Online’) AS region
FROM employee
JOIN department
  ON employee.department_id = department.id;

Explicação: Para exibir o nome do funcionário, o nome do departamento e a região, junte as tabelas.

Os funcionários em departamentos sem uma região terão NULL como o valor dessa coluna. Para substituir isso, podemos usar a função COALESCE(): ela manterá os valores não nulos, mas substituirá os NULLs no resultado por um novo valor que fornecemos (‘Online’). Se quiser saber mais sobre como essa função funciona, consulte nosso artigo sobre a função COALESCE().

7. Contagem regional de funcionários

Exercício: Exiba todas as regiões do banco de dados juntamente com o número de funcionários que trabalham nessa região. Mostre ‘Online’ como a região para os funcionários que não têm uma.

Solução:

SELECT 
  COALESCE(region, ‘Online’) AS region,
  COUNT(*)
FROM employee
JOIN department
  ON employee.department_id = department.id
GROUP BY region;

Explicação: Junte os employee e department tabelas. Assim como no último exercício, use a função COALESCE() para substituir as regiões ausentes por "Online".

Adicione a função de agregação COUNT() para obter o número de funcionários em cada região e, em seguida, agrupe o resultado pela coluna region.

Observação: Não há necessidade de usar COALESCE() na cláusula GROUP BY. COALESCE() substitui todos os NULLs pelo mesmo valor, de modo que o número de grupos e as linhas neles permanecem inalterados.

8. Relação entre bônus e salário

Exercício: Para cada funcionário, exiba o nome dele e a relação entre o bônus e o salário. Se o bônus for 0, exiba NULL em vez disso.

Solução:

SELECT 
  name,
  NULLIF(bonus, 0) / salary AS ratio 
FROM employee;

Explicação: Ao calcular a proporção entre o salário e o bônus, lembre-se de que o bônus pode ser 0 e não queremos exibir 0 no resultado final. Para evitar isso, podemos usar a função NULLIF() com a coluna de bônus. Essa função verifica se o bônus é 0; se for, ela substitui o 0 por NULL. Qualquer operação aritmética que inclua NULL resultará no retorno de NULL. Portanto, se o bônus for NULL, a proporção também será NULL.

9. Número de funcionários do departamento

Exercício: Para cada departamento, conte o número de funcionários que trabalham nele. Inclua todos os departamentos, mesmo aqueles que não têm funcionários atribuídos a eles. Ignore os funcionários sem um departamento.

Solução:

SELECT 
  department.name AS department,
  COUNT(employee.id) AS employees
FROM department
LEFT JOIN employee
  ON department.id = employee.department_id
GROUP BY 
  department.name, 
  department.id;

Explicação: Junte os campos department e employee tabelas. Para garantir que os departamentos sem funcionários sejam mostrados no resultado, use LEFT JOIN e coloque a tabela department primeiro. Conte os IDs dos funcionários para evitar a contagem de linhas NULL e agrupe o resultado pelo nome do departamento e id (caso dois departamentos tenham o mesmo nome).

10. Funções por departamento

Exercício: Exiba o nome de cada departamento, a região e o número de funções diferentes dentro dele. Certifique-se de que haja uma seção "não atribuído" para os funcionários sem um departamento atribuído.

Solução:

SELECT
  COALESCE(department.name, ‘unassigned’) AS department,
  region,
  COUNT(DISTINCT position) AS different_positions
FROM department
FULL OUTER JOIN employee
  ON employee.department_id = department.id
GROUP BY
  department.region, 
  department.name, 
  department.id

Explicação: Junte as seções department e employee usando um FULL OUTER JOIN para garantir que os departamentos sem funcionários e os funcionários sem departamentos sejam mostrados. A ordem das tabelas não importa aqui.

Para lidar com funcionários sem um departamento, use a função COALESCE() para substituir o nome do departamento por ‘unassigned’. Conte o número de posições diferentes em cada departamento usando COUNT(DISTINCT position). Você pode saber mais sobre o uso da palavra-chave DISTINCT em nosso artigo do livro de receitas.

Agrupe o resultado por região, nome e id do departamento. Observe que "unassigned" é um dos grupos resultantes.

Está com sede de mais exercícios práticos sobre SQL NULL?

Muito bem! Você aprendeu um pouco sobre como lidar com NULLs no SQL! Se quiser mais exercícios práticos, confira nossa extensa Trilha de Práticas em SQL . Além de NULLs, ela aborda todos os tópicos existentes para ajudá-lo a manter suas habilidades em SQL afiadas.

Boa prática!