SQL Subquery: o que você precisa saber

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:

id

nome

preco

Id_categoria

1

Café

1.00

1

2

Suco

3.00

1

3

Água

2.00

1

4

Bolo

5.00

2

5

Pão

7.00

2

6

Queijo

15.00

2

7

Presunto

13.00

2

8

Pudim

11.00

3

9

Brigadeiro

3.00

3

10

Pavê

9.00

3

Tabela 1: Produtos - Será responsável por armazenar todos os produtos do estoque do cliente.

id

nome

1

Bebida

2

Comida

3

Sobremesa

Tabela 2: categoria_produto - Será responsável pelo armazenamento das categorias existentes no seu banco de dados.

id

id_produto

valor

data

1

1

1.00

2023/04/29

2

1

1.00

2023/04/29

3

1

1.00

2023/04/29

4

2

3.00

2023/04/27

5

2

3.00

2023/04/27

6

2

3.00

2023/04/27

7

2

3.00

2023/04/27

8

3

2.00

2023/04/26

9

3

2.00

2023/04/26

10

3

2.00

2023/04/26

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:

nome

preco

Suco

3.00

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:

id

produto

maior

2

Suco

4


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).

id

nome

departamento

data_admissao

1

Roberto Luna

Padeiro

2015-01-01

2

José Santiago

Padeiro

2017-02-25

Tabela 6: Padeiros

id

nome

departamento

data_admissão

1

Joaquim Borges

Auxiliar

2019-01-01

2

Antonio França

Auxiliar

2018-03-25

3

Emanuel Costa

Auxiliar

2022-01-01

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:

id

nome

departamento

data_admissao

1

Roberto Luna

Padeiro

2015-01-01

2

José Santiago

Padeiro

2017-02-25

3

Antonio França

Padeiro

2018-03-25

4

Joaquim Borges

Padeiro

2019-01-01

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:

id

nome

departamento

data_admissão

3

Emanuel Costa

Auxiliar

2022-01-01

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.

💡
OBS: O comando INSERT quando em conjunto com uma outra query, só funcionará se as duas tabelas possuírem exatamente a mesma configuração/quantidades de colunas.

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.

💡
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

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.