Підручник з MySQL JOINS: INNER, OUTER, LEFT, RIGHT, CROSS

Anonim

Що таке ПРИЄДНАННЯ?

Об’єднання допомагають отримувати дані з двох або більше таблиць баз даних. Таблиці взаємопов’язані за допомогою первинного та зовнішнього ключів.

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

ідентифікатор ім'я прізвище movie_id
1 Адам Сміт 1
2 Раві Кумар 2
3 Сьюзен Девідсон 5
4 Дженні Адріанна 8
6 Лі Понг 10
ідентифікатор заголовок категорії
1 КРЕЙ АССАСИНА: ОГОНИ Анімація
2 Справжня сталь (2012) Анімація
3 Елвін і бурундуки Анімація
4 Пригоди олова олова Анімація
5 Безпечний (2012) Дія
6 Безпечний дім (2012) Дія
7 ГІА 18+
8 Дедлайн 2009 18+
9 Брудна картина 18+
10 Ми з Марлі Романтика

Типи об’єднань

Перехресне ПРИЄДНАННЯ

Cross JOIN - це найпростіша форма 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

ВНУТРІШНЄ З'ЄДНАННЯ

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

Припустимо, ви хочете отримати список учасників, які взяли в оренду фільми, разом із назвами фільмів, орендованих ними. Для цього ви можете просто використати ВНУТРІШНЄ СПІЛКУВАННЯ, яке повертає рядки з обох таблиць, які відповідають заданим умовам.

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

Виконання вищезазначеного сценарію give

 
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 AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`

Зовнішні ПРИЄДНАННЯ

MySQL Outer JOIN повертає всі записи, що збігаються з обох таблиць.

Він може виявити записи, які не мають збігів у об’єднаній таблиці. Він повертає значення NULL для записів об’єднаної таблиці, якщо збіг не знайдено.

Звучить заплутано? Давайте розглянемо приклад -

ЛІВО ПРИЄДНАЙТЕСЬ

Припустимо, зараз ви хочете отримати назви всіх фільмів разом з іменами учасників, які їх взяли в оренду. Зрозуміло, що деякі фільми ніхто не брав у прокат. Для цього ми можемо просто використати LEFT JOIN .

LEFT JOIN повертає всі рядки з таблиці зліва, навіть якщо в таблиці справа не знайдено відповідних рядків. Якщо в таблиці справа не знайдено збігів, повертається NULL.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON 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 повертає всі стовпці з таблиці праворуч, навіть якщо в таблиці зліва не знайдено відповідних рядків. Якщо в таблиці зліва не знайдено збігів, повертається NULL.

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

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

Виконання вищезазначеного сценарію в робочому середовищі MySQL дає такі результати.

 
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 також може бути використано з тією ж метою. Відмінність від USING полягає в тому, що в обох таблицях потрібно мати однакові назви відповідних стовпців.

До цього часу в таблиці "фільми" ми використовували його первинний ключ з назвою "id". Ми згадували те саме в таблиці "members" з назвою "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 ALEFT JOIN `members` AS BUSING ( `movie_id` )

Окрім використання ON та USING з JOINs, ви можете використовувати багато інших речень MySQL, таких як GROUP BY, WHERE і навіть такі функції, як SUM , AVG тощо.

Чому ми повинні використовувати об'єднання?

Тепер ви можете подумати, чому ми використовуємо JOIN, коли ми можемо виконувати одне і те ж завдання, виконуючи запити. Особливо, якщо у вас є якийсь досвід у програмуванні баз даних, ви знаєте, що ми можемо запускати запити по одному, використовуйте результати кожного з послідовних запитів. Звичайно, це можливо. Але, використовуючи JOIN, ви можете виконати роботу, використовуючи лише один запит з будь-якими параметрами пошуку. З іншого боку, MySQL може досягти кращої продуктивності за допомогою JOIN, оскільки може використовувати індексування. Просто використання одного запиту 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, AGREGATE FUNCTIONS тощо.