Pular para o conteúdo principal
Documentos
Sintaxe básicaFunções JSONAcionadoresGerenciamento de tabelas e esquemasFunções de cadeia de caracteresFunções matemáticasFunções de dataBancos de dadosÍndices

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 EXISTS para verificações de existência. Geralmente é mais eficiente do que comparar resultados de subconsultas com operadores como IN.