INTERSECT и EXCEPT для сравнения
Находите общие и различающиеся строки в двух наборах данных.
«INTERSECT и EXCEPT для сравнения» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Операторы сравнения
INTERSECT и EXCEPT — это операции над множествами для сравнения двух наборов результатов, а не для их объединения. На собеседованиях их используют в вопросах вроде «какие клиенты есть в обоих списках» или «какие строки есть в A, но отсутствуют в B».
INTERSECT= строки, присутствующие в обоих запросах.EXCEPT= строки из первого запроса, которых нет во втором.
Что возвращает INTERSECT
INTERSECT возвращает только уникальные строки, присутствующие в обоих наборах результатов. Чтобы считаться общей, строка должна совпадать по каждому столбцу.
Как и UNION, обычный INTERSECT удаляет дубликаты и возвращает каждую общую строку один раз.
SELECT customer_id FROM orders_2023
INTERSECT
SELECT customer_id FROM orders_2024;
-- customers who ordered in BOTH yearsЧто возвращает EXCEPT
EXCEPT (в Oracle называется MINUS) возвращает уникальные строки из первого запроса, которые не встречаются во втором. Этот оператор направленный: A EXCEPT B отличается от B EXCEPT A.
Это естественный способ найти записи, отсутствующие во втором наборе данных.
SELECT customer_id FROM orders_2023
EXCEPT
SELECT customer_id FROM orders_2024;
-- ordered in 2023 but NOT in 2024 (churned)EXCEPT несимметричен
Популярный вопрос на собеседовании: EXCEPT является направленным оператором. Перестановка двух запросов отвечает на другой вопрос.
A EXCEPT B= есть в A, но нет в B.B EXCEPT A= есть в B, но нет в A.
INTERSECT, напротив, симметричен: A INTERSECT B равно B INTERSECT A.
-- new customers in 2024 (not seen in 2023):
SELECT customer_id FROM orders_2024
EXCEPT
SELECT customer_id FROM orders_2023;Дубликаты и поведение DISTINCT по умолчанию
Стандартные INTERSECT и EXCEPT работают с уникальными строками, как и UNION. Дублирующиеся входные строки объединяются перед сравнением.
Некоторые базы данных поддерживают INTERSECT ALL и EXCEPT ALL, которые учитывают количество повторений, но они встречаются реже. Если интервьюер не указывает ALL, подразумевайте работу с уникальными строками.
SELECT city FROM a
INTERSECT ALL
SELECT city FROM b;
-- multiplicity-aware (Postgres supports this; MySQL 8+ too)Сравнение целых строк на равенство
Оба оператора сравнивают целые строки по всем выбранным столбцам. Две строки равны только тогда, когда совпадает каждый столбец. Поэтому эти операторы отлично подходят для проверки того, содержат ли две таблицы одинаковые данные.
Выберите полный набор интересующих вас столбцов, чтобы сравнение имело смысл.
SELECT id, name, email FROM prod_users
EXCEPT
SELECT id, name, email FROM staging_users;
-- rows in prod that differ from / are missing in stagingШаблон двустороннего сравнения таблиц
Чтобы проверить, идентичны ли две таблицы, выполните EXCEPT в обоих направлениях и объедините различия. Если объединённый результат пуст, таблицы полностью совпадают.
Это классический ответ на собеседовании при обсуждении проверки данных во время миграции и сверки.
(SELECT * FROM table_a EXCEPT SELECT * FROM table_b)
UNION ALL
(SELECT * FROM table_b EXCEPT SELECT * FROM table_a);
-- empty result => tables are identicalКак обрабатываются значения NULL
В операциях над множествами два значения NULL считаются равными друг другу при сопоставлении. Это отличается от обычного поведения, при котором NULL = NULL даёт значение UNKNOWN.
Поэтому строка со значением NULL в одном столбце совпадёт с другой строкой, содержащей NULL в той же позиции. На собеседованиях это проверяют, поскольку такое поведение противоречит обычным правилам сравнения.
-- (1, NULL) INTERSECT (1, NULL) -> returns (1, NULL)
SELECT id, region FROM a
INTERSECT
SELECT id, region FROM b;Приоритет операторов над множествами
При смешивании операторов INTERSECT обычно имеет более высокий приоритет, чем UNION и EXCEPT, согласно стандарту SQL. Чтобы избежать неоднозначности, заключайте ветки в круглые скобки.
Если вы скажете, что используете скобки для явного задания порядка вычислений, это покажет зрелое понимание темы на собеседовании.
(SELECT id FROM a EXCEPT SELECT id FROM b)
UNION
(SELECT id FROM c);Что выбрать: INTERSECT/EXCEPT или соединения
INTERSECT и EXCEPT лаконичны и сравнивают целые строки со встроенным удалением дубликатов. Соединения гибче: вы можете вернуть дополнительные столбцы и выбрать способ обработки дубликатов.
Предпочитайте операции над множествами, когда вопрос сводится исключительно к тому, «какие строки являются общими или отсутствуют». Переходите к соединениям, когда нужны столбцы с обеих сторон или используемый диалект не поддерживает эти операторы.
Объединяем правила
Итог, который можно повторить: «INTERSECT возвращает строки, присутствующие в обоих запросах, и является симметричным; EXCEPT возвращает строки из первого запроса, которых нет во втором, и является направленным. Оба оператора сравнивают целые строки, считают NULL равными и по умолчанию возвращают уникальные результаты».
Добавьте к ответу приём с двусторонним EXCEPT для сверки данных — и тема будет раскрыта полностью.
Быстрая проверка
Вам нужны клиенты, которые разместили заказ в 2023 году, но NOT разместили его в 2024 году (ушедшие клиенты).
Итоги
Основные выводы:
INTERSECT= строки в обоих запросах; оператор симметричен.EXCEPT(в Oracle: MINUS) = строки в первом запросе, которых нет во втором; оператор направленный.- Оба оператора сравнивают целые строки и по умолчанию возвращают уникальные результаты.
- При сопоставлении значения NULL считаются равными.
- Двусторонний
EXCEPTдаёт полное сравнение таблиц.
Часто задаваемые вопросы
Урок «INTERSECT и EXCEPT для сравнения» бесплатный?
Да — полный текст урока «INTERSECT и EXCEPT для сравнения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «INTERSECT и EXCEPT для сравнения»?
Находите общие и различающиеся строки в двух наборах данных. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «INTERSECT и EXCEPT для сравнения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- UNION и UNION ALL
- Совместимость количества и типов столбцов
- INTERSECT и EXCEPT для сравнения
- Имитация операций над множествами с помощью JOIN