Базы данных | Практическое занятие 6
Использование UNION, INTERSECT и EXCEPT в PostgreSQL
Введение в операции над множествами
Операции над множествами в SQL рассматривают результаты операторов SELECT как математические множества, позволяя вам комбинировать или сравнивать их. Мы рассмотрим три операции:
- UNION: Объединяет результирующие наборы двух или более операторов
SELECTв один результирующий набор, удаляя повторяющиеся строки. - INTERSECT: Возвращает только те строки, которые присутствуют во всех указанных операторах
SELECT. - EXCEPT: Возвращает строки из первого оператора
SELECT, которые отсутствуют в последующих операторахSELECT.
Настройка примеров таблиц
Чтобы продемонстрировать эти операции, мы будем использовать две простые таблицы: math_enrollments и science_enrollments. Каждая таблица содержит список студентов, зачисленных на курсы математики или естественных наук, со столбцами student_id (целое число) и student_name (текст).
Выполните следующие команды SQL в редакторе SQL pgAdmin 4, чтобы создать и заполнить эти таблицы:
CREATE TABLE math_enrollments (
student_id integer,
student_name text
);
CREATE TABLE science_enrollments (
student_id integer,
student_name text
);
INSERT INTO math_enrollments (student_id, student_name) VALUES
(1, 'AZIMJON'),
(2, 'SHOHZODBEK'),
(3, 'SULTONBEK');
INSERT INTO science_enrollments (student_id, student_name) VALUES
(2, 'SHOHZODBEK'),
(4, 'XAYRULLO'),
(5, 'AZIZBEK');
После выполнения этих команд ваши таблицы готовы. В pgAdmin 4 вывод подтвердит, что таблицы созданы и данные успешно вставлены.
UNION: Объединение результатов
Операция UNION объединяет результаты двух или более операторов SELECT в один результирующий набор, автоматически удаляя дубликаты.
Синтаксис
SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
Пример
Чтобы получить список всех студентов, зачисленных либо на математику, либо на естественные науки:
SELECT student_id, student_name FROM math_enrollments
UNION
SELECT student_id, student_name FROM science_enrollments;
Выполните этот запрос в pgAdmin 4. Результат появится на вкладке Data Output:

Пояснение
- Результат включает всех уникальных студентов из обеих таблиц.
- SHOHZODBEK, который присутствует как в
math_enrollments, так и вscience_enrollments, появляется только один раз, потому чтоUNIONудаляет дубликаты.
Вариант UNION ALL
Если вы хотите включить дубликаты (если они существуют), используйте UNION ALL:
SELECT student_id, student_name FROM math_enrollments
UNION ALL
SELECT student_id, student_name FROM science_enrollments;

В наших примерах данных нет повторяющихся строк, поэтому результат идентичен UNION. Однако UNION ALL работает быстрее, потому что не проверяет наличие дубликатов.
INTERSECT: Поиск общих строк
Операция INTERSECT возвращает только те строки, которые присутствуют во всех указанных операторах SELECT.
Синтаксис
SELECT column1, column2, ... FROM table1
INTERSECT
SELECT column1, column2, ... FROM table2;
Пример
Чтобы найти студентов, зачисленных и на математику, и на естественные науки:
SELECT student_id, student_name FROM math_enrollments
INTERSECT
SELECT student_id, student_name FROM science_enrollments;
Выполните этот запрос. Результат:

Пояснение
- Только SHOHZODBEK присутствует в обеих таблицах, поэтому он является единственной возвращаемой строкой.
INTERSECTсравнивает целые строки, поэтому должны совпадать иstudent_id, иstudent_name.
EXCEPT: Поиск различий
Операция EXCEPT возвращает строки из первого оператора SELECT, которые отсутствуют во втором операторе SELECT.
Синтаксис
SELECT column1, column2, ... FROM table1
EXCEPT
SELECT column1, column2, ... FROM table2;
Пример 1: Математика, но не естественные науки
Чтобы найти студентов, зачисленных на математику, но не на естественные науки:
SELECT student_id, student_name FROM math_enrollments
EXCEPT
SELECT student_id, student_name FROM science_enrollments;
Результат:

Пример 2: Естественные науки, но не математика
Чтобы найти студентов, зачисленных на естественные науки, но не на математику:
SELECT student_id, student_name FROM science_enrollments
EXCEPT
SELECT student_id, student_name FROM math_enrollments;
Результат:

Пояснение
- В примере 1, AZIMJON и SULTONBEK присутствуют в
math_enrollments, но не вscience_enrollments. - В примере 2, XAYRULLO и AZIZBEK присутствуют в
science_enrollments, но не вmath_enrollments. - Порядок операторов
SELECTимеет значение при использованииEXCEPT, в отличие отUNIONиINTERSECT.
Ключевые требования и примечания
Для успешного использования операций над множествами в PostgreSQL:
- Количество столбцов: Каждый оператор
SELECTдолжен возвращать одинаковое количество столбцов. - Типы данных: Соответствующие столбцы должны иметь совместимые типы данных (например, целое число с целым числом, текст с текстом).
- Имена столбцов: Результирующий набор использует имена столбцов из первого оператора
SELECT. - Дубликаты:
UNIONиINTERSECTудаляют дубликаты; используйтеALL(например,UNION ALL), чтобы сохранить их. - Несколько операций: Вы можете объединять операции в цепочку, например,
SELECT ... UNION SELECT ... UNION SELECT ....
Распространенные ошибки
- Несовпадающие столбцы: Это не сработает:
SELECT student_id FROM math_enrollments UNION SELECT student_name FROM science_enrollments;Ошибка: Типы данных (целое число и текст) не совпадают.
- Разное количество столбцов: Это не сработает:
SELECT student_id, student_name FROM math_enrollments UNION SELECT student_id FROM science_enrollments;Ошибка: Неравное количество столбцов.