Subquery é uma instrução do tipo SELECT dentro de outra instrução SQL, possibilitando assim a realização de consultas mais complexas, que de outra forma seriam extremamente complicadas ou impossíveis de serem feitas, como por exemplo utilizando JOINS.
Este artigo tem como finalidade exemplificar a utilização de subqueries na prática, utilizando para isso exemplos de questões que foram trabalhadas em concursos públicos.
Questão 1: Controladoria geral da união (CGU)
Na prova do concurso público da Controladoria geral da União, tivemos a seguinte questão:
Uma subquery (subconsulta) é um comando SELECT que foi "embutido" em outro comando SELECT, UPDATE, DELETE ou dentro de outra subquery. A finalidade da subquery é retornar um conjunto de linhas para a query (consulta) ou comando principal. Com relação às subqueries, é correto afirmar que:
A. uma subquery não precisa estar incluída entre parêntesis.
B. uma subquery sempre deve estar do lado esquerdo do operador de comparação.
C. uma subquery pode conter a cláusula ORDER BY.
D. o operador IN não pode ser utilizado em uma subquery que retorne múltiplas linhas.
E. o operador igual "=" não pode ser utilizado em uma consulta que contenha uma subquery que retorne múltiplas linhas.
A resposta correta para esta questão seria a letra E (o operador igual "=" não pode ser utilizado em uma consulta que contenha uma subquery que retorne múltiplas linhas)
Vamos compreender melhor porque as outras alternativas estão incorretas:
A: A alternativa diz: ... não precisa ..., porém toda subquery deve estar incluída entre parênteses para se diferenciar da consulta principal. É recomendado a utilização de um Alias para a subquery logo após o parênteses, facilitando assim a sua identificação.
B: A alternativa diz: ...sempre deve estar do lado esquerdo ...*, porém, não faz diferença para o resultado da consulta se a subquery esta a esquerda ou a direita do operador de comparação.
C: A Alternativa diz: ...pode conter order by*, porém uma subquery não pode a cláusula order by. Caso seja necessário, a cláusula deve ser movida para a consulta principal.
D: A Alternativa diz ... não pode ser utilizado em uma subquery ...* porém o operador IN pode ser utilizado em uma subquery que retorna múltiplas linhas.
Questão 2: Tribunal de Contas do Município de São Paulo (TCMSP)
Na prova do Tribunal de Contas do Município de São Paulo tivemos a seguinte questão:
Considere as tabelas relacionadas, e respectivas instância, mostradas na Figura 1.
O comando SQL apresentado na Listagem 1 produz um resultado com apenas uma coluna, cujo(s) valor(es) é/são:
A. 1
B. 1,2,3
C. 4,5
D. 1,2,3,4,5
E. NULL
SELECT A FROM X1 WHERE
NOT EXISTS
(SELECT * FROM X3 WHERE
NOT EXISTS
(SELECT * FROM X2 WHERE
X1.A = X2.C AND X3.B=X2.D))
A resposta correta para esta questão seria a letra A (1).
Esta questão foi baseada em uma query inicial, dessa forma, para entender melhor como chegamos no resultado, vamos detalhar o funcionamento da query:
Para simplificar recomenda-se analisar o comando SQL por partes, começando do mais interno e seguir filtrando as linhas. Dessa forma, a instrução SELECT mais interna é:
(SELECT * FROM X2 WHERE
X1.A = X2.C AND X3.B=X2.D)
O resultado dessa instrução vai comparar os dados da coluna A da tabela X1 com a coluna C da tabela X2. De forma semelhante, também será feita uma comparação com os dados da tabela X3 e X2, porém entre as colunas B e D.
O candidato deve analisar linha a linha começando da tabela X1 e X2 e, em seguida, analisar o resultado da linha para os valores de X3 e X2. Após estudar cuidadosamente o resultado dessa consulta mais interna (com base na Figura 1)pode-se notar que ela vai gerar os dados apresentados na Tabela 1.
1 | 1 |
1 | 3 |
1 | 5 |
2 | 1 |
2 | 3 |
3 | 1 |
3 | 1 |
Com base neste resultado, executamos a subquery do meio, conforme podemos ver na Listagem 2.
SELECT * FROM X3 WHERE
NOT EXISTS
Esta consulta vai analisar para quais valores únicos da coluna C não existem os valores 1, 3 e 5 (o conteúdo completo da tabela de X3), portanto, observando os dados da Tabela 1 é possível notar que apenas quando a coluna C for igual a 1 termos a sequência 1, 3 e 5. Dessa forma o resultado da subconsulta é uma nova tabela em memória com os valores 2, 2, 3 e 3.
Podemos partir agora para a consulta principal, que podemos ver abaixo na Listagem 3.
SELECT A FROM X1 WHERE
NOT EXISTS
Esta consula irá trazer todos os valores da coluna A que não existam no resultado da query anterior, que gerou os valores 2,2,3 e 3. Dessa forma, da coluna A da tabela X1, o único valor que não esta presente é o valor 1, que no caso, é a resposta final para a questão.
Questão 3: Instituto Brasileiro de Geografia e Estatística (IBGE)
Na prova do concurso público do Instituto Brasileiro de Geografia e Estatística, tivemos a seguinte questão:
Observe a estrutura de tabelas ilustrado na Figura 2.
Com base nesta estrutura, escreva um comando SQL que responda à pergunta: quais os nomes dos empregados do departamento cujo identificador do departamento é 200 e que não tiraram férias no ano de 2000:
Podemos dar como resposta para esta questão a query vista na Listagem 4.
SELECT nomeEmpregado
FROM Empregado
WHERE idDepartamento = 200
AND idEmpregado NOT IN (SELECT idEmpregado
FROM Ferias WHERE ano = 2000);
Vamos entender melhor a query acima. Na Linha 1 selecionamos a coluna nomeEmpregado, e logo na Linha 2 informamos que esses dados serão tirados da tabela Empregado. Na linha 3 adicionamos um filtro informando que somente serão trazidos resultados onde o valor da coluna idDepartamento seja igual a 200 e logo em seguida, na linha 4 informamos que além do filtro anterior, obrigatoriamente a query deve respeiter um segundo filtro, que define que o valor da coluna idEmpregado não pode aparecer no resultado de uma subquery. A subquery referenciada, nas Linhas 4 e 5 seleciona a coluna idEmpregado da tabela Ferias onde o valor da coluna ano é igual a 2000.
Questão 4: Instituto Brasileiro de Geografia e Estatística (IBGE)
Ainda na prova do Instituto Brasileiro de Geografia e Estatística, temos a seguinte quetão:
Escreva um comando SQL que responda à pergunta: quais os identificadores e os nomes dos empregados que recebem salário acima da média de salário dos empregados da empresa e que possuem mais de 2 dependentes?
Podemos dar como resposta para esta questão a query vista na Listagem 5.
SELECT idEmpregado
, nomeEmpregado
FROM Empregado
WHERE numeroDependentes > 2
AND salario > (SELECT AVG(salario) FROM Empregado);
Vamos entender melhor a query acima. Na Linha 1 e 2 selecionamos as colunas idEmpregado e nomeEmpregado. Na Linha 3 informamos que esses dados serão trazidos da tabela Empregado. Na Linha 4 definimos o primeiro item do filtro, que é o valor da coluna numeroDependentes ser maior que 2. Na Linha 5, adicionamos o segundo filtro obrigatório que é o valor da coluna salario ser maior que o valor de uma subquery informada. A subquery mencionada na linha 5 é responsável por trazer a média do valor da coluna salario através da função de agregação AVG diretamente da tabela Empregado.
Para mais informações, temos aqui na DevMedia um curso exclusivo sobre este tema! Avançando com Subqueries
Saiba mais Veja a Série SQL nível Jedi: SubqueriesConfira outros conteúdos:
SQL SUM: somando os valores de uma...
SQL: INNER JOIN
SQL: Introdução ao Where
Promoção de Natal
Oferta exclusiva de Natal!
Pagamento anual
12x no cartão
De: R$ 69,00
Por: R$ 59,90
Total: R$ 718,80
Garanta o desconto
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- 12 meses de acesso
Pagamento recorrente
Cobrado mensalmente no cartão
De: R$ 79,00
Por: R$ 59,90 /mês
Total: R$ 718,80
Garanta o desconto
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- Fidelidade de 12 meses
- Não compromete o limite do seu cartão
<Perguntas frequentes>
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.