PostgreSQL оператор INTERSECT

В этом учебном пособии вы узнаете, как использовать в PostgreSQL оператор INTERSECT с синтаксисом и примерами.

Описание

PostgreSQL оператор INTERSECT возвращает пересечение 2 или более наборов данных. Каждый набор данных определяется оператором SELECT. Если запись существует в обоих наборах данных, она будет включена в результаты INTERSECT. Однако, если запись существует в одном наборе данных, а не в другом, она будет опущена в результатах INTERSECT.

INTERSECT запрос

Объяснение: Запрос INTERSECT вернет записи в синей заштрихованной области. Это записи, которые существуют как в select 1, так и в select 2.
Каждый оператор SELECT в INTERSECT должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.

Синтаксис

Синтаксис для оператора INTERSECT в PostgreSQL:

SELECT expression1, expression2,... expression_n
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, в котором есть одно поле с одинаковым типом данных:

В этом примере INTERSECT, если category_id появился и в таблице products, и в таблице inventory, он появится в вашем результирующем наборе.
Теперь давайте усложним наш пример, добавив условия WHERE к запросу INTERSECT.

В этом примере WHERE были добавлены к каждому из наборов данных. Первый набор данных был отфильтрован так, что возвращаются только те записи из таблицы products, где category_id меньше 800. Второй набор данных был отфильтрован по записям из таблицы inventory, где quantity больше 5.

Пример - с несколькими выражениями

Далее рассмотрим пример использования оператора INTERSECT в PostgreSQL для возврата более одного столбца.
Например:

В этом примере запрос 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 :

Поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в ORDER BY по их положению в результирующем наборе. В этом примере мы отсортировали результаты по contact_id / company_id в порядке возрастания, как обозначено ORDER BY 1.
Поля contact_id / company_id находятся в позиции № 1 в результирующем наборе.