Операции объединения таблиц JOIN
Введение
В реальной базе данных информация редко хранится в одной таблице.
Данные распределяются между несколькими связанными таблицами, например:
- таблица Students — хранит сведения о студентах;
- таблица Groups — хранит данные о группах;
- таблица Subjects — хранит предметы, которые изучаются.
Чтобы получить связанную информацию (например, фамилию студента и название его группы), необходимо объединить таблицы.
Для этого в SQL используется оператор JOIN.
Понятие JOIN
JOIN — это операция, которая объединяет строки из двух (или более) таблиц в зависимости от связей между ними.
Связь осуществляется по ключевым полям — обычно по внешнему ключу (FOREIGN KEY).
Общий синтаксис
SELECT таблица1.поле, таблица2.поле
FROM таблица1
JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
JOIN— указывает тип объединения;ON— задаёт условие соединения (обычно по совпадению ключей);SELECT— определяет, какие поля выводить.
Виды JOIN
SQL поддерживает несколько типов объединений. Рассмотрим основные:
1. INNER JOIN (внутреннее объединение)
Возвращает только те строки, у которых есть совпадение в обеих таблицах.
Пример:
SELECT s.full_name, g.group_name
FROM Students s
INNER JOIN Groups g
ON s.group_id = g.group_id;
Результат: будут показаны только те студенты, для которых указана существующая группа.
Схема:
Students ∩ Groups
(пересечение двух таблиц)
2. LEFT JOIN (левое объединение)
Возвращает все строки из левой таблицы, даже если совпадений во второй нет.
Если совпадения отсутствуют — значения из правой таблицы будут NULL.
Пример:
SELECT s.full_name, g.group_name
FROM Students s
LEFT JOIN Groups g
ON s.group_id = g.group_id;
Результат: будут показаны все студенты, даже если они не прикреплены ни к одной группе.
Схема:
Все из Students + совпадения из Groups
3. RIGHT JOIN (правое объединение)
Возвращает все строки из правой таблицы, даже если в левой совпадений нет.
Редко используется — чаще применяют LEFT JOIN, поменяв порядок таблиц.
Пример:
SELECT s.full_name, g.group_name
FROM Students s
RIGHT JOIN Groups g
ON s.group_id = g.group_id;
Результат: будут показаны все группы, даже если в них нет студентов.
4. FULL JOIN (полное объединение)
Возвращает все строки из обеих таблиц, включая те, у которых нет совпадений.
Отсутствующие данные заполняются NULL.
Пример:
SELECT s.full_name, g.group_name
FROM Students s
FULL JOIN Groups g
ON s.group_id = g.group_id;
Поддерживается не всеми СУБД (например, работает в PostgreSQL, но не в MySQL).
5. CROSS JOIN (декартово произведение)
Соединяет каждую строку первой таблицы с каждой строкой второй.
Используется редко, например, для генерации всех возможных комбинаций.
Пример:
SELECT s.full_name, g.group_name
FROM Students s
CROSS JOIN Groups g;
Если в таблице 10 студентов и 5 групп — получится 50 строк.
Примеры на практике
Пример 1. Студенты и их группы
SELECT s.full_name, g.group_name
FROM Students s
JOIN Groups g ON s.group_id = g.group_id;
Показывает имя студента и название его группы.
Пример 2. Студенты без группы
SELECT s.full_name
FROM Students s
LEFT JOIN Groups g ON s.group_id = g.group_id
WHERE g.group_name IS NULL;
Выводит студентов, у которых нет назначенной группы.
Пример 3. Список групп с количеством студентов
SELECT g.group_name, COUNT(s.student_id) AS student_count
FROM Groups g
LEFT JOIN Students s ON g.group_id = s.group_id
GROUP BY g.group_name;
Показывает все группы и количество студентов в каждой.
Визуальное сравнение видов JOIN
| Тип JOIN | Что показывает | Присутствие NULL | Схематично |
|---|---|---|---|
| INNER JOIN | Только совпавшие записи | Нет | 🔵 ∩ 🟢 |
| LEFT JOIN | Все из левой таблицы + совпадения | Да | 🔵 + часть 🟢 |
| RIGHT JOIN | Все из правой таблицы + совпадения | Да | 🟢 + часть 🔵 |
| FULL JOIN | Все записи обеих таблиц | Да | 🔵 ∪ 🟢 |
| CROSS JOIN | Все возможные комбинации | Нет | 🔵 × 🟢 |
Ошибки и советы
- Отсутствие условия
ON→ создаётся декартово произведение. - Совпадение имён столбцов → всегда указывайте таблицу (
Students.group_id). - Проверяйте результат перед фильтрацией (
SELECT * ... LIMIT 5;). - Используйте псевдонимы (
s,g) — повышает читаемость. - Проверяйте
NULLпри левом или полном объединении.
Итоги
JOINиспользуется для объединения данных из разных таблиц по логическим связям.- Основное условие — наличие связующего поля (ключа) между таблицами.
- Основные типы:
INNER JOIN— только совпадения;LEFT JOIN— все из левой таблицы;RIGHT JOIN— все из правой таблицы;FULL JOIN— все из обеих таблиц;CROSS JOIN— все возможные комбинации.
- Без
JOINневозможно создавать реалистичные и комплексные SQL-запросы.