Учебники

24) СОЕДИНЯЕТСЯ

Что такое СОЕДИНЕНИЯ?

Объединения помогают получать данные из двух или более таблиц базы данных. 
Таблицы связаны между собой с использованием первичных и внешних ключей.

Примечание: JOIN — это наиболее неправильно понятая тема среди SQL-уровней. Для простоты и простоты понимания мы будем использовать новую базу данных для отработки образца. Как показано ниже

Я бы Имя фамилия movie_id
1 Адам кузнец 1
2 Ravi Кумар 2
3 Сьюзен Davidson 5
4 Дженни Адрианна 8
6 подветренный Pong 10

Я бы заглавие категория
1 Кредо убийцы: EMBERS Анимации
2 Real Steel (2012) Анимации
3 Элвин и бурундуки Анимации
4 Приключения Тин Тин Анимации
5 Сейф (2012) действие
6 Безопасный дом (2012) действие
7 GIA 18+
8 Срок исполнения 2009 18+
9 Грязная картина 18+
10 Марли и я романс
 

Типы соединений

 

Cross JOIN

Cross JOIN — это самая простая форма JOIN, которая сопоставляет каждую строку из одной таблицы базы данных со всеми строками другой.

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

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

Учебное пособие по присоединению к MySQL: ВНУТРЕННЕЕ, НАРУЖНОЕ, ВЛЕВО, ПРАВО, КРЕСТ

SELECT * FROM `movies` CROSS JOIN `members`

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

 

idtitle idfirst_namelast_namemovie_id
1ASSASSIN'S CREED: EMBERSAnimations1AdamSmith1
1ASSASSIN'S CREED: EMBERSAnimations2RaviKumar2
1ASSASSIN'S CREED: EMBERSAnimations3SusanDavidson5
1ASSASSIN'S CREED: EMBERSAnimations4JennyAdrianna8
1ASSASSIN'S CREED: EMBERSAnimations6LeePong10
2Real Steel(2012)Animations1AdamSmith1
2Real Steel(2012)Animations2RaviKumar2
2Real Steel(2012)Animations3SusanDavidson5
2Real Steel(2012)Animations4JennyAdrianna8
2Real Steel(2012)Animations6LeePong10
3Alvin and the ChipmunksAnimations1AdamSmith1
3Alvin and the ChipmunksAnimations2RaviKumar2
3Alvin and the ChipmunksAnimations3SusanDavidson5
3Alvin and the ChipmunksAnimations4JennyAdrianna8
3Alvin and the ChipmunksAnimations6LeePong10
4The Adventures of Tin TinAnimations1AdamSmith1
4The Adventures of Tin TinAnimations2RaviKumar2
4The Adventures of Tin TinAnimations3SusanDavidson5
4The Adventures of Tin TinAnimations4JennyAdrianna8
4The Adventures of Tin TinAnimations6LeePong10
5Safe (2012)Action1AdamSmith1
5Safe (2012)Action2RaviKumar2
5Safe (2012)Action3SusanDavidson5
5Safe (2012)Action4JennyAdrianna8
5Safe (2012)Action6LeePong10
6Safe House(2012)Action1AdamSmith1
6Safe House(2012)Action2RaviKumar2
6Safe House(2012)Action3SusanDavidson5
6Safe House(2012)Action4JennyAdrianna8
6Safe House(2012)Action6LeePong10
7GIA18+1AdamSmith1
7GIA18+2RaviKumar2
7GIA18+3SusanDavidson5
7GIA18+4JennyAdrianna8
7GIA18+6LeePong10
8Deadline(2009)18+1AdamSmith1
8Deadline(2009)18+2RaviKumar2
8Deadline(2009)18+3SusanDavidson5
8Deadline(2009)18+4JennyAdrianna8
8Deadline(2009)18+6LeePong10
9The Dirty Picture18+1AdamSmith1
9The Dirty Picture18+2RaviKumar2
9The Dirty Picture18+3SusanDavidson5
9The Dirty Picture18+4JennyAdrianna8
9The Dirty Picture18+6LeePong10
10Marley and meRomance1AdamSmith1
10Marley and meRomance2RaviKumar2
10Marley and meRomance3SusanDavidson5
10Marley and meRomance4JennyAdrianna8
10Marley and meRomance6LeePong10

 

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

Внутреннее JOIN используется для возврата строк из обеих таблиц, которые удовлетворяют заданному условию.

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

Учебное пособие по присоединению к MySQL: ВНУТРЕННЕЕ, НАРУЖНОЕ, ВЛЕВО, ПРАВО, КРЕСТ

 

SELECT members.`first_name` , members.`last_name` , movies.`title`
FROM members ,movies
WHERE movies.`id` = members.`movie_id`

Выполнение приведенного выше сценария дает

first_namelast_nametitle
AdamSmithASSASSIN'S CREED: EMBERS
RaviKumarReal Steel(2012)
SusanDavidsonSafe (2012)
JennyAdriannaDeadline(2009)
LeePongMarley and me

Обратите внимание, что приведенный выше скрипт результатов также может быть написан следующим образом для достижения тех же результатов.

SELECT A.`first_name` , A.`last_name` , B.`title`
FROM `members`AS A
INNER JOIN `movies` AS B
ON B.`id` = A.`movie_id`

Внешние СОЕДИНЕНИЯ

Внешние соединения MySQL возвращают все записи, совпадающие с обеими таблицами.

Он может обнаружить записи, не совпадающие в объединенной таблице. Он возвращает значения NULL для записей объединенной таблицы, если совпадение не найдено.

Звучит запутанно? Давайте посмотрим на пример —

ЛЕВОЕ СОЕДИНЕНИЕ

Предположим теперь, что вы хотите получить названия всех фильмов вместе с именами участников, которые их арендовали. Понятно, что некоторые фильмы никто не снимал. Мы можем просто использовать LEFT JOIN для этой цели.

Учебное пособие по присоединению к MySQL: ВНУТРЕННЕЕ, НАРУЖНОЕ, ВЛЕВО, ПРАВО, КРЕСТ

 

LEFT JOIN возвращает все строки из таблицы слева, даже если в таблице справа не найдено подходящих строк. Если в таблице справа совпадений не найдено, возвращается NULL.

 

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
ON B.`movie_id` = A.`id`

Выполнение вышеупомянутого сценария в MySQL верстаке дает. Вы можете видеть, что в возвращенном результате, который указан ниже, что для фильмов, которые не арендованы, поля имени элемента имеют значения NULL. Это означает, что для данного фильма не найдено ни одного подходящего участника.

titlefirst_namelast_name
ASSASSIN'S CREED: EMBERSAdamSmith
Real Steel(2012)RaviKumar
Safe (2012)SusanDavidson
Deadline(2009)JennyAdrianna
Marley and meLeePong
Alvin and the ChipmunksNULLNULL
The Adventures of Tin TinNULLNULL
Safe House(2012)NULLNULL
GIANULLNULL
The Dirty PictureNULLNULL
Note: Null is returned for non-matching rows on right

 

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

RIGHT JOIN — это, очевидно, противоположность LEFT JOIN. RIGHT JOIN возвращает все столбцы из таблицы справа, даже если в таблице слева не найдено подходящих строк. Если в таблице слева не найдено совпадений, возвращается NULL.

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

Учебное пособие по присоединению к MySQL: ВНУТРЕННЕЕ, НАРУЖНОЕ, ВЛЕВО, ПРАВО, КРЕСТ

SELECT  A.`first_name` , A.`last_name`, B.`title`
FROM `members` AS A
RIGHT JOIN `movies` AS B
ON B.`id` = A.`movie_id`

 

Выполнение вышеупомянутого сценария в MySQL Workbench дает следующие результаты.

first_namelast_nametitle
AdamSmithASSASSIN'S CREED: EMBERS
RaviKumarReal Steel(2012)
SusanDavidsonSafe (2012)
JennyAdriannaDeadline(2009)
LeePongMarley and me
NULLNULLAlvin and the Chipmunks
NULLNULLThe Adventures of Tin Tin
NULLNULLSafe House(2012)
NULLNULLGIA
NULLNULLThe Dirty Picture
Note: Null is returned for non-matching rows on left

Положения «ON» и «USING»

В приведенных выше примерах запросов JOIN мы использовали предложение ON для сопоставления записей между таблицами.

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

 

До сих пор в таблице «movies» мы использовали ее первичный ключ с именем «id». Мы ссылались на то же самое в таблице «members» с именем «movie_id».

 

Давайте переименуем поле «id» таблицы «movies» в имя «movie_id». Мы делаем это для того, чтобы иметь идентичные совпадающие имена полей.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

Далее давайте использовать USING с примером выше LEFT JOIN.

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
USING ( `movie_id` )

Помимо использования ON и USING с JOIN, вы можете использовать многие другие предложения MySQL, такие как GROUP BY, WHERE, и даже такие функции, как SUM , AVG и т. Д.

 

Почему мы должны использовать соединения?

Теперь вы можете подумать, почему мы используем JOIN, когда можем выполнять ту же задачу, выполняя запросы. Особенно, если у вас есть некоторый опыт программирования баз данных, вы знаете, что мы можем запускать запросы один за другим, использовать вывод каждого в последовательных запросах. Конечно, это возможно. Но, используя JOIN, вы можете выполнить работу, используя только один запрос с любыми параметрами поиска. С другой стороны, MySQL может достичь лучшей производительности с помощью JOIN, поскольку он может использовать индексирование. Просто использование одного запроса JOIN вместо выполнения нескольких запросов сокращает нагрузку на сервер. Вместо этого используется несколько запросов, что приводит к большей передаче данных между MySQL и приложениями (программными) Далее это требует больше манипуляций с данными и в конце приложения.

Понятно, что мы можем добиться лучшей производительности MySQL и приложений с помощью JOIN.

 

Резюме

  • СОЕДИНЕНИЯ позволяют нам объединять данные из более чем одной таблицы в один набор результатов.
  • СОЕДИНЕНИЯ имеют лучшую производительность по сравнению с подзапросами
  • INNER JOINS возвращают только те строки, которые соответствуют заданным критериям.
  • ВНЕШНИЕ СОЕДИНЕНИЯ также могут возвращать строки, в которых совпадений не найдено. Несоответствующие строки возвращаются с ключевым словом NULL.
  • Основные типы JOIN включают в себя Inner, Left Outer, Right Outer, Cross JOINS и т. Д.
  • В операциях JOIN часто используется предложение «ON». Предложение «USING» требует, чтобы совпадающие столбцы имели одно и то же имя.
  • СОЕДИНЕНИЯ могут также использоваться в других разделах, таких как GROUP BY, WHERE, SUB-запросы, агрегированные функции и т. Д.