Множественные операции в SQL
Теория: Пересечение запросов
Представим, что нам нужно определить, какие курсы читались и в 2022 и в 2023 году.
Другими словами, нам нужно найти пересечение двух множеств. В языке SQL это можно сделать с помощью оператора INTERSECT.
Оператор INTERSECT
Чтобы найти пересечение двух подзапросов, нужно между ними написать оператор INTERSECT:
Такой запрос вернет нам четыре строки - те курсы, которые читались в обоих годах.
Правила использования
Для INTERSECT действуют те же два правила, что и для UNION.
В обоих подзапросах должно быть одинаковое количество столбцов, а сами столбцы должны иметь одинаковые типы данных.

Два следующих запроса не выполнятся, потому что в первом разное количество столбцов в подзапросах, а во втором - столбцы разного типа
Для INTERSECT, как и для UNION, СУБД будет следить только за тем, чтобы типы данных столбцов были одинаковые. Логический смысл СУБД не проверяет.
Если мы в первом подзапросе укажем столбец username, а во втором - coursename, то запрос выполнится, но вернет нам пустое множество, потому что среди названий курсов и
имен пользователей нет пересечений - они все разные.
INTERSECT ALL
По умолчанию, INTERSECT, как и UNION не выводит дублирующиеся строки.
В первом запросе этого урока результат содержал 4 строки - уникальные названия курсов, которые читались в 2022 и в 2023 году.
Но бывает полезно узнать не только какие записи совпадают, но и сколько их.
Если использовать оператор INTERSECT ALL, то запрос вернет все записи, даже дублирующиеся.

Результат запроса:
Это означает, что в каждом году есть как минимум 2 пользователя, записавшихся на Python, как минимум 3 пользователя, записавшихся на SQL и так далее.
Еще лучше понять этот результат INTERSECT ALL можно, если посмотреть, сколько человек записано на курс PHP в каждом году:
Запрос вернет две таблицы.
Для 2022 года:
Для 2023 года:
Мы видим, что у этих таблиц общая только одна строка, поэтому последний запрос с оператором INTERSECT ALL вывел только одну строку для курса PHP
Выводы
В этом уроке мы узнали, как можно находить пересечение двух запросов с помощью оператора INTERSECT.
Другими словами, INTERSECT ищет одинаковые строки двух запросов.
Для его использования необходимо соблюдение двух правил: объединяемые запросы должны иметь одинаковое количество столбцов, а сами столбцы должны иметь одинаковые типы данных.
INTERSECT по умолчанию удаляет дублирующиеся строки. Если необходимо вывести все строки, то нужно использовать INTERSECT ALL.
Рекомендуемые программы
Завершено
0 / 5

