MySQL Учебное пособие по соединениям: ВНУТРЕННЕЕ, ВНЕШНЕЕ, ЛЕВОЕ, ПРАВОЕ, КРЕСТОВОЕ

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

Объединения помогают извлекать данные из двух или более таблиц базы данных.

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

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

id имя Фамилия Movie_id
1 Адам Smith 1
2 Ravi Кумаром 2
3 Сьюзен Davidson 5
4 Jenny Адрианна 8
5 подветренный Pong 10
id название Каталог
1 ASSASSIN'S CREED: УГЛИ Развлечения
2 Настоящая сталь (2012) Развлечения
3 Элвин и бурундуки Развлечения
4 Приключения олова олова Развлечения
5 Сейф (2012) Экшн
6 Безопасный дом (2012) Экшн
7 GIA 18+
8 Срок 2009 18+
9 Грязная картина 18+
10 Марли и я Romance

Типы объединений

Перекрестное ПРИСОЕДИНЕНИЕ

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

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

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

Типы объединений

SELECT * FROM `movies` CROSS JOIN `members`

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

id title id first_name last_name movie_id
1 ASSASSIN'S CREED: EMBERS Animations 1 Adam Smith 1
1 ASSASSIN'S CREED: EMBERS Animations 2 Ravi Kumar 2
1 ASSASSIN'S CREED: EMBERS Animations 3 Susan Davidson 5
1 ASSASSIN'S CREED: EMBERS Animations 4 Jenny Adrianna 8
1 ASSASSIN'S CREED: EMBERS Animations 6 Lee Pong 10
2 Real Steel(2012) Animations 1 Adam Smith 1
2 Real Steel(2012) Animations 2 Ravi Kumar 2
2 Real Steel(2012) Animations 3 Susan Davidson 5
2 Real Steel(2012) Animations 4 Jenny Adrianna 8
2 Real Steel(2012) Animations 6 Lee Pong 10
3 Alvin and the Chipmunks Animations 1 Adam Smith 1
3 Alvin and the Chipmunks Animations 2 Ravi Kumar 2
3 Alvin and the Chipmunks Animations 3 Susan Davidson 5
3 Alvin and the Chipmunks Animations 4 Jenny Adrianna 8
3 Alvin and the Chipmunks Animations 6 Lee Pong 10
4 The Adventures of Tin Tin Animations 1 Adam Smith 1
4 The Adventures of Tin Tin Animations 2 Ravi Kumar 2
4 The Adventures of Tin Tin Animations 3 Susan Davidson 5
4 The Adventures of Tin Tin Animations 4 Jenny Adrianna 8
4 The Adventures of Tin Tin Animations 6 Lee Pong 10
5 Safe (2012) Action 1 Adam Smith 1
5 Safe (2012) Action 2 Ravi Kumar 2
5 Safe (2012) Action 3 Susan Davidson 5
5 Safe (2012) Action 4 Jenny Adrianna 8
5 Safe (2012) Action 6 Lee Pong 10
6 Safe House(2012) Action 1 Adam Smith 1
6 Safe House(2012) Action 2 Ravi Kumar 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 Kumar 2
7 GIA 18+ 3 Susan Davidson 5
7 GIA 18+ 4 Jenny Adrianna 8
7 GIA 18+ 6 Lee Pong 10
8 Deadline(2009) 18+ 1 Adam Smith 1
8 Deadline(2009) 18+ 2 Ravi Kumar 2
8 Deadline(2009) 18+ 3 Susan Davidson 5
8 Deadline(2009) 18+ 4 Jenny Adrianna 8
8 Deadline(2009) 18+ 6 Lee Pong 10
9 The Dirty Picture 18+ 1 Adam Smith 1
9 The Dirty Picture 18+ 2 Ravi Kumar 2
9 The Dirty Picture 18+ 3 Susan Davidson 5
9 The Dirty Picture 18+ 4 Jenny Adrianna 8
9 The Dirty Picture 18+ 6 Lee Pong 10
10 Marley and me Romance 1 Adam Smith 1
10 Marley and me Romance 2 Ravi Kumar 2
10 Marley and me Romance 3 Susan Davidson 5
10 Marley and me Romance 4 Jenny Adrianna 8
10 Marley and me Romance 6 Lee Pong 10

INNER JOIN

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

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

INNER JOIN

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

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

first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley 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

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

Внешние соединения

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

title first_name last_name
ASSASSIN'S CREED: EMBERS Adam Smith
Real Steel(2012) Ravi Kumar
Safe (2012) Susan Davidson
Deadline(2009) Jenny Adrianna
Marley and me Lee Pong
Alvin and the Chipmunks NULL NULL
The Adventures of Tin Tin NULL NULL
Safe House(2012) NULL NULL
GIA NULL NULL
The Dirty Picture NULL NULL
Note: Null is returned for non-matching rows on right

ПРАВО ПРИСОЕДИНИТЬСЯ

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

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

ПРАВО ПРИСОЕДИНИТЬСЯ

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_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me
NULL NULL Alvin and the Chipmunks
NULL NULL The Adventures of Tin Tin
NULL NULL Safe House(2012)
NULL NULL GIA
NULL NULL The Dirty Picture
Note: Null is returned for non-matching rows on left

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

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

Предложение 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 и ИСПОЛЬЗОВАНИЕ с JOINами вы можете использовать многие другие MySQL такие пункты, как ГРУППИРОВАТЬ ПО, ГДЕ и даже такие функции, как SUM, AVG, и т.д.

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

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

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

Резюме

  • JOINS позволяют нам объединять данные из нескольких таблиц в один набор результатов.
  • JOINS имеют лучшую производительность по сравнению с подзапросами.
  • INNER JOINS возвращает только те строки, которые соответствуют заданным критериям.
  • OUTER JOINS также может возвращать строки, для которых совпадений не обнаружено. Несовпадающие строки возвращаются с ключевым словом NULL.
  • Основные типы JOIN включают Inner, Left Outer, Right Outer, Cross JOINS и т. д.
  • Часто используемое предложение в операциях JOIN — «ON». Предложение «USING» требует, чтобы соответствующие столбцы имели одно и то же имя.
  • JOINS также можно использовать в других предложениях, таких как GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS и т. д.