Шта су ПРИДРУЖИВАЊА?
Удруживање помаже у преузимању података из две или више табела базе података. Табеле су међусобно повезане помоћу примарног и страног кључа.Напомена: ЈОИН је најнеразумеванија тема међу СКЛ-има. Ради једноставности и лакоће разумевања, користићемо нову базу података за вежбање узорка. Како је приказано испод
ид | име | презиме | мовие_ид |
---|---|---|---|
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 | Марлеи и ја | Романса |
Врсте придруживања
Цросс ЈОИН
Цросс ЈОИН је најједноставнији облик ЈОИН-а који подудара сваки ред из једне табеле базе података са свим редовима другог.
Другим речима, даје нам комбинације сваког реда прве табеле са свим записима у другој табели.
Претпоставимо да желимо да добијемо све записе чланова у односу на све записе филмова, можемо користити скрипту приказану у наставку да бисмо добили жељене резултате.
SELECT * FROM `movies` CROSS JOIN `members`
Извршавање горње скрипте у МиСКЛ радном окружењу даје нам следеће резултате.
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 |
ИННЕР ЈОИН
Унутрашњи ЈОИН се користи за враћање редова из обе табеле који задовољавају задати услов.
Претпоставимо да желите да добијете списак чланова који су унајмили филмове заједно са насловима филмова које су они унајмили. За то можете једноставно користити ИННЕР ЈОИН, који враћа редове из обе табеле који задовољавају задате услове.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE 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 AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Спољни ПРИДРУЖЕНИ
МиСКЛ Оутер ЈОИНс враћају све записе који се подударају из обе табеле.
Може открити записе који се не подударају у спојеној табели. Враћа НУЛЛ вредности за записе спојене табеле ако није пронађено подударање.
Звучи збуњујуће? Погледајмо пример -
ЛЕВО ПРИДРУЖИТЕ
Претпоставимо да сада желите да добијете наслове свих филмова заједно са именима чланова који су их изнајмили. Јасно је да неке филмове нико није изнајмио. У ту сврху можемо једноставно да користимо ЛЕФТ ЈОИН .
ЛЕФТ ЈОИН враћа све редове из табеле са леве стране, чак и ако у табели с десне стране нису пронађени одговарајући редови. Ако у табели с десне стране није пронађено ниједно подударање, враћа се НУЛЛ.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Извршење горње скрипте у МиСКЛ воркбенцх-у даје. Можете видети да у враћеном резултату који је наведен у наставку, да за филмове који нису изнајмљени, поља имена чланова имају НУЛЛ вредности. То значи да ниједан подударни члан није пронашао табелу чланова за тај одређени филм.
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 |
ПРАВО ПРИДРУЖИТЕ
ПРАВО ПРИДРУЖИВАЊЕ је очигледно супротност ЛЕВОМ ПРИДРУЖЕЊУ. ДЕСНО ПРИДРУЖИВАЊЕ враћа све колоне из табеле с десне стране, чак и ако у табели с леве стране нису пронађени одговарајући редови. Ако у табели са леве стране није пронађено ниједно подударање, враћа се НУЛЛ.
У нашем примеру, претпоставимо да треба да пронађете имена чланова и филмове које су они унајмили. Сада имамо новог члана који још увек није изнајмио ниједан филм
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`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 |
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 |
Клаузуле „ОН“ и „УСИНГ“
У горњим примерима упита ЈОИН користили смо клаузулу ОН да бисмо ускладили записе између табеле.
Клаузула УСИНГ такође се може користити у исту сврху. Разлика са УСИНГ је у томе што у обе табеле треба да имају идентична имена за подударне колоне.
До сада смо у табели „филмови“ користили њен примарни кључ са именом „ид“. То смо навели у табели „мемберс“ са именом „мовие_ид“.
Преименујмо поље "табеле" филмова у "ид" да би добило име "мовие_ид". То радимо како бисмо имали идентична подударна имена поља.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Даље, употребимо УСИНГ са горњим примером ЛЕФТ ЈОИН.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Поред употребе ОН и УСИНГ са ЈОИНс , можете користити и многе друге МиСКЛ клаузуле попут ГРОУП БИ, ВХЕРЕ и чак функције попут СУМ , АВГ итд.
Зашто бисмо требали користити удруживања?
Сад можда мислите, зашто користимо ЈОИН-ове када можемо да радимо исти задатак покрећући упите. Нарочито ако имате неко искуство у програмирању база података, знате да можемо покретати упите један по један, користите излаз сваког у узастопним упитима. Наравно, то је могуће. Али помоћу ЈОИН-ова посао можете обавити користећи само један упит са било којим параметрима претраге. С друге стране, МиСКЛ може постићи боље перформансе са ЈОИН-овима јер може користити индексирање. Једноставна употреба једног ЈОИН упита уместо извођења више упита смањује режијске трошкове сервера. Уместо употребе више упита, што доводи до више преноса података између МиСКЛ-а и апликација (софтвера). Даље, потребно је више манипулација подацима и на крају апликације.
Јасно је да помоћу ЈОИН-ова можемо постићи боље перформансе МиСКЛ-а и апликација.
Резиме
- ЈОИНС нам омогућавају да комбинујемо податке из више табела у један скуп резултата.
- ЈОИНС имају боље перформансе у поређењу са подупитима
- ИННЕР ЈОИНС враћају само редове који испуњавају задате критеријуме.
- ОУТЕР ЈОИНС такође могу вратити редове у којима није пронађено подударање. Непоређени редови се враћају кључном речи НУЛЛ.
- Главни типови ЈОИН-а укључују Иннер, Лефт Оутер, Ригхт Оутер, Цросс ЈОИНС итд.
- Клаузула која се често користи у ЈОИН операцијама је "ОН". Клаузула „УСИНГ“ захтева да одговарајуће колоне буду истог имена.
- ЈОИНС се такође могу користити у другим клаузулама као што су ГРОУП БИ, ВХЕРЕ, СУБ КУЕРИЕС, АГРЕГАТЕ ФУНЦТИОНС итд.