SQL Subquery: o que você precisa saber
Uma subconsulta, também conhecida como SUBQUERY ou SUBSELECT, é uma consulta embutida dentro de outra consulta, de forma aninhada, passando os resultados da consulta que é mais interna, para a consulta que é mais externa por meio de uma cláusula WHERE ou da cláusula HAVING.
Desse modo, é possível restringirmos ainda mais os dados que serão retornados por uma consulta, nos permitindo a criação de filtros de consulta bastante sofisticados. A subquery nos retornará os dados que serão colocados na consulta principal, seguindo com as informações que serão utilizadas como condições de filtragem.
Podemos utilizar Subquery não somente em consultas com a cláusula SELECT, também podemos utilizar as operações INSERT, UPDATE e DELETE.
Quando utilizamos uma Subquery em uma Query, a Subquery será resolvida primeiro e só depois a consulta externa ou principal é resolvida de acordo com o resultado que retornará da Subquery.
Visão geral
Para exemplo, as subqueries foram divididas em diferentes sessões, também podendo ser vista em SELECT AS FIELD e SELECT FROM SELECT, que são formas de realizar as subqueries.
Para o nosso exemplo neste artigo, usaremos a estrutura de tabelas abaixo, onde teremos o seguinte:
Tabela 1: Produtos - Será responsável por armazenar todos os produtos do estoque do cliente.
Tabela 2: categoria_produto - Será responsável pelo armazenamento das categorias existentes no seu banco de dados.
Tabela 3: venda_produto - Será responsável pela relação dos produtos vendidos.
Pegando como exemplo, suponhamos que é necessário listar da tabela produtos, todos os registros que tenham um preço que seja acima da média dos outros produtos. Ficando com a Query do seguinte modo:
Observando o trecho de código acima, podemos ver nas linhas de 1 a 3 que informamos que as colunas nome e preço serão trazidas na consulta, nas linhas seguintes, 4 e 5 informamos que a consulta a ser realizada, será na tabela produto.
Das linhas 6 a 11 iremos informar que irão ser trazidos apenas os resultados em que o valor da coluna preço seja maior que o resultado do SELECT da linha 8 que é o responsável por trazer o valor total da media de preço da tabela produto.
O resultado da Query em questão seria:
Tabela 4: Retorno da consulta da tabela produtos com preço que está acima da média dos outros produtos.
A seguir mostrarei a parte sintática das querys:
Após entendermos o que foi explicado acima, iremos praticar algumas situações para melhor compreensão do conteúdo.
Exemplo 1
No exemplo a seguir, realizaremos uma consulta baseada no resultado de uma outra consulta.
Vamos supor que seja necessário sabermos de todos os produtos existentes, quantos foram vendidos e em seguida também será necessário sabermos quando o produto que teve a maior quantidade de itens vendidos. Utilizando a query abaixo:
Ao observarmos o trecho que código acima, podemos ver que fizemos um SELECT dentro de outro SELECT, ao continuarmos analisando o código, vemos que nas linhas de 2 a 4 informamos quais as colunas que irão vir na consulta. Observe também que na linha 4 especificamente, é solicitado o valor máximo da coluna TOTAL_VENDIDO.
Continuando nas linhas 5 a 19 dissemos que a consulta será feita FROM em um segundo SELECT. Na linha 8 pedimos que a contagem de id_produto que está presente na tabela venda_produto seja feita e logo em seguida que o resultado seja agrupado por id do produto e na linha 15 definimos que tal coluna se chamará TOTAL_VENDIDO.
E na linha 19 usamos um ALIAS para a consulta que está sendo utilizada como tabela.
O resultado da query acima ficará assim:
Exemplo 2
Para o próximo exemplo o cenário vai ser o seguinte:
A empresa Robs Pães possui uma tabela para Padeiros (Tabela 6) e uma segunda tabela para auxiliares (Tabela 7).
Tabela 6: Padeiros
Tabela 7: Auxiliares
A seguir, a empresa Robs Pães tomou a decisão de promover a Padeiro, todos os auxiliares que se encontram na empresa antes de 2020 e também solicitou que os funcionários promovidos fossem adicionados na tabela padeiro. Utilizando a query a seguir conseguiremos atender a solicitação da empresa:
Na query acima, nas linhas 1 e 2 informamos que a inserção dos dados irão ser feitos na tabela padeiros e que serão preenchidas as colunas nome, departamento e data_admissao. Na linha 3 informamos que os dados que estão sendo inseridos vão ser obtidos através de uma outra consulta, nas linhas de 3 a 8, realizamos uma segunda query, que solicita ao banco de dados todos os funcionarios da tabela auxiliares que tenham o ano da sua data de admissão, menor que 2020.
Ao executarmos essa query, todos os dados encontrados na tabela auxiliares correspondentes da query serão adicionados a tabela padeiros. Ficando da seguinte forma:
Tabela 8: Tabela padeiro com os auxiliares promovidos.
Exemplo 3
Para o próximo exemplo, iremos utilizar a mesma estrutura de tabelas utilizada anteriormente, as tabelas de padeiro e auxiliar.
Tendo em vista que com a execução da query acima, todos os auxiliares que foram promovidos a padeiro, foram inseridos na tabela padeiros, porém, seus nomes continuam na tabela de auxiliares. Para resolvermos esta questão, utilizaremos mais um exemplo de subquery, neste caso utilizando o comando DELETE. A query ficará da seguinte forma:
Ao observarmos a query acima, utilizamos o comando DELETE na tabela de auxiliares com, colocando como condição, o nome do auxiliar estar no resultado de uma outra consulta, tendo como resultado da query acima a:
Tabela 8
Ao observarmos o resultado acima, vemos que os registros que foram promovidos a padeiro, ja não fazem mais parte da tabela, afinal acabamos de fazer a remoção dos mesmos.
Diretrizes para uma SubQuery
- Uma Subquery deve sempre ser colocada entre parênteses.
- Uma Subquery deve ser colocada ao lado direito do operador de comparação.
- As Subqueries não podem manipular seus dados internamento, por isso, a cláusula ORDER BY não poderá ser adicionada a uma Subquery. Você poderá utilizar a cláusula ORDER BY na sua instrução SELECT principal, que será a última cláusula.
- Utilize operadores de linha única para Subqueries de linha única.
- Caso uma Subquery (interna) retorne um valor nulo para a consulta externa, a consulta externa não irá retornar nenhuma linha ao se utilizar determinados operadores de comparação em uma cláusula WHERE.
- É possível que nós utilizemos a clausula GROUP BY em uma Subquery.
- Não é possível utilizarmos o operador BETWEEN com uma Subquery, caso seja na consulta principal, mas, podemos utilizar esse operador dentro da Subquery.
Tipos de Subqueries
- Subquery de linha única: retornará zero ou uma linha.
- Subquery de várias linhas: retornará uma ou mais linhas.
- Subquery de várias colunas: retornará uma ou mais colunas
- Subquery correlacionada: fará referência a uma ou mais colunas na instrução SQL externa. Essa Subquery é conhecida como Subquery correlacionada pois está relacionada a instrução SQL externa
- Subquery aninhada: São subqueries que são colocadas dentro de uma outra subquery.
Conclusão
Podemos utilizar as subqueries para resolver problemas simples e complexos, ela é uma instrução muito versátil e pode ser utilizada em diversos cenários, servindo geralmente para resolver problemas que precisam ser resolvidos com 2 ou mais consultas.
Podemos utilizar subqueries em várias instruções diferentes como SELECT, INSERT, UPDATE e DELETE, utilizando essas instruções poderemos utilizar o uso das subqueries em diversas cláusulas como INTO, VALUES, SET, WHERE e HAVING. O Oracle também permitirá que utilizemos a Subquery tanto do lado direito quanto do lado esquerdo do operador “=”.
Em breve trarei um novo artigo falando minuciosamente sobre cada tipo de Subquery e explicando como utilizar cada uma delas, utilizando como base um banco de dados disponibilizado pela Oracle para que os exemplos fiquem o mais assertivos possível.
A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.