TOP

Lição SQL 9. Subconsultas

Até agora, obtivemos dados do banco de dados usando consultas simples e uma única instrução SELECT. Porém, mesmo assim, com mais frequência precisaremos selecionar dados que atendam a muitas condições, e aqui não podemos prescindir de consultas avançadas. Para isso, no SQL existem subconsultas ou consultas aninhadas, onde uma instrução SELECT está aninhada dentro de outra.

Uma subconsulta é uma instrução SELECT aninhada dentro de outro SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE ou dentro de outra subconsulta.

O texto da subconsulta deve ser colocado entre parênteses. Subconsultas são frequentemente usadas em vez de unir tabelas (JOIN).


1. Filtragem usando subconsultas

As tabelas do banco de dados utilizadas no SGBD Access são tabelas relacionais, ou seja, todas as tabelas podem ser vinculadas entre si por campos comuns. Suponha que armazenamos dados em duas tabelas diferentes e precisamos selecionar os dados em uma delas, dependendo de quais dados estão na outra. Para isso, criaremos outra tabela em nosso banco de dados. Esta será, por exemplo, a tabela Sellers com informações sobre fornecedores:

Agora temos duas tabelas - Sumproduct e Sellers que possuem o mesmo campo City. Digamos que precisamos contar quantos produtos foram vendidos somente no Canadá. As subconsultas nos ajudarão a fazer isso. Então, primeiro, vamos escrever uma consulta para uma amostra de cidades localizadas no Canadá:

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

Agora vamos passar esses dados para a consulta a seguir, que selecionará os dados da tabela Sumproduct:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

Também podemos combinar essas duas solicitações em uma. Assim, uma solicitação que gera dados será a principal, e a segunda solicitação que transmite os dados de entrada será uma auxiliar (subconsulta). Para inserir uma subconsulta, usaremos a construção WHERE ... IN (...), que foi discutida na seção Filtragem avançada:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

Podemos ver que obtivemos os mesmos dados de duas consultas separadas. Da mesma forma, podemos aumentar a profundidade de aninhamento das consultas aninhando subconsultas quantas vezes quisermos.

2. Utilização de subconsultas como campos de liquidação

Também podemos usar subconsultas como campos calculados. Vamos exibir, por exemplo, a quantidade de produtos vendidos para cada vendedor usando a seguinte consulta:

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

A primeira instrução SELECT exibe duas colunas - Seller_name e Qty. O campo Qty é calculado, é formado a partir da execução da subconsulta, que está entre colchetes. Esta subconsulta é executada uma vez para cada registro no campo Seller_name e será executada quatro vezes no total, já que quatro nomes de vendedores são selecionados.

Além disso, na subconsulta, a cláusula WHERE executa a função join, pois com a ajuda de WHERE unimos as duas tabelas pelo campo City, utilizando os nomes completos das colunas (Table.Field).