Множества (UNION) в PostgreSQL

Статья основана на 21 видео из 30 тем курса SQL c 0 от Аристова Евгения. Ссылки на видео на платформах RUTUBE и VK видео.

Множества

Множество в PostgreSQL – совокупность результирующих строк, построенная с помощью запроса.

Если множества совпадают по количеству и типу аргументов, то над ними можно проводить следующие операции:

  • объединение (UNION)
  • пересечение (INTERSECT)
  • вычитание (EXCEPT)

Ограничений на количество таких последовательных операций над множествами нет, очередность операций можно определять скобками.

Также есть возможность оставлять дубликаты или убирать их, для этого есть специальное слово ALL. При его отсутствии после завершения очередной операции будут оставлены только уникальные значения (DISTINCT). Учтите, что это дорогая операция и её использование должно быть целесообразно.

Обратите внимание, что операции над множествами возвращают значения в произвольном порядке.

Рекомендации:

  • Задавать имена полям
  • Сортировку осуществлять только в самый последний момент

Объединение – UNION

UNION объединяет результаты двух запросов. Результатом операции являются строки из всех множеств, но можно исключить дубликаты (убрав ключевое слово ALL).

Синтаксис:

SELECT <target list>
FROM <table>
UNION [ALL]
SELECT <target list>
FROM <table2>

Создадим две таблицы – Столы и Стулья. Вставим по два значения в каждую:

CREATE TABLE tables (
    color text, 
    type_table text
);
CREATE TABLE chairs (
    color text, 
    type_chair text
);
INSERT INTO tables VALUES 
    ('white', 'classic'),
    ('black', 'classic');
INSERT INTO chairs VALUES 
    ('white', 'plastic'),
    ('blue', 'plastic');

Объединим все цвета столов со всеми цветами стульев:

SELECT color
FROM tables
UNION ALL
SELECT color
FROM chairs;

Уберем из этого запроса ALL (то есть применим DISTINCT):

SELECT color
FROM tables
UNION
SELECT color
FROM chairs;

Напишем запрос, который сначала выбирает все цвета из таблицы Столы, затем объединяет с цветами из таблицы Стулья и отбрасывает дубликаты (так как нет слова ALL) – получается три цвета. После этого с помощью UNION ALL объединяются уже получившиеся цвета с цветами стульев (дубликаты оставляются):

SELECT color
FROM tables
UNION
SELECT color
FROM chairs
UNION ALL
SELECT color
FROM chairs;

Пересечение – INTERSECT

INTERSECT пересекает результаты двух запросов. Результатом операции являются только те строки, которые полностью совпали. Аналогично с другими операциями можно убрать дубликаты (убрав ключевое слово ALL).

Синтаксис:

SELECT <target list>
FROM <table>
INTERSECT [ALL]
SELECT <target list>
FROM <table2>

Добавим в наши таблицы новые значения:

INSERT INTO tables VALUES 
    ('white', 'classic2'),
    ('black', 'classic2');
INSERT INTO chairs VALUES 
    ('white', 'plastic2'),
    ('blue', 'plastic2');

Найдём пересечение цветов Столов и Стульев:

SELECT color
FROM tables
INTERSECT ALL
SELECT color
FROM chairs;

Важно, что INTERSECT, в отличие от JOIN, не сопоставляет каждое с каждым. Если к данному объекту уже найдено совпадение, то второй раз он не используется и, соответственно, в результирующую выборку второй раз не попадает.

Исключение – EXCEPT

EXCEPT исключает результаты второго запроса из первого. Результатом операции являются только те строки, которые есть в первом множестве , но отсутствуют во втором. Аналогично с другими операциями можно убрать дубликаты (убрав ключевое слово ALL).

Синтаксис:

SELECT <target list>
FROM <table>
EXCEPT [ALL]
SELECT <target list>
FROM <table2>

Пересоздадим таблицы:

CREATE TABLE tables (
    color text, 
    type_table text
);
CREATE TABLE chairs (
    color text, 
    type_chair text
);
INSERT INTO tables VALUES 
    ('white', 'classic'),
    ('black', 'classic');
INSERT INTO chairs VALUES 
    ('white', 'plastic'),
    ('blue', 'plastic');

Вычтем из цветов столов цвета стульев:

SELECT color
FROM TABLES
EXCEPT ALL
SELECT color
FROM chairs;

Добавим две строки в таблицу Столы:

INSERT INTO tables VALUES 
    ('white', 'classic'),
    ('black', 'classic');

Выполним запрос, который сначала вычитает из цветов столов цвета стульев (остается белый и два черных), а затем снова цвета стульев:

SELECT color
FROM TABLES
EXCEPT ALL
SELECT color
FROM chairs
EXCEPT ALL
SELECT color
FROM chairs;

Презентация к статье здесь.

22 из 30 тем будет скоро доступна. Если вы хотите быстрее получить доступ – присоединяйтесь к онлайн группе, ссылка доступна в описании курса.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

3 × 4 =