SQL JOIN


SQL JOIN используется для объединения строк из двух или более таблиц.

На следующей диаграмме показаны 7 вариантов использования LEFT JOIN, RIGHT JOIN, INNER JOIN и OUTER JOIN.

TypeОписание
INNER JOINВозвращает записи, удовлетворяющие условию соединения в обеих таблицах (пересечение).
LEFT JOINВозвращает все записи из левой таблицы, даже если в правой таблице нет совпадающих записей (сохраняет левую таблицу).
RIGHT JOINВозвращает все записи из правой таблицы, даже если в левой таблице нет совпадающих записей (сохраняет правую таблицу).
FULL OUTER JOINВозвращает объединение обеих таблиц, включая совпадающие и несовпадающие записи.
CROSS JOINВозвращает декартово произведение двух таблиц, объединяя каждую запись левой таблицы с каждой записью правой таблицы.
SELF JOINСоединяет таблицу с самой собой.
NATURAL JOINАвтоматически сопоставляет и соединяет таблицы по полям с одинаковыми именами.

Пример данных

Таблица 1: Customers

CustomerID Name
1 Алиса
2 Боб
3 Чарли

Таблица 2: Orders

OrderID CustomerID Продукт
101 1 Ноутбук
102 2 Телефон
103 4 Планшет

Сравнение результатов JOIN

Типы JOIN Результат
INNER JOIN Возвращает записи, которые совпадают в обеих таблицах. В приведённом примере только записи с CustomerID 1 и 2 имеют совпадения в обеих таблицах, поэтому возвращаются только эти записи.
LEFT JOIN Возвращает все записи из левой таблицы (Customers), даже если в правой таблице (Orders) нет совпадающих записей. Для записей левой таблицы, не имеющих совпадения в правой таблице, поля правой таблицы в результате будут NULL. В примере запись с CustomerID 3 не имеет совпадения в правой таблице, поэтому соответствующее ей значение Product будет NULL.
RIGHT JOIN Возвращает все записи из правой таблицы (Orders), даже если в левой таблице (Customers) нет совпадающих записей. Для записей правой таблицы, не имеющих совпадения в левой таблице, поля левой таблицы в результате будут NULL. В примере запись с OrderID 103 не имеет совпадения в левой таблице, поэтому соответствующее ей значение Name будет NULL.
FULL OUTER JOIN Возвращает все записи из обеих таблиц, совпадают они или нет. Если в таблице нет совпадающих записей, её поля будут NULL. В примере записи с CustomerID 3 и OrderID 103 будут отображаться как NULL в другой таблице соответственно.
CROSS JOIN Возвращает декартово произведение двух таблиц, то есть каждая строка левой таблицы объединяется с каждой строкой правой таблицы. В примере каждый клиент будет объединён с каждым заказом, что даст несколько результатов.
SELF JOIN Соединяет таблицу с самой собой. Обычно это используется для запроса взаимосвязанных записей в таблице, например связи между сотрудниками и их руководителями.

SQL JOIN

Предложение SQL JOIN используется для объединения строк из двух или более таблиц на основе общих полей между этими таблицами.

Наиболее распространённые типы JOIN:SQL INNER JOIN (простой JOIN)SQL INNER JOIN возвращает все строки из нескольких таблиц, которые удовлетворяют условию JOIN.

Синтаксис:

SELECT column1, column2, ...
FROM table1
JOIN table2 ON condition;

Описание параметра:

  • column1, column2, ...: имена полей для выбора, их может быть несколько. Если имена полей не указаны, будут выбраны все поля.
  • table1: первая таблица для соединения.
  • table2: Вторая таблица для соединения.
  • condition: Условие соединения, используемое для указания способа соединения.

Демонстрационная база данных

В этом руководстве мы будем использовать образец базы данных EXAMPLE.

Ниже приведены данные, выбранные из таблицы "Websites":

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | Example      | http://www.example.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

Ниже приведены данные из таблицы журнала доступа веб-сайта "access_log":

mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)

Обратите внимание, что столбецidв таблице "Websites" указывает на полеsite_idв таблице "access_log". Эти две таблицы связаны через столбец "site_id".

Затем, если мы выполним следующую SQL-инструкцию (содержащую INNER JOIN):

Примеры

SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;

Выполнение приведённой выше инструкции SQL выводит следующий результат:



Различные типы SQL JOIN

Прежде чем перейти к примерам, давайте сначала перечислим различные типы SQL JOIN, которые можно использовать:

  • INNER JOIN: Возвращает строки, если в таблице есть хотя бы одно совпадение.
  • LEFT JOIN: Возвращает все строки из левой таблицы, даже если в правой таблице нет совпадений.
  • RIGHT JOIN: Возвращает все строки из правой таблицы, даже если нет совпадений в левой таблице
  • FULL JOIN: Возвращает строки, если есть совпадение в одной из таблиц
Другие расширения