База Данных MySQL LEFT JOIN
Ключевое слово соединения SQL Left
Ключевое слово LEFT JOIN возвращает все записи из левой таблицы (Table1) и совпадающие записи из правой таблицы (Table2). Результат равен NULL с правой стороны, если совпадений нет.
LEFT JOIN Синтаксис
SELECT column_name(s)
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
Note: In some databases LEFT JOIN is called LEFT OUTER JOIN.
Демонстрационная база данных
В этом учебнике мы будем использовать хорошо известную базу данных Northwind Sample.
Ниже представлен выбор из таблицы «Customers»:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
And a selection from the «Orders» table:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10308 | 2 | 7 | 1996-09-18 | 3 |
10309 | 37 | 3 | 1996-09-19 | 1 |
10310 | 77 | 8 | 1996-09-20 | 2 |
Пример левого соединения SQL
Следующая инструкция SQL выберет всех клиентов и любые заказы, которые они могут иметь:
Пример
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
Примечание: Ключевое слово LEFT JOIN возвращает все записи из левой таблицы (Customers), даже если в правой таблице нет совпадений (Orders).
как объединить две таблицы с возвратом строк из левой при отсутствии нужного предиката
От автора: LEFT JOIN SQL возвращает все строки из левой таблицы, даже если в правой таблице нет совпадений. Это означает, что, если условие ON соответствует 0 (нолю) записей в правой таблице; объединение все равно вернет строку в результат, но с NULL в каждом столбце из правой таблицы.
Это означает, что LEFT JOIN возвращает все значения из левой таблицы, а также соответствующие значения из правой таблицы или NULL в случае отсутствия соответствующего предиката объединения.
Синтаксис
Основной синтаксис LEFT JOIN следующий.
SELECT таблица1.столбец1, таблица2.стобец2… FROM таблица1 LEFT JOIN таблица2 ON таблица1. общее_поле = таблица2.общее_поле; |
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Данное условие может быть любым заданным выражением, исходя из ваших потребностей.
Пример
Рассмотрим следующие две таблицы. Таблица 1 — Таблица CUSTOMERS выглядит следующим образом.
Таблица 2 — Таблица ORDERS выглядит следующим образом.
Теперь давайте объединим две таблицы, используя LEFT JOIN следующим образом.
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID; |
Мы получим следующий результат.
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!Хотите изучить MySQL?
Посмотрите курс по базе данных MySQL!
СмотретьУроки PHP — урок 3.6 — Работа с БД MySQL. Виды оператора JOIN.
В MySQL выборку с помощью JOIN можно производить разными способами. Мы постараемся рассмотреть все эти виды запросов. Вот список всех запросов с участием JOIN:
- INNER JOIN
- LEFT JOIN
- LEFT JOIN без пересечений с правой таблицей
- RIGHT JOIN
- RIGHT JOIN без пересечений с левой таблицей
- FULL OUTER
- FULL OUTER где левая или правая таблица пустая
А вот иллюстрация к этим видам JOIN:
Я прикреплю к статье файлы нашего сайта, среди которых будет join. php в которых я буду выводить все записи с помощью разных операторов JOIN.
INNER JOIN
Начнем мы с этого оператора INNER JOIN, потому что этот оператор срабатывает по умолчанию, если вы пишите в запросе просто JOIN. Этот оператор выбирает все записи из двух таблиц, где выполняется условие идущее после оператора ON. У нас есть две таблицы Files и Messages:
Таблица Messages:
mid | bodytext | fid |
1 | Test | NULL |
2 | Hi | 2 |
3 | Hello | NULL |
Таблица Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
Запрос с JOIN будет следующий:
SELECT * FROM Messages INNER JOIN Files ON Messages.fid=Files.fid
В результате будут выведены такие записи
mid | bodytext | fid | path |
2 | Hi | 2 | /files/2.png |
То есть там где fid совпадает, то mysql выведит эти строки.
LEFT JOIN
При LEFT JOIN мы выводим все записи в которых в таблице слева (у нас это Messages), в том числе и те записи в которых эти значения fid есть в таблице Files.
Таблица Messages:
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 — связывание таблиц
Команда LEFT JOIN используются для связывания таблиц по определенным полям связи.
Синтаксис
SELECT поля FROM имя_таблицы
LEFT 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
LEFT 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 | Россия |
6 | Лондон | 0 | NULL |
Пример
В данном примере …:
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
LEFT JOIN countries ON countries.id=cities.country_id
WHERE countries.id>=2
SQL запрос выберет следующие строки:
city_id айди города | city_name название города | city_country_id айди страны | country_id айди страны | country_name название страны |
---|---|---|---|---|
3 | Москва | 2 | 2 | Россия |
4 | Владивосток | 2 | 2 | Россия |
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.
Разбираемся с mySQL JOIN, визуальное представление.
На протяжении немалого времени, в начале своей карьеры веб-разработчика, я работал с базой данный как умел, а умел я не многое. Составлял простые примитивные запросы, а порою даже вставлял запросы в циклы. На тот момент мне к сожалению не попалась в руки правильная книжка по mySQL и учить приходилось методом проб и ошибок. Множество статей в интернете как-то не сразу донесли до меня замечательный mySQL запрос — JOIN.
В этой публикации я расскажу о всех возможных вариантах работы с JOIN и более того, представлю принцип работы каждой команды — визуально.
Рассматривать мы будем:
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- OUTER JOIN
- LEFT JOIN EXCLUDING INNER JOIN
- RIGHT JOIN EXCLUDING INNER JOIN
- OUTER JOIN EXCLUDING INNER JOIN
Отдельно стоит отметить пункты 5,6 и 7. На самом деле эти запросы не соединяют две таблицы, а наоборот исключают из одной таблицы столбцы присутствующие в другой. На деле это может оказать очень полезным.
Inner JOIN
Один из самых распространенных запросов, встречается предельно часто. Этот запрос вернет все записи из левой таблицы (таб. А) и записи из (таб. В), но при этом возвращены будут только совпадающие столбцы.
Пример запроса:
SELECT <select_list> FROM Table_A A INNER JOIN Table_B B ON A.Key = B.Key |
Left JOIN
Данный запрос вернет все столбцы из левой таблицы (таб. А), а также все столбцы из правой таблицы (таб. В) но только которые совпадают со столбцами из левой таблицы.
Пример запроса:
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key |
Right JOIN
Аналогичен предыдущему запросу, но уже вернет все столбцы из правой таблицы (таб. В), а также все столбцы из левой таблицы (таб. А) которые совпадают со столбцами из правой таблицы.
Пример запроса:
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key |
Outer JOIN
Часто данный запрос записывают как FULL OUTER JOIN или FULL JOIN, все вариации выполняют одно действие, а именно возвращают все столбцы из обоих таблиц, при этом совпадающие столбцы будут перекрыты столбцами из левой таблицы.
Пример запроса:
SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key |
Left Excluding JOIN
Этот запрос вернет все столбцы из левой таблицы (таб. А), которые не совпадают со столбцами из правой таблицы (таб. В).
Пример запроса:
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key WHERE B.Key IS NULL |
Right Excluding JOIN
Почти как и предыдущий, но этот запрос вернет все столбцы из правой таблицы (таб. В), которые не совпадают со столбцами из левой таблицы (таб. А).
Пример запроса:
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL |
Outer Excluding JOIN
Этот запрос вернет все записи из левой и правой таблицы, но при этом исключит совпадающие столбцы.
Пример запроса:
SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL |
Надеюсь этот пост пригодится многим начинающий веб-разработчикам, ведь запомнить сразу все отличия запросов друг от друга очень сложно, ввиду чего многие пользуются одним, двумя типами запросов и забывают про силу и мощь mySQL.
В качестве шпаргалки приведу изображение со всеми типами JOIN запросов и кратким примером кода.
Похожие записи
Визуальное представление соединений JOIN в SQL
Добавлено 11 февраля 2016 в 18:00
Сохранить или поделиться
‘JOIN
‘ – ключевое слово в SQL, используемое для запроса данных из двух и более связанных таблиц. Данная статья – это попытка кратко и лаконично объяснить работу с JOIN
себе и всем, кто заинтересован в этом.
Связанные таблицы
Хорошо спроектированная реляционная база данных включает в себя ряд таблиц, содержащих связанные данные. В качестве очень простого примера данных используем пользователей (студентов) и зачисления на курсы:
id | name | course |
---|---|---|
1 | Alice | 1 |
2 | Bob | 1 |
3 | Caroline | 2 |
4 | David | 5 |
5 | Emma | (NULL) |
Код MySQL для создания таблицы:
CREATE TABLE `user` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`course` smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Номера курсов связаны с объектами, находящимися в таблице курсов. ..
id | name |
---|---|
1 | HTML5 |
2 | CSS3 |
3 | JavaScript |
4 | PHP |
5 | MySQL |
Код MySQL для создания таблицы:
CREATE TABLE `course` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Поскольку мы используем таблицы InnoDB и знаем, что user.course и course.id связаны, то можем задать связь внешним ключом:
ALTER TABLE `user`
ADD CONSTRAINT `FK_course`
FOREIGN KEY (`course`) REFERENCES `course` (`id`)
ON UPDATE CASCADE;
В сущности, MySQL будет автоматически:
- перенумеровывать связанные записи в столбце
user.course
при изменениях вcourse.id
; - отклонять любые попытки удалить курс, на который зачислены пользователи.
Важно: эта база данных спроектирована ужасно!
Эта база данных неэффективна. Она нормальна для примера, но студент в ней может быть записан либо никуда, либо только на один курс. В реальной системе такого ограничения быть не должно, для этого можно использовать промежуточную таблицу «регистрация», которая будет связывать любое количество студентов с любым количеством курсов.
INNER JOIN
(или просто JOIN
)INNER JOIN
является наиболее часто используемым. Он дает набор записей, которые совпадают в обоих таблицах, и в user
, и в course
, то есть все пользователи, зачисленные на курсы:
SELECT user.name, course.name
FROM `user`
INNER JOIN `course` on user.course = course.id;
Результат:
user.name | course.name |
---|---|
Alice | HTML5 |
Bob | HTML5 |
Caroline | CSS3 |
David | MySQL |
LEFT JOIN
А что делать, если нам необходим список всех студентов и их курсов, даже если они не зачислены ни на один курс? LEFT JOIN
даст набор записей, которые соответствуют каждой записи в левой таблице (user
) независимо от соответствия записи в правой таблице (course
):
SELECT user. name, course.name
FROM `user`
LEFT JOIN `course` on user.course = course.id;
user.name | course.name |
---|---|
Alice | HTML5 |
Bob | HTML5 |
Carline | CSS3 |
David | MySQL |
Emma | (NULL) |
Добавив условие
WHERE course.id IS NULL
мы получим список студентов, не зачисленных ни на один курс. И диаграмма для такого запроса будет следующей:
RIGHT JOIN
Возможно, нам потребуется список всех курсов и студентов, даже если никто из них не был зачислен? RIGHT JOIN
дает набор записей, которые соответствуют каждой записи в правой таблице (course
) независимо от соответствия записи в левой таблице (user
):
SELECT user.name, course.name
FROM `user`
RIGHT JOIN `course` on user. course = course.id;
Результат:
user.name | course.name |
---|---|
Alice | HTML5 |
Bob | HTML5 |
Carline | CSS3 |
(NULL) | JavaScript |
(NULL) | PHP |
David | MySQL |
RIGHT JOIN
используется редко, так как вы можете получить тот же результат, используя LEFT JOIN
. Следующий код может быть более эффективным и быстрым для парсинга СУБД:
SELECT user.name, course.name
FROM `course`
LEFT JOIN `user` on user.course = course.id;
Мы могли бы, например, подсчитать количество студентов, обучающихся на каждом курсе:
SELECT course.name, COUNT(user.name)
FROM `course`
LEFT JOIN `user` ON user.course = course.id
GROUP BY course.id;
Результат:
course. name | count() |
---|---|
HTML5 | 2 |
CSS3 | 1 |
JavaScript | 0 |
PHP | 0 |
MySQL | 1 |
OUTER JOIN
(или FULL OUTER JOIN
)OUTER JOIN
возвращает все записи из обеих таблиц независимо от совпадений. Там где совпадения нет, на недостающей стороне будет содержаться NULL
.
OUTER JOIN
менее полезен по сравнению с INNER
, LEFT
или RIGHT
, и он не реализован в MySQL. Тем не менее, вы можете обойти это ограничение, используя UNION
для LEFT JOIN
и RIGHT JOIN
, например:
SELECT user.name, course.name
FROM `user`
LEFT JOIN `course` on user.course = course.id
UNION
SELECT user.name, course.name
FROM `user`
RIGHT JOIN `course` on user. course = course.id;
Результат:
user.name | course.name |
---|---|
Alice | HTML5 |
Bob | HTML5 |
Carline | CSS3 |
David | MySQL |
Emma | (NULL) |
(NULL) | JavaScript |
(NULL) | PHP |
Вот и всё! Надеюсь этот материал будет кому-то полезен.
Источники:
Теги
JOINSQLБаза данныхСохранить или поделиться
SQL Ключевое слово LEFT JOIN
SQL LEFT JOIN Keyword
Ключевое слово LEFT JOIN возвращает все записи из левой таблицы (table1), а совпали записи из правой таблицы (table2). Результат — NULL с правой стороны, если совпадения нет.
Синтаксис LEFT JOIN
ВЫБЕРИТЕ имя_столбца
ИЗ стол1
LEFT JOIN table2
ON table1. column_name = table2.имя_столбца ;
Примечание: В некоторых базах данных LEFT JOIN называется LEFT OUTER JOIN.
Демо-база данных
В этом руководстве мы будем использовать хорошо известный образец базы данных Northwind.
Ниже представлен выбор из таблицы «Клиенты»:
Идентификатор клиента | Имя клиента | ContactName | Адрес | Город | Почтовый индекс | Страна |
---|---|---|---|---|---|---|
1 | Альфредс Футтеркисте | Мария Андерс | Obere Str.57 | Берлин | 12209 | Германия |
2 | Ana Trujillo Emparedados y helados | Ана Трухильо | Avda. de la Constitución 2222 | México D.F. | 05021 | Мексика |
3 | Антонио Морено Такерия | Антонио Морено | Матадерос 2312 | Мексика Д. F. | 05023 | Мексика |
И выбор из таблицы «Заказы»:
Код заказа | Идентификатор клиента | ID сотрудника | Дата заказа | ShipperID |
---|---|---|---|---|
10308 | 2 | 7 | 1996-09-18 | 3 |
10309 | 37 | 3 | 1996-09-19 | 1 |
10310 | 77 | 8 | 1996-09-20 | 2 |
SQL, пример LEFT JOIN
Следующий оператор SQL выберет всех клиентов и все заказы, которые они может иметь:
Пример
ВЫБЕРИТЕ клиентов.CustomerName, Orders.OrderID
ОТ Заказчиков
LEFT JOIN Заказы
ON Customers.CustomerID = Orders.CustomerID
ЗАКАЗАТЬ ПО Customers.CustomerName;
Примечание: Ключевое слово LEFT JOIN возвращает все записи из левая таблица (клиенты), даже если в правой таблице нет совпадений (Заказы).
Левое соединение SQL — w3resource
ЛЕВОЕ СОЕДИНЕНИЕ
SQL LEFT JOIN (заданный ключевыми словами LEFT JOIN и ON) объединяет две таблицы и выбирает все совпадающие строки двух таблиц, для которых SQL-выражение истинно, плюс строки из первой таблицы, которые не соответствуют ни одной строке во второй. стол.
Левое соединение: синтаксис
ВЫБРАТЬ * ИЗ table1 LEFT [OUTER] JOIN table2 ON table1.column_name = table2.column_name;
Изображение:
SQL LEFT join выбирает полный набор записей из таблицы 1 с соответствующими записями (в зависимости от доступности) в таблице 2. Результатом будет NULL с правой стороны, если совпадение не будет выполнено.
Синтаксическая диаграмма — LEFT JOIN
org/WebPageElement/Heading»> Пример SQL Left Join
Чтобы получить столбцы с названием компании и идентификатором компании из таблицы компании и столбцы идентификатора компании, названия позиции, столбцов единиц товара из таблицы food, после ВНЕШНЕГО СОЕДИНЕНИЯ с этими упомянутыми таблицами можно использовать следующий оператор SQL:
Образец таблицы: продукты
Образец таблицы: компания
Код SQL:
SELECT компания.company_id, company.company_name,
company.company_city, foods.company_id, foods.item_name
ОТ компании
LEFT JOIN продукты
ON company.company_id = foods.company_id;
Пояснение:
Этот оператор SQL вернет все строки из таблицы компании и только те строки из таблицы food, где объединенные поля равны, и если предложение ON не соответствует ни одной записи в таблице «food», объединение все равно вернет строки, но NULL в каждом столбце правой таблицы.
Выход:
COMPANY_ID COMPANY_NAME COMPANY_CITY COMPANY_ID ITEM_NAME ---------- ------------------------- --------------- ---------- ---------- -------------- 16 Акас Фудс Дели 16 Chex Mix 15 Jack Hill Ltd Лондон 15 Cheez-It 15 Jack Hill Ltd Лондон 15 млрд Бисквит 17 гурманов.Лондон 17 Майти Мунк 15 Jack Hill Ltd Лондон 15 Pot Rice 18 Заказать все бостонские 18 торта Яффо 19 глоток-н-укус. Нью-Йорк
Изображение приведенного выше примера:
Пример левого соединения SQL с использованием нескольких столбцов
Чтобы отфильтровать те номер счета, название позиции и сумму счета для каждого счета, сумма счета которого превышает значение 500 и который должен быть доступен в продуктовом ларьке, можно использовать следующий оператор SQL:
Образец таблицы: продукты
Пример таблицы: counter_sale
Код SQL:
Выберите. bill_no, b.item_name, a.bill_amt
ОТ counter_sale a
LEFT JOIN food b
НА a.item_id = b.item_id
ГДЕ a.bill_amt> 500;
Пояснение:
Этот оператор SQL сначала объединит все строки из таблицы counter_sale и только те строки из таблицы food, где объединенные поля равны, и если предложение ON не соответствует ни одной записи в таблице food, соединение все равно вернет строки, но NULL в каждом столбце правой таблицы, поэтому исключает те строки, сумма счета которых меньше или равна 500.
Выход:
BILL_NO ITEM_NAME BILL_AMT ---------- ------------------------- ---------- 1002 Chex Mix 2000 1006 Майти Мунк 625 1001 горшок с рисом 600 1004 Горшок с рисом 540 1005 Соль и коктейль 600
Изображение:
Пример SQL Left Join с использованием нескольких таблиц
Чтобы отфильтровать те номер счета, название позиции, название компании и город, а также сумму счета для каждого счета, какие товары доступны в таблице продуктов, и их производитель должен быть включен в список для поставки этого товара, и никакое значение NULL для производителя не разрешено, можно использовать следующий оператор SQL:
Образец таблицы: продукты
Образец таблицы: компания
Пример таблицы: counter_sale
Код SQL:
ВЫБРАТЬ a. bill_no, b.item_name, c.company_name,
c.company_city, a.bill_amt
ОТ counter_sale a
LEFT JOIN food b ON a.item_id = b.item_id
LEFT JOIN company c ON b.company_id = c.company_id
ГДЕ c.company_name НЕ ПУСТО
ЗАКАЗАТЬ ПО a.bill_no;
Пояснение:
Этот оператор SQL сначала объединит все строки из таблицы counter_sale и только те строки из таблицы food, где объединенные поля совпадают, и если предложение ON не соответствует ни одной записи в таблице food, соединение все равно вернет строки, но NULL в каждом столбце правой таблицы.Следовательно, этот результат объединится с таблицей компании, и все строки из таблицы результатов, а также совпавшие и несопоставленные строки из таблицы компании также появятся, но для несопоставленных строк таблицы компании значение столбца будет NULL. Поэтому предложение WHERE удалит те строки, в которых значение столбца названия компании равно NULL, а после этого предложение ORDER BY упорядочит строки в порядке возрастания в соответствии с номером счета.
Выход:
BILL_NO ITEM_NAME COMPANY_NAME COMPANY_CITY BILL_AMT ---------- ------------------------- --------------- ---------- ------------------------- ---------- 1001 Pot Rice Jack Hill Ltd Лондон 600 1002 Chex Mix Akas Foods Дели 2000 1003 Cheez-It Jack Hill Ltd Лондон 300 1004 Pot Rice Jack Hill Ltd Лондон 540 1006 Mighty Munch Foodies.Лондон 625
Изображение:
В чем разница между левым соединением и левым внешним соединением в SQL?
На самом деле нет разницы между левым соединением и левым внешним соединением — оба они относятся к аналогичной операции в SQL.
Образец таблицы: компания
COMPANY_ID COMPANY_NAME COMPANY_CITY ---------- ------------------------- ------------- 18 Заказать Весь Бостон 15 Jack Hill Ltd Лондон 16 Akas Foods Дели 17 гурманов.Лондон 19 глоток-н-укус. Нью-Йорк
Образец таблицы: продукты
ITEM_ID ITEM_NAME ITEM_UNIT COMPANY_ID -------- ------------------------- ---------- ------- --- 1 Chex Mix, шт.16 6 Cheez-It шт 15 2 млрд бисквитов шт 15 3 Mighty Munch, часть 17 4 горшочка с рисом шт.15 5 тортов Jaffa шт.18 7 шт. Соли и коктейля
Важно отметить, что самая последняя строка в таблице компании, идентификатор компании не существует в таблице продуктов.Кроме того, в самой последней строке таблицы пищевых продуктов значение идентификатора компании равно NULL и не существует в таблице компании. Эти факты окажутся важными для левого соединения.
Здесь оператор SQL без использования «внешнего» с «левым соединением».
Код SQL:
ВЫБЕРИТЕ company.company_id, company.company_name,
foods.item_id, foods.item_name, foods.company_id
ОТ компании
LEFT JOIN продукты
ON company.company_id = foods.company_id;
Выполнение SQL с ключевым словом «external» даст нам те же результаты, что и выполнение SQL без «внешнего». Здесь оператор SQL с «внешним» и «левым соединением».
Код SQL:
ВЫБЕРИТЕ company.company_id, company.company_name,
foods.item_id, foods.item_name, foods.company_id
ОТ компании
LEFT OUTER JOIN продукты
ON company.company_id = foods.company_id;
Левое внешнее объединение или левое объединение сохраняет все строки левой таблицы company, независимо от того, есть ли строка, соответствующая продуктам в правой таблице. Вот результат, приведенный ниже для обоих приведенных выше операторов.
Выход:
COMPANY_ID COMPANY_NAME ITEM_ID ITEM_NAME COMPANY_ID ---------- ------------------------- -------- ------- ------------------ ---------- 16 Акас Фудс 1 Chex Mix 16 15 Джек Хилл Лтд 6 Cheez-It 15 15 Jack Hill Ltd 2 BN Бисквит 15 17 гурманов. 3 Майти Мунк 17 15 Джек Хилл Лтд. 4 горшочка с рисом 15 18 Заказать все 5 торта Яффо 18 19 глоток-н-укус.NULL NULL NULL
Выходные данные указанного оператора SQL, показанного здесь, получены с помощью Oracle Database 10g Express Edition.
LEFT JOIN: реляционные базы данных
Ключевые моменты, которые следует запомнить :
Нажмите на следующую ссылку, чтобы просмотреть слайды —
Практика выполнения упражнений SQL
Хотите улучшить статью выше? Публикуйте свои заметки / комментарии / примеры через Disqus.
Пред .: ВНЕШНЕЕ СОЕДИНЕНИЕ SQL
Следующее: ПРАВИЛЬНОЕ СОЕДИНЕНИЕ SQL
PHP MySQL Joins Tutorial — PHPKnowHow
Объединения используются для выборки данных из двух или более таблиц и записываются с использованием операторов SELECT.
Мы собираемся использовать таблицы «employee» и «user», упомянутые ниже, в качестве примеров в этой статье. Здесь доступны команды SQL для создания таблиц и вставки данных.
id | имя | фамилия | job_title | зарплата | банкноты |
---|---|---|---|---|---|
1 | Робин | Джекман | Инженер-программист | 5500 | |
2 | Тейлор | Эдвард | Архитектор программного обеспечения | 7200 | |
3 | Вивиан | Диккенс | Администратор базы данных | 6000 | |
4 | Гарри | Клиффорд | Администратор базы данных | 6800 | |
5 | Элиза | Клиффорд | Инженер-программист | 4750 | |
6 | Нэнси | Ньюман | Инженер-программист | 5100 | |
7 | Мелинда | Клиффорд | Менеджер проекта | 8500 | |
8 | Харлей | Гилберт | Архитектор программного обеспечения | 8000 |
id | идентификатор сотрудника | user_type | имя пользователя | пароль |
---|---|---|---|---|
1 | SUPER ADMIN | админ | админ | |
2 | 1 | НОРМАЛЬНЫЙ | Робин | Робин |
3 | 2 | ADMIN | Тейлор | Тейлор |
4 | 3 | ADMIN | вивиан | вивиан |
5 | 4 | НОРМАЛЬНЫЙ | Гарри | Гарри |
6 | 7 | ADMIN | мелинда | мелинда |
7 | 8 | НОРМАЛЬНЫЙ | Харлей | Харлей |
Все команды SQL, упомянутые в этой статье, можно запускать из командной строки MySQL, в графическом интерфейсе пользователя или с mysqli_query () в сценарии PHP.
Наборы результатов, показанные в статье, были получены путем выполнения команд в командной строке.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Внутренние объединения позволяют нам выбирать строки, которые имеют одинаковое значение в обеих таблицах для указанных столбцов, тем самым возвращая совпадающие строки. Мы указываем первую таблицу после FROM, как в обычных операторах SELECT, а вторая таблица указывается после INNER JOIN.
Используя предложение ON, мы можем указать столбцы, которые должны иметь совпадающие значения.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e INNER JOIN` user` AS u ON e.id = u.employee_id;
+ ------------ + ----------- + ----------- + ---------- + | first_name | last_name | user_type | имя пользователя | + ------------ + ----------- + ----------- + ---------- + | Робин | Джекман | НОРМАЛЬНЫЙ | робин | | Тейлор | Эдвард | ADMIN | Тейлор | | Вивиан | Диккенс | ADMIN | вивиан | | Гарри | Клиффорд | НОРМАЛЬНЫЙ | Гарри | | Мелинда | Клиффорд | ADMIN | мелинда | | Харлей | Гилберт | НОРМАЛЬНЫЙ | Харлей | + ------------ + ----------- + ----------- + ---------- +
В приведенном выше наборе результатов вы можете видеть, что были возвращены только сотрудники, у которых была соответствующая строка в таблице `user`.
Порядок таблиц во внутренних соединениях
Поскольку внутренние объединения возвращают только совпадающие строки, не имеет значения, какая таблица вы укажете в качестве первой. Следующие два запроса возвращают тот же результат.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e INNER JOIN` user` AS u ON e.id = u.employee_id;
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `user` AS u ВНУТРЕННЕЕ СОЕДИНЕНИЕ` employee` AS e ON e.id = u.employee_id;
ПРИСОЕДИНИТЬСЯ и КРЕСТНО СОЕДИНЯТЬСЯ
JOIN (без INNER части) и CROSS JOIN работают так же, как INNER JOIN.Следующие два запроса возвращают тот же набор результатов, что и соответствующий запрос INNER JOIN.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e JOIN` user` AS u ON e.id = u.employee_id;
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e CROSS JOIN` user` AS u ON e. id = u.employee_id;
Использование предложения WHERE
Подобно обычным операторам SELECT, вы можете указать условия для строк, которые должны быть извлечены с помощью предложения WHERE (также применимо к другим типам соединений).
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e INNER JOIN` user` AS u ON e.id = u.employee_id ГДЕ e.salary> 6000 AND u.user_type = ' ADMIN ';
+ ------------ + ----------- + ----------- + ---------- + | first_name | last_name | user_type | имя пользователя | + ------------ + ----------- + ----------- + ---------- + | Тейлор | Эдвард | ADMIN | Тейлор | | Мелинда | Клиффорд | ADMIN | мелинда | + ------------ + ----------- + ----------- + ---------- +
Внутренние соединения без ключевого слова INNER JOIN
Можно писать внутренние соединения без ключевых слов INNER JOIN и ON, как показано ниже.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e,` user` AS u WHERE e. id = u.employee_id И e.salary> 6000 AND u.user_type = 'ADMIN ';
+ ------------ + ----------- + ----------- + ---------- + | first_name | last_name | user_type | имя пользователя | + ------------ + ----------- + ----------- + ---------- + | Тейлор | Эдвард | ADMIN | Тейлор | | Мелинда | Клиффорд | ADMIN | мелинда | + ------------ + ----------- + ----------- + ---------- +
- Имена таблиц указываются после ключевого слова FROM через запятую.
- Отношения между таблицами упоминаются в предложении WHERE.
Поскольку в предложении WHERE отношения таблиц смешаны с другими условиями, этот способ записи внутренних объединений менее читабелен по сравнению с записью с использованием ключевых слов INNER JOIN и ON.
ЛЕВОЕ СОЕДИНЕНИЕ
Левое объединение позволяет выбрать все строки из первой таблицы (левая таблица) для указанного отношения и выбрать только совпадающие из второй таблицы (правая таблица).
ВЫБЕРИТЕ e. first_name, e.last_name, u.user_type, u.username FROM `employee` AS e LEFT JOIN` user` AS u ON e.id = u.employee_id;
+ ------------ + ----------- + ----------- + ---------- + | first_name | last_name | user_type | имя пользователя | + ------------ + ----------- + ----------- + ---------- + | Робин | Джекман | НОРМАЛЬНЫЙ | робин | | Тейлор | Эдвард | ADMIN | Тейлор | | Вивиан | Диккенс | ADMIN | вивиан | | Гарри | Клиффорд | НОРМАЛЬНЫЙ | Гарри | | Элиза | Клиффорд | NULL | NULL | | Нэнси | Ньюман | NULL | NULL | | Мелинда | Клиффорд | ADMIN | мелинда | | Харлей | Гилберт | НОРМАЛЬНЫЙ | Харлей | + ------------ + ----------- + ----------- + ---------- +
Вы можете понять создание вышеуказанного набора результатов в следующих двух шагах.
- Сначала MySQL смотрит на взаимосвязь между таблицами и идентифицирует поле id таблицы employee как левую часть и поле employee_id таблицы user как правую часть. Затем он выбирает все строки из таблицы «employee», которые имеют значения для столбца «id».
- На втором этапе, на основе отношения e.id = u.employee_id, он выбирает совпадающие строки из таблицы user и создает окончательный набор строк (эти строки содержат значения как из таблиц «employee», так и «user»). Если не удается найти соответствующую строку, ячейкам таблицы user присваивается значение NULL.
Используя оператор IS NOT NULL, вы можете ограничить набор результатов, чтобы он включал только последние строки, в которых правые ячейки таблицы имеют значения.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e LEFT JOIN` user` AS u ON e.id = u.employee_id ГДЕ u.employee_id НЕ ПУСТО;
+ ------------ + ----------- + ----------- + ---------- + | first_name | last_name | user_type | имя пользователя | + ------------ + ----------- + ----------- + ---------- + | Робин | Джекман | НОРМАЛЬНЫЙ | робин | | Тейлор | Эдвард | ADMIN | Тейлор | | Вивиан | Диккенс | ADMIN | вивиан | | Гарри | Клиффорд | НОРМАЛЬНЫЙ | Гарри | | Мелинда | Клиффорд | ADMIN | мелинда | | Харлей | Гилберт | НОРМАЛЬНЫЙ | Харлей | + ------------ + ----------- + ----------- + ---------- +
Аналогичным образом, используя оператор IS NULL, вы можете выбрать сотрудников, у которых нет учетных записей пользователей.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e LEFT JOIN` user` AS u ON e.id = u.employee_id WHERE u.employee_id IS NULL;
+ ------------ + ----------- + ----------- + ---------- + | first_name | last_name | user_type | имя пользователя | + ------------ + ----------- + ----------- + ---------- + | Элиза | Клиффорд | NULL | NULL | | Нэнси | Ньюман | NULL | NULL | + ------------ + ----------- + ----------- + ---------- +
ПРАВИЛЬНОЕ СОЕДИНЕНИЕ
Правое соединение работает напротив левого соединения.То есть приоритет отдается правой таблице и выбирает все строки из правой таблицы для данной связи.
Следующий запрос возвращает все строки из таблицы `user` и заполняет NULL для ячеек таблицы` employee`, если соответствующая строка не найдена.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e RIGHT JOIN` user` AS u ON u.employee_id = e.id;
+ ------------ + ----------- + ------------- + --------- - + | first_name | last_name | user_type | имя пользователя | + ------------ + ----------- + ------------- + ---------- + | NULL | NULL | СУПЕР АДМИН | админ | | Робин | Джекман | НОРМАЛЬНЫЙ | робин | | Тейлор | Эдвард | ADMIN | Тейлор | | Вивиан | Диккенс | ADMIN | вивиан | | Гарри | Клиффорд | НОРМАЛЬНЫЙ | Гарри | | Мелинда | Клиффорд | ADMIN | мелинда | | Харлей | Гилберт | НОРМАЛЬНЫЙ | Харлей | + ------------ + ----------- + ------------- + ---------- +
Декартово произведение
Декартово произведение означает, что для каждого элемента в первом наборе вы получите все элементы второго набора. То есть, если в первом наборе 4 элемента, а во втором наборе 3 элемента, в результате вы получите 12 элементов (4 * 3).
В MySQL декартово произведение будет создано, если вы не укажете связь таблицы во внутреннем соединении. Выполните следующий запрос и посмотрите результат. У вас получится 56 рядов (8 * 7).
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username FROM `employee` AS e INNER JOIN` user` AS u;
Хотя набор результатов, созданный запросом, подобным приведенному выше, кажется бессмысленным, декартово произведение можно использовать, когда нет связи между таблицами, и вы по-прежнему хотите получить комбинированный набор результатов.
В качестве примера возьмем следующую таблицу «leave_type», которая не имеет отношения к таблице «employee» (нет столбца «employee_id» в таблице «leave_type»). Здесь доступны команды SQL для создания таблицы и вставки данных.
id | название |
---|---|
1 | Повседневный |
2 | Медицинский |
Теперь представьте, что каждый сотрудник имеет право на оба типа отпуска (временный и медицинский), и вы хотите отобразить набор результатов, в котором перечислены типы отпусков, на которые имеет право каждый сотрудник. Следующий запрос принесет желаемый результат.
ВЫБЕРИТЕ e.first_name, e.last_name, l.name FROM `employee` AS e INNER JOIN` leave_type` AS l;
+ ------------ + ----------- + --------- + | first_name | last_name | имя | + ------------ + ----------- + --------- + | Робин | Джекман | Повседневный | | Робин | Джекман | Медицинский | | Тейлор | Эдвард | Повседневный | | Тейлор | Эдвард | Медицинский | | Вивиан | Диккенс | Повседневный | | Вивиан | Диккенс | Медицинский | | Гарри | Клиффорд | Повседневный | | Гарри | Клиффорд | Медицинский | | Элиза | Клиффорд | Повседневный | | Элиза | Клиффорд | Медицинский | | Нэнси | Ньюман | Повседневный | | Нэнси | Ньюман | Медицинский | | Мелинда | Клиффорд | Повседневный | | Мелинда | Клиффорд | Медицинский | | Харлей | Гилберт | Повседневный | | Харлей | Гилберт | Медицинский | + ------------ + ----------- + --------- +
Устранение неоднозначности имен
Для всех запросов, упомянутых до сих пор в этой статье, мы указали псевдонимы (например, `employee` AS e) для имен таблиц и использовали их с именами столбцов (например, e. first_name), чтобы указать, какой столбец какой таблице принадлежит.
Если все столбцы, упомянутые в запросе на соединение, имеют разные имена, вам не нужно использовать псевдонимы, как показано в следующем примере.
ВЫБЕРИТЕ first_name, last_name, user_type, username FROM `employee` INNER JOIN` user`;
Однако следующий запрос вызовет ошибку MySQL, так как он не может решить, к какому полю таблицы `id`, упомянутому в предложении ON, принадлежит, поскольку обе таблицы` employee` и `user` имеют поле` id`.
ВЫБЕРИТЕ first_name, last_name, user_type, username FROM `employee` INNER JOIN` user` ON id = employee_id;
Чтобы избежать ошибок из-за неоднозначности имени, рекомендуется всегда использовать псевдонимы таблиц в запросах соединения.Вы также можете переименовать имена столбцов в наборах результатов, как указано в статье о выражении SELECT.
Объединение нескольких таблиц
С помощью запроса соединения можно объединить более двух таблиц. Рассмотрим следующую таблицу «meeting_user», в которой хранятся учетные записи пользователей программного обеспечения для встреч компании.
В настоящее время он имеет четыре учетных записи для четырех существующих пользователей и одну общую для администрирования. Здесь доступны команды SQL для создания таблицы и вставки данных.
id | user_id | имя пользователя | пароль |
---|---|---|---|
1 | м_админ | м_админ | |
2 | 3 | м_тайлор | м_тайлор |
3 | 4 | м_вивиан | м_вивиан |
4 | 6 | м_мелинда | м_мелинда |
5 | 7 | m_harley | m_harley |
Следующий запрос объединяет таблицы «employee», «user» и «meeting_user».Вы можете видеть, что мы использовали псевдонимы для столбцов с именами пользователей, чтобы различать их в результирующем наборе.
ВЫБЕРИТЕ e.first_name, e.last_name, u.user_type, u.username AS u_username, m.username AS m_username FROM `employee` AS e LEFT JOIN` user` AS u ON e.id = u.employee_id LEFT JOIN `meeting_user `AS m ON u.id = m.user_id;
+ ------------ + ----------- + ----------- + ----------- - + ------------ + | first_name | last_name | user_type | u_username | m_username | + ------------ + ----------- + ----------- + ------------ + ------------ + | Робин | Джекман | НОРМАЛЬНЫЙ | робин | NULL | | Тейлор | Эдвард | ADMIN | Тейлор | m_taylor | | Вивиан | Диккенс | ADMIN | вивиан | м_вивиан | | Гарри | Клиффорд | НОРМАЛЬНЫЙ | Гарри | NULL | | Элиза | Клиффорд | NULL | NULL | NULL | | Нэнси | Ньюман | NULL | NULL | NULL | | Мелинда | Клиффорд | ADMIN | мелинда | м_мелинда | | Харлей | Гилберт | НОРМАЛЬНЫЙ | Харлей | m_harley | + ------------ + ----------- + ----------- + ------------ + ------------ +
При генерации вышеуказанного набора результатов сначала происходит соединение между таблицами «employee» и «user», а затем набор результатов становится левой таблицей для второго соединения.
Необязательно выбирать столбцы из всех таблиц, упомянутых в запросе соединения. Например, следующий запрос можно использовать для получения имени пользователя программного обеспечения для встреч каждого сотрудника.
Однако, поскольку нет никакой связи между таблицами «employee» и «meeting_user» (в таблице «meeting_user» нет столбца «employee_id»), вам все равно нужно использовать таблицу «user» для присоединения, но вы не обязаны выберите из него любой столбец.
ВЫБЕРИТЕ e.first_name, e.last_name, m.имя пользователя AS m_username FROM `employee` AS e LEFT JOIN` user` AS u ON e.id = u.employee_id LEFT JOIN `meeting_user` AS m ON u.id = m.user_id;
+ ------------ + ----------- + ------------ + | first_name | last_name | m_username | + ------------ + ----------- + ------------ + | Робин | Джекман | NULL | | Тейлор | Эдвард | m_taylor | | Вивиан | Диккенс | м_вивиан | | Гарри | Клиффорд | NULL | | Элиза | Клиффорд | NULL | | Нэнси | Ньюман | NULL | | Мелинда | Клиффорд | м_мелинда | | Харлей | Гилберт | m_harley | + ------------ + ----------- + ------------ +
Обычно вы видите несколько объединений таблиц в отношениях «многие ко многим».
Отношения «один ко многим»
Упомянутые до сих пор таблицы данных имели взаимно однозначные отношения. То есть для каждой строки в левой таблице была только одна соответствующая строка (или ни одна строка) в правой таблице.
Также возможно иметь более одной соответствующей строки в правой таблице для каждой строки в левой таблице. Такие отношения называются отношениями «один ко многим».
Рассмотрим следующую таблицу, в которой хранятся номера телефонов сотрудников. Обратите внимание, что в столбце «employee_id» есть дубликаты, образующие отношения «один ко многим» (у одного сотрудника может быть один или несколько телефонных номеров).Здесь доступны команды SQL для создания таблицы и вставки данных.
id | идентификатор сотрудника | тип | нет |
---|---|---|---|
1 | 1 | мобильный | 245-249697 |
2 | 2 | мобильный | 270-235969 |
3 | 2 | земельный участок | 325-888885 |
4 | 3 | мобильный | 270-684972 |
5 | 4 | мобильный | 245-782365 |
6 | 4 | земельный участок | 325-888886 |
7 | 5 | мобильный | 245-537891 |
8 | 6 | мобильный | 270-359457 |
9 | 7 | мобильный | 245-436589 |
10 | 7 | земельный участок | 325-888887 |
11 | 8 | мобильный | 245-279164 |
12 | 8 | земельный участок | 325-888888 |
Следующий запрос возвращает имена сотрудников и их мобильные номера. Нет разницы в синтаксисе по сравнению с запросами LEFT JOIN, рассмотренными до сих пор.
ВЫБЕРИТЕ e.first_name, e.last_name, t.type, t.no FROM `employee` AS e LEFT JOIN` phone` AS t ON e.id = t.employee_id;
+ ------------ + ----------- + -------- + ------------ + | first_name | last_name | тип | нет | + ------------ + ----------- + -------- + ------------ + | Робин | Джекман | мобильный | 245-249697 | | Тейлор | Эдвард | мобильный | 270-235969 | | Тейлор | Эдвард | земля | 325-888885 | | Вивиан | Диккенс | мобильный | 270-684972 | | Гарри | Клиффорд | мобильный | 245-782365 | | Гарри | Клиффорд | земля | 325-888886 | | Элиза | Клиффорд | мобильный | 245-537891 | | Нэнси | Ньюман | мобильный | 270-359457 | | Мелинда | Клиффорд | мобильный | 245-436589 | | Мелинда | Клиффорд | земля | 325-888887 | | Харлей | Гилберт | мобильный | 245-279164 | | Харлей | Гилберт | земля | 325-888888 | + ------------ + ----------- + -------- + ------------ +
Использование ORDER BY и LIMIT
Подобно обычным операторам SELECT, в операторах соединения можно использовать ORDER BY и LIMIT.
ВЫБЕРИТЕ e.first_name, e.last_name, t.type, t.no FROM `employee` AS e LEFT JOIN` phone` AS t ON e.id = t.employee_id ORDER BY t.type DESC, e.last_name ASC, e.first_name ASC LIMIT 4;
+ ------------ + ----------- + -------- + ------------ + | first_name | last_name | тип | нет | + ------------ + ----------- + -------- + ------------ + | Элиза | Клиффорд | мобильный | 245-537891 | | Гарри | Клиффорд | мобильный | 245-782365 | | Мелинда | Клиффорд | мобильный | 245-436589 | | Вивиан | Диккенс | мобильный | 270-684972 | + ------------ + ----------- + -------- + ------------ +
Определение множественных отношений в пункте ON
Некоторые таблицы данных могут иметь составные первичные ключи.То есть более одного столбца формируют первичный ключ. В таких случаях вы можете указать несколько отношений в предложении ON с помощью оператора AND, как показано в следующем синтаксисе.
ВЫБРАТЬ t1. *, T2. * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1. field1 = t2.field1 AND t1.field2 = t2.field2;
Замена имен столбцов в пункте ON
Вы можете поменять местами имена столбцов, упомянутые в предложении ON, как показано ниже (отношение теперь u.employee_id = e.id вместо e.id = u.employee_id).
ВЫБРАТЬ e.first_name, e.last_name, u.user_type, u.username FROM `user` AS u ВНУТРЕННЕЕ СОЕДИНЕНИЕ` employee` AS e ON u.employee_id = e.id;
Однако он будет более читабельным, если вы укажете левую часть отношения из левой таблицы и правую часть из правой таблицы.
INNER, OUTER, LEFT, RIGHT, CROSS
Типы объединений
Cross JOIN
Cross JOIN — это простейшая форма JOIN, которая сопоставляет каждую строку одной таблицы базы данных со всеми строками другой.
Другими словами, он дает нам комбинации каждой строки первой таблицы со всеми записями во второй таблице.
Предположим, мы хотим получить все записи участников из всех записей фильмов, мы можем использовать показанный ниже сценарий для получения желаемых результатов.
SELECT * FROM `movies` CROSS JOIN` members`
Выполнение вышеуказанного сценария в рабочей среде MySQL дает нам следующие результаты.
id | title | id | first_name | last_name | movie_id | ||||
---|---|---|---|---|---|---|---|---|---|
1 | КРЕДА АССАСИНА: EMBERS | Animations | 1 | Animations | 1 | Animations | Smith 1 | ||
1 | КРЕДА АССАСИНА: ЭМБЕРС | Анимации | 2 | Рави | Кумар | 2 | |||
1 | КРЕДА АССАСИНА: ПОЧАСТИ | Анимации | 3 | Анимации | 3 | Анимации | 3 | Анимации | 5 |
1 | КРЕДА АССАСИНА: ЭМБЕРС | Анимации | 4 | Дженни | Адрианна | 8 | |||
1 | КРЕДА АССАСИНА: ПОЧАСТИ | Анимации | 6 | Понг | 10 | ||||
2 9 0056 | Real Steel (2012) | Анимации | 1 | Adam | Smith | 1 | |||
2 | Real Steel (2012) | Анимации | 2 | Ravi | Kumar | 2 | |||
2 | Real Steel (2012) | Анимации | 3 | Susan | Davidson | 5 | |||
2 | Real Steel (2012) | Анимации | 4 | Jenny | Adrianna | 8 | |||
2 | Real Steel (2012) | Анимации | 6 | Lee | Pong | 10 | |||
3 | Элвин и бурундуки | Анимации | 1 | Adam | Смит | 1 | |||
3 | Элвин и бурундуки | Анимации | 2 | 9005 5 РавиКумар | 2 | ||||
3 | Элвин и бурундуки | Анимации | 3 | Сьюзен | Дэвидсон | 5 | |||
3 | Элвин и бурундуки | 4 | Дженни | Адрианна | 8 | ||||
3 | Элвин и бурундуки | Анимации | 6 | Ли | Понг | 10 | |||
4 | Приключения Тин Тин | Анимации | 1 | Адам | Смит | 1 | |||
4 | Приключения олова | Анимации | 2 | Рави | Кумар | 2 | |||
4 | Приключения Олово Олово | Анимация | 3 | Susan | Davidson | 5 | |||
4 | Приключения олова | Анимации | 4 | Дженни | Адрианна | 8 | |||
4 | Приключения олова | Анимации | 6 | Ли | Понг | 10 | |||
5 | Сейф (2012) | Action | 1 | Adam | Smith | 1 | |||
5 | Safe (2012) | Action | 2 | Ravi | Кумар | 2 | |||
5 | Сейф (2012) | Action | 3 | Susan | Davidson | 5 | |||
5 | Safe (2012) | Action | 4 | Дженни | Адрианна | 8 | |||
5 | Сейф (2012) | Действие | 6 | Ли 9 0056 | Pong | 10 | |||
6 | Safe House (2012) | Action | 1 | Adam | Smith | 1 | |||
6 | Safe House (2012) | Action | 2 | Рави | Кумар | 2 | |||
6 | Safe House (2012) | Action | 3 | Susan | Davidson | 5 | |||
6 | Safe House (2012) | Action | 4 | Jenny | Adrianna | 8 | |||
6 | Safe House (2012) | Action | 6 | Lee | Pong | 10 | |||
7 | GIA | 18+ | 1 | Adam | Smith | 1 | |||
7 | GIA | 18+ | 2 | Ravi 9005 6 | Кумар | 2 | |||
7 | GIA | 18+ | 3 | Сьюзен | Дэвидсон | 5 | |||
7 | GIA | 18+ | 4 | Дженни | Адрианна | 8 | |||
7 | GIA | 18+ | 6 | Lee | Pong | 10 | |||
8 | Срок (2009 г. ) | 18+ | 1 | Adam | Smith | 1 | |||
8 | Срок (2009 г.) | 18+ | 2 | Рави | Кумар | 2 | |||
8 | Срок (2009 г.) | 18+ | 3 | Сьюзан | Дэвидсон | 5 | |||
8 | Срок (2009 г.) | 18+ | 4 | Дженни | Адрианна | 8 9 0056 | |||
8 | Срок (2009 г.) | 18+ | 6 | Lee | Pong | 10 | |||
9 | Грязное изображение | 18+ | 1 | Adam | Smith | 1 | |||
9 | Грязное изображение | 18+ | 2 | Рави | Кумар | 2 | |||
9 | Грязное изображение | 18+ | 3 | Susan | Дэвидсон | 5 | |||
9 | Грязное изображение | 18+ | 4 | Дженни | Адрианна | 8 | |||
9 | Грязное изображение | 18+ | 6 | Ли | Понг | 10 | |||
10 | Марли и я | Романтика | 1 | Адам | Смит 9005 6 | 1 | |||
10 | Марли и я | Романтика | 2 | Рави | Кумар | 2 | |||
10 | Марли и я | Романтика | 3 | Сьюзен | Дэвидсон | 5 | |||
10 | Марли и я | Романтика | 4 | Дженни | Адрианна | 8 | |||
10 | Марли и я | Романтика | 6 | Ли | Понг | 10 |
INNER JOIN
Внутреннее JOIN используется для возврата строк из обеих таблиц, которые удовлетворяют заданному условию.
Предположим, вы хотите получить список участников, которые арендовали фильмы вместе с названиями фильмов, взятых напрокат ими. Вы можете просто использовать для этого INNER JOIN, который возвращает строки из обеих таблиц, которые удовлетворяют заданным условиям.
ВЫБЕРИТЕ members.`first_name`, members.`last_name`, movies.`title` ОТ участников, фильмы WHERE movies.`id` = members.`movie_id`
Выполнение вышеуказанного скрипта дает
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Кумар | Real Steel (2012) | |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Срок (2009) |
Lee | Pong | Marley and me |
Обратите внимание, что приведенный выше сценарий результатов также может быть записан следующим образом для достижения тех же результатов.
ВЫБЕРИТЕ A.`first_name`, A.`last_name`, B.`title` ОТ `members`AS A INNER JOIN `movies` как B ON B.`id` = A.`movie_id`
Внешние СОЕДИНЕНИЯ
Внешние СОЕДИНЕНИЯ MySQL возвращают все совпадающие записи из обеих таблиц.
Он может обнаруживать записи, не имеющие совпадений в объединенной таблице. Он возвращает значений NULL для записей объединенной таблицы, если совпадений не найдено.
Непонятно звучит? Давайте рассмотрим пример —
LEFT JOIN
Предположим, теперь вы хотите получить названия всех фильмов вместе с именами участников, которые их арендовали.Понятно, что некоторые фильмы никто не арендует. Для этой цели мы можем просто использовать LEFT JOIN .
LEFT JOIN возвращает все строки из таблицы слева, даже если совпадающие строки не были найдены в таблице справа. Если совпадений в таблице справа не найдено, возвращается NULL.
ВЫБЕРИТЕ A. `title`, B.`first_name`, B.`last_name` ИЗ `movies` AS A LEFT JOIN `members` AS B ПО Б.`movie_id` = A.`id`
Выполнение вышеуказанного сценария в рабочей среде MySQL дает. Вы можете видеть, что в возвращаемом результате, который указан ниже, для фильмов, которые не взяты напрокат, поля имени члена имеют значения NULL. Это означает, что для этого конкретного фильма не найдено ни одного подходящего элемента.
название | first_name | last_name |
---|---|---|
ASSASSIN'S CREED: EMBERS | Adam | Smith |
Real Steel (2012) | Ravi | Kumar |
Safe (2012) Сейф (2012) | Сьюзан | Дэвидсон |
Срок (2009) | Дженни | Адрианна |
Марли и я | Ли | Понг |
Элвин и бурундуки | NULL | NULL |
The Adventures of Tin Tin | NULL | NULL |
Safe House (2012) | NULL | NULL |
GIA | NULL | NULL |
Грязная картинка | NULL | NULL |
RIGHT JOIN
RIGHT JOIN, очевидно, является противоположностью LEFT JOIN.RIGHT JOIN возвращает все столбцы из таблицы справа, даже если в таблице слева не найдено совпадающих строк. Если совпадений в таблице слева не найдено, возвращается NULL.
В нашем примере предположим, что вам нужно получить имена участников и фильмы, взятые ими напрокат. Теперь у нас есть новый участник, который еще не брал напрокат ни одного фильма.
SELECT A.`first_name`, A.`last_name`, B.`title` ОТ `members` AS A ПРАВО ПРИСОЕДИНЯЙТЕСЬ `movies` как B ПО Б.`id` = A.`movie_id`
Выполнение вышеуказанного сценария в рабочей среде MySQL дает следующие результаты.
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel (2012) |
Real Steel | DavanidsСейф (2012) | |
Дженни | Адрианна | Срок (2009) |
Ли | Понг | Марли и я |
NULL | NULL | Элвин и бурундуки |
NULL | NULL | The Adventures of Tin Tin |
NULL | NULL | Safe House (2012) |
NULL | NULL | GIA |
NULL | NULL | Грязный Изображение |
Предложения «ON» и «USING»
В приведенных выше примерах запросов JOIN мы использовали предложение ON для сопоставления записей в таблице.Предложение
USING также может использоваться для той же цели. Разница с ИСПОЛЬЗОВАНИЕ состоит в том, что должен иметь одинаковые имена для совпадающих столбцов в обеих таблицах.
До сих пор в таблице «movies» мы использовали ее первичный ключ с именем «id». Мы ссылались на то же самое в таблице «members» с именем «movie_id».
Давайте переименуем поле «id» таблиц «фильмы» в имя «movie_id». Мы делаем это для того, чтобы имена полей совпадали одинаково.
ALTER TABLE `movies` ИЗМЕНИТЬ` id` `movie_id` INT (11) NOT NULL AUTO_INCREMENT;
Теперь давайте использовать USING с приведенным выше примером LEFT JOIN.
ВЫБЕРИТЕ A.`title`, B.`first_name`, B.`last_name` ИЗ `movies` AS A LEFT JOIN `members` AS B ИСПОЛЬЗОВАНИЕ (`movie_id`)
Помимо использования ON и USING с JOINs , вы можете использовать многие другие предложения MySQL, такие как GROUP BY, WHERE и даже такие функции, как SUM , AVG и т. Д.
Почему мы должны использовать объединения?
Теперь вы можете подумать, зачем мы используем JOIN, когда мы можем выполнять ту же задачу, выполняя запросы. Особенно, если у вас есть некоторый опыт программирования баз данных, вы знаете, что мы можем запускать запросы один за другим, использовать вывод каждого в последовательных запросах. Конечно, это возможно. Но, используя JOIN, вы можете выполнить работу, используя только один запрос с любыми параметрами поиска. С другой стороны, MySQL может достичь лучшей производительности с JOIN, поскольку он может использовать индексирование.Простое использование одного запроса JOIN вместо выполнения нескольких запросов снижает накладные расходы на сервер. Вместо этого используется несколько запросов, что приводит к большему количеству передач данных между MySQL и приложениями (программным обеспечением). Кроме того, это также требует дополнительных манипуляций с данными в конце приложения.
Понятно, что мы можем добиться лучшей производительности MySQL и приложений, используя JOIN.
Сводка- СОЕДИНЕНИЯ позволяют нам объединять данные из более чем одной таблицы в единый набор результатов.
- JOINS имеют лучшую производительность по сравнению с подзапросами
- INNER JOINS возвращают только строки, которые соответствуют заданным критериям.
- ВНЕШНИЕ СОЕДИНЕНИЯ также могут возвращать строки, в которых не было найдено совпадений. Несопоставленные строки возвращаются с ключевым словом NULL.
- Основные типы JOIN включают внутренний, левый внешний, правый внешний, перекрестные соединения и т. Д.
- Часто используемое предложение в операциях JOIN — «ON». Предложение «USING» требует, чтобы совпадающие столбцы имели одно и то же имя.
- JOINS также можно использовать в других предложениях, таких как GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS и т. Д.
SQLite Left Join
Резюме : в этом руководстве вы узнаете, как использовать SQLite Предложение LEFT JOIN
для запроса данных из нескольких таблиц.
Введение в SQLite
LEFT JOIN, предложение
Подобно предложению INNER JOIN
, предложение LEFT JOIN
является необязательным предложением оператора SELECT
.Предложение LEFT JOIN
используется для запроса данных из нескольких связанных таблиц.
Предположим, у нас есть две таблицы: A и B.
- A имеет m и f столбцов.
- B имеет n и f столбцов.
Чтобы выполнить соединение между A и B с помощью предложения LEFT JOIN
, используйте следующий оператор:
SELECT а, б ИЗ А ЛЕВОЕ СОЕДИНЕНИЕ B НА A.f = B.f ГДЕ search_condition;
Выражение A.f = B.f
является условным выражением.Помимо оператора равенства (=), вы можете использовать другие операторы сравнения, такие как больше (>), меньше (<) и т. Д.
Этот оператор возвращает набор результатов, который включает:
- Строки в таблице A (слева table), которым соответствуют строки в таблице B.
- Строки в таблице A и строки в таблице B заполнены значениями
NULL
в случае, если строка из таблицы A не имеет соответствующих строк в таблице B.
Другими словами, все строки в таблице A включаются в набор результатов независимо от того, есть ли совпадающие строки в таблице B или нет.
Если в операторе есть предложение WHERE
, условие search_condition
в предложении WHERE
применяется после завершения сопоставления предложения LEFT JOIN
.
См. Следующую иллюстрацию предложения LEFT JOIN
между таблицами A и B.
Все строки в таблице A включены в набор результатов.
Поскольку вторая строка (a2,2)
не имеет соответствующей строки в таблице B, предложение LEFT JOIN
создает поддельную строку , заполненную NULL
.
Следующая диаграмма Венна иллюстрирует предложение LEFT JOIN
.
Следует отметить, что LEFT OUTER JOIN
совпадает с LEFT JOIN
.
SQLite
LEFT JOIN
примеров Мы будем использовать таблицы художников
и альбомы
в базе данных примеров для демонстрации.
Один альбом принадлежит одному исполнителю. Однако у одного исполнителя может быть ноль или более альбомов.
Чтобы найти исполнителей, у которых нет альбомов, с помощью пункта LEFT JOIN
мы выбираем исполнителей и их соответствующие альбомы.Если у исполнителя нет альбомов, значение столбца AlbumId
равно NULL.
Чтобы сначала отобразить исполнителей, у которых нет альбомов, у нас есть два варианта:
- Во-первых, используйте предложение
ORDER BY
, чтобы перечислить строки, у которыхAlbumId
сначала имеет значениеNULL
. - Во-вторых, используйте предложение
WHERE
и операторIS NULL
, чтобы перечислить только исполнителей, у которых нет альбомов.
Следующий оператор использует предложение LEFT JOIN
с предложением ORDER BY
.
ВЫБРАТЬ артисты.ArtistId, AlbumId ИЗ художники LEFT JOIN альбомы ВКЛ. альбомы.ArtistId = artist.ArtistId СОРТИРОВАТЬ ПО AlbumId;
Попробовать
Следующий оператор использует предложение LEFT JOIN
с предложением WHERE
.
ВЫБРАТЬ художники.ArtistId , AlbumId ИЗ художники LEFT JOIN альбомы ВКЛ. альбомы.ArtistId = artist.ArtistId КУДА AlbumId IS NULL;
Попробовать
В этом руководстве вы узнали, как использовать предложение SQLite LEFT JOIN
для запроса данных из нескольких таблиц.
- Было ли это руководство полезным?
- Да Нет
SQL LEFT JOIN Operation — Tutorial Republic
В этом руководстве вы узнаете, как получить данные из двух таблиц с помощью левого соединения SQL.
Использование левых соединений
Оператор LEFT JOIN
возвращает все строки из левой таблицы вместе со строками из правой таблицы, для которых выполнено условие соединения. Левое соединение — это тип внешнего соединения, поэтому его также называют левым внешним соединением . Другие варианты внешнего соединения — это правое соединение и полное соединение.
На следующей диаграмме Венна показано, как работает левое соединение.
Примечание: Внешнее соединение — это соединение, которое включает строки в результирующем наборе, даже если между строками в двух соединяемых таблицах может не быть совпадения.
Чтобы понять это ясно, давайте посмотрим на следующие таблицы сотрудников и отделов .
+ -------- + -------------- + ------------ + --------- + | emp_id | emp_name | найм_дата | dept_id | + -------- + -------------- + ------------ + --------- + | 1 | Итан Хант | 2001-05-01 | 4 | | 2 | Тони Монтана | 2002-07-15 | 1 | | 3 | Сара Коннор | 2005-10-18 | 5 | | 4 | Рик Декард | 2007-01-03 | 3 | | 5 | Мартин Бланк | 2008-06-24 | NULL | + -------- + -------------- + ------------ + --------- + | + --------- + ------------------ + | dept_id | dept_name | + --------- + ------------------ + | 1 | Администрация | | 2 | Служба поддержки клиентов | | 3 | Финансы | | 4 | Человеческие ресурсы | | 5 | Продажи | + --------- + ------------------ + | |
Стол: сотрудников | Стол: отделов |
Теперь предположим, что вы хотите получить идентификатор, имя и дату приема на работу всех сотрудников вместе с названием их отдела, независимо от того, назначены они какому-либо отделу или нет. Чтобы получить такой тип набора результатов, нам нужно применить левое соединение.
Следующий оператор извлекает идентификатор сотрудника, имя, дату приема на работу и название его отдела путем объединения таблиц сотрудников и департаментов вместе с использованием общего поля dept_id . Сюда также входят те сотрудники, которые не закреплены за отделом.
ВЫБРАТЬ t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
ОТ сотрудников AS t1 ВЛЕВО ПРИСОЕДИНИТЬСЯ к отделам AS t2
ВКЛ t1.dept_id = t2.dept_id ЗАКАЗАТЬ ПО emp_id;
Подсказка: В запросе на соединение левая таблица — это та, которая появляется крайним левым в предложении JOIN
, а правая таблица — это та, которая появляется крайней правее.
После выполнения вышеуказанной команды вы получите что-то вроде этого:
+ -------- + -------------- + ------------ + ------------ ----- + | emp_id | emp_name | найм_дата | dept_name | + -------- + -------------- + ------------ + ------------ ----- + | 1 | Итан Хант | 2001-05-01 | Человеческие ресурсы | | 2 | Тони Монтана | 2002-07-15 | Администрация | | 3 | Сара Коннор | 2005-10-18 | Продажи | | 4 | Рик Декард | 2007-01-03 | Финансы | | 5 | Мартин Бланк | 2008-06-24 | NULL | + -------- + -------------- + ------------ + ------------ ----- +
Как вы можете ясно видеть, левое соединение включает в себя все строки из таблицы сотрудников в наборе результатов, независимо от того, есть ли совпадение в столбце dept_id в таблице департаментов .
Примечание: Если есть строка в левой таблице, но нет совпадения в правой таблице, то связанная строка результата содержит значений NULL
для всех столбцов, поступающих из правой таблицы.
PHP SQL Левое соединение
JOIN используется для запроса данных из двух или более таблиц.Левое соединение используется в случае необходимости вернуть все строки из левой таблицы, даже если в правой таблице нет совпадений.
JOIN используется для запроса данных из двух или более таблиц. Левое соединение используется в случае необходимости вернуть все строки из левой таблицы, даже если в правой таблице нет совпадений.В этом примере показано, как использовать предложение left join в sql запрос.
JOIN используется для запроса данных из двух или более таблиц.Левое соединение используется в случае необходимости вернуть все строки из левой таблицы, даже если в правой таблице нет совпадений. В этом примере левое соединение используется для соединения двух данных таблицы в соответствии с Поле emp_id таблицы «emp». Мы используем таблицы «emp», «message» в примере. Мы найдем имя из таблицы emp и сообщения из таблицы сообщений, где emp_id в обеих таблицах равны. Полученный результат отображается на браузер, как показано ниже, и полный исходный код доступен ниже для загрузки или скопируйте код в соответствии с вашими потребностями.
Таблица: emp
Таблица: сообщение
Исходный код leftJoin.php
php |
Выход:
Скачать исходный код
Объявления
.