Написание подзапроса в предложении WHERE
В этом шаге вы узнаете, как использовать подзапрос в предложении WHERE SQL-запроса. Подзапрос, также известный как внутренний запрос или вложенный запрос (nested query), — это запрос, встроенный внутрь другого запроса. Подзапросы используются для возврата данных, которые будут использоваться в основном запросе в качестве условия для дальнейшего ограничения извлекаемых данных.
Понимание подзапросов в предложении WHERE
Подзапрос в предложении WHERE обычно используется для сравнения значения столбца с результатом подзапроса. Подзапрос выполняется первым, и его результат затем используется внешним запросом.
Базовый синтаксис:
SELECT column1, column2
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);
Здесь подзапрос (SELECT column_name FROM another_table WHERE condition) возвращает набор значений. Внешний запрос затем выбирает строки из table_name, где column_name находится в этом наборе.
Сценарий:
Предположим, у вас есть две таблицы: employees и departments. Таблица employees содержит информацию о сотрудниках, включая их employee_id, employee_name и department_id. Таблица departments содержит информацию об отделах, включая их department_id и department_name.
Мы хотим найти всех сотрудников, работающих в отделе 'Sales' (продаж).
Шаг 1: Создайте таблицы и вставьте данные
Сначала подключитесь к базе данных PostgreSQL, используя пользователя postgres:
sudo -u postgres psql
Затем создайте таблицу departments:
CREATE TABLE departments (
department_id SERIAL PRIMARY KEY,
department_name VARCHAR(50)
);
Вставьте некоторые примеры данных в таблицу departments:
INSERT INTO departments (department_name) VALUES
('Sales'),
('Marketing'),
('Engineering');
Теперь создайте таблицу employees:
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
employee_name VARCHAR(50),
department_id INTEGER REFERENCES departments(department_id)
);
Вставьте некоторые примеры данных в таблицу employees:
INSERT INTO employees (employee_name, department_id) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 1),
('David', 3),
('Eve', 2);
Шаг 2: Напишите подзапрос
Теперь давайте напишем запрос для поиска всех сотрудников, работающих в отделе 'Sales', используя подзапрос в предложении WHERE.
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
Объяснение:
- Подзапрос
(SELECT department_id FROM departments WHERE department_name = 'Sales') выбирает department_id из таблицы departments, где department_name равен 'Sales'. В этом случае он вернет 1.
- Внешний запрос затем выбирает
employee_name из таблицы employees, где department_id находится в наборе, возвращенном подзапросом (который равен 1).
Шаг 3: Выполните запрос и просмотрите результаты
Выполните запрос в вашем терминале psql. Вы должны увидеть следующий вывод:
employee_name
---------------
Alice
Charlie
(2 rows)
Это показывает, что Alice и Charlie — сотрудники, работающие в отделе 'Sales'.
Шаг 4: Использование EXISTS с подзапросами
Другой способ использования подзапросов в предложении WHERE — с оператором EXISTS. Оператор EXISTS проверяет наличие строк в подзапросе. Он возвращает true, если подзапрос возвращает какие-либо строки, и false в противном случае.
Вот пример использования EXISTS для достижения того же результата:
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'
);
Этот запрос достигает того же результата, что и предыдущий, но использует оператор EXISTS вместо IN.
Объяснение:
- Подзапрос
SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales' проверяет, есть ли отдел с именем 'Sales', у которого тот же department_id, что и у текущего сотрудника.
- Если подзапрос возвращает какие-либо строки (что означает, что есть отдел 'Sales' с тем же
department_id), оператор EXISTS возвращает true, и выбирается имя сотрудника.
Выполните запрос в вашем терминале psql. Вы должны увидеть тот же вывод, что и раньше:
employee_name
---------------
Alice
Charlie
(2 rows)
Теперь вы успешно использовали подзапрос в предложении WHERE для фильтрации данных на основе условия в другой таблице. Вы также узнали, как использовать оператор EXISTS с подзапросом.