Содержание

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

ON suppliers.supplier_id = orders.supplier_id;

Этот пример 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.

supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

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 Google

У нас есть вторая таблица 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 Google
500127 18.05.2016 null

Строка для order_id 500127 будет включена, так как был использован RIGHT OUTER JOINS. Тем не менее, вы заметите, что поле supplier_name для этой записи содержит значение NULL.

Уроки PHP — урок 3.6 — Работа с БД MySQL. Виды оператора JOIN.

В MySQL выборку с помощью JOIN можно производить разными способами. Мы постараемся рассмотреть все эти виды запросов. Вот список всех запросов с участием JOIN:

  1. INNER JOIN
  2. LEFT JOIN
  3. LEFT JOIN без пересечений с правой таблицей
  4. RIGHT JOIN
  5. RIGHT JOIN без пересечений с левой таблицей
  6. FULL OUTER
  7. 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

 

SELECT выражение FROM table1 [t1] ЛЕВОЕ СОЕДИНЕНИЕ таблица2 [t2] ON table1.column_name = table2.column_name;

Язык кода: SQL (язык структурированных запросов) (sql)

Здесь «t1» и «t2» — необязательные псевдонимы, которые вы можете использовать для имен таблиц. Мы увидим больше в примерах. Столбцы, упомянутые после ключевого слова ON, являются связанными общими столбцами, с помощью которых должно выполняться левое соединение.

В приведенном выше запросе «table1» — это самая левая таблица, которая будет в центре внимания левого соединения.


Примеры MySQL LEFT JOIN

Рассмотрим приведенные ниже таблицы «Студенты» и «Отметки».

Таблица отметок таблицы учащихся

В таблице «Студенты» хранятся сведения об учащемся в каждой строке. В таблице «Отметки» хранятся оценки каждого учащегося по английскому языку, математике и естественным наукам из 100.

Простой пример MySQL LEFT JOIN

Давайте теперь сделаем левое соединение в таблицах «Студенты» и «Отметки», чтобы мы сначала увидели идентификатор каждого учащегося. имя, фамилия и их отметки в науке.

Первым шагом является поиск общих связанных столбцов между двумя таблицами. В данном случае это идентификатор из таблицы «Студенты» и «Код студента» из таблицы «Отметки». Давайте теперь напишем запрос для левого соединения, используя оператор SELECT .

 

ВЫБЕРИТЕ s.FirstName, s.LastName, m.Science FROM Student s ЛЕВОЕ СОЕДИНЕНИЕ Метки m ON s.ID=m.StudentID;

Язык кода: SQL (язык структурированных запросов) (sql)

В приведенном выше запросе Студенты — наша самая левая таблица. Мы используем «s» в качестве сокращенного обозначения для обозначения таблицы «Студенты» и «m» для таблицы «Отметки». Получаем результат следующим образом –

Подождите. Почему Манви Кханна и Джей Шинде имеют NULL в качестве оценок по науке? Как видите, их идентификаторы не имеют записи в таблице Marks, и, поскольку левое соединение включает все записи из самой левой таблицы, их имена включены в набор результатов. Однако, поскольку в таблице Marks нет соответствующих данных для записей Manvi Khanna и Jay Shinde, LEFT JOIN возвращает NULL в качестве их оценок для Science.

Еще одно наблюдение, которое вы можете заметить, это то, что в таблице оценок есть запись для учащегося с идентификатором 9.. Однако, поскольку в таблице «Студенты» нет записи со значением идентификатора 9, LEFT JOIN исключает эту запись из таблицы «Отметки». Как вы читали ранее, левое соединение возвращает только записи из самой левой таблицы и общие записи между левой и правой таблицами.

Использование MySQL LEFT JOIN с выражениями

Опираясь на предыдущий запрос, давайте сделаем левое соединение для таблицы «Студенты» и таблицы «Отметки», чтобы увидеть идентификатор, имя, фамилию и процент каждого учащегося. Чтобы рассчитать процент каждого учащегося, мы складываем их оценки по трем предметам, делим на 300, а затем умножаем на 100. Запрос —  

 

ВЫБЕРИТЕ s.ID, s.FirstName, s.LastName, ((м.английский+м.математика+м.наука)/300)*100 AS Процент от студентов ЛЕВОЕ СОЕДИНЕНИЕ Метки m ON s.ID=m.StudentID;

Язык кода: SQL (язык структурированных запросов) (sql)

И мы получаем этот вывод как –

MySQL LEFT JOIN с предложением HAVING

Теперь давайте отобразим идентификатор, имя, фамилию и процент студентов, имеющих более 85%. Поскольку нам придется фильтровать запрос через псевдоним Percentage, мы будем использовать Предложение HAVING вместо предложения WHERE .

 

ВЫБЕРИТЕ s.ID, s.FirstName, s.LastName, ((м.английский+м.математика+м.наука)/300)*100 AS Процент от студентов ЛЕВОЕ СОЕДИНЕНИЕ Метки m ON s.ID=m.StudentID HAVING Percentage>0;

Кодовый язык: SQL (Structured Query Language) (sql)

И вывод —


Заключение

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. . Это означает, что ни один соответствующий элемент не нашел таблицу участников для этого конкретного фильма.

 
Название имя_имя фамилия
Кредо Убийцы: ТЕМНИ Адам Смит
Настоящая сталь (2012) Рави Кумар
Сейф (2012) Сьюзан Дэвидсон
Крайний срок (2009) Дженни Адрианна
Марли и я Ли Понг
Элвин и бурундуки НУЛЕВОЙ НУЛЕВОЙ
Приключения Тин Тин НУЛЕВОЙ НУЛЕВОЙ
Убежище (2012) НУЛЕВОЙ НУЛЕВОЙ
ГИА НУЛЕВОЙ НУЛЕВОЙ
Грязная картинка НУЛЕВОЙ НУЛЕВОЙ
Примечание. Для несовпадающих строк справа возвращается значение null.

ПРАВОЕ СОЕДИНЕНИЕ

ПРАВОЕ СОЕДИНЕНИЕ, очевидно, противоположно ЛЕВОМУ СОЕДИНЕНИЮ. ПРАВОЕ СОЕДИНЕНИЕ возвращает все столбцы из таблицы справа, даже если в таблице слева не найдено совпадающих строк. Если в таблице слева не найдено совпадений, возвращается NULL.

В нашем примере предположим, что вам нужно получить имена участников и фильмы, взятые ими напрокат. Теперь у нас есть новый участник, который еще не взял ни одного фильма напрокат

 ВЫБЕРИТЕ A.`first_name`, A.`last_name`, B.`title`
ОТ `членов` КАК А
ПРАВО ПРИСОЕДИНЯЙТЕСЬ к фильму КАК Б
ON B.`id` = A.`movie_id` 

Выполнение вышеуказанного скрипта в рабочей среде MySQL дает следующие результаты.

 
имя_имя фамилия название
Адам Смит Кредо Убийцы: УГЛИ
Рави Кумар Настоящая сталь (2012)
Сьюзан Дэвидсон Сейф (2012)
Дженни Адрианна Крайний срок (2009)
Ли Понг Марли и я
НУЛЕВОЙ НУЛЕВОЙ Элвин и бурундуки
НУЛЕВОЙ НУЛЕВОЙ Приключения Тин Тин
НУЛЕВОЙ НУЛЕВОЙ Убежище (2012)
НУЛЕВОЙ НУЛЕВОЙ ГИА
НУЛЕВОЙ НУЛЕВОЙ Грязная картинка
Примечание. Для несовпадающих строк слева возвращается значение null.

Предложения «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
LEFT OUTER JOIN TABLE B B
ВКЛ А. Общий_СТОЛБЦ =B. Common_COLUMN
ГДЕ B.Common_COLUMN IS NULL

Набор результатов содержит значения NULL. Нижеследующий синтаксис можно использовать для игнорирования значений NULL:

SELECT * FROM TABLE_A A
RIGHT OUTER JOIN TABLE B B
ON A. Common_COLUMN =B. Common_COLUMN
ГДЕ A. Common_COLUMN IS NULL

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. Здесь мы обсуждаем, как использовать левое внешнее соединение? с ключевыми различиями между левым и правым соединениями, а также с примерами для реализации. Вы также можете ознакомиться с другими нашими статьями по теме, чтобы узнать больше –

  1. Таблица в MySQL
  2. ORDER BY в MySQL
  3. MySQL МЕЖДУ
  4. Подстановочные знаки в MySQL

SQL левый запрос на соединение таблиц MySQL

Мы храним данные в разных таблицах в зависимости от их свойств и способа их использования. Студент может сдавать несколько экзаменов, и его оценка может быть сохранена в таблице результатов экзамена. Студенческая мастер-таблица не обязательно должна содержать все эти детали, такие как семестр, тип экзамена или оценка на каждом экзамене.

Отчет может быть сгенерирован путем сбора сведений о студентах из основной таблицы студентов, семестра и оценок из таблицы результатов экзаменов.

Давайте поймем разницу между левым соединением и условием ГДЕ.
Есть две таблицы с некоторыми примерами данных. Мы применим первую команду sql where к эти таблицы.

Стол один ( t1 ) Стол второй ( t2)
id имя1
1 один1
2 два1
3 три1
id name2
1 one2
2 two2
4 four2


Использование запроса WHERE

 ВЫБЕРИТЕ t1. id,t1.name1 ИЗ `t1`,t2, ГДЕ t1.id=t2.id 
Вывод приведенной выше команды SQL даст записи таблицы MySQL t1, для которых в таблице t2 есть запись, и связывание выполняется по полю id.
id имя1
1 один1
2 два1
4 4 Площадь согласно диаграмме Венна B

С ИСПОЛЬЗОВАНИЕМ ЛЕВОГО СОЕДИНЕНИЯ

 ВЫБЕРИТЕ 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 
id name1 id name2
1 one1 1 one2
2 two1 2 two2

Связанные учебники LEFT JOIN Несколько таблиц ВНУТРЕННЕЕ соединение MySQL ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ MySQL MySQL ПРАВОЕ СОЕДИНЕНИЕ

PHP-скрипт, использующий левое соединение для отображения записей

Мы попробуем разработать один PHP-скрипт для отображения записей с помощью запроса левого соединения. Здесь мы использовали соединение PHP PDO для подключения к базе данных MySQL. Подробнее о подключении PHP к MySQL с использованием PDO можно прочитать здесь.
После подключения мы использовали цикл foreach для отображения всех записей. Вот код.
 ";
echo "идентификаторимя1";
foreach ($dbo->query($count) as $row) {
echo "$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

    Далее давайте выясним, кто из учеников не попал ни в одну из команд. Другими словами, найдите записи в таблице учеников, которые не имеют совпадающих записей в таблице футбола или бейсбола (команда).

     ВЫБЕРИТЕ * ИЗ `студента` 
    LEFT JOIN student_football ON id=f_id
    ЛЕВОЕ ПРИСОЕДИНЯЙСЯ student_baseball к id=b_id
    ГДЕ f_id равен NULL, а b_id равен NULL
    . Мы можем получить аналогичный результат, используя UNION, NOT IN и подзапросы.

    Подробнее 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 сек)
     

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

    1. Не все записи о друзьях имеют соответствующие записи о друзьях , потому что не все друзья знают друг друга.

    2. Все записи 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 . Таким образом, мы получаем записи, которые нам нужны, в то время как гораздо более четко выражающие намерение запроса.