Subconsultas em SQL: Filtrando Dados e Campos Computados

As subconsultas são um recurso poderoso no SQL, permitindo que você construa consultas complexas aninhando uma consulta dentro de outra. Essencialmente, uma subconsulta, também conhecida como consulta interna ou consulta aninhada, é uma instrução SELECT que é executada como parte de outra instrução SQL.

Conceitos Fundamentais de Subconsultsa

Uma subconsulta pode ser empregada em várias cláusulas de uma instrução SQL, como SELECT, FROM, WHERE, HAVING e até mesmo em operações como INSERT, UPDATE e DELETE. Embora o termo "consulta" possa se referir a qualquer instrução SQL, ele é mais frequentemente associado à instrução SELECT.

Um ponto crucial a lembrar é que, quando usada em uma cláusula WHERE para retornar uma lista de valores (por exemplo, com operadores IN ou EXISTS), uma subconsulta SELECT deve retornar uma única coluna. Caso contrário, um erro será gerado. A execução de subconsultas geralmente segue uma ordem "de dentro para fora", significando que a consulta mais interna é avaliada primeiro, e seu resultado é então utilizado pela consulta externa.

Filtrando Dados com Subconsultas

Um dos usos mais comuns de subconsultas é para filtrar dados em uma consulta externa. Isso é particularmente útil quando você precisa selecionar informações de uma tabela com base em critérios que dependem de dados de outra tabela, sem necessariamente usar uma operação JOIN explícita.

Vamos considerar um cenário onde temos as seguintes tabelas simplificadas para gerenciar pedidos de clientes:

  • Clientes: Contém informações dos clientes (id_cliente, nome_cliente, contato_cliente).
  • Pedidos: Registra os pedidos feitos (numero_pedido, id_cliente, data_pedido).
  • ItensPedido: Detalha os produtos em cada pedido (numero_pedido, id_produto, quantidade, preco_unitario).

Suponha que queremos encontrar o nome e contato de todos os clientes que compraram um produto específico, digamos, 'PROD001'. Podemos alcançar isso com uma subconsulta aninhada:


-- Para identificar os clientes que adquiriram 'PROD001', o processo se desenrola em camadas:

-- 1. Primeiro, localizamos os números dos pedidos onde o 'PROD001' foi incluído.
--    (SELECT numero_pedido FROM ItensPedido WHERE id_produto = 'PROD001')

-- 2. Em seguida, usamos esses números de pedido para encontrar os IDs dos clientes
--    que realizaram tais compras.
--    (SELECT id_cliente FROM Pedidos WHERE numero_pedido IN (resultado_passo_1))

-- 3. Finalmente, com os IDs dos clientes em mãos, extraímos os dados desejados
--    (nome e contato) da tabela Clientes.
SELECT
    c.nome_cliente,
    c.contato_cliente
FROM
    Clientes c
WHERE
    c.id_cliente IN (
        SELECT p.id_cliente
        FROM Pedidos p
        WHERE p.numero_pedido IN (
            SELECT ip.numero_pedido
            FROM ItensPedido ip
            WHERE ip.id_produto = 'PROD001'
        )
    );

Neste exemplo, a consulta mais interna (SELECT ip.numero_pedido FROM ItensPedido ip WHERE ip.id_produto = 'PROD001') é execuatda primeiro, retornando uma lista de numero_pedido. Em seguida, a consulta intermediária (SELECT p.id_cliente FROM Pedidos p WHERE p.numero_pedido IN (...)) usa essa lista para encontrar os id_cliente correspondentes. Finalmente, a consulta externa usa esses id_cliente para recuperar os detalhes dos clientes da tabela Clientes.

Subconsultas como Campos Computados

Além de filtrar dados, as subconsultas podem ser utilizadas para criar campos computados na lista SELECT. Nesses casos, a subconsulta é executada para cada linha da consulta externa e deve retornar um único valor (uma única coluna e uma única linha).

Um uso comum é calcular um valor agregado relacionado a cada linha da consulta principal. É fundamental, neste cenário, usar nomes de coluna totalmente qualificados (nome_da_tabela.nome_da_coluna) para evitar ambiguidades, especialmente em subconsultas correlacionadas, onde a consulta interna depende de valores da consulta externa.

Por exemplo, para listar todos os clientes e, para cada cliente, computar o número total de pedidos que eles fizeram:


SELECT
    c.nome_cliente,
    c.contato_cliente,
    (SELECT COUNT(p.numero_pedido)
     FROM Pedidos p
     WHERE p.id_cliente = c.id_cliente) AS total_pedidos
FROM
    Clientes c
ORDER BY
    c.nome_cliente;

Aqui, a subconsulta (SELECT COUNT(p.numero_pedido) FROM Pedidos p WHERE p.id_cliente = c.id_cliente) é executada para cada id_cliente da tabela Clientes. Ela conta quantos pedidos existem na tabela Pedidos para o id_cliente atual da linha processada na tabela Clientes, e esse resultado é apresentado como a coluna total_pedidos.

Tags: SQL Subconsultas Filtragem SQL Campos Calculados banco de dados

Publicado em 6-30 04:37