SQL JOIN: объяснение с примерами (Inner, Left, Right, Full)
Изучите INNER, LEFT, RIGHT, FULL, CROSS и SELF JOIN на двух небольших таблицах, с понятными запросами и точными результатами.
- INNER JOIN: только строки, совпадающие в обеих таблицах.
- LEFT JOIN: все строки слева и совпадения справа (иначе NULL).
- RIGHT JOIN: все строки справа и совпадения слева.
- FULL JOIN: все строки обеих таблиц, сопоставленные там, где возможно.
- Соединяйте по ключам, используйте псевдонимы таблиц и индексируйте столбцы соединения.
В реальных базах данных не хранят всё в одной таблице. Клиенты лежат в одной таблице, заказы в другой. Чтобы ответить на вопрос «какие клиенты сделали заказ в этом месяце?», их нужно объединить, и именно это делает SQL JOIN.
Это практическое руководство. JOIN сбивает с толку новичков, потому что одни и те же две таблицы дают разные результаты в зависимости от типа соединения. На небольших конкретных данных всё становится просто.
SQL JOIN: примеры таблиц
customers
| id | name |
|---|---|
| 1 | Asha |
| 2 | Ben |
| 3 | Chitra |
orders
| id | customer_id | total |
|---|---|---|
| 101 | 1 | 250 |
| 102 | 1 | 120 |
| 103 | 2 | 90 |
| 104 | 9 | 40 |
У Chitra нет заказов, а заказ 104 ссылается на несуществующего клиента (9). Эти два крайних случая показывают разницу между типами соединений.
INNER JOIN
INNER JOIN возвращает только строки, для которых условие выполняется в обеих таблицах. Строки без пары отбрасываются.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
Результат: Asha (101), Asha (102), Ben (103). Chitra и заказ 104 отсутствуют. Используйте его, когда нужны только связанные данные, например заказы с данными клиента. Просто JOIN означает INNER JOIN.
LEFT JOIN
LEFT JOIN сохраняет все строки левой таблицы и добавляет совпадающие строки справа. Если совпадения нет, столбцы справа равны NULL.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
Результат: Asha (101), Asha (102), Ben (103), Chitra (NULL, NULL). Теперь Chitra присутствует.
Быстрый совет: чтобы найти клиентов, которые никогда не заказывали, отфильтруйте NULL справа: WHERE o.id IS NULL вернёт Chitra. Тестировщики используют это для поиска «осиротевших» или отсутствующих записей.
RIGHT JOIN и FULL JOIN
RIGHT JOIN — зеркало LEFT JOIN, он сохраняет все строки правой таблицы. Большинство меняют порядок таблиц и используют LEFT JOIN, потому что его читать естественнее.
SELECT c.name, o.id AS order_id
FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;
Результат включает заказ 104 с именем клиента NULL. FULL (OUTER) JOIN возвращает все строки обеих таблиц: Chitra без заказа и заказ 104 без клиента.
SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id;
PostgreSQL и SQL Server его поддерживают. MySQL — нет: объедините LEFT JOIN и RIGHT JOIN через UNION. Подробнее — в понятном руководстве по соединениям в документации PostgreSQL.
| Соединение | Только строки слева | Только строки справа | Совпавшие строки |
|---|---|---|---|
| INNER | Нет | Нет | Да |
| LEFT | Да | Нет | Да |
| RIGHT | Нет | Да | Да |
| FULL | Да | Да | Да |
CROSS JOIN и SELF JOIN
CROSS JOIN сопоставляет каждую строку одной таблицы с каждой строкой другой: три клиента и четыре заказа дают двенадцать строк. Он нужен редко, но полезен для генерации комбинаций, например тестовых данных для каждого размера и цвета.
SELECT c.name, o.id
FROM customers c
CROSS JOIN orders o;
SELF JOIN соединяет таблицу саму с собой через псевдонимы, например чтобы найти руководителя каждого сотрудника.
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
SQL JOIN: частые ошибки и советы по производительности
- Забытое условие ON случайно создаёт CROSS JOIN и резко увеличивает число строк.
- Фильтрация правой таблицы в WHERE после LEFT JOIN превращает его в INNER JOIN; помещайте условие в ON.
- Неоднозначные имена столбцов: добавляйте перед столбцами псевдоним таблицы.
- Соединение по неуникальным столбцам размножает строки и завышает итоги.
- Индексируйте столбцы соединения, выбирайте только нужные столбцы и анализируйте медленные запросы через
EXPLAIN.
Почему JOIN важны для тестировщиков
QA-инженеры используют соединения, чтобы проверить, что данные, созданные через интерфейс или API, корректно попали в базу, и чтобы находить «осиротевшие» записи. Читайте вместе с нашим руководством по тестированию API в Postman (на английском). Основы — в учебнике по SQL для начинающих (на английском), а о новых хранилищах данных — про векторные базы данных (на английском). Чтобы запустить базу локально, см. руководство по Docker (на английском).
Итоги
SQL JOIN в одной строке: INNER оставляет только совпадения, LEFT — всё слева, RIGHT — всё справа, FULL — всё. Тренируйтесь на двух небольших таблицах, пока не сможете предсказывать результат до запуска запроса; затем соединяйте три таблицы и сочетайте JOIN с GROUP BY.
Часто задаваемые вопросы
В чём разница между INNER JOIN и LEFT JOIN?
INNER JOIN возвращает только совпадающие строки из обеих таблиц. LEFT JOIN возвращает все строки левой таблицы и заполняет NULL столбцы справа, где совпадений нет.
Какой SQL JOIN самый быстрый?
Ни один тип не всегда самый быстрый. Производительность зависит от индексов, размера таблиц и плана выполнения. Индексируйте столбцы соединения и проверяйте план.
Поддерживает ли MySQL FULL OUTER JOIN?
Нет. В MySQL объедините LEFT JOIN и RIGHT JOIN через UNION, чтобы получить тот же результат.
Для чего нужен SELF JOIN?
SELF JOIN сравнивает строки одной и той же таблицы, например чтобы найти руководителя каждого сотрудника в единственной таблице employees.
Почему мой JOIN возвращает дубликаты строк?
Дубликаты появляются, когда столбец соединения не уникален в одной из таблиц. Проверьте ключи или агрегируйте данные перед соединением.
Продолжайте изучать (статьи на английском)
Нужна помощь с тестированием, WordPress или SEO?
Мы помогаем командам выпускать более качественное ПО и развивать свои сайты. Расскажите, над чем вы работаете, и мы предложим следующий шаг.
Больше руководств по тестирование, искусственный интеллект и современные разработки
Понравилась эта статья? Выберите тему и сразу приступайте к нашим новейшим руководствам.
