Що таке ПРИЄДНАННЯ?
Об’єднання допомагають отримувати дані з двох або більше таблиць баз даних. Таблиці взаємопов’язані за допомогою первинного та зовнішнього ключів.Примітка: 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 |
ПРАВИЛЬНЕ ПРИЄДНАННЯ
ПРАВО ПРИЄДНАННЯ - це, очевидно, протилежність ЛІВОМУ ПРИЄДНАННЮ. 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 |
Речення "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 тощо.