Subconsultas do PostgreSQL
As subconsultas no PostgreSQL são consultas aninhadas usadas em uma consulta principal para realizar filtragens ou cálculos complexos. Eles permitem que você isole partes de consultas SQL e use resultados intermediários para formular a saída final da consulta.
Uso
As subconsultas são normalmente usadas nas instruções SELECT, INSERT, UPDATE ou DELETE para dividir operações SQL complexas em componentes mais simples e gerenciáveis. Eles são colocados entre parênteses e podem retornar um único valor ou um conjunto de valores a ser usado pela consulta principal.
SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (SELECT column FROM table WHERE condition);
Nessa sintaxe, a subconsulta é usada em uma cláusula WHERE para filtrar os resultados com base na saída da consulta aninhada.
Exemplos
1. Subconsulta básica na cláusula WHERE
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date > '2023-01-01');
Este exemplo recupera os clientes que fizeram pedidos após 1º de janeiro de 2023, usando uma subconsulta na cláusula WHERE.
2. Subconsulta na instrução SELECT
SELECT product_id,
(SELECT AVG(price) FROM products) AS average_price
FROM products;
Aqui, uma subconsulta calcula o preço médio de todos os produtos e o apresenta junto com o ID de cada produto.
3. Usando subconsulta com EXISTS
SELECT supplier_id, supplier_name
FROM suppliers
WHERE EXISTS (SELECT * FROM products WHERE suppliers.supplier_id = products.supplier_id AND products.stock > 0);
Este exemplo verifica se há fornecedores com produtos em estoque usando uma condição EXISTS para filtrar os resultados.
4. Subconsulta na instrução INSERT
INSERT INTO sales_summary (product_id, total_sales)
SELECT product_id, SUM(sales_amount)
FROM sales
WHERE sale_date > '2023-01-01'
GROUP BY product_id;
Este exemplo usa uma subconsulta para agregar dados de vendas e inserir os resultados em uma tabela de resumo.
5. Subconsulta na instrução UPDATE
UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');
Aqui, a subconsulta encontra o ID da categoria para "Eletrônicos" e a consulta principal atualiza os preços desses produtos.
6. Subconsulta na instrução DELETE
DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_items WHERE quantity = 0);
Esse exemplo exclui pedidos que não têm itens, conforme determinado por uma subconsulta.
7. Exemplo de subconsulta correlacionada
SELECT employee_id, employee_name
FROM employees e
WHERE EXISTS (SELECT 1 FROM sales s WHERE s.employee_id = e.employee_id AND s.amount > 1000);
Uma subconsulta correlacionada faz referência a colunas da consulta externa, aqui verificando se há funcionários com vendas acima de US$ 1.000.
Dicas e práticas recomendadas
- Otimize o desempenho. Use as subconsultas com sabedoria; considere a indexação de colunas relevantes ou a reestruturação de consultas para minimizar o tempo de execução.
- Use subconsultas para modularidade. Divida consultas complexas em subconsultas para facilitar o gerenciamento e a legibilidade.
- Aproveite cuidadosamente as subconsultas correlacionadas. As subconsultas correlacionadas são poderosas, mas podem afetar o desempenho, pois são executadas uma vez por linha na consulta externa.
- Considere o uso do site
EXISTSpara verificações de existência. Geralmente é mais eficiente do que comparar resultados de subconsultas com operadores comoIN.