Voltar para a lista de artigos Artigos
5 minutos de leitura

Aprenda a Escrever uma Subconsulta relacionada a SQL em 5 minutos

Se você está familiarizado com o famoso boneco de nidificação russo, então as subconsultas correlatas do SQL devem ser uma paz de bolo para entender - as subconsultas são apenas consultas aninhadas dentro de consultas. Uma subconsulta SQL é freqüentemente chamada de consulta "interna"; a consulta principal é normalmente chamada de consulta "externa". Este artigo cobre tudo o que você precisa saber sobre subconsultas correlatas.

O que é exatamente uma subconsulta relacionada a SQL Correspondente?

Uma subconsulta SQL correlacionada é apenas uma subconsulta que é executada muitas vezes - uma vez para cada registro (linha) retornado pela consulta "externa" (principal). Em outras palavras, a consulta externa retorna uma tabela com várias linhas; a consulta interna então é executada uma vez para cada uma dessas linhas. Se sua consulta externa retorna 10 linhas, então a consulta interna será executada 10 vezes. E se sua consulta externa retorna 100 linhas, a consulta interna será executada 100 vezes.

Quando você deve usar uma subconsulta relacionada ao SQL Correspondente?

Algumas perguntas de dados só podem ser respondidas com subconsultas correlatas. Isto é particularmente verdadeiro quando se fazem perguntas de dados negativos.

Perguntas de dados negativos surgem quando procuramos por registros que não satisfazem uma determinada condição. Um exemplo de uma simples pergunta de dados negativos é: "Obter os nomes de todos os filmes não produzidos por Steven Spielberg".

Vamos resolver um exemplo de uma questão de dados negativos neste artigo. Antes de fazermos isso, vamos primeiro rever as tabelas envolvidas. Temos duas tabelas: a tabela employee mesa e o payment_history mesa. A segunda tabela tem uma coluna chamada payment_type que denota se um pagamento é parte de um salário regular, um bônus, ou um prêmio. Vamos ver alguns exemplos de dados das tabelas que utilizaremos:

employee

employee_id payment_type amount_paid payment_date
100 salary 2000.00 2018-Mar-02
101 salary 1800.00 2018-Mar-02
102 salary 1900.00 2018-Mar-02
101 award 500.00 2018-Mar-08
102 adjustment 124.70 2018-Mar-10

payment_history

employee_id payment_type amount_paid payment_date
100 salary 2000.00 2018-Mar-02
101 salary 1800.00 2018-Mar-02
102 salary 1900.00 2018-Mar-02
101 award 500.00 2018-Mar-08
102 adjustment 124.70 2018-Mar-10

Aqui está a pergunta sobre dados negativos que gostaríamos de responder:

"Obter os nomes de funcionários que nunca receberam um prêmio".

A consulta SQL que responde à pergunta anterior é a seguinte:

SELECT last_name, first_name
FROM    employee e1
WHERE NOT EXISTS (SELECT ph.last_name 
                                      FROM payment_history ph 
                                      WHERE ph.employee_id = e1.employee_id 
                                      AND ph.payment_type = 'award')

Subconsultas SQL Correlatas Vs. Subconsultas simples

A principal diferença entre uma subconsulta SQL correlacionada e uma subconsulta simples é que uma subconsulta SQL correlacionada faz referência a colunas da tabela da consulta externa.

No exemplo acima, ph.employee_id = e1.employee_id é uma referência à tabela de subconsultas externas (e1). Para identificar uma subconsulta correlata, basta procurar este tipo de referência. Se você encontrar pelo menos uma, você tem uma subconsulta correlata!

A parte negativa de uma questão de dados é freqüentemente resolvida em uma subconsulta correlacionada a SQL usando o operador NOT EXISTS na cláusula WHERE. EXISTS é um operador sempre seguido por uma subconsulta. Se a subconsulta retornar pelo menos um registro, então EXISTS avalia para TRUE. Se a subconsulta retornar um conjunto vazio, então EXISTS avalia para FALSE. Note que usamos NOT EXISTS, que é simplesmente o oposto de EXISTS.

O resultado da consulta anterior é:

first_name last_name
John Smith
Alice Johnson

Outro exemplo de subconsulta relacionada a Cor

Neste exemplo, tentaremos obter os nomes de todos os funcionários que ganharam salários mais altos em março de 2018 do que sua média mensal de salários de todos os meses anteriores, utilizando uma subconsulta correlata SQL. Aqui está a consulta que vamos fazer:

SELECT    first_name, last_name 
FROM       employee e1, payment_history ph
WHERE    e1.employee_id = ph.employee_id 
     AND     amount_paid > = (
                               SELECT AVG(amount_paid) FROM payment_history ph2
                               WHERE ph2.employee_id = e1.employee_id
                                     AND ph2.payment_date  < '01/03/2018'
                                     AND ph2.payment_type = 'salary' 
                               )
     AND    month(ph.payment_date) =3 
     AND    year(ph.payment_date) = 2018 
     AND    ph.payment_type ='salary'

Chega de Negatividade. E as perguntas sobre dados positivos?

Devemos usar uma subconsulta correlacionada a SQL para responder a uma pergunta de dados positiva? Não, você não precisa. Mas você ainda pode fazer isso se quiser. Para perguntas positivas, geralmente podemos usar apenas uma condição JOIN ou uma relação entre duas tabelas.

Vamos mudar nossa pergunta anterior para uma positiva e resolvê-la com um JOIN em vez disso, uma subconsulta correlata. A pergunta se torna: "Obter os nomes dos funcionários que receberam pagamentos de prêmios". E a consulta SQL (sem subconsultas correlacionadas) que responde a esta pergunta é:

SELECT    first_name, last_name 
FROM       employee e1 
                 JOIN payment_history ph ON  ph.employee_id = e1.employee_id 
WHERE    ph.payment_type =award'

O resultado é: "Obter nomes de funcionários que receberam pagamentos de prêmios":

first_name last_name
Kate Miller

Advertência: Sua subconsulta relacionada ao SQL Cor é provável que seja lenta

Gostaria apenas de mencionar que tentamos não usar em demasia subconsultas correlatas SQL, se possível. Lembre-se de que uma subconsulta correlacionada é executada uma vez para cada registro retornado pela consulta externa. Se a consulta externa retornar milhares e milhares de registros, você pode imaginar a rapidez com que sua consulta irá diminuir o desempenho. Em geral, você só deve usar uma subconsulta correlata SQL se ela for absolutamente necessária.

Tente você mesmo uma subconsulta relacionada à SQL Correspondente!

Já vimos que as subconsultas correlacionadas são uma parte importante da linguagem SQL e podem nos ajudar a responder diferentes perguntas de dados, especialmente as negativas. Também explicamos como reconhecer uma subconsulta SQL correlacionada e porque devemos geralmente tentar evitar subconsultas correlacionadas, se possível, devido a razões de desempenho.

Para melhorar suas habilidades de subconsulta, tente LearnSQL.com.br's SQL para Iniciantes curso. Temos uma seção específica dedicada a subconsultas, com muitos exercícios práticos e exemplos de subconsultas correlacionadas para ajudá-lo a dominar o conteúdo.