O que são Non-Correlated Subqueries?

Uma Non-Correlated Subquery (Subconsulta Não-Correlacionada) é uma subconsulta que é completamente independente da consulta externa. Isso significa que a subconsulta pode ser executada de forma isolada da consulta principal e retorna um conjunto de resultados que não depende dos valores da consulta externa. Ao contrário das subconsultas correlacionadas, as non-correlated subqueries são executadas apenas uma vez e seus resultados são usados pela consulta principal.

Como Funcionam?

As subconsultas não-correlacionadas são executadas antes da consulta principal e o resultado é passado para esta última. Como a subconsulta não depende de nenhuma linha específica da consulta externa, ela é executada uma única vez e o resultado é reutilizado em cada linha da consulta externa, tornando-as mais eficientes em termos de desempenho em comparação com subconsultas correlacionadas.

Estrutura Básica

A estrutura de uma subconsulta não-correlacionada geralmente se parece com isto:

SELECT coluna1, coluna2, ...
FROM tabela_externa
WHERE coluna IN (
    SELECT coluna
    FROM tabela_interna
    WHERE alguma_condicao
);

Aqui, a subconsulta dentro dos parênteses (SELECT coluna FROM tabela_interna WHERE alguma_condicao) não faz referência a nenhuma coluna da consulta externa.

Exemplo 1: Encontrar Produtos em uma Categoria Específica

Imagine que você tem duas tabelas: Produtos e Categorias. A tabela Produtos tem colunas como id_produto, nome_produto, preco, e id_categoria. A tabela Categorias tem id_categoria e nome_categoria. Queremos encontrar todos os produtos que pertencem à categoria "Eletrônicos".

SELECT nome_produto, preco
FROM Produtos
WHERE id_categoria = (
    SELECT id_categoria
    FROM Categorias
    WHERE nome_categoria = 'Eletrônicos'
);

Explicação:

Exemplo 2: Encontrar Empregados que Ganham Mais do que a Média Salarial

Suponha que temos uma tabela Empregados com as colunas id_empregado, nome, e salario. Queremos encontrar todos os empregados que ganham mais do que a média salarial de todos os empregados.

SELECT nome, salario
FROM Empregados
WHERE salario > (
    SELECT AVG(salario)
    FROM Empregados
);

Explicação: