SQL JOIN: объяснение с примерами (Inner, Left, Right, Full)

SQL joins explained with examples: inner, left, right, full, cross and self joins
  1. Главная
  2. Блог
  3. Базы данных и SQL

Базы данных и SQL

SQL JOIN: объяснение с примерами (Inner, Left, Right, Full)

Изучите INNER, LEFT, RIGHT, FULL, CROSS и SELF JOIN на двух небольших таблицах, с понятными запросами и точными результатами.

Автор: Stack QuoraОбновлено 29 окт. 20268 мин чтения
SQLSQL JOIN: объяснениес примерамиstackquora.com

Главное

  • 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 возвращает дубликаты строк?

Дубликаты появляются, когда столбец соединения не уникален в одной из таблиц. Проверьте ключи или агрегируйте данные перед соединением.

Продолжайте изучать (статьи на английском)

Работайте со Stack Quora

Нужна помощь с тестированием, WordPress или SEO?

Мы помогаем командам выпускать более качественное ПО и развивать свои сайты. Расскажите, над чем вы работаете, и мы предложим следующий шаг.

Продолжайте читать

Больше руководств по тестирование, искусственный интеллект и современные разработки

Понравилась эта статья? Выберите тему и сразу приступайте к нашим новейшим руководствам.