Когда мы работаем с базами данных, почти всегда возникает задача объединить данные из нескольких таблиц. Для этого 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)
Возвращает все строки из левой таблицы, даже если нет совпадения в правой. Где совпадений нет, подставляются 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)
Показывает все строки из обеих таблиц: совпадающие и не совпадающие.
CROSS JOIN (или перечисление через запятую)
Берет каждую строку из одной таблицы и сочетает её с каждой строкой из другой таблицы.
По сути, это декартово произведение.
Пример:
Мы хотим получить сочетание каждого фрукта с каждым цветом.
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: объединяем или сравниваем таблицы
Эти операторы работают с результатами запросов, а не с таблицами напрямую.
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 — для работы с разными наборами данных.