← Назад к вопросам

Для чего нужен INTERSECT в SQL?

1.0 Junior🔥 71 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

INTERSECT в SQL

INTERSECT — это оператор SQL, который используется для нахождения общих строк между двумя или несколькими запросами SELECT. Он возвращает только те строки, которые присутствуют в результатах всех запросов.

Синтаксис

SELECT column1, column2
FROM table1
INTERSECT
SELECT column1, column2
FROM table2;

ИМПОРТАНТО: Оба SELECT-запроса должны:

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

Пример 1: Простой случай

Представь две таблицы с сотрудниками:

-- Таблица employees (все сотрудники)
id | name     | department
1  | Alice    | IT
2  | Bob      | HR
3  | Charlie  | IT

-- Таблица managers (менеджеры)
id | name     | department
2  | Bob      | HR
3  | Charlie  | IT
4  | David    | Sales

Запрос с INTERSECT найдёт сотрудников, которые одновременно в обеих таблицах:

SELECT name FROM employees
INTERSECT
SELECT name FROM managers;

Результат:

Bob
Charlie

Пример 2: Поиск пользователей с одинаковыми действиями

-- Найти пользователей, которые одновременно:
-- 1. Купили товары из категории "Electronics"
-- 2. Оставили отзывы

SELECT DISTINCT user_id FROM purchases
WHERE product_category = "Electronics"
INTERSECT
SELECT DISTINCT user_id FROM reviews;

Этот запрос вернёт только тех пользователей, которые и купили товары в категории Electronics, и оставили хотя бы один отзыв.

INTERSECT vs INNER JOIN

Кажется, можно использовать INNER JOIN? Давайте посмотрим разницу.

С INNER JOIN:

SELECT DISTINCT e.name
FROM employees e
INNER JOIN managers m ON e.name = m.name;

Результат тот же, но INNER JOIN:

  • Требует явного условия соединения (ON)
  • Более гибкий (можно использовать разные столбцы)
  • Может вернуть дубликаты, если нужны разные столбцы

С INTERSECT:

SELECT name FROM employees
INTERSECT
SELECT name FROM managers;

INTERSECT:

  • Не требует условий соединения (сравнивает целиком строки/столбцы)
  • Автоматически убирает дубликаты
  • Проще читается, когда нужно найти общие записи

Пример 3: INTERSECT с WHERE

-- Найти товары, которые:
-- 1. Были куплены в июне
-- 2. И оставлены в отзывах (без явного соединения)

SELECT product_id FROM purchases
WHERE MONTH(purchase_date) = 6
INTERSECT
SELECT product_id FROM reviews
WHERE rating > 4;

Этот запрос находит товары, которые были куплены в июне И имеют отзывы с рейтингом > 4.

INTERSECT vs EXCEPT

Есть ещё оператор EXCEPT (или MINUS), который работает противоположно:

-- INTERSECT: что есть в обоих
SELECT id FROM table1
INTERSECT
SELECT id FROM table2;
-- Результат: 2, 3

-- EXCEPT: что есть в первом, но не во втором
SELECT id FROM table1
EXCEPT
SELECT id FROM table2;
-- Результат: 1

Пример 4: Множественный INTERSECT

-- Найти пользователей, которые:
-- 1. Сделали покупки
-- 2. Оставили отзывы
-- 3. Подписались на новости

SELECT user_id FROM purchases
INTERSECT
SELECT user_id FROM reviews
INTERSECT
SELECT user_id FROM newsletter_subscriptions;

Особенности INTERSECT

  1. Удаление дубликатов — по умолчанию INTERSECT возвращает уникальные строки

    -- Если нужны дубликаты (PostgreSQL, некоторые БД)
    SELECT ... INTERSECT ALL SELECT ...
    
  2. Производительность — INTERSECT может быть медленнее INNER JOIN на больших таблицах, так как требует сортировки результатов

  3. Поддержка в БД — INTERSECT поддерживается в:

    • PostgreSQL
    • MySQL 8.0+
    • Oracle
    • SQL Server
    • SQLite
  4. Порядок строк — результаты не гарантируют порядок, используй ORDER BY

Когда использовать INTERSECT

  • Нужно найти общие элементы между несколькими наборами данных
  • Запрос логически проще выразить через пересечение
  • Не нужны дополнительные столбцы из обеих таблиц
  • Условия для двух SELECT-ов существенно различаются

INTERSECT — полезный оператор для работы с наборами данных, особенно когда нужно найти пересечения без сложных соединений.

Для чего нужен INTERSECT в SQL? | PrepBro