Найти в Дзене

Все способы соединения таблиц в SQL

Оглавление

Когда мы работаем с базами данных, почти всегда возникает задача объединить данные из нескольких таблиц. Для этого SQL предлагает разные подходы. Давайте разберемся с ними по порядку, просто и без сложных терминов.

1. JOIN: стандартные соединения таблиц

JOIN позволяет объединить строки из двух таблиц на основе условий. Вот основные виды:

INNER JOIN (или просто JOIN)

Выбирает только те строки, которые совпадают в обеих таблицах.
Пример:
У нас есть таблицы с клиентами и заказами. Если мы хотим увидеть только тех клиентов, которые сделали заказы, используем INNER JOIN.

SELECT clients.Name, orders.OrderID
FROM clients
INNER JOIN orders
ON clients.ClientID = orders.ClientID

LEFT JOIN (или LEFT OUTER JOIN)

-2

Возвращает все строки из левой таблицы, даже если нет совпадения в правой. Где совпадений нет, подставляются NULL.
Пример:
Хочется увидеть всех клиентов, даже тех, кто не делал заказов.

SELECT clients.Name, orders.OrderID
FROM clients
LEFT JOIN orders
ON clients.ClientID = orders.ClientID

RIGHT JOIN

  • Аналогично LEFT JOIN, но возвращает все строки из правой таблицы. Используется крайне редко.

FULL JOIN (или FULL OUTER JOIN)

-3

Показывает все строки из обеих таблиц: совпадающие и не совпадающие.

CROSS JOIN (или перечисление через запятую)

-4

Берет каждую строку из одной таблицы и сочетает её с каждой строкой из другой таблицы.

По сути, это декартово произведение.
Пример:
Мы хотим получить сочетание каждого фрукта с каждым цветом.

SELECT a.FruitName, b.ColorName
FROM Fruits AS a
CROSS JOIN Colors AS b

2. Вложенные запросы: когда JOIN не нужен

Иногда проще использовать вложенный запрос (или подзапрос). Это запрос внутри другого.

Пример 1: Найти клиентов без заказов

Сначала мы получим список всех клиентов, а затем исключим тех, кто есть в таблице заказов.

SELECT Name
FROM clients
WHERE ClientID
NOT IN
(SELECT ClientID
FROM orders)

Пример 2: Самый дорогой заказ

Сначала определяем максимальную цену, затем получаем сам заказ.

SELECT *
FROM orders
WHERE Price = (SELECT MAX(Price) FROM orders)

3. UNION, EXCEPT и INTERSECT: объединяем или сравниваем таблицы

Эти операторы работают с результатами запросов, а не с таблицами напрямую.

-5

UNION

  • Объединяет результаты двух запросов, удаляя дубликаты.
    Пример:
    Есть таблицы old_clients и new_clients. Нужно получить общий список уникальных клиентов.
SELECT Name
FROM old_clients
UNION
SELECT Name
FROM new_clients

UNION ALL

  • То же, что и UNION, но сохраняет дубликаты.

EXCEPT

  • Показывает строки, которые есть в первом запросе, но нет во втором.
    Пример:
    Найти клиентов, которые были раньше, но не числятся в новой базе.
SELECT Name
FROM old_clients
EXCEPT
SELECT Name
FROM new_clients

INTERSECT

  • Возвращает только те строки, которые есть в обоих запросах.
    Пример:
    Найти клиентов, которые остались в обеих базах.
SELECT Name
FROM old_clients
INTERSECT
SELECT Name
FROM new_clients

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

  • JOIN — когда нужно соединить таблицы на основе условий;
  • SUBQUERIES (ВЛОЖЕННЫЕ ЗАПРОСЫ) — если запрос сложный или проще "разбить на шаги";
  • UNION/EXCEPT/INTERSECT — для работы с разными наборами данных.