В этом учебном пособии вы узнаете, как использовать в PostgreSQL оператор INTERSECT с синтаксисом и примерами.
Описание
PostgreSQL оператор INTERSECT возвращает пересечение 2 или более наборов данных. Каждый набор данных определяется оператором SELECT. Если запись существует в обоих наборах данных, она будет включена в результаты INTERSECT. Однако, если запись существует в одном наборе данных, а не в другом, она будет опущена в результатах INTERSECT.
INTERSECT запрос
Объяснение: Запрос INTERSECT вернет записи в синей заштрихованной области. Это записи, которые существуют как в select 1, так и в select 2.
Каждый оператор SELECT в INTERSECT должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
Синтаксис
Синтаксис для оператора INTERSECT в PostgreSQL:
FROM tables
[WHERE conditions]
INTERSECT
SELECT expression1, expression2,... expression_n
FROM tables
[WHERE conditions];
Параметры или аргументы
- expression1, expression2, expression_n
- Столбцы или вычисления, которые вы хотите получить.
- tables
- Таблицы, из которых вы хотите получить записи. В операторе FROM должна быть указана хотя бы одна таблица.
- WHERE conditions
- Необязательный. Это условия, которые должны быть соблюдены для выбора записей.
Примечание
- В обоих операторах SELECT должно быть одинаковое количество выражений.
- Соответствующие выражения должны иметь одинаковый тип данных в операторах SELECT. Например: expression1 должен иметь одинаковый тип данных как в первом, так и во втором операторе SELECT.
Пример - с одним выражением
Ниже приведен пример оператора INTERSECT, в котором есть одно поле с одинаковым типом данных:
1 2 3 4 5 |
SELECT category_id FROM products INTERSECT SELECT category_id FROM inventory; |
В этом примере INTERSECT, если category_id появился и в таблице products, и в таблице inventory, он появится в вашем результирующем наборе.
Теперь давайте усложним наш пример, добавив условия WHERE к запросу INTERSECT.
1 2 3 4 5 6 7 |
SELECT category_id FROM products WHERE category_id < 800 INTERSECT SELECT category_id FROM inventory WHERE quantity > 5; |
В этом примере WHERE были добавлены к каждому из наборов данных. Первый набор данных был отфильтрован так, что возвращаются только те записи из таблицы products, где category_id меньше 800. Второй набор данных был отфильтрован по записям из таблицы inventory, где quantity больше 5.
Пример - с несколькими выражениями
Далее рассмотрим пример использования оператора INTERSECT в PostgreSQL для возврата более одного столбца.
Например:
1 2 3 4 5 6 7 |
SELECT contact_id, last_name, first_name FROM contacts WHERE last_name <> 'Ivanov' INTERSECT SELECT customer_id, last_name, first_name FROM customers WHERE customer_id < 100; |
В этом примере запрос INTERSECT вернет записи из таблицы contacts, где contact_id, last_name и first_name значения соответствуют значениям customer_id, last_name и first_name из таблицы customers.
В каждом наборе данных есть условия WHERE для дальнейшей фильтрации результатов, чтобы возвращались только записи из contacts, где last_name не равно 'Ivanov'. Записи из таблицы customer возвращаются, где customer_id меньше 100.
Пример - использование ORDER BY
Ниже приведен пример INTERSECT, в котором используется оператор ORDER BY :
1 2 3 4 5 6 7 8 |
SELECT contact_id, contact_name FROM contacts WHERE contact_id < 100 INTERSECT SELECT company_id, company_name FROM companies WHERE state = 'Nevada' ORDER BY 1; |
Поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в ORDER BY по их положению в результирующем наборе. В этом примере мы отсортировали результаты по contact_id / company_id в порядке возрастания, как обозначено ORDER BY 1
.
Поля contact_id / company_id находятся в позиции № 1 в результирующем наборе.