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):
Примеры
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: Возвращает строки, если есть совпадение в одной из таблиц
