Joins оператор MySQL — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном пособии вы узнаете, как использовать JOINS (INNER и OUTER) в MySQL с синтаксисом, рисунками и примерами.
Описание
MySQL JOINS используются для извлечения данных из нескольких таблиц. JOIN выполняется всякий раз, когда две или более таблиц объединяются в SQL предложении.
Существуют различные типы соединений MySQL:
- MySQL INNER JOIN (или иногда называют простое соединение)
- MySQL LEFT OUTER JOIN (или иногда называют LEFT JOIN)
- MySQL RIGHT OUTER JOIN (или иногда называют RIGHT JOIN)
Рассмотрим синтаксис MySQL JOIN, а также изучим примеры MySQL JOIN.
INNER JOIN (простое соединение)
Скорее всего, вы уже писали запросы в которых используются MySQL INNER JOIN. Это наиболее распространенный тип соединения. MySQL INNER JOINS возвращает все строки из нескольких таблиц, где выполняется условия соединения.
Синтаксис
Синтаксис INNER JOIN в MySQL:
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
В этом рисунке, MySQL INNER JOIN возвращает затененную область:
MySQL INNER JOIN будет возвращать записи, где table1 и table2 будут пересекаться.
Пример
Ниже приведен пример MySQL INNER JOIN:
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Этот пример MySQL INNER JOIN возвращает все строки из таблиц suppliers и orders, где имеются соответствующие значение поля supplier_id в обоих таблицах.
Рассмотрим некоторые данные, чтобы понять, как работает INNER JOIN:
У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
У нас есть еще одна таблица orders с тремя полями (order_id, supplier_id и order_date).
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 05.05.2015 |
500126 | 10001 | 08.02.2016 |
500127 | 10004 | 06.01.2017 |
Если мы выполним MySQL оператор SELECT (который содержит INNER JOIN) ниже:
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Наш результирующий набор будет выглядеть следующим образом:
supplier_id | name | order_date |
---|---|---|
10000 | IBM | 05. 05.2015 |
10001 | Hewlett Packard | 08.02.2016 |
Строки для Microsoft и NVIDIA из таблицы suppliers будут опущены, так как значения supplier_id 10002 и 10003 не существует в обеих таблицах. Строка order_id 500127 из таблицы orders будет опущена, так как supplier_id 10004 не существует в таблице suppliers.
Старый Синтаксис
В качестве последнего примечания, стоит отметить, что приведенный выше пример MySQL INNER JOIN можно переписать, используя старый неявный синтаксис следующим образом (но рекомендуется использовать синтаксис INNER JOIN):
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id;
LEFT OUTER JOIN
Другой тип соединения называется MySQL LEFT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с левосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны.
Синтаксис
Синтаксис для LEFT OUTER JOIN в MySQL:
SELECT columns
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных LEFT OUTER JOIN заменяется на LEFT JOIN.
На этом рисунке, MySQL LEFT OUTER JOIN возвращает затененную область:
MySQL LEFT OUTER JOIN возвратит все записи из table1 и только те записи из table2, которые пересекаются с table1.
Пример
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT JOIN orders ON suppliers.supplier_id = orders.supplier_id;
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT JOIN orders |
Этот пример LEFT OUTER JOIN возвратит все строки из таблицы suppliers, и только те строки из таблицы orders, где объединяемые поля равны.
Если значение supplier_id в таблице suppliers не существует в таблице orders, все поля таблицы orders будут отображаться в результирующем наборе как NULL.
Рассмотрим некоторые данные, чтобы понять, как работает LEFT OUTER JOIN:
У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
У нас есть еще одна таблица orders с тремя полями (order_id, supplier_id и order_date). Она содержит следующие данные:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 05.05.2015 |
500126 | 10001 | 08.02.2016 |
Если мы выполним MySQL оператор SELECT (который содержит LEFT OUTER JOIN) ниже:
SELECT suppliers.
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Результирующий набор будет выглядеть следующим образом:
supplier_id | name | order_date |
---|---|---|
10000 | IBM | 05.05.2015 |
10001 | Hewlett Packard | 08.02.2016 |
10002 | Microsoft | null |
10003 | NVIDIA | null |
Строки для Microsoft и NVIDIA будут включены, так как был использован LEFT OUTER JOIN. Тем не менее, вы заметите, что поле order_date для этих записей содержит значение NULL.
RIGHT OUTER JOIN
Другой тип соединения называется MySQL RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с правосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны.
Синтаксис
СинтаксиRIGHT OUTER JOIN в MySQL:
SELECT columns
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных, RIGHT OUTER JOIN заменяется на RIGHT JOIN.
На этом рисунке, MySQL RIGHT OUTER JOIN возвращает затененную область:
MySQL RIGHT OUTER JOIN возвратит все записи из table2 и только те записи из table1, которые пересекаются с table2.
Пример
Ниже приведен пример MySQL RIGHT OUTER JOIN:
SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT JOIN orders ON suppliers.supplier_id = orders.supplier_id;
SELECT orders. order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Этот пример RIGHT OUTER JOIN возвращает все строки из таблицы orders и только те строки из таблицы suppliers, где объединяемые поля равны.
Если значение supplier_id в таблице orders не существует в таблице suppliers, все поля в таблице suppliers будут отображаться в результирующем наборе как NULL.
Рассмотрим некоторые данные, чтобы понять, как работает RIGHT OUTER JOIN:
У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:
supplier_id | supplier_name |
---|---|
10000 | Apple |
10001 |
У нас есть вторая таблица orders с тремя полями (order_id, supplier_id и order_date). Она содержит следующие данные:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 12. 05.2016 |
500126 | 10001 | 14.05.2016 |
500127 | 10002 | 18.05.2016 |
Если мы выполним MySQL оператор SELECT (который содержит RIGHT OUTER JOIN) ниже:
SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Результирующий набор будет выглядеть следующим образом:
order_id | order_date | supplier_name |
---|---|---|
500125 | 12.05.2016 | Apple |
500126 | 14.05.2016 | |
500127 | 18.05.2016 | null |
Строка для order_id 500127 будет включена, так как был использован RIGHT OUTER JOINS. Тем не менее, вы заметите, что поле supplier_name для этой записи содержит значение NULL.
Уроки PHP — урок 3.6 — Работа с БД MySQL. Виды оператора JOIN.
В MySQL выборку с помощью JOIN можно производить разными способами. Мы постараемся рассмотреть все эти виды запросов. Вот список всех запросов с участием JOIN:
- INNER JOIN
- LEFT JOIN
- LEFT JOIN без пересечений с правой таблицей
- RIGHT JOIN
- RIGHT JOIN без пересечений с левой таблицей
- FULL OUTER
- FULL OUTER где левая или правая таблица пустая
А вот иллюстрация к этим видам JOIN:
Я прикреплю к статье файлы нашего сайта, среди которых будет join.php в которых я буду выводить все записи с помощью разных операторов JOIN.
INNER JOIN
Начнем мы с этого оператора INNER JOIN, потому что этот оператор срабатывает по умолчанию, если вы пишите в запросе просто JOIN. Этот оператор выбирает все записи из двух таблиц, где выполняется условие идущее после оператора ON. У нас есть две таблицы Files и Messages:
Таблица Messages:
mid | bodytext | fid |
1 | Test | NULL |
2 | Hi | 2 |
3 | Hello | NULL |
Таблица Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
Запрос с JOIN будет следующий:
SELECT * FROM Messages INNER JOIN Files ON Messages.fid=Files.fid
В результате будут выведены такие записи
mid | bodytext | fid | path |
2 | Hi | 2 | /files/2.png |
То есть там где fid совпадает, то mysql выведит эти строки.
LEFT JOIN
При LEFT JOIN мы выводим все записи в которых в таблице слева (у нас это Messages), в том числе и те записи в которых эти значения fid есть в таблице Files.
Таблица Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Таблица Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
Запрос с LEFT JOIN будет следующий:
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid
В результате будут выведены такие записи
mid | bodytext | fid | path |
1 | Test | 2 | /files/2.png |
2 | Hi | NULL | NULL |
3 | Hello | 3 | /files/3. png |
LEFT JOIN будет нужен когда выводим все записи сообщений, а есть или нет прикрепленный файл, мы проверим уже через PHP.
LEFT JOIN без пересечений с правой таблицей
LEFT JOIN выводит все записи из левой таблицы, кроме тех в которых fid совпадают в правой таблице.
Таблица Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Таблица Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
Запрос с LEFT JOIN без пересечений будет следующий:
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid WHERE Files.fid IS NULL
В результате мы получим вот такую вот выборку:
mid | bodytext | fid | path |
2 | Hi | NULL | NULL |
LEFT JOIN без перечений будет нужен когда выводим все записи без прикрепленных файлов.
RIGHT JOIN
RIGHT JOIN выводит все записи из правой таблицы, если есть пересечения, то выводится данные из левой таблицы.
Таблица Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Таблица Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
Запрос с RIGHT JOIN будет следующий:
SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid=Files.fid
В результате мы получим вот такую вот выборку:
mid | bodytext | fid | path |
NULL | NULL | 1 | /files/1. png |
1 | Test | 2 | /files/2.png |
3 | Hello | 3 | /files/3.png |
RIGHT JOIN будет нужен когда выводим все прикрепленные файлы без разницы используются они или нет, просто все файлы.
RIGHT JOIN без пересечений
RIGHT JOIN без пересечений выводит все записи из правой таблицы, кроме тех где есть пересечения с левой таблицей.
Таблица Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Таблица Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
Запрос с RIGHT JOIN без пересечений будет следующий:
SELECT * FROM Messages RIGHT JOIN Files ON Messages. fid=Files.fid WHERE Messages.fid IS NULL
Таким образом мы получим следующие данные:
mid | bodytext | fid | path |
NULL | NULL | 1 | /files/1.png |
RIGHT JOIN будет нужен когда выводим все прикрепленные файлы, которые не прикреплены ни к каким сообщениям. Например, если мы хотим вывести файлы которые не используются.
FULL OUTER JOIN
Несмотря на то что в языке SQL есть FULL OUTER JOIN, в MySQL этого оператора нет. Дело в том что подобный оператор это огромная нагрузка на сервер. Сейчас у нас 3 файла и 3 сообщения, при этом образуется 4 строк в результате выполнения запроса. Я не уверен, что это хорошая идея писать запрос, который дает в совокупности два запроса LEFT JOIN и RIGHT JOIN. Но все же есть возможность эмулировать запрос FULL OUTER JOIN.
Таблица Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Таблица Files:
fid | path |
1 | /files/1. png |
2 | /files/2.png |
3 | /files/3.png |
Эмуляция запроса с FULL OUTER JOIN будет следующей:
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid = Files.fid UNION SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid = Files.fid
В этом запросе мы используем оператор UNION, чтобы объединить два запроса LEFT JOIN и RIGHT JOIN.
В результате мы получим следующие записи:
mid | bodytext | fid | path |
1 | Test | 2 | /files/2.png |
2 | Hi | NULL | NULL |
3 | Hello | 3 | /files/3.png |
NULL | NULL | 1 | /files/1.png |
И здесь я уже затрудняюсь сказать зачем потребуется FULL OUTER JOIN. Но раз это есть в SQL, то видимо потребуется потом.
FULL OUTER JOIN без пересечений
Еще один вид JOIN еще более безумный, чем просто FULL OUTER JOIN, а именно FULL OUTER JOIN без пересечений. Я даже не могу предложить где можно использовать этот вид JOIN. Потому что в результате мы получаем файлы которые не используются и сообщения без файлов. И как вы наверно уже догадались этого оператора тоже нет в MySQL. Остается его только эмулировать с помощью двух операторов LEFT JOIN без перечений и RIGHT JOIN без пересечений.
Эмуляция запроса FULL OUTER JOIN без пересечений:
$sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid = Files.fid WHERE Files.fid IS NULL UNION SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid = Files.fid WHERE Messages.fid IS NULL';
В результате (исходные таблицы те же что и в примере с FULL OUTER JOIN) мы получим:
mid | bodytext | fid | path |
2 | Hi | NULL | NULL |
NULL | NULL | 1 | /files/1. png |
Вот наверно и все, в следующих уроках мы начнем писать еще более сложные запросы к нескольким таблицам сразу.
LEFT JOIN и INNER JOIN объединение таблиц.
MySQL поддерживает синтаксис [LEFT|RIGHT|INNER] JOIN
для части определения таблиц в операторе SELECT
и операторах DELETE
и UPDATE
для нескольких таблиц. Объединения таблиц позволяют извлекать данные из нескольких таблиц без создания временных таблиц и за один запрос.
Пример объединения нескольких таблиц при помощи LEFT JOIN
:
SELECT * FROM t1 LEFT JOIN t2 ON (t2.a = t1.a) LEFT JOIN t3 ON (t2.b = t3.b) -- эквивалентно SELECT * FROM t1 LEFT JOIN t2 INNER JOIN t3 ON t2.b = t3.b ON t2.a = t1.a
Здесь все записи из таблицы t1
соединяются с соответствующими записями таблицы t2
, в свою очередь все записи из таблицы t2
соединяются с соответствующими записями таблицы t3
.
Эквивалентный вариант объединяет t1
с t3
через промежуточную таблицу t2
. Так как соединение между t1
и t2
является LEFT JOIN
, то получаем все записи таблицы t1
.
Инструкция ON
служит для условий, указывающих, как соединять таблицы. Другими словами, выражение ON (t2.a = t1.a)
говорит MySQL по каким полям объединять таблицу t1
с таблицей t2
. Оператор ON
может содержать сложные условия объединения таблиц, например ON (t2.a = t1.a AND t2.b = t1.b)
— здесь происходит соединение таблицы t1
с таблицей t2
по двум столбцам a
и b
.
При объединении таблиц, вместо ссылки на таблицу может использоваться псевдоним alias
, который присваивается при помощи выражений tbl AS alias
или tbl alias
:
-- использование `tbl AS alias` SELECT * FROM left_tbl AS a LEFT JOIN right_tbl AS b ON (b. id = a.id) -- эквивалентно, без `AS` SELECT * FROM left_tbl a LEFT JOIN right_tbl b ON (b.id = a.id)
LEFT JOIN
: возвращает все записи из левой таблицы и соответствующие записи из правой таблицы.RIGHT JOIN
: возвращает все записи из правой таблицы и соответствующие записи из левой таблицы.INNER JOIN
или простоJOIN
: выбирает записи, которые имеют совпадающие значения в обеих таблицах (перекрёстное объединение).
В MySQL CROSS JOIN
и INNER JOIN
являются синтаксическими эквивалентами (они могут заменять друг друга). В стандартном SQL они не эквивалентны. INNER JOIN
используется с предложением ON
, в противном случае используется CROSS JOIN
.
LEFT JOIN
:На практике чаще всего используется объединение таблиц при помощи инструкции LEFT JOIN
.
SELECT * FROM left_tbl LEFT JOIN right_tbl ON (right_tbl. id = left_tbl.id)
Запрос возвращает все записи из левой (первой) таблицы left_tbl
и только совпавшие записи (согласно right_tbl.id = left_tbl.id
) из правой (второй) таблицы right_tbl
.
При использовании LEFT JOIN
, если нет соответствующей строки/записи для правой таблицы в операторе ON
, то для правой таблицы используется строка со всеми столбцами, установленными в NULL
. Это поведение можно использовать, чтобы найти строки/записи в таблице, которые не имеют аналога в другой таблице:
SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
RIGHT JOIN
:Объединение при помощи RIGHT JOIN
работает аналогично LEFT JOIN
. Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN
использовать LEFT JOIN
.
SELECT * FROM left_tbl RIGHT JOIN right_tbl ON (right_tbl. id = left_tbl.id)
Запрос возвращает все записи из правой (второй) таблицы right_tbl
и только совпавшие записи (согласно right_tbl.id = left_tbl.id
) из левой (первой) таблицы left_tbl
.
JOIN
,INNER JOIN
:Объединения при помощи JOIN
или INNER JOIN
производят декартово произведение между указанными таблицами (то есть каждая строка в первой таблице соединяется с каждой совпадающей строкой во второй таблице).
Инструкции JOIN
/INNER JOIN
и запятая ,
между названиями таблиц в операторе FROM семантически эквивалентны. Способ связывания таблиц в этом случае задается в условии WHERE
.
SELECT * FROM left_tbl INNER JOIN right_tbl ON (left_tbl.id = right_tbl.id) -- эквивалентно SELECT * FROM left_tbl, right_tbl WHERE left_tbl.id = right_tbl.id
При использовании инструкции
INNER JOIN
следует учитывать, что процесс соединения таблиц может быть ресурсоемким, поэтому следует соединять только те таблицы, данные из которых действительно необходимы. Чем больше таблиц соединяется, тем больше снижается производительность.
mysql — outer — В чем разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN?
Предложение SQL JOIN используется для объединения строк из двух или более таблиц на основе общего поля между ними.
В SQL доступны разные типы соединений:
INNER JOIN : возвращает строки, когда есть совпадение в обеих таблицах.
LEFT JOIN : возвращает все строки из левой таблицы, даже если в правой таблице нет совпадений.
RIGHT JOIN : возвращает все строки из правой таблицы, даже если в левой таблице нет совпадений.
FULL JOIN : Он объединяет результаты как левого, так и правого внешних соединений.
Объединенная таблица будет содержать все записи из обеих таблиц и заполнять NULL для отсутствия совпадений с обеих сторон.
SELF JOIN : используется для объединения таблицы в себя, как если бы таблица была двумя таблицами, временно переименовывая по крайней мере одну таблицу в SQL-заявлении.
CARTESIAN JOIN : возвращает декартово произведение наборов записей из двух или более объединенных таблиц.
Мы можем взять каждый первый четыре соединения в деталях:
У нас есть две таблицы со следующими значениями.
TableA
id firstName lastName ....................................... 1 arun prasanth 2 ann antony 3 sruthy abc 6 new abc
TableB
id2 age Place ................ 1 24 kerala 2 24 usa 3 25 ekm 5 24 chennai
………………………………………….. ………………
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Примечание : это дает пересечение двух таблиц, то есть строк, которые они имеют общее в TableA и TableB
Синтаксис
SELECT table1. column1, table2.column2... FROM table1 INNER JOIN table2 ON table1.common_field = table2.common_field;
Примените его в нашей примерной таблице:
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;
Результат будет
firstName lastName age Place .............................................. arun prasanth 24 kerala ann antony 24 usa sruthy abc 25 ekm
ВЛЕВО
Примечание : все выделенные строки будут отображаться в таблице A, а также любые общие выбранные строки в TableB.
Синтаксис
SELECT table1.column1, table2.column2... FROM table1 LEFT JOIN table2 ON table1.common_field = table2.common_field;
Примените его в нашей примерной таблице:
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place FROM TableA LEFT JOIN TableB ON TableA. id = TableB.id2;
Результат
firstName lastName age Place ............................................................................... arun prasanth 24 kerala ann antony 24 usa sruthy abc 25 ekm new abc NULL NULL
ПРАВОЕ СОЕДИНЕНИЕ
Примечание : все выбранные строки будут отображаться в таблице Б, плюс любые общие выбранные строки в таблице.
Синтаксис
SELECT table1.column1, table2.column2... FROM table1 RIGHT JOIN table2 ON table1.common_field = table2.common_field;
Примените его в нашей примерной таблице:
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;
Результат
firstName lastName age Place . .............................................................................. arun prasanth 24 kerala ann antony 24 usa sruthy abc 25 ekm NULL NULL 24 chennai
ПОЛНОЕ СОЕДИНЕНИЕ
Примечание . Он вернет все выбранные значения из обеих таблиц.
Синтаксис
SELECT table1.column1, table2.column2... FROM table1 FULL JOIN table2 ON table1.common_field = table2.common_field;
Примените его в нашей примерной таблице:
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;
Результат
firstName lastName age Place .......................................................................... ..... arun prasanth 24 kerala ann antony 24 usa sruthy abc 25 ekm new abc NULL NULL NULL NULL 24 chennai
Интересный факт
Для INNER присоединяется порядок не имеет значения
Для (ВЛЕВО, ВПРАВОЕ ИЛИ ПОЛНОЕ) ВНЕШНИЕ соединения, порядок
Лучше пойти проверить эту Link это даст вам интересные подробности о порядке подачи заявки
В чем разница между INNER JOIN
, LEFT JOIN
, RIGHT JOIN
и FULL JOIN
в MySQL ?
MySQL LEFT JOIN [Поясняется на простых примерах]
В этом руководстве мы изучим MySQL LEFT JOIN
. Мы видели, что такое соединение, в статье INNER JOIN
, но давайте еще раз освежим нашу память. Соединение используется для объединения двух или более таблиц с использованием общего связанного столбца между ними.
В MySQL существуют различные типы соединений. Это –
- Внутреннее соединение
- Левое (внешнее) соединение
- Правое (внешнее) соединение
- Полное внешнее соединение
В этой статье мы сосредоточимся на левом соединении, иногда также называемом левым внешним соединением, и на том, как использовать ключевое слово MySQL LEFT JOIN
для создания левого соединения.
Что такое левое соединение?
Предположим, у вас есть две таблицы — table1 и table2. Ключевое слово левого соединения вернет все записи таблицы1 и те записи, которые соответствуют таблице2. Если записи не совпадают с правой стороны, то в качестве значения для этих записей возвращается NULL. Другими словами, левое соединение включает левую таблицу (таблицу 1) и общие записи между таблицами 1 и 2. Давайте посмотрим на схематическое изображение этого.
Левое соединение Диаграмма 1 Важно отметить, что некоторые базы данных ссылаются на LEFT JOIN
как на LEFT OUTER JOIN
.
Синтаксис MySQL LEFT JOIN
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT выражение FROM table1 [t1] ЛЕВОЕ СОЕДИНЕНИЕ таблица2 [t2] ON table1.column_name = table2.column_name;
Здесь «t1» и «t2» — необязательные псевдонимы, которые вы можете использовать для имен таблиц. Мы увидим больше в примерах. Столбцы, упомянутые после ключевого слова ON, являются связанными общими столбцами, с помощью которых должно выполняться левое соединение.
В приведенном выше запросе «table1» — это самая левая таблица, которая будет в центре внимания левого соединения.
Примеры MySQL LEFT JOIN
Рассмотрим приведенные ниже таблицы «Студенты» и «Отметки».
Таблица отметок таблицы учащихсяВ таблице «Студенты» хранятся сведения об учащемся в каждой строке. В таблице «Отметки» хранятся оценки каждого учащегося по английскому языку, математике и естественным наукам из 100.
Простой пример MySQL LEFT JOIN
Давайте теперь сделаем левое соединение в таблицах «Студенты» и «Отметки», чтобы мы сначала увидели идентификатор каждого учащегося. имя, фамилия и их отметки в науке.
Первым шагом является поиск общих связанных столбцов между двумя таблицами. В данном случае это идентификатор из таблицы «Студенты» и «Код студента» из таблицы «Отметки». Давайте теперь напишем запрос для левого соединения, используя оператор SELECT
.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБЕРИТЕ s.FirstName, s.LastName, m.Science FROM Student s ЛЕВОЕ СОЕДИНЕНИЕ Метки m ON s.ID=m.StudentID;
В приведенном выше запросе Студенты — наша самая левая таблица. Мы используем «s» в качестве сокращенного обозначения для обозначения таблицы «Студенты» и «m» для таблицы «Отметки». Получаем результат следующим образом –
Подождите. Почему Манви Кханна и Джей Шинде имеют NULL в качестве оценок по науке? Как видите, их идентификаторы не имеют записи в таблице Marks, и, поскольку левое соединение включает все записи из самой левой таблицы, их имена включены в набор результатов. Однако, поскольку в таблице Marks нет соответствующих данных для записей Manvi Khanna и Jay Shinde, LEFT JOIN
возвращает NULL в качестве их оценок для Science.
Еще одно наблюдение, которое вы можете заметить, это то, что в таблице оценок есть запись для учащегося с идентификатором 9.. Однако, поскольку в таблице «Студенты» нет записи со значением идентификатора 9, LEFT JOIN
исключает эту запись из таблицы «Отметки». Как вы читали ранее, левое соединение возвращает только записи из самой левой таблицы и общие записи между левой и правой таблицами.
Использование MySQL LEFT JOIN с выражениями
Опираясь на предыдущий запрос, давайте сделаем левое соединение для таблицы «Студенты» и таблицы «Отметки», чтобы увидеть идентификатор, имя, фамилию и процент каждого учащегося. Чтобы рассчитать процент каждого учащегося, мы складываем их оценки по трем предметам, делим на 300, а затем умножаем на 100. Запрос —
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБЕРИТЕ s.ID, s.FirstName, s.LastName, ((м.английский+м.математика+м.наука)/300)*100 AS Процент от студентов ЛЕВОЕ СОЕДИНЕНИЕ Метки m ON s.ID=m.StudentID;
И мы получаем этот вывод как –
MySQL LEFT JOIN с предложением HAVING
Теперь давайте отобразим идентификатор, имя, фамилию и процент студентов, имеющих более 85%. Поскольку нам придется фильтровать запрос через псевдоним Percentage, мы будем использовать Предложение HAVING
вместо предложения WHERE
.
Кодовый язык: SQL (Structured Query Language) (sql)
ВЫБЕРИТЕ s.ID, s.FirstName, s.LastName, ((м.английский+м.математика+м.наука)/300)*100 AS Процент от студентов ЛЕВОЕ СОЕДИНЕНИЕ Метки m ON s.ID=m.StudentID HAVING Percentage>0;
И вывод —
Заключение
LEFT JOIN
, также упоминается в некоторых базах данных как OUTER JOLEFT LEFT0004 — чрезвычайно важная операция, когда речь идет о MySQL. Объединение двух таблиц и отображение этих данных дает полезную информацию о данных. Я настоятельно рекомендую вам попрактиковаться в некоторых примерах MySQL
LEFT JOIN
.
ВНУТРЕННЯЯ, НАРУЖНАЯ, ЛЕВАЯ, ПРАВАЯ, КРЕСТНАЯ
ByRichard Peterson
ЧасыОбновлено
Что такое СОЕДИНЕНИЯ?
Соединения помогают извлекать данные из двух или более таблиц базы данных.
Таблицы связаны между собой первичными и внешними ключами.
Примечание: JOIN — это самая непонятная тема среди тех, кто изучает SQL. Для простоты и легкости понимания мы будем использовать новую базу данных для практического примера. Как показано ниже
идентификатор | имя_имя | фамилия | movie_id |
---|---|---|---|
1 | Адам | Смит | 1 |
2 | Рави | Кумар | 2 |
3 | Сьюзан | Дэвидсон | 5 |
4 | Дженни | Адрианна | 8 |
6 | Ли | Понг | 10 |
идентификатор | название | категория |
---|---|---|
1 | Кредо Убийцы: ТЕМНИ | Анимации |
2 | Настоящая сталь (2012) | Анимации |
3 | Элвин и бурундуки | Анимации |
4 | Приключения Тин Тин | Анимации |
5 | Сейф (2012) | Действие |
6 | Убежище (2012) | Действие |
7 | ГИА | 18+ |
8 | Крайний срок 2009 | 18+ |
9 | Грязная картинка | 18+ |
10 | Марли и я | Романтика |
Типы соединений
Cross JOIN
Cross JOIN — это простейшая форма JOIN, которая сопоставляет каждую строку из одной таблицы базы данных со всеми строками другой.
Другими словами, он дает нам комбинации каждой строки первой таблицы со всеми записями во второй таблице.
Предположим, мы хотим получить все записи участников по всем записям о фильмах. Мы можем использовать сценарий, показанный ниже, чтобы получить желаемые результаты.
SELECT * FROM `movies` CROSS JOIN `members`
Выполнение приведенного выше сценария в рабочей среде MySQL дает нам следующие результаты.
идентификатор название идентификатор имя_имя фамилия movie_id 1 Кредо Убийцы: УГЛИ Анимации 1 Адам Смит 1 1 Кредо Убийцы: УГЛИ Анимации 2 Рави Кумар 2 1 Кредо Убийцы: УГЛИ Анимации 3 Сьюзан Дэвидсон 5 1 Кредо Убийцы: УГЛИ Анимации 4 Дженни Адрианна 8 1 Кредо Убийцы: УГЛИ Анимации 6 Ли Понг 10 2 Настоящая сталь (2012) Анимации 1 Адам Смит 1 2 Настоящая сталь (2012) Анимации 2 Рави Кумар 2 2 Настоящая сталь (2012) Анимации 3 Сьюзан Дэвидсон 5 2 Настоящая сталь (2012) Анимации 4 Дженни Адрианна 8 2 Настоящая сталь (2012) Анимации 6 Ли Понг 10 3 Элвин и бурундуки Анимации 1 Адам Смит 1 3 Элвин и бурундуки Анимации 2 Рави Кумар 2 3 Элвин и бурундуки Анимации 3 Сьюзан Дэвидсон 5 3 Элвин и бурундуки Анимации 4 Дженни Адрианна 8 3 Элвин и бурундуки Анимации 6 Ли Понг 10 4 Приключения Тин Тин Анимации 1 Адам Смит 1 4 Приключения Тин Тин Анимации 2 Рави Кумар 2 4 Приключения Тин Тин Анимации 3 Сьюзан Дэвидсон 5 4 Приключения Тин Тин Анимации 4 Дженни Адрианна 8 4 Приключения Тин Тин Анимации 6 Ли Понг 10 5 Сейф (2012) Действие 1 Адам Смит 1 5 Сейф (2012) Действие 2 Рави Кумар 2 5 Сейф (2012) Действие 3 Сьюзан Дэвидсон 5 5 Сейф (2012) Действие 4 Дженни Адрианна 8 5 Сейф (2012) Действие 6 Ли Понг 10 6 Убежище (2012) Действие 1 Адам Смит 1 6 Убежище (2012) Действие 2 Рави Кумар 2 6 Убежище (2012) Действие 3 Сьюзан Дэвидсон 5 6 Безопасный дом (2012) Действие 4 Дженни Адрианна 8 6 Убежище (2012) Действие 6 Ли Понг 10 7 ГИА 18+ 1 Адам Смит 1 7 ГИА 18+ 2 Рави Кумар 2 7 ГИА 18+ 3 Сьюзан Дэвидсон 5 7 ГИА 18+ 4 Дженни Адрианна 8 7 ГИА 18+ 6 Ли Понг 10 8 Крайний срок (2009) 18+ 1 Адам Смит 1 8 Крайний срок (2009) 18+ 2 Рави Кумар 2 8 Крайний срок (2009) 18+ 3 Сьюзан Дэвидсон 5 8 Крайний срок (2009) 18+ 4 Дженни Адрианна 8 8 Крайний срок (2009) 18+ 6 Ли Понг 10 9 Грязная картинка 18+ 1 Адам Смит 1 9 Грязная картинка 18+ 2 Рави Кумар 2 9 Грязная картинка 18+ 3 Сьюзан Дэвидсон 5 9 Грязная картинка 18+ 4 Дженни Адрианна 8 9 Грязная картинка 18+ 6 Ли Понг 10 10 Марли и я Романтика 1 Адам Смит 1 10 Марли и я Романтика 2 Рави Кумар 2 10 Марли и я Романтика 3 Сьюзан Дэвидсон 5 10 Марли и я Романтика 4 Дженни Адрианна 8 10 Марли и я Романтика 6 Ли Понг 10
INNER JOIN
Внутреннее соединение используется для возврата строк из обеих таблиц, удовлетворяющих заданному условию.
Предположим, вы хотите получить список участников, которые брали напрокат фильмы, вместе с названиями арендованных ими фильмов. Вы можете просто использовать для этого INNER JOIN, который возвращает строки из обеих таблиц, которые удовлетворяют заданным условиям.
ВЫБЕРИТЕ участников.`first_name`, участников.`last_name`, фильмов.`название` ОТ членов ,фильмы ГДЕ фильмы.`id` = Members.`movie_id`
Выполнение вышеуказанного скрипта дает
имя_имя фамилия название Адам Смит Кредо Убийцы: УГЛИ Рави Кумар Настоящая сталь (2012) Сьюзен Дэвидсон Сейф (2012) Дженни Адрианна Крайний срок (2009) Ли Понг Марли и я
Обратите внимание, что приведенный выше сценарий результатов можно также написать следующим образом для достижения тех же результатов.
ВЫБЕРИТЕ A.`first_name`, A.`last_name`, B.`title` ОТ `участников`AS A ВНУТРЕННЕЕ СОЕДИНЕНИЕ `фильмы` AS B ON B.`id` = A.`movie_id`
Внешние соединения
Внешние соединения MySQL возвращают все совпадающие записи из обеих таблиц.
Может обнаруживать записи, не имеющие совпадения в объединенной таблице. Он возвращает значений NULL для записей объединенной таблицы, если совпадений не найдено.
Звучит запутанно ? Давайте рассмотрим пример —
LEFT JOIN
Теперь предположим, что вы хотите получить названия всех фильмов вместе с именами участников, взявших их напрокат. Понятно, что некоторые фильмы никто не брал в прокат. Мы можем просто использовать ЛЕВОЕ СОЕДИНЕНИЕ для этой цели.
LEFT JOIN возвращает все строки из таблицы слева, даже если в таблице справа не найдено совпадающих строк. Если в таблице справа не найдено совпадений, возвращается NULL.
ВЫБЕРИТЕ A.`title`, B.`first_name`, B.`last_name` ИЗ `кино` КАК А LEFT JOIN `members` КАК B ON B.`movie_id` = A.`id`
Выполнение вышеуказанного сценария в рабочей среде MySQL дает. Вы можете видеть, что в возвращаемом результате, который указан ниже, для фильмов, которые не взяты напрокат, поля имени участника имеют значения NULL. . Это означает, что ни один соответствующий элемент не нашел таблицу участников для этого конкретного фильма.
Примечание. Для несовпадающих строк справа возвращается значение null.
Название имя_имя фамилия Кредо Убийцы: ТЕМНИ Адам Смит Настоящая сталь (2012) Рави Кумар Сейф (2012) Сьюзан Дэвидсон Крайний срок (2009) Дженни Адрианна Марли и я Ли Понг Элвин и бурундуки НУЛЕВОЙ НУЛЕВОЙ Приключения Тин Тин НУЛЕВОЙ НУЛЕВОЙ Убежище (2012) НУЛЕВОЙ НУЛЕВОЙ ГИА НУЛЕВОЙ НУЛЕВОЙ Грязная картинка НУЛЕВОЙ НУЛЕВОЙ
ПРАВОЕ СОЕДИНЕНИЕ
ПРАВОЕ СОЕДИНЕНИЕ, очевидно, противоположно ЛЕВОМУ СОЕДИНЕНИЮ. ПРАВОЕ СОЕДИНЕНИЕ возвращает все столбцы из таблицы справа, даже если в таблице слева не найдено совпадающих строк. Если в таблице слева не найдено совпадений, возвращается NULL.
В нашем примере предположим, что вам нужно получить имена участников и фильмы, взятые ими напрокат. Теперь у нас есть новый участник, который еще не взял ни одного фильма напрокат
ВЫБЕРИТЕ A.`first_name`, A.`last_name`, B.`title` ОТ `членов` КАК А ПРАВО ПРИСОЕДИНЯЙТЕСЬ к фильму КАК Б ON B.`id` = A.`movie_id`
Выполнение вышеуказанного скрипта в рабочей среде MySQL дает следующие результаты.
Примечание. Для несовпадающих строк слева возвращается значение null.
имя_имя фамилия название Адам Смит Кредо Убийцы: УГЛИ Рави Кумар Настоящая сталь (2012) Сьюзан Дэвидсон Сейф (2012) Дженни Адрианна Крайний срок (2009) Ли Понг Марли и я НУЛЕВОЙ НУЛЕВОЙ Элвин и бурундуки НУЛЕВОЙ НУЛЕВОЙ Приключения Тин Тин НУЛЕВОЙ НУЛЕВОЙ Убежище (2012) НУЛЕВОЙ НУЛЕВОЙ ГИА НУЛЕВОЙ НУЛЕВОЙ Грязная картинка
Предложения «ON» и «USING»
В приведенных выше примерах запроса JOIN мы использовали предложение ON для сопоставления записей между таблицами.
Предложение USINGтакже может использоваться для той же цели. Разница с USING заключается в том, что должен иметь одинаковые имена для совпадающих столбцов в обеих таблицах.
До сих пор в таблице «movies» мы использовали ее первичный ключ с именем «id». Мы ссылались на него в таблице «members» с именем «movie_id».
Давайте переименуем поле «id» таблицы «фильмы», чтобы оно имело имя «movie_id». Мы делаем это для того, чтобы иметь одинаковые совпадающие имена полей.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Далее давайте используем USING с приведенным выше примером LEFT JOIN.
ВЫБЕРИТЕ A.`title`, B.`first_name`, B.`last_name` ИЗ `кино` КАК А LEFT JOIN `members` КАК B USING ( `movie_id` )
Кроме использования ON и USING с соединениями вы можете использовать многие другие предложения MySQL, такие как GROUP BY, WHERE и даже такие функции, как SUM , AVG и т. д.
Почему мы должны использовать соединения?
Теперь вы можете подумать, почему мы используем JOIN, когда мы можем выполнять ту же задачу, выполняя запросы. Особенно, если у вас есть некоторый опыт программирования баз данных, вы знаете, что мы можем запускать запросы один за другим, использовать вывод каждого в последовательных запросах. Конечно, это возможно. Но используя JOIN, вы можете выполнить работу, используя только один запрос с любыми параметрами поиска. С другой стороны MySQL может добиться большей производительности с помощью JOIN, так как он может использовать индексирование. Простое использование одного запроса JOIN вместо выполнения нескольких запросов снижает нагрузку на сервер. Вместо этого использование нескольких запросов приводит к большему количеству передач данных между MySQL и приложениями (программным обеспечением). Кроме того, требуется больше манипуляций с данными в конце приложения.
Ясно, что мы можем добиться лучшей производительности MySQL и приложений с помощью JOIN.
Резюме- СОЕДИНЕНИЯ позволяют нам объединять данные из более чем одной таблицы в один набор результатов.
- JOINS имеют лучшую производительность по сравнению с подзапросами
- ВНУТРЕННИЕ СОЕДИНЕНИЯ возвращают только те строки, которые соответствуют заданным критериям.
- OUTER JOINS также может возвращать строки, в которых не было найдено совпадений. Несопоставленные строки возвращаются с ключевым словом NULL.
- Основные типы JOIN включают Inner, Left Outer, Right Outer, Cross JOINS и т. д.
- Часто используемое предложение в операциях JOIN — «ON». Предложение «USING» требует, чтобы соответствующие столбцы имели одно и то же имя.
- JOINS также можно использовать в других предложениях, таких как GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS и т. д.
MySQL: Соединения
В этом руководстве по MySQL объясняется, как использовать MySQL СОЕДИНЕНИЯ (внутреннее и внешнее) с синтаксисом, наглядными иллюстрациями и примерами.
Описание
MySQL СОЕДИНЕНИЯ используются для извлечения данных из нескольких таблиц. MySQL JOIN выполняется всякий раз, когда две или более таблиц соединяются в операторе SQL.
Существуют различные типы соединений MySQL:
- ВНУТРЕННЕЕ СОЕДИНЕНИЕ MySQL (или иногда называемое простым соединением)
- MySQL LEFT OUTER JOIN (или иногда называемый LEFT JOIN)
- MySQL ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ (или иногда называемое ПРАВЫМ СОЕДИНЕНИЕМ)
Итак, давайте обсудим синтаксис MySQL JOIN, посмотрим на визуальные иллюстрации MySQL JOIN и рассмотрим примеры MySQL JOIN.
INNER JOIN (простое соединение)
Скорее всего, вы уже написали выражение, использующее MySQL INNER JOIN. Это наиболее распространенный тип соединения. ВНУТРЕННИЕ СОЕДИНЕНИЯ MySQL возвращают все строки из нескольких таблиц, где выполняется условие соединения.
Синтаксис
Синтаксис для ВНУТРЕННЕГО СОЕДИНЕНИЯ в MySQL:
SELECT столбцы ИЗ таблицы1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблица2 ON таблица1. столбец = таблица2.столбец;
Визуальная иллюстрация
На этой визуальной диаграмме MySQL INNER JOIN возвращает заштрихованную область:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ MySQL вернет записи, где table1 и table2 пересекаются.
Пример
Вот пример ВНУТРЕННЕГО СОЕДИНЕНИЯ MySQL:
ВЫБОР ОТ поставщиков ВНУТРЕННЕЕ СОЕДИНЕНИЕ заказы ПО Suppliers.supplier_id = orders.supplier_id;
В этом примере MySQL INNER JOIN будут возвращены все строки из таблиц поставщиков и заказов, для которых имеется совпадающее значение supplier_id как в таблицах поставщиков, так и в таблицах заказов.
Давайте посмотрим на некоторые данные, чтобы объяснить, как работают ВНУТРЕННИЕ СОЕДИНЕНИЯ:
У нас есть таблица с именем Suppliers с двумя полями (supplier_id и supplier_name). Он содержит следующие данные:
supplier_id | имя_поставщика |
---|---|
10000 | IBM |
10001 | Хьюлетт Паккард |
10002 | Майкрософт |
10003 | NVIDIA |
У нас есть другая таблица с именем заказы с тремя полями (order_id, supplier_id и order_date). Он содержит следующие данные:
order_id | идентификатор_поставщика | дата_заказа |
---|---|---|
500125 | 10000 | 12.05.2013 |
500126 | 10001 | 13.05.2013 |
500127 | 10004 | 14.05.2013 |
Если мы запустим инструкцию MySQL SELECT (содержащую ВНУТРЕННЕЕ СОЕДИНЕНИЕ) ниже: ОТ поставщиков ВНУТРЕННЕЕ СОЕДИНЕНИЕ заказы ПО Suppliers.supplier_id = orders.supplier_id;
Наш результирующий набор будет выглядеть так:
идентификатор_поставщика | имя | дата_заказа |
---|---|---|
10000 | IBM | 12.05.2013 |
10001 | Хьюлетт Паккард | 13. 05.2013 |
Строки для Microsoft и NVIDIA из таблицы поставщиков будут опущены, поскольку идентификаторы Supplier_id 10002 и 10003 не существуют в обеих таблицах. Строка для 500127 (order_id) из таблицы заказов будет опущена, так как supplier_id 10004 не существует в таблице поставщиков.
Старый синтаксис
В заключение стоит упомянуть, что приведенный выше пример MySQL INNER JOIN можно переписать с использованием старого неявного синтаксиса следующим образом (но мы по-прежнему рекомендуем использовать синтаксис ключевого слова INNER JOIN):
ВЫБЕРИТЕ поставщиков. поставщик_идентификатор, поставщики.поставщик_название, заказы.дата_заказа ОТ поставщиков, заказы ГДЕ Suppliers.supplier_id = orders.supplier_id;
LEFT OUTER JOIN
Другой тип соединения называется MySQL LEFT OUTER JOIN. Этот тип объединения возвращает все строки из ЛЕВОЙ таблицы, указанной в условии ON и 9.0305 только те строки из другой таблицы, где соединяемые поля равны (соблюдено условие соединения).
Синтаксис
Синтаксис для LEFT OUTER JOIN в MySQL:
столбцы SELECT ИЗ таблицы1 ЛЕВЫЙ [ВНЕШНИЙ] ПРИСОЕДИНЯЙТЕСЬ к таблице2 ON таблица1.столбец = таблица2.столбец;
В некоторых базах данных ключевые слова LEFT OUTER JOIN заменены на LEFT JOIN.
Визуальная иллюстрация
На этой визуальной диаграмме MySQL LEFT OUTER JOIN возвращает заштрихованную область:
MySQL LEFT OUTER JOIN вернет все записи из table1 и только те записи из table2 , которые пересекаются с table1 .
Пример
Вот пример MySQL LEFT OUTER JOIN:
SELECT supplier.supplier_id, Suppliers.supplier_name, orders.order_date ОТ поставщиков ЗАКАЗЫ ЛЕВОЕ СОЕДИНЕНИЕ ПО Suppliers.supplier_id = orders.supplier_id;
Этот пример LEFT OUTER JOIN вернет все строки из таблицы поставщиков и только те строки из таблицы заказов, в которых объединенные поля равны.
Если значение supplier_id в таблице поставщиков не существует в таблице заказов, все поля в таблице заказов будут отображаться как
Давайте посмотрим на некоторые данные, чтобы объяснить, как работают ЛЕВЫЕ ВНЕШНИЕ СОЕДИНЕНИЯ:
У нас есть таблица с именем Suppliers с двумя полями (supplier_id и supplier_name). Он содержит следующие данные:
supplier_id | имя_поставщика |
---|---|
10000 | IBM |
10001 | Хьюлетт Паккард |
10002 | Майкрософт |
10003 | NVIDIA |
У нас есть вторая таблица с именем заказы с тремя полями (order_id, supplier_id и order_date). Он содержит следующие данные:
order_id | идентификатор_поставщика | дата_заказа |
---|---|---|
500125 | 10000 | 12.05.2013 |
500126 | 10001 | 13. 05.2013 |
Если мы запустим инструкцию SELECT (содержащую LEFT OUTER JOIN) ниже: ОТ поставщиков ЗАКАЗЫ ЛЕВОЕ СОЕДИНЕНИЕ ПО Suppliers.supplier_id = orders.supplier_id;
Наш результирующий набор будет выглядеть следующим образом:
supplier_id | имя_поставщика | дата_заказа |
---|---|---|
10000 | IBM | 12.05.2013 |
10001 | Хьюлетт Паккард | 13.05.2013 |
10002 | Майкрософт | <ноль> |
10003 | NVIDIA | <ноль> |
Строки для Microsoft и NVIDIA будут включены, поскольку использовалось LEFT OUTER JOIN. Однако вы заметите, что поле order_date для этих записей содержит значение
RIGHT OUTER JOIN
Другой тип соединения называется MySQL RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из ПРАВОЙ таблицы, указанной в условии ON и 9.0305 только те строки из другой таблицы, где соединяемые поля равны (соблюдено условие соединения).
Синтаксис
Синтаксис для RIGHT OUTER JOIN в MySQL:
SELECT columns ИЗ таблицы1 ПРАВОЕ [ВНЕШНЕЕ] ПРИСОЕДИНЯЙТЕСЬ к таблице2 ON таблица1.столбец = таблица2.столбец;
В некоторых базах данных ключевые слова RIGHT OUTER JOIN заменены на RIGHT JOIN.
Визуальная иллюстрация
На этой визуальной диаграмме MySQL RIGHT OUTER JOIN возвращает заштрихованную область:
MySQL RIGHT OUTER JOIN вернет все записи из table2 и только те записи из table1 , которые пересекаются с table2 .
Пример
Вот пример MySQL RIGHT OUTER JOIN:
SELECT orders.order_id, orders.order_date, Suppliers.supplier_name ОТ поставщиков ПРАВОЕ СОЕДИНЕНИЕ заказов ПО Suppliers.supplier_id = orders.supplier_id;
Этот пример RIGHT OUTER JOIN вернет все строки из таблицы заказов и только те строки из таблицы поставщиков, в которых объединенные поля равны.
Если значение supplier_id в таблице заказов не существует в таблице поставщиков, все поля в таблице поставщиков будут отображаться как
Давайте посмотрим на некоторые данные, чтобы объяснить, как работают RIGHT OUTER JOINS:
У нас есть таблица с именем Suppliers с двумя полями (supplier_id и supplier_name). Он содержит следующие данные:
supplier_id | имя_поставщика |
---|---|
10000 | яблоко |
10001 | Гугл |
У нас есть вторая таблица с именем заказы с тремя полями (order_id, supplier_id и order_date). Он содержит следующие данные:
order_id | идентификатор_поставщика | дата_заказа |
---|---|---|
500125 | 10000 | 12. 08.2013 |
500126 | 10001 | 13.08.2013 |
500127 | 10002 | 14.08.2013 |
Если мы запустим инструкцию SELECT (содержащую ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ) ниже: ОТ поставщиков ПРАВОЕ СОЕДИНЕНИЕ заказов ПО Suppliers.supplier_id = orders.supplier_id;
Наш результирующий набор будет выглядеть следующим образом:
order_id | дата_заказа | имя_поставщика |
---|---|---|
500125 | 12.08.2013 | яблоко |
500126 | 13.08.2013 | Гугл |
500127 | 14.08.2013 | <ноль> |
Строка для 500127 (order_id) будет включена, поскольку использовалось ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ. Однако вы заметите, что поле supplier_name для этой записи содержит значение
Левое внешнее соединение в MySQL
В этой статье мы рассмотрим левое внешнее соединение в MySQL. Left Outer Join получает все строки из левой таблицы и общие строки обеих таблиц.
Возьмем пример правильного соединения.
Пример:
Ниже представлена диаграмма Венна левого внешнего соединения.
На приведенной ниже диаграмме таблица A слева присоединена к таблице B. Здесь все строки из таблицы. А учитываются и общие строки из обеих таблиц.
Примечание. Левое внешнее соединение является синонимом ЛЕВОЕ соединение.
Синтаксис:
SELECT * FROM TABLE_A A
LEFT OUTER JOIN TABLE_B B
ON A.Common_COLUMN=B.Common_COLUMN
WHERE
Ключевые отличия левого соединения от правого соединения
Ниже приведены основные отличия левого соединения от правого соединения:
Левое внешнее соединение | Правое внешнее соединение |
Рассмотрим все строки из таблицы и общие строки из обеих таблиц. | Считать все строки из правой таблицы и общие из обеих таблиц. |
INNER Соединение + все строки из левой таблицы. | INNER Join + все строки из правой таблицы. |
Соединения на основе условия. | Соединения на основе условия. |
Ключевое слово ON используется для указания условия и объединения таблиц. | Ключевое словоON используется для указания условия и объединения таблиц. |
Набор результатов содержит значения NULL. Нижеследующий синтаксис можно использовать для игнорирования значений NULL: SELECT * FROM TABLE_A A | Набор результатов содержит значения NULL. Нижеследующий синтаксис можно использовать для игнорирования значений NULL: SELECT * FROM TABLE_A A |
SELECT * FROM TABLE_A LEFT OUTER JOIN TABLE B ON A. Common_COLUMN =B. Common_COLUMN | ВЫБЕРИТЕ * ИЗ ТАБЛИЦЫ_A ПРАВАЯ ВНЕШНЯЯ СОЕДИНИТЕЛЬНАЯ ТАБЛИЦА B НА A. Common_COLUMN =B. Common_COLUMN |
Как использовать ЛЕВОЕ внешнее соединение в MYSQL?
- ЛЕВОЕ внешнее соединение = все строки из ЛЕВОЙ таблицы + ВНУТРЕННЕЕ соединение.
- Считать все строки из левой таблицы и общие из обеих таблиц.
- Соединения на основе условия. Ключевое слово
- ON используется для указания условия и объединения таблиц.
Примеры реализации левого внешнего соединения
Ниже приведен пример реализации левого внешнего соединения в MySQL:
Пример № 1
давайте рассмотрим две таблицы и применим левое внешнее соединение на таблицах:
Таблица кредита:
Заем:
Query to из двух таблиц:
Код:
ВЫБЕРИТЕ L. LOAN_NO, L.LOAN_STATUS, B.BORROWER_DATE
FROM LOAN L LEFT OUTER JOIN BORROWER B
ON L.LOAN_NO=B.LOAN_NO
Вывод:
Набор результатов содержит значения NULL. Чтобы игнорировать значения NULL, можно использовать приведенный ниже синтаксис:
Код:
SELECT * FROM TABLE_A A
LEFT OUTER JOIN TABLE B B
ON A. Common_COLUMN =B. Common_COLUMN
ГДЕ A.Common_COLUMN IS NULL
Пример #2
Давайте рассмотрим две таблицы и применим ЛЕВОЕ внешнее соединение к таблицам: Запрос для получения ссуды №, статуса, ссуды и даты заемщика из двух таблиц.
Код:
SELECT L.Loan_NO, L.Loan_status, L.Loan_Amount, B.Borrower_Date
из кредит Lever Overt Join Borret B
приведенной выше таблицы после применения к ним левого внешнего соединения.
Выходные данные:
Пример #3
Давайте рассмотрим две таблицы и применим левое внешнее соединение к таблицам: Запрос, чтобы получить номер_кредита, статус, сумму_кредита и дату заемщика из двух таблиц.
Код:
SELECT L.Loan_NO, L.Loan_status, L.Loan_Amount, B.Borrower_Date
из заемщика B Left Over Join Len приведенной выше таблицы после применения к ним левого внешнего соединения.
Вывод:
В приведенной выше таблице КРЕДИТ — это правая таблица, а Заемщик — левая таблица. Как и в левом ВНЕШНЕМ соединении, мы получаем внутреннее соединение + все строки из левой таблицы. Здесь мы получаем все строки из таблицы «Заемщик», которая остается в таблице, и строки внутреннего соединения с таблицей «кредит». Отсутствующие значения будут равны NULL.
Заключение
Чтобы получить данные, относящиеся к требованию клиента, нам может понадобиться соединить таблицы, которые будут выполняться с помощью соединений. Как упоминалось ранее, соединения используются для получения данных из более чем одной таблицы. Чтобы объединить более одной таблицы, нам нужен хотя бы один столбец, общий для обеих таблиц. Таблицы объединяются на основе указанного условия.
Рекомендуемые статьи
Это руководство по левому внешнему соединению в MySQL. Здесь мы обсуждаем, как использовать левое внешнее соединение? с ключевыми различиями между левым и правым соединениями, а также с примерами для реализации. Вы также можете ознакомиться с другими нашими статьями по теме, чтобы узнать больше –
- Таблица в MySQL
- ORDER BY в MySQL
- MySQL МЕЖДУ
- Подстановочные знаки в MySQL
SQL левый запрос на соединение таблиц MySQL
Мы храним данные в разных таблицах в зависимости от их свойств и способа их использования. Студент может сдавать несколько экзаменов, и его оценка может быть сохранена в таблице результатов экзамена. Студенческая мастер-таблица не обязательно должна содержать все эти детали, такие как семестр, тип экзамена или оценка на каждом экзамене.Отчет может быть сгенерирован путем сбора сведений о студентах из основной таблицы студентов, семестра и оценок из таблицы результатов экзаменов.
Давайте поймем разницу между левым соединением и условием ГДЕ.
Есть две таблицы с некоторыми примерами данных. Мы применим первую команду sql where к
эти таблицы.
Стол один ( t1 ) | Стол второй ( t2) | ||||||||||||||||
|
|
Использование запроса WHERE
ВЫБЕРИТЕ t1. id,t1.name1 ИЗ `t1`,t2, ГДЕ t1.id=t2.idВывод приведенной выше команды SQL даст записи таблицы MySQL t1, для которых в таблице t2 есть запись, и связывание выполняется по полю id.
id | имя1 |
---|---|
1 | один1 |
2 | два1 |
С ИСПОЛЬЗОВАНИЕМ ЛЕВОГО СОЕДИНЕНИЯ
ВЫБЕРИТЕ t1.id, name1, t2.id, t2.name2 ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ t2 ON t1.id = t2.idМы можем отобразить все записи таблицы t1 вместе с (соответствием) записи t2, если совпадение найдено путем их связывания через поле ID. Вот левый SQL-запрос соединения, чтобы отобразить это и ниже, что указано в выводе.
id | name1 | id | name2 |
---|---|---|---|
1 | one1 | 1 | one2 |
2 | two1 | 2 | two2 |
3 | three1 | ПУСТО | ПУСТО |
ЛЕВОЕ СОЕДИНЕНИЕ с IS NULL
Приведенный выше результат показывает простое левое соединение и его выходные данные. Нам может быть интересно идентифицировать записи в таблице t1, для которых нет соответствующей записи в таблице t2. Здесь мы должны использовать левое соединение и связать таблицы по полю id.Вот запрос, использующий левое соединение, и вывод ниже.
ВЫБЕРИТЕ t1.id, имя1 ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ t2 на t1.id = t2.id ГДЕ ISNULL (t2.id)для MySQL 5 и выше попробуйте так:
SELECT t1.id, name1 FROM t1 LEFT JOIN t2 on t1.id = t2.id ГДЕ (t2.id) равно нулю
идентификатор | имя1 |
---|---|
3 | три1 |
В приведенном выше результате мы видели, как работает вывод, когда нам нужно получить записи, которых нет в другой таблице. Теперь давайте узнаем по-другому , мы получим запись первой таблицы, для которой существует соответствующая запись в таблице 2. Вот левый sql соединения и под ним результаты запроса.
ВЫБЕРИТЕ t1.id,name1,t2.id,t2.name2 ИЗ t1 LEFT JOIN t2 ON t1. id = t2.id WHERE NOT ISNULL( t2.id )для MySQL 5 попробуйте так
SELECT t1.id,name1,t2.id,t2.name2 FROM t1 LEFT JOIN t2 ON t1.id = t2.id WHERE ( t2.id ) NOT is null
| Связанные учебники LEFT JOIN Несколько таблиц ВНУТРЕННЕЕ соединение MySQL ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ MySQL MySQL ПРАВОЕ СОЕДИНЕНИЕ |
PHP-скрипт, использующий левое соединение для отображения записей
Мы попробуем разработать один PHP-скрипт для отображения записей с помощью запроса левого соединения. Здесь мы использовали соединение PHP PDO для подключения к базе данных MySQL. Подробнее о подключении PHP к MySQL с использованием PDO можно прочитать здесь.После подключения мы использовали цикл foreach для отображения всех записей. Вот код.
"; echo "Мы можем заменить часть запроса в приведенном выше коде, чтобы проверить другие результаты."; foreach ($dbo->query($count) as $row) { echo " идентификатор имя1 "; } эхо "таблица>"; ?> $row[id] $row[name1]
Вот дамп SQL двух таблиц t1 и t2
Применение запроса LEFT Join
У нас есть две таблицы: одна — список студентов, а другая — выбранная футбольная команда. Некоторые из студентов выбираются для игры в футбольной команде. В нашей футбольной таблице мы сохранили два студенческих билета (выбранных для футбольной команды).Используя левое соединение, мы можем перечислить различные способы отображения списка.
- Показать всех учеников с отметкой для тех, кто выбран
SELECT * FROM `student` LEFT JOIN student_football ON id=f_id
Из приведенного выше списка вы можете видеть, что с помощью условия WHERE мы можем отфильтровать наши необходимые записи.
SELECT * FROM `student` LEFT JOIN student_football ON id=f_id, ГДЕ f_id НЕ NULL
SELECT * FROM `student` LEFT JOIN student_football ON id=f_id, ГДЕ f_id IS NULL
Использование трех таблиц в запросе LEFT Join
В приведенном выше примере мы увидели, как узнать записи, присутствующие в одной таблице и отсутствующие в другой таблице. Давайте попробуем на другом примере.Помимо футбольной команды есть еще одна бейсбольная команда. Два студента выбираются в бейсбольную команду. Итак, теперь у нас двое в футбольной команде и двое в бейсбольной команде.
Показать всех учеников с отметкой для тех, кто отобран в команды (любые)
ВЫБЕРИТЕ * ИЗ `студента`
LEFT JOIN student_football ON id=f_id
ЛЕВОЕ ПРИСОЕДИНЯЙСЯ student_baseball к id=b_id
Далее давайте выясним, кто из учеников не попал ни в одну из команд. Другими словами, найдите записи в таблице учеников, которые не имеют совпадающих записей в таблице футбола или бейсбола (команда).
ВЫБЕРИТЕ * ИЗ `студента`. Мы можем получить аналогичный результат, используя UNION, NOT IN и подзапросы.
LEFT JOIN student_football ON id=f_id
ЛЕВОЕ ПРИСОЕДИНЯЙСЯ student_baseball к id=b_id
ГДЕ f_id равен NULL, а b_id равен NULL
Подробнее Null data можно прочитать здесь.
Загрузить дамп sql таблиц student и student_footbal
.Упражнение Для лучшего понимания LEFT JOIN просмотрите пример кода для создания отчетов о продажах.
← ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ LEFT JOIN с использованием нескольких таблиц →ПРАВОЕ СОЕДИНЕНИЕ→ СОЕДИНЕНИЕ ТАБЛИЦ→
Упражнение: Продажи — Агент с использованием табличных функций JOIN и Date →
Выполнение ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ над ВНУТРЕННИМ СОЕДИНЕНИЕМ для написания более выразительного SQL в MySQL 5.
6.37 На прошлой неделе я работал с одним из наших старших специалистов по данным, Кейтлин Седерс, над созданием отчетов из наши базы данных MySQL и Redshift. Это было одновременно захватывающе и утомительно — когда вы думаете, что достаточно хорошо знаете свой SQL, попробуйте сесть с специалистом по данным и подготовиться к скорректируйте свое эго ! За время, проведенное вместе, я использовал множество методов SQL, которые обычно не использую. Например, я использовал SELECT
и UNION
для создания производных наборов данных, чтобы JOIN
данные CSV с данными таблицы. Еще одна функция SQL, которую я вытащил, — это возможность выполнять LEFT OUTER JOIN
для INNER JOIN
в MySQL. Синтаксис для этого немного странный; но это позволяет вам писать запросы, которые более точно описывают ваши намерения.
Чтобы продемонстрировать эту технику, давайте создадим следующую таблицу friend
:
mysql> ВЫБЕРИТЕ * ОТ друга; +----+--------+------+--------------- ------------------+ | идентификатор | имя | возраст | поймать фразу | +----+--------+------+--------------- ------------------+ | 1 | Тина | 39 | Если не сломалось, старайся сильнее. | | 2 | Дэнни | 28 | | | 3 | Эллен | 50 | Что? | | 4 | Ральф | 8 | Печенье! | | 5 | Сэнди | 33 | Не забудьте остановиться и понюхать цыплят! | | 6 | Джоанна | 42 | Да да да / | | 7 | Коул | 30 | Это не конец, пока не закончится. | +----+--------+------+--------------- ------------------+ 7 рядов в сете (0,00 сек)
И, чтобы дать нам что-то интересное для ПРИСОЕДИНЯЙТЕСЬ
против, давайте создадим таблицу friend_relationship
, которая моделирует отношения между друзьями, которые могут быть либо доброжелательными ( feel='friend'
), либо агрессивными ( feel='enemy'
):
mysql> SELECT * FROM friend_relationship; +----+-------------+--------------+---------+ | идентификатор | другИдОдин | другИдТво | чувство | +----+-------------+--------------+---------+ | 1 | 1 | 3 | друг | | 2 | 1 | 5 | друг | | 3 | 5 | 1 | враг | | 4 | 2 | 4 | друг | | 5 | 4 | 2 | друг | | 6 | 5 | 2 | друг | +----+-------------+--------------+---------+ 6 рядов в сете (0,00 сек)
Представим, что, имея эти две таблицы, мы хотим получить список друзей вместе со списком друзей между друзьями . Другими словами, мы хотим увидеть всех друзей плюс друзей, с которыми дружат эти друзья. Делая это, мы знаем две вещи:
Не все
записи о друзьях
имеют соответствующиезаписи о друзьях
, потому что не все друзья знают друг друга.Все записи
friend_relationship
должны соответствовать записям в таблицеfriend
, поскольку таблицаfriend_relationship
, по сути, является прославленной таблицей «соединений» со ссылками на внешние ключи.
Чтобы преобразовать это в « намерение присоединения », мы хотим:
друг
==> ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
==> друг_отношение
А,
друзья_отношения
==> ВНУТРЕННЕЕ СОЕДИНЕНИЕ
==> друг
Наивная попытка систематизировать это в запросе SQL может выглядеть так:
ВЫБЕРИТЕ ф. ид, ф.имя, ф.возраст, ( otherFriend.id ) КАК friend_id, ( otherFriend.name ) КАК имя_друга, ( otherFriend.age ) КАК friend_age ИЗ друг ф -- Так как НЕ ВСЕ друзья будут иметь отношения друг с другом, нам нужно -- выполнить LEFT JOIN, чтобы не уменьшать записи из первой таблицы. ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ друг_отношения r НА ( r.friendIdOne = f.id А ТАКЖЕ r.feeling = 'друг' ) -- Получить все записи друзей, которые соответствуют ПРАВОЙ стороне отношений. -- ВНИМАНИЕ: ВНУТРЕННЕЕ СОЕДИНЕНИЕ здесь НЕ РАБОТАЕТ, как можно было ожидать! ВНУТРЕННЕЕ СОЕДИНЕНИЕ друг НА otherFriend.id = r.friendIdTwo СОРТИРОВАТЬ ПО ф.имя ASC, имя_друга ASC ;
Здесь мы пытаемся зафиксировать два соединения, как было сказано ранее: первое — LEFT OUTER JOIN
, а второе — INNER JOIN
. К сожалению, это не работает. INNER JOIN
в конечном итоге ограничивает набор результатов, поскольку он говорит о конечном перекрестном произведении. Таким образом, когда мы запускаем приведенный выше SQL-запрос в MySQL, мы получаем следующий результат:
+----+-------+-----+-----------+-------------+--- ---------+ | идентификатор | имя | возраст | id_друга | имя_друга | друг_возраст | +----+-------+-----+------------+-------------+---- --------+ | 2 | Дэнни | 28 | 4 | Ральф | 8 | | 4 | Ральф | 8 | 2 | Дэнни | 28 | | 5 | Сэнди | 33 | 2 | Дэнни | 28 | | 1 | Тина | 39| 3 | Эллен | 50 | | 1 | Тина | 39 | 5 | Сэнди | 33 | +----+-------+-----+------------+-------------+---- --------+ 5 рядов в сете (0,00 сек)
У нас 7 друзей в таблице друга
. Однако этот SQL-запрос вернул только 5 друзей. Это связано с тем, что INNER JOIN
в последних двух таблицах «случайно» отфильтровали друзей, не имеющих отношения друг к другу.
Одно "исправление" для этого состоит в том, чтобы просто преобразовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ
с ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
:
ВЫБЕРИТЕ ф.ид, ф.имя, ф.возраст, ( otherFriend.id ) КАК friend_id, ( otherFriend.name ) КАК имя_друга, ( otherFriend. age ) КАК friend_age ИЗ друг ф -- Так как НЕ ВСЕ друзья будут иметь отношения друг с другом, нам нужно -- выполнить LEFT JOIN, чтобы не уменьшать записи из первой таблицы. ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ друг_отношения r НА ( r.friendIdOne = f.id А ТАКЖЕ r.feeling = 'друг' ) -- Получить все записи друзей, которые соответствуют ПРАВОЙ стороне отношений. -- Однако, поскольку мы уже на другой стороне LEFT OUTER JOIN, мы можем использовать -- еще одно ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, чтобы случайно не ограничить перекрестное произведение от -- предыдущее СОЕДИНЕНИЕ. ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ друг НА otherFriend.id = r.friendIdTwo СОРТИРОВАТЬ ПО ф.имя ASC, имя_друга ASC ;
Когда мы меняем INNER JOIN
на LEFT OUTER JOIN
и запускаем этот SQL-запрос в MySQL, мы получаем нужные нам записи:
+----+--------+-----+-----------+-------------+-- ----------+ | идентификатор | имя | возраст | id_друга | имя_друга | друг_возраст | +----+--------+-----+------------+-------------+--- ---------+ | 7 | Коул | 30 | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | | 2 | Дэнни | 28 | 4 | Ральф | 8 | | 3 | Эллен | 50 | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | | 6 | Джоанна | 42 | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | | 4 | Ральф | 8 | 2 | Дэнни | 28 | | 5 | Сэнди | 33 | 2 | Дэнни | 28 | | 1 | Тина | 39| 3 | Эллен | 50 | | 1 | Тина | 39 | 5 | Сэнди | 33 | +----+--------+-----+------------+-------------+--- ---------+ 8 рядов в сете (0,00 сек)
Как видите, мы вернули всех 7 друзей в таблицу friend
, включая тех, у которых нет отношений между друзьями. И, конечно же, мы получили несколько строк для друзей ( Тина
), у которых есть отношения с несколькими другими друзьями.
Соединение двух LEFT OUTER JOIN
вместе работает. Но это кажется грубым , поскольку мы коренным образом изменили намерение отношений между различными таблицами. Если бы кто-то еще пришел и посмотрел на этот SQL-запрос, увидев второй LEFT OUTER JOIN
, указал бы им , что у нас может быть записей friend_relationship
, у которых нет не соответствующих записей о друзьях
. Конечно, этого никогда не произойдет — мы просто сделали это, чтобы удовлетворить запрос.
Чтобы получить те же результаты, но сохранить намерение запроса, мы можем выполнить LEFT OUTER JOIN
на продукте INNER JOIN
:
ВЫБЕРИТЕ ф.ид, ф.имя, ф.возраст, ( otherFriend.id ) КАК friend_id, ( otherFriend.name ) КАК имя_друга, ( otherFriend. age ) КАК friend_age ИЗ друг ф -- Так как НЕ ВСЕ друзья будут иметь отношения друг с другом, нам нужно -- выполнить LEFT JOIN, чтобы не уменьшать записи из первой таблицы. ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ ( -- Получить все записи друзей, которые соответствуют ПРАВОЙ стороне -- отношение. И хотя нам нужно использовать LEFT OUTER JOIN на первом -- таблице, мы знаем, что каждая объединенная запись ДОЛЖНА СООТВЕТСТВОВАТЬ строке из -- стол друзей. Таким образом, мы можем использовать INNER JOIN внутри нашего LEFT OUTER. -- JOIN для обработки следующих таблиц как "единицы". друг_отношения r ВНУТРЕННЕЕ СОЕДИНЕНИЕ друг НА ( r.feeling = 'друг' А ТАКЖЕ otherFriend.id = r.friendIdTwo ) ) НА r.friendIdOne = f.id СОРТИРОВАТЬ ПО ф.имя ASC, имя_друга ASC ;
При таком синтаксисе соединения теперь читаются точно так, как мы предполагали: таблица
может соответствовать или не соответствовать таблице
friend_relationship
; но каждая запись, возвращенная из friend_relationship
, должна соответствовать последующей записи в таблице friend
.
И когда мы запустим этот SQL-запрос в MySQL, получим следующий вывод:
+----+--------+-----+-----------+-------------+-- ----------+ | идентификатор | имя | возраст | id_друга | имя_друга | друг_возраст | +----+--------+-----+------------+-------------+--- ---------+ | 7 | Коул | 30 | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | | 2 | Дэнни | 28 | 4 | Ральф | 8 | | 3 | Эллен | 50 | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | | 6 | Джоанна | 42 | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | | 4 | Ральф | 8 | 2 | Дэнни | 28 | | 5 | Сэнди | 33 | 2 | Дэнни | 28 | | 1 | Тина | 39| 3 | Эллен | 50 | | 1 | Тина | 39 | 5 | Сэнди | 33 | +----+--------+-----+------------+-------------+--- ---------+ 8 рядов в сете (0,00 сек)
Как видите, это LEFT OUTER JOIN
на продукте из INNER JOIN
дает нам те же результаты, что и цепной подход LEFT OUTER JOIN
. Таким образом, мы получаем записи, которые нам нужны, в то время как гораздо более четко выражающие намерение запроса.