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

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

Подобно операторам UNION и INTERSECT, оператор EXCEPT возвращает строки, сравнивая результирующие наборы двух или более запросов.

Оператор EXCEPT возвращает отдельные строки из первого (левого) запроса, которые не содержатся в выводе второго (правого) запроса. Следующий запрос отображает синтаксис вызова оператора EXCEPT:

SELECT column_list
FROM A
WHERE condition_a
EXCEPT
SELECT column_list
FROM B
WHERE condition_b;

Для объединения запросов при помощи оператора EXCEPT, вы должны соблюдать следующие правила:

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

Следующая диаграмма Венна отображает результат работы оператора EXCEPT, который применяется к таблицам A и B:

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

Обратим внимание на таблицы film и inventory из примера базы данных.

Следующий запрос возвращает фильмы из таблицы film:

SELECT
    film_id,
    title
FROM
    film
ORDER BY
    title;

Следующий запрос возвращает фильмы, которые есть в прокате:

SELECT
    distinct inventory.film_id,
    title
FROM
    inventory
INNER JOIN film ON film.film_id = inventory.film_id
ORDER BY title;

Оба запроса возвращают набор результатов, который состоит из двух столбцов: film_id и title.

Чтобы получить фильмы, которых нет в прокате, используйте оператора EXCEPT следующим образом:

SELECT
    film_id,
    title
FROM
    film
EXCEPT
    SELECT
        DISTINCT inventory.film_id,
        title
    FROM
        inventory
    INNER JOIN film ON film.film_id = inventory.film_id
ORDER BY title;

Обратите внимание, что мы поместили условие ORDER BY в конец оператора, чтобы отсортировать фильмы по их названиям. Если вы поместите условие ORDER BY в каждый запрос, окончательный результат может быть не отсортирован, поскольку каждый запрос будет сортировать набор результатов по столбцу заголовка, и после этого оператор EXCEPT будет применен к обоим запросам.

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

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