Пример left join mysql: Оператор MySQL LEFT JOIN | MySQL
Joins оператор MySQL — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном пособии вы узнаете, как использовать JOINS (INNER и OUTER) в MySQL с синтаксисом, рисунками и примерами.
Описание
MySQL JOINS используются для извлечения данных из нескольких таблиц. JOIN выполняется всякий раз, когда две или более таблиц объединяются в SQL предложении.
Существуют различные типы соединений MySQL:
Рассмотрим синтаксис 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 |
У нас есть вторая таблица 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.
MYSQL JOIN — строим сложные запросы: INNER JOIN, LEFT JOIN, RIGHT JOIN
Оператор JOIN является одним из самых распространенных для построения сложных запросов в языке SQL. Понятие сложное, но если разобраться с ним, вы получите мощный инструмент в свое распоряжение.
Данный пост рассчитан на начинающих вебмастеров, которые хотят развиваться дальше. Без освоения оператора JOIN нормально строить сайты достаточно сложно.
Если Вы не умеете работать с псевдонимами в SQL, настоятельно рекомендую прочитать мой пост о псевдонимах в MYSQL перед прочтением данной темы. Нормально работать с JOIN без понимания псевдонимов — невозможно. Тема достаточно объемная, я ставлю целью в данном посте дать начальное понимание процесса объединения таблиц. Это должно дать мощный толчок к дальнейшему пониманию MYSQL.
Итак, что такое JOIN, зачем он нужен.
Оператор JOIN позволяет объединять две и более таблиц в одну (временную) таблицу для извлечения данных одним запросом. Для избегания избыточности и дублирования данные в базе хранятся в разных таблицах. Получить их одним запросом без объединения таблиц невозможно. А использование нескольких запросов — не вариант — значительно увеличивает время загрузки страницы. Кроме того, усложняет процесс обработки полученных данных.
Синтаксис запроса с использованием JOIN:
SELECT field_1, field_2, field_3 FROM tbl_1 {INNER, LEFT, RIGHT} JOIN tbl_2 ON {условие объединения} WHERE {условие выборки} |
- Что мы делаем:
- SELECT field_1, field_2, field_3 — получаем в результирующую таблицу значение полей field_1, field_2, field_3. Причем любое из этих полей может быть как в tbl_1, так и в tbl_2
- FROM tbl_1 — первая таблица, из которой выбираем данные
- {INNER, LEFT, RIGHT} — тип объединения, ниже рассмотрим подробнее
- JOIN tbl_2 ON {условие объединения} — присоединяем вторую таблицу используя условие. Присоединять таблицу можно и без условий, но такое объединение редко имеет смысл. Что такое {условие объединения} рассмотрим в следующем абзаце.
- WHERE {условие выборки} — стандартное ограничение выборки для запросов SELECT
В {условие объединения} мы определяем соответствие данных tbl_1 и tbl_2. Как правило, мы выбираем данные из связанных таблиц — соответственно, в этом условии мы прописываем эту связь. При этом, зачастую, названия полей совпадают в обеих таблицах — соответственно, мы должны использовать псевдонимы для таблиц.
Рассмотрим пример. У нас есть две таблицы:
tbl1 — | user_id | user_name | — имя пользователя
tbl1 — | user_id | user_age | — возраст пользователя
Нам надо получить одним запросом имя пользователя и его возраст. Составляем запрос:
SELECT user_name, user_age FROM tbl_1 JOIN tbl_2 ON tbl_1.user_id = tbl_2.user_id |
В данном примере имена таблиц tbl_1 и tbl_2 короткие, можно обойтись без псевдонимов. Но если они длинные — используйте псевдонимы!
В результате данного запроса мы получим таблицу | user_name | user_age | — она будет содержать и возраст и имя пользователя.
Теперь расскажу о типах {INNER, LEFT, RIGHT}
INNER JOIN — внутреннее объединение
При данном типе объединения в результирующую выборку будут включены только те строки, для которых есть записи и в первой и во второй таблице. То есть, в результат попадут пользователи для которых в первой таблице прописано имя, а во второй — возраст. Если или то или то отсутствует, то пользователь в результат не попадет. Если мы в запросе опускаем тип объединения, то используется, как раз, INNER. То есть, JOIN и INNER JOIN — одно и то-же.
LEFT JOIN — внешнее левостороннее объединение
Внешним оно называется потому, что полный синтаксис LEFT OUTER JOIN. Как правило слово OUTER опускают — оно необязательно. При данном типе объединения в результирующую таблицу будут включены ВСЕ данные из первой таблицы. Из второй таблицы будет выбран возраст всех пользователей, user_id которых есть и в первой таблице. Если же во второй таблице отсутствует возраст какого-то пользователя, то в соответствующую ячейку будет записан NULL.
RIGHT JOIN — внешнее правостороннее объединение
Используется значительно реже. Фактически, это то-же самое, что и левостороннее объединение, только таблицы меняются местами. То есть, будут выбраны все данные из таблицы с возрастами и дополнены данными из таблицы с именами. Результирующая таблица будет иметь такую-же структуру — | user_name | user_age |, только возрасты будут все, а отсутствующие имена будут заменены на NULL.
Еще есть один момент. Если в выборке или в {условие выборки} есть совпадающие поля , то необходимо полная запись имени поля в формате {table.field}.
Вот, пожалуй и все. Это далеко не все возможности JOIN, но если вы поймете данную статью — дальже дело пойдет значительно проще. В заключение, приведу знаменитую картинку, которая отображает возможности использования JOIN в графическом виде.
MySQL | Outer Join
Outer Join
Последнее обновление: 22.05.2018
В предыдущей теме рассматривля Inner Join или внутреннее соединение таблиц. Но также в MySQL мы можем использовать и так называемое
внешнее соединение или Outer Join. В отличие от Inner Join внешнее соединение возвращает все строки одной или двух таблиц, которые участвуют в
соединении.
Outer Join имеет следующий формальный синтаксис:
SELECT столбцы FROM таблица1 {LEFT|RIGHT} [OUTER] JOIN таблица2 ON условие1 [{LEFT|RIGHT} [OUTER] JOIN таблица3 ON условие2]...
Перед оператором JOIN указывается одно из ключевых слов LEFT или
RIGHT, которые определяют тип соединения:
LEFT: выборка будет содержать все строки из первой или левой таблицы
RIGHT: выборка будет содержать все строки из второй или правой таблицы
Также перед оператором JOIN может указываться ключевое слово OUTER, но его применение необязательно.
Далее после JOIN указывается присоединяемая таблица, а затем идет условие соединения.
Например, соединим таблицы Orders и Customers:
SELECT FirstName, CreatedAt, ProductCount, Price, ProductId FROM Orders LEFT JOIN Customers ON Orders.CustomerId = Customers.Id
Таблица Orders является первой или левой таблицей, а таблица Customers — правой таблицей. Поэтому, так как здесь используется
выборка по левой таблице, то вначале будут выбираться все строки из Orders, а затем к ним по условию Orders.CustomerId = Customers.Id
будут
добавляться связанные строки из Customers.
По вышеприведенному результату может показаться, что левостороннее соединение аналогично INNER Join, но это не так.
Inner Join объединяет строки из дух таблиц при соответствии условию. Если одна из таблиц содержит строки, которые не соответствуют этому условию, то данные строки
не включаются в выходную выборку. Left Join выбирает все строки первой таблицы и затем присоединяет к ним строки правой таблицы. К примеру, возьмем таблицу Customers и добавим к покупателям информацию об их заказах:
#INNER JOIN SELECT FirstName, CreatedAt, ProductCount, Price FROM Customers JOIN Orders ON Orders.CustomerId = Customers.Id; #LEFT JOIN SELECT FirstName, CreatedAt, ProductCount, Price FROM Customers LEFT JOIN Orders ON Orders.CustomerId = Customers.Id;
В случае с LEFT JOIN MySQL выбирает сначала всех покупателей из таблицы Customers, затем сопоставляет их с заказами из таблицы Orders через
условие Orders.CustomerId = Customers.Id
. Однако не у всех покупателей есть заказы. В этом случае покупателю для соответствующих столбцов
устанавливаются значения NULL.
Изменим в примере выше тип соединения для OUTER JOIN с левостороннего на правостороннее:
SELECT FirstName, CreatedAt, ProductCount, Price FROM Customers RIGHT JOIN Orders ON Orders.CustomerId = Customers.Id;
Теперь будут выбираться все строки из Orders (из правой таблицы), а к ним уже будет присоединяться связанные по условию строки из таблицы Customers:
Используем левостороннее соединение для добавления к заказам информации о пользователях и товарах:
SELECT Customers.FirstName, Orders.CreatedAt, Products.ProductName, Products.Manufacturer FROM Orders LEFT JOIN Customers ON Orders.CustomerId = Customers.Id LEFT JOIN Products ON Orders.ProductId = Products.Id;
И также можно применять более комплексные условия с фильтрацией и сортировкой. Например, выберем все заказы с информацией о клиентах и товарах по тем товарам,
у которых цена меньше 45000, и отсортируем по дате заказа:
SELECT Customers.FirstName, Orders.CreatedAt, Products.ProductName, Products.Manufacturer FROM Orders LEFT JOIN Customers ON Orders.CustomerId = Customers.Id LEFT JOIN Products ON Orders.ProductId = Products.Id WHERE Products.Price > 45000 ORDER BY Orders.CreatedAt;
Или выберем всех пользователей из Customers, у которых нет заказов в таблице Orders:
SELECT FirstName FROM Customers LEFT JOIN Orders ON Customers.Id = Orders.CustomerId WHERE Orders.CustomerId IS NULL;
Также можно комбинировать Inner Join и Outer Join:
SELECT Customers.FirstName, Orders.CreatedAt, Products.ProductName, Products.Manufacturer FROM Orders JOIN Products ON Orders.ProductId = Products.Id AND Products.Price > 45000 LEFT JOIN Customers ON Orders.CustomerId = Customers.Id ORDER BY Orders.CreatedAt;
Вначале по условию к таблице Orders через Inner Join присоединяется связанная информация из Products, затем через Outer Join
добавляется информация из таблицы Customers.
Команда INNER JOIN — связывание таблиц
Команда INNER JOIN используются
для связывания таблиц по определенным полям связи.
Синтаксис
SELECT поля FROM имя_таблицы
INNER JOIN имя_связанной_таблицы ON условие_связи
WHERE условие_выборки
Примеры
Все примеры будут по таблицам countries и cities, если не сказано иное.
Таблица countries:
id айди | name имя |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
Таблица cities:
id айди | name имя | country_id айди страны |
---|---|---|
1 | Минск | 1 |
2 | Витебск | 1 |
3 | Москва | 2 |
4 | Владивосток | 2 |
6 | Лондон | 0 |
Пример
В данном примере …
Лондон и Украина не выберется
SELECT
cities.id as city_id, cities.name as city_name, cities.country_id as city_country_id,
countries.id as country_id, countries.name as country_name
FROM cities
INNER JOIN countries ON countries.id=cities.country_id
SQL запрос выберет следующие строки:
city_id айди города | city_name название города | city_country_id айди страны | country_id айди страны | country_name название страны |
---|---|---|---|---|
1 | Минск | 1 | 1 | Беларусь |
2 | Витебск | 1 | 1 | Беларусь |
3 | Москва | 2 | 2 | Россия |
4 | Владивосток | 2 | 2 | Россия |
MySQL: присоединяется к
В этом учебном пособии MySQL объясняется, как использовать MySQL JOINS (внутренний и внешний) с синтаксисом, визуальными иллюстрациями и примерами.
Описание
MySQL JOINS используются для извлечения данных из нескольких таблиц. MySQL JOIN выполняется всякий раз, когда две или более таблиц объединяются в операторе SQL.
Существуют разные типы соединений MySQL:
- MySQL ВНУТРЕННЕЕ СОЕДИНЕНИЕ (или иногда его называют простым соединением)
- MySQL LEFT OUTER JOIN (или иногда называется LEFT JOIN)
- MySQL RIGHT OUTER JOIN (или иногда называется RIGHT JOIN)
Итак, давайте обсудим синтаксис MySQL JOIN, посмотрим на визуальные иллюстрации MySQL JOINS и рассмотрим примеры MySQL JOIN.
INNER JOIN (простое соединение)
Скорее всего, вы уже написали инструкцию, в которой используется MySQL INNER JOIN. Это наиболее распространенный тип соединения. MySQL INNER JOINS возвращает все строки из нескольких таблиц, в которых выполнено условие соединения.
Синтаксис
Синтаксис INNER JOIN в MySQL:
ВЫБРАТЬ столбцы ИЗ table1 INNER JOIN table2 НА table1.column = table2.column;
Визуальная иллюстрация
На этой визуальной диаграмме MySQL INNER JOIN возвращает заштрихованную область:
MySQL INNER JOIN вернет записи, где пересекаются table1 и table2 .
Пример
Вот пример MySQL INNER JOIN:
ВЫБЕРИТЕ поставщиков.supplier_id, поставщиков.supplier_name, orders.order_date ОТ поставщиков INNER JOIN заказы ON поставщиков.supplier_id = orders.supplier_id;
Этот пример MySQL INNER JOIN вернет все строки из таблиц поставщиков и заказов, в которых есть совпадающее значение supplier_id как в таблицах поставщиков, так и в таблицах заказов.
Давайте посмотрим на некоторые данные, чтобы объяснить, как работают INNER JOINS:
У нас есть таблица поставщиков с двумя полями (supplier_id и supplier_name).Он содержит следующие данные:
идентификатор_ поставщика | имя_поставщика |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
У нас есть еще одна таблица под названием orders с тремя полями (order_id, supplier_id и order_date).Он содержит следующие данные:
идентификатор заказа | provider_id | дата заказа |
---|---|---|
500125 | 10000 | 12.05.2013 |
500126 | 10001 | 13.05.2013 |
500127 | 10004 | 14.05.2013 |
Если мы запустим оператор MySQL SELECT (который содержит INNER JOIN) ниже:
ВЫБЕРИТЕ поставщиков.идентификатор_ поставщика, имя_поставщика.имя_поставщика, дата_поставщика.заказов ОТ поставщиков INNER JOIN заказы ON поставщиков.supplier_id = orders.supplier_id;
Наш набор результатов будет выглядеть так:
идентификатор_ поставщика | название | дата заказа |
---|---|---|
10000 | IBM | 12.05.2013 |
10001 | Hewlett Packard | 13.05.2013 |
Строки для Microsoft и NVIDIA из таблицы поставщиков будут опущены, так как 10002 и 10003 поставщика_id не существуют в обеих таблицах.Строка для 500127 (идентификатор_заказа) из таблицы заказов будет опущена, поскольку идентификатор поставщика 10004 не существует в таблице поставщиков.
Старый синтаксис
В заключение стоит упомянуть, что приведенный выше пример MySQL INNER JOIN можно переписать с использованием старого неявного синтаксиса следующим образом (но мы по-прежнему рекомендуем использовать синтаксис ключевого слова INNER JOIN):
ВЫБЕРИТЕ поставщиков.supplier_id, поставщиков.supplier_name, orders.order_date ОТ поставщиков, заказы ГДЕ поставщики.поставщик_id = orders.supplier_id;
ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ
Другой тип соединения называется MySQL LEFT OUTER JOIN. Этот тип соединения возвращает все строки из ЛЕВОЙ таблицы, указанной в условии ON, а — только тех строк из другой таблицы, в которых объединенные поля равны (условие соединения выполнено).
Синтаксис
Синтаксис LEFT OUTER JOIN в MySQL:
ВЫБРАТЬ столбцы ИЗ table1 LEFT [OUTER] JOIN table2 НА table1.столбец = table2.column;
В некоторых базах данных ключевые слова LEFT OUTER JOIN заменяются на LEFT JOIN.
Визуальная иллюстрация
На этой визуальной диаграмме MySQL LEFT OUTER JOIN возвращает заштрихованную область:
MySQL LEFT OUTER JOIN вернет все записи из table1 и только те записи из table2 , которые пересекаются с table1 .
Пример
Вот пример MySQL LEFT OUTER JOIN:
ВЫБЕРИТЕ поставщиков.идентификатор_ поставщика, имя_поставщика.имя_поставщика, дата_поставщика.заказов ОТ поставщиков LEFT JOIN заказы ON поставщиков.supplier_id = orders.supplier_id;
Этот пример LEFT OUTER JOIN вернет все строки из таблицы поставщиков и только те строки из таблицы заказов, в которых объединенные поля равны.
Если значение supplier_id в таблице поставщиков не существует в таблице заказов, все поля в таблице заказов будут отображаться как
Давайте посмотрим на некоторые данные, чтобы объяснить, как работают LEFT OUTER JOINS:
У нас есть таблица поставщиков с двумя полями (supplier_id и supplier_name).Он содержит следующие данные:
идентификатор_ поставщика | имя_поставщика |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
У нас есть вторая таблица с названием orders с тремя полями (order_id, supplier_id и order_date).Он содержит следующие данные:
идентификатор заказа | provider_id | дата заказа |
---|---|---|
500125 | 10000 | 12.05.2013 |
500126 | 10001 | 13.05.2013 |
Если мы запустим оператор SELECT (который содержит LEFT OUTER JOIN) ниже:
ВЫБЕРИТЕ поставщиков. Идентификатор_поставщика, поставщиков.имя_поставщика, orders.order_date ОТ поставщиков LEFT JOIN заказы ON поставщиков.supplier_id = orders.supplier_id;
Наш набор результатов будет выглядеть так:
идентификатор_ поставщика | имя_поставщика | дата заказа |
---|---|---|
10000 | IBM | 12.05.2013 |
10001 | Hewlett Packard | 13.05.2013 |
10002 | Microsoft | <нуль> |
10003 | NVIDIA | <нуль> |
Строки для Microsoft и NVIDIA будут включены, потому что использовалось LEFT OUTER JOIN.Однако вы заметите, что поле order_date для этих записей содержит значение
ПРАВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ
Другой тип соединения называется MySQL RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из ПРАВОЙ таблицы, указанной в условии ON, а — только тех строк из другой таблицы, в которых объединенные поля равны (условие соединения выполнено).
Синтаксис
Синтаксис RIGHT OUTER JOIN в MySQL:
ВЫБРАТЬ столбцы ИЗ table1 RIGHT [OUTER] JOIN table2 НА table1.столбец = table2.column;
В некоторых базах данных ключевые слова RIGHT OUTER JOIN заменяются на RIGHT JOIN.
Визуальная иллюстрация
На этой визуальной диаграмме MySQL RIGHT OUTER JOIN возвращает заштрихованную область:
MySQL RIGHT OUTER JOIN вернет все записи из table2 и только те записи из table1 , которые пересекаются с table2 .
Пример
Вот пример MySQL RIGHT OUTER JOIN:
ВЫБРАТЬ заказы.order_id, orders.order_date, suppliers.supplier_name ОТ поставщиков RIGHT JOIN заказы ON поставщиков.supplier_id = orders.supplier_id;
Этот пример ПРАВОГО ВНЕШНЕГО СОЕДИНЕНИЯ вернет все строки из таблицы заказов и только те строки из таблицы поставщиков, в которых объединенные поля равны.
Если значение supplier_id в таблице заказов не существует в таблице поставщиков, все поля в таблице поставщиков будут отображаться как
Давайте посмотрим на некоторые данные, чтобы объяснить, как работают ПРАВОЕ ВНЕШНИЕ СОЕДИНЕНИЯ:
У нас есть таблица поставщиков с двумя полями (supplier_id и supplier_name).Он содержит следующие данные:
идентификатор_ поставщика | имя_поставщика |
---|---|
10000 | Яблоко |
10001 |
У нас есть вторая таблица с названием orders с тремя полями (order_id, supplier_id и order_date). Он содержит следующие данные:
идентификатор заказа | provider_id | дата заказа |
---|---|---|
500125 | 10000 | 12.08.2013 |
500126 | 10001 | 13.08.2013 |
500127 | 10002 | 14.08.2013 |
Если мы запустим оператор SELECT (содержащий ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ) ниже:
ВЫБРАТЬ заказы.order_id, orders.order_date, suppliers.supplier_name ОТ поставщиков RIGHT JOIN заказы ON поставщиков.supplier_id = orders.supplier_id;
Наш набор результатов будет выглядеть так:
идентификатор заказа | дата заказа | имя_поставщика |
---|---|---|
500125 | 12.08.2013 | Яблоко |
500126 | 13.08.2013 | |
500127 | 14.08.2013 | <нуль> |
Строка для 500127 (order_id) будет включена, потому что использовалось ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ.Однако вы заметите, что поле supplier_name для этой записи содержит значение
.
с использованием LEFT JOIN и LIKE mysql
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
sql — MySQL LEFT JOIN с GROUP BY и WHERE IN (подзапрос)
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
- Авторизоваться
зарегистрироваться текущее сообщество
.
Самостоятельное соединение MySQL — присоединение таблицы к самой себе
Резюме : В этом руководстве вы узнаете, как использовать MySQL самообъединение , которое присоединяет таблицу к самой себе с помощью внутреннего или левого соединения.
В предыдущих руководствах вы узнали, как присоединить таблицу к другим таблицам с помощью предложения INNER JOIN
, LEFT JOIN
, RIGHT JOIN
или CROSS JOIN
. Однако есть особый случай, когда вам нужно присоединить таблицу к самой себе, что называется самосоединением.
Самосоединение часто используется для запроса иерархических данных или для сравнения строки с другими строками в той же таблице.
Для выполнения самосоединения необходимо использовать псевдонимы таблиц, чтобы не повторять одно и то же имя таблицы дважды в одном запросе. Обратите внимание, что ссылка на таблицу дважды или более в запросе без использования псевдонимов таблиц приведет к ошибке.
Примеры самостоятельного соединения MySQL
Давайте взглянем на таблицу сотрудников
в образце базы данных.
Таблица сотрудников
хранит не только данные сотрудников, но и данные организационной структуры.Столбец reportsto
используется для определения идентификатора менеджера сотрудника.
1) Самостоятельное присоединение к MySQL с использованием предложения INNER JOIN
Чтобы получить всю структуру организации, вы можете присоединить к самой себе таблицу employee
, используя отчеты employeeNumber
и в столбцы
. Таблица сотрудников
имеет две роли: одна — это Manager , а другая — Direct Reports.
ВЫБРАТЬ КОНКАТ (м.lastName, ',', m.firstName) AS Manager, CONCAT (e.lastName, ',', e.firstName) AS 'Прямой отчет' ОТ сотрудники е Сотрудники INNER JOIN m.employeeNumber = e.reportsTo СОРТИРОВАТЬ ПО Управляющий делами;
Попробовать
В выходных данных показаны только сотрудники, у которых есть менеджер. Однако вы не видите президента, потому что его имя отфильтровано из-за пункта INNER JOIN
.
2) Самостоятельное соединение MySQL с использованием LEFT JOIN
clause
Президент — это сотрудник, у которого нет менеджера, или значение в столбце reportsTo
равно NULL
.
В следующем заявлении используется предложение LEFT JOIN
вместо INNER JOIN
для включения президента:
SELECT IFNULL (CONCAT (m.lastname, ',', m.firstname), «Топ-менеджер») AS «Менеджер», CONCAT (e.lastname, ',', e.firstname) AS 'Прямой отчет' ОТ сотрудники е LEFT JOIN сотрудники m ON m.employeeNumber = e.reportsto СОРТИРОВАТЬ ПО менеджер DESC;
Попробовать
3) Использование самосоединения MySQL для сравнения последовательных строк
Используя самосоединение MySQL, вы можете отобразить список клиентов, которые находятся в том же городе, присоединив к себе таблицу клиентов
.
ВЫБРАТЬ c1.city, c1.customerName, c2.customerName ОТ клиенты c1 INNER JOIN клиенты c2 ON c1.city = c2.city И c1.customername> c2.customerName СОРТИРОВАТЬ ПО c1.city;
Попробовать
В этом примере таблица клиентов
объединена с собой с использованием следующих условий объединения:
-
c1.city = c2.city
гарантирует, что у обоих клиентов один и тот же город. -
г.customerName> c2.customerName
гарантирует, что тот же клиент не включен.
В этом руководстве вы узнали, как выполнить самостоятельное соединение MySQL, чтобы присоединить таблицу к самой себе с помощью предложений INNER JOIN
или LEFT JOIN
.
- Было ли это руководство полезным?
- Да Нет
.