Escreva uma Subconsulta em uma Cláusula WHERE
Nesta etapa, você aprenderá como usar uma subconsulta dentro da cláusula WHERE de uma consulta SQL. Uma subconsulta, também conhecida como consulta interna ou consulta aninhada, é uma consulta incorporada dentro de outra consulta. As subconsultas são usadas para retornar dados que serão usados na consulta principal como uma condição para restringir ainda mais os dados a serem recuperados.
Entendendo Subconsultas na Cláusula WHERE
Uma subconsulta na cláusula WHERE é tipicamente usada para comparar o valor de uma coluna com o resultado da subconsulta. A subconsulta é executada primeiro, e seu resultado é então usado pela consulta externa.
Sintaxe Básica:
SELECT column1, column2
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);
Aqui, a subconsulta (SELECT column_name FROM another_table WHERE condition) retorna um conjunto de valores. A consulta externa então seleciona linhas de table_name onde column_name está nesse conjunto.
Cenário:
Vamos supor que você tenha duas tabelas: employees (funcionários) e departments (departamentos). A tabela employees contém informações sobre os funcionários, incluindo seus employee_id (ID do funcionário), employee_name (nome do funcionário) e department_id (ID do departamento). A tabela departments contém informações sobre os departamentos, incluindo seus department_id e department_name (nome do departamento).
Queremos encontrar todos os funcionários que trabalham no departamento de 'Vendas'.
Passo 1: Criar as Tabelas e Inserir Dados
Primeiro, conecte-se ao banco de dados PostgreSQL usando o usuário postgres:
sudo -u postgres psql
Em seguida, crie a tabela departments:
CREATE TABLE departments (
department_id SERIAL PRIMARY KEY,
department_name VARCHAR(50)
);
Insira alguns dados de exemplo na tabela departments:
INSERT INTO departments (department_name) VALUES
('Sales'),
('Marketing'),
('Engineering');
Agora, crie a tabela employees:
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
employee_name VARCHAR(50),
department_id INTEGER REFERENCES departments(department_id)
);
Insira alguns dados de exemplo na tabela employees:
INSERT INTO employees (employee_name, department_id) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 1),
('David', 3),
('Eve', 2);
Passo 2: Escrever a Subconsulta
Agora, vamos escrever a consulta para encontrar todos os funcionários que trabalham no departamento de 'Vendas' usando uma subconsulta na cláusula WHERE.
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
Explicação:
- A subconsulta
(SELECT department_id FROM departments WHERE department_name = 'Sales') seleciona o department_id da tabela departments onde o department_name é 'Sales'. Neste caso, ela retornará 1.
- A consulta externa então seleciona o
employee_name da tabela employees onde o department_id está no conjunto retornado pela subconsulta (que é apenas 1).
Passo 3: Executar a Consulta e Visualizar os Resultados
Execute a consulta em seu terminal psql. Você deve ver a seguinte saída:
employee_name
---------------
Alice
Charlie
(2 rows)
Isso mostra que Alice e Charlie são os funcionários que trabalham no departamento de 'Vendas'.
Passo 4: Usando EXISTS com Subconsultas
Outra maneira de usar subconsultas na cláusula WHERE é com o operador EXISTS. O operador EXISTS testa a existência de linhas em uma subconsulta. Ele retorna verdadeiro se a subconsulta retornar alguma linha e falso caso contrário.
Aqui está um exemplo de como usar EXISTS para obter o mesmo resultado:
SELECT employee_name
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
AND d.department_name = 'Sales'
);
Esta consulta obtém o mesmo resultado que a anterior, mas usa o operador EXISTS em vez de IN.
Explicação:
- A subconsulta
SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales' verifica se existe um departamento com o nome 'Vendas' que tem o mesmo department_id que o funcionário atual.
- Se a subconsulta retornar alguma linha (significando que existe um departamento de 'Vendas' com o mesmo
department_id), o operador EXISTS retorna verdadeiro, e o nome do funcionário é selecionado.
Execute a consulta em seu terminal psql. Você deve ver a mesma saída de antes:
employee_name
---------------
Alice
Charlie
(2 rows)
Você agora usou com sucesso uma subconsulta na cláusula WHERE para filtrar dados com base em uma condição em outra tabela. Você também aprendeu como usar o operador EXISTS com uma subconsulta.