Данная статья относится к циклу статей, посвященных PostgreSQL. В предыдущей статье мы говорили об операторе PostgreSQL UNION. Теперь же мы углубимся в изучение оператора INTERSECT, при помощи которого мы будем объединять двух или более операторов SELECT в один набор результатов.

Введение в оператор PostgreSQL INTERSECT

Подобно операторам UNION и EXCEPT, оператор PostgreSQL INTERSECT объединяет наборы результатов двух или более операторов SELECT в один.

Следующая диаграмма отображает окончательный набор результатов, созданный оператором INTERSECT. Непосредственно конечный набор результатов представлен желтой областью, где круг A пересекается с кругом B.

Ниже показан синтаксис вызова оператора INTERSECT:

SELECT
    column_list
FROM
    A
INTERSECT
SELECT
    column_list
FROM
    B;

Чтобы использовать оператор INTERSECT, столбцы, которые появляются в операторах SELECT, должны соответствовать следующим правилам:

  • Количество столбцов и их порядок в предложениях SELECT должны быть одинаковыми.
  • Типы данных столбцов должны быть совместимы.

Примеры использования оператора PostgreSQL INTERSECT

Давайте создадим несколько таблиц для наглядности.

Следующий оператор CREATE TABLE создаёт три таблицы: employees, keys и hipos.

CREATE TABLE employees (
    employee_id serial PRIMARY KEY,
    employee_name VARCHAR (255) NOT NULL
);

CREATE TABLE keys (
    employee_id INT PRIMARY KEY,
    effective_date DATE NOT NULL,
    FOREIGN KEY (employee_id) REFERENCES employees (employee_id)
);

CREATE TABLE hipos (
    employee_id INT PRIMARY KEY,
    effective_date DATE NOT NULL,
    FOREIGN KEY (employee_id) REFERENCES employees (employee_id)
);

В таблице employees хранятся основные данные сотрудников. В таблице keys хранятся ключевые сотрудники, а в hipos — сотрудники с высоким потенциалом и высокой эффективностью.

Следующие операторы INSERT вставляют некоторые данные в таблицы employees, keys и hipos:

INSERT INTO employees (employee_name)
VALUES
    ('Joyce Edwards'),
    ('Diane Collins'),
    ('Alice Stewart'),
    ('Julie Sanchez'),
    ('Heather Morris'),
    ('Teresa Rogers'),
    ('Doris Reed'),
    ('Gloria Cook'),
    ('Evelyn Morgan'),
    ('Jean Bell');

INSERT INTO keys
VALUES
    (1, '2000-02-01'),
    (2, '2001-06-01'),
    (5, '2002-01-01'),
    (7, '2005-06-01');

INSERT INTO hipos
VALUES
    (9, '2000-01-01'),
    (2, '2002-06-01'),
    (5, '2006-06-01'),
    (10, '2005-06-01');

Следующий запрос возвращает ключевых сотрудников из таблицы keys:

SELECT
    employee_id
FROM
    keys;
 employee_id
-------------
           1
           2
           5
           7
(4 rows)

Ниже представлен запрос, возвращающий список employee_id из таблицы hipos:

SELECT
    employee_id
FROM hipos;
 employee_id
-------------
           9
           2
           5
          10
(4 rows)

Чтобы получить сотрудников, которые являются одновременно и ключевыми и “hipo”, используем следующий запрос:

SELECT
    employee_id
FROM
    keys
INTERSECT
SELECT
    employee_id
FROM
    hipos;
 employee_id
-------------
           5
           2
(2 rows)

Результирующий набор показывает, что сотрудники с ID 2 и 5 удовлетворяют данному условию.

Чтобы отсортировать набор результатов, возвращаемый оператором INTERSECT, вам необходимо поместить условие ORDER BY в конец оператора, но никак не в конец каждого оператора SELECT. Ниже представлен такой запрос:

SELECT
    employee_id
FROM
    keys
INTERSECT
SELECT
    employee_id
FROM
    hipos
ORDER BY employee_id;
 employee_id
-------------
           2
           5
(2 rows)

На этом мы заканчиваем изучение оператора PostgreSQL INTERSECT и переходим к изучению оператора EXCEPT, использовать который мы будем для возврата строк в первом запросе, не отображающихся в выходных данных второго запроса.

Источник: PostgreSQL Tutorial from Scratch