Перейти к содержанию

Операции объединения таблиц 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 Все возможные комбинации Нет 🔵 × 🟢

Ошибки и советы

  1. Отсутствие условия ON → создаётся декартово произведение.
  2. Совпадение имён столбцов → всегда указывайте таблицу (Students.group_id).
  3. Проверяйте результат перед фильтрацией (SELECT * ... LIMIT 5;).
  4. Используйте псевдонимы (s, g) — повышает читаемость.
  5. Проверяйте NULL при левом или полном объединении.

Итоги

  • JOIN используется для объединения данных из разных таблиц по логическим связям.
  • Основное условие — наличие связующего поля (ключа) между таблицами.
  • Основные типы:
    • INNER JOIN — только совпадения;
    • LEFT JOIN — все из левой таблицы;
    • RIGHT JOIN — все из правой таблицы;
    • FULL JOIN — все из обеих таблиц;
    • CROSS JOIN — все возможные комбинации.
  • Без JOIN невозможно создавать реалистичные и комплексные SQL-запросы.