Какво представляват JOINS?
Обединенията помагат за извличане на данни от две или повече таблици на базата данни. Таблиците са взаимно свързани с помощта на първични и външни ключове.Забележка: JOIN е най-неразбраната тема сред SQL обектите. За простота и лекота на разбиране ще използваме нова база данни за упражняване на извадка. Както е показано по-долу
документ за самоличност | първо име | фамилия | movie_id |
---|---|---|---|
1 | Адам | Смит | 1 |
2 | Рави | Кумар | 2 |
3 | Сюзън | Дейвидсън | 5 |
4 | Джени | Адриана | 8 |
6 | Лий | Понг | 10 |
документ за самоличност | заглавие | категория |
---|---|---|
1 | КРЕД НА УБИЙЦА: ЕМБЕРИ | Анимации |
2 | Истинска стомана (2012) | Анимации |
3 | Алвин и Бурундуците | Анимации |
4 | Приключенията на Tin Tin | Анимации |
5 | Безопасно (2012) | Действие |
6 | Безопасна къща (2012) | Действие |
7 | GIA | 18+ |
8 | Краен срок 2009 | 18+ |
9 | Мръсната картина | 18+ |
10 | Марли и аз | Романтика |
Видове съединения
КРЪСТ ПРИСЪЕДИНЕТЕ
Cross JOIN е най-простата форма на JOIN, която съвпада с всеки ред от една таблица на базата данни с всички редове на друга.
С други думи, той ни дава комбинации от всеки ред от първата таблица с всички записи във втората таблица.
Да предположим, че искаме да получим всички записи на членове спрямо всички записи на филми, можем да използваме скрипта, показан по-долу, за да получим желаните резултати.
SELECT * FROM `movies` CROSS JOIN `members`
Изпълнението на горния скрипт в MySQL workbench ни дава следните резултати.
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 се използва за връщане на редове от двете таблици, които отговарят на даденото условие.
Да предположим, че искате да получите списък на членовете, които са наели филми, заедно със заглавия на филми, наети от тях. Можете просто да използвате INNER 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 JOINs връщат всички записи, съвпадащи от двете таблици.
Той може да открие записи, които нямат съвпадение в обединената таблица. Той връща 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 |
ПРАВИЛНО ПРИСЪЕДИНЯВАНЕ
НАДЯСНОТО ПРИСЪЕДИНЯВАНЕ очевидно е обратното на ЛЯВОТО ПРИСЪЕДИНЯВАНЕ. НАДЯСНОТО ПРИСЪЕДИНЯВАНЕ връща всички колони от таблицата вдясно, дори ако в таблицата отляво не са намерени съответстващи редове. Когато в таблицата вляво не са намерени съвпадения, се връща NULL.
В нашия пример, нека приемем, че трябва да получите имена на членове и филми, наети от тях. Сега имаме нов член, който все още не е наел нито един филм
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON 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 |
Клаузи "ON" и "USING"
В горните примери за заявки JOIN използвахме клауза ON за съвпадение на записите между таблицата.
Клаузата USING също може да се използва за същата цел. Разликата с ИЗПОЛЗВАНЕ е, че трябва да има еднакви имена за съвпадащи колони в двете таблици.
Досега в таблицата „филми“ използвахме нейния първичен ключ с името „id“. Посочихме същото в таблицата "members" с името "movie_id".
Нека преименуваме полето "id" таблици "филми", за да има името "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 и др.
Защо трябва да използваме съединения?
Сега може би си мислите, защо използваме JOINs, когато можем да изпълним една и съща задача, изпълнявайки заявки. Особено ако имате известен опит в програмирането на бази данни, знаете, че можем да изпълняваме заявки една по една, използвайте изхода на всяка в последователни заявки. Разбира се, това е възможно. Но използвайки JOINs, можете да свършите работата, като използвате само една заявка с всякакви параметри на търсене. От друга страна MySQL може да постигне по-добра производителност с JOINs, тъй като може да използва индексиране. Просто използването на единична JOIN заявка, вместо да се изпълняват множество заявки, намалява режийните разходи на сървъра. Използването на множество заявки вместо това води до повече трансфери на данни между MySQL и приложения (софтуер). Освен това изисква повече манипулации с данни и в края на приложението.
Ясно е, че можем да постигнем по-добри MySQL и изпълнение на приложенията чрез използване на JOINs.
Обобщение
- 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 и др.