Kaj so PRIDRUŽITVE?
Združevanja pomagajo pri pridobivanju podatkov iz dveh ali več tabel zbirke podatkov. Tabele so medsebojno povezane s pomočjo primarnih in tujih ključev.Opomba: JOIN je med napačnimi SQL najbolj napačno razumljena tema. Zaradi poenostavitve in lažjega razumevanja bomo za vadbo vzorca uporabili novo zbirko podatkov. Kot je prikazano spodaj
id | ime | priimek | movie_id |
---|---|---|---|
1. | Adam | Smith | 1. |
2. | Ravi | Kumar | 2. |
3. | Susan | Davidson | 5. |
4. | Jenny | Adrianna | 8. |
6. | Lee | Pong | 10. |
id | naslov | kategoriji |
---|---|---|
1. | UBOJNIČKI KRED: EMBERS | Animacije |
2. | Real Steel (2012) | Animacije |
3. | Alvin in veverice | Animacije |
4. | Pustolovščine kositra | Animacije |
5. | Varna (2012) | Ukrepanje |
6. | Varna hiša (2012) | Ukrepanje |
7. | GIA | 18+ |
8. | Rok 2009 | 18+ |
9. | Umazana slika | 18+ |
10. | Marley in jaz | Ljubezen |
Vrste pridružitev
Cross PRIDRUŽI
Cross JOIN je najpreprostejša oblika JOIN-ov, ki se ujema z vsako vrstico iz ene tabele baze podatkov v vse vrstice druge.
Z drugimi besedami, daje nam kombinacije vsake vrstice prve tabele z vsemi zapisi v drugi tabeli.
Recimo, da želimo pridobiti vse zapise članov glede vseh zapisov filma, lahko uporabimo spodnji skript, da dobimo želene rezultate.
SELECT * FROM `movies` CROSS JOIN `members`
Izvedba zgornjega skripta v delovnem okolju MySQL nam da naslednje rezultate.
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
Notranji JOIN se uporablja za vrnitev vrstic iz obeh tabel, ki izpolnjujejo dani pogoj.
Recimo, da želite dobiti seznam članov, ki so najeli filme, skupaj z naslovi filmov, ki so jih najeli sami. Za to lahko preprosto uporabite INNER JOIN, ki vrne vrstice iz obeh tabel, ki izpolnjujejo dane pogoje.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Izvajanje zgornjega skripta da
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 |
Upoštevajte, da lahko zgornje skripte rezultatov zapišete na naslednji način, da dosežete enake rezultate.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Zunanji JOIN-i
MySQL Outer JOINs vrne vse zapise, ki se ujemajo iz obeh tabel.
V združeni tabeli lahko zazna zapise, ki se ne ujemajo. Vrne NULL vrednosti za zapise združene tabele, če ni bilo mogoče najti nobenega ujemanja.
Zveni zmedeno? Poglejmo si primer -
LEVO PRIDRUŽITE
Predpostavimo, da želite zdaj dobiti naslove vseh filmov skupaj z imeni članov, ki so jih najeli. Jasno je, da nekaterih filmov ni nihče izposodil. Za ta namen lahko preprosto uporabimo LEFT JOIN .
LEFT JOIN vrne vse vrstice iz tabele na levi, tudi če v tabeli na desni ni bilo najdenih ustreznih vrstic. Če v tabeli na desni ni bilo najdenih nobenih zadetkov, se vrne NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Izvedba zgornjega skripta v delovnem okolju MySQL daje. Vidite lahko, da imajo v vrnjenem rezultatu, ki je spodaj naveden, da polja za filme, ki niso izposojeni, vrednosti NULL. To pomeni, da noben ujemajoč se član ni našel tabele članov za ta film.
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 |
PRAVO PRIDRUŽI
PRAVO PRIDRUŽITEV je očitno nasprotje LEVEGA PRIDRUŽITEV. DESNO PRIDRUŽITEV vrne vse stolpce iz tabele na desni, tudi če v tabeli na levi ni bilo najdenih ustreznih vrstic. Če v tabeli na levi strani ni bilo najdenih zadetkov, se vrne NULL.
V našem primeru predpostavimo, da morate dobiti imena članov in filme, ki jih najamejo. Zdaj imamo novega člana, ki še ni najel nobenega filma
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Izvedba zgornjega skripta v delovnem okolju MySQL daje naslednje rezultate.
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 |
Klavzuli "ON" in "USING"
V zgornjih primerih poizvedbe JOIN smo za ujemanje zapisov med tabelo uporabili stavek ON.
V isti namen se lahko uporablja tudi klavzula USING. Razlika pri UPORABI je v tem, da morata biti v obeh tabelah enaka imena za ujemajoče se stolpce.
Do zdaj smo v tabeli "filmi" uporabljali njen primarni ključ z imenom "id". Na to smo se sklicevali v tabeli "members" z imenom "movie_id".
Preimenujmo polje "tabele" filmov v "id", da bo ime "film_id". To naredimo, da imamo enaka imena polj.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Nato uporabimo USING z zgornjim primerom LEVO JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Poleg uporabe VKLOP in UPORABE s JOIN-i lahko uporabite tudi številne druge klavzule MySQL, kot so GROUP BY, WHERE in celo funkcije, kot so SUM , AVG itd.
Zakaj bi morali uporabiti pridružitve?
Zdaj si morda mislite, zakaj uporabljamo JOIN-e, ko lahko izvajamo iste naloge pri izvajanju poizvedb. Še posebej, če imate nekaj izkušenj s programiranjem baz podatkov, veste, da lahko poizvedbe izvajamo eno za drugo, v zaporednih poizvedbah uporabite izhodne podatke vsake. Seveda je to mogoče. Toda z uporabo JOIN-ov lahko opravite delo z uporabo samo ene poizvedbe s poljubnimi iskalnimi parametri. Po drugi strani pa lahko MySQL z JOIN-i doseže boljše rezultate, saj lahko uporablja indeksiranje. Preprosta uporaba enojne poizvedbe JOIN namesto izvajanja več poizvedb zmanjša stroške strežnika. Namesto tega uporabite več poizvedb, ki vodijo do več prenosov podatkov med MySQL in aplikacijami (programska oprema). Poleg tega zahteva več manipulacij s podatki tudi na koncu aplikacije.
Jasno je, da lahko z uporabo JOIN-ov dosežemo boljše zmogljivosti MySQL in aplikacij.
Povzetek
- JOINS nam omogočajo združitev podatkov iz več tabel v en nabor rezultatov.
- JOINS imajo boljšo zmogljivost v primerjavi s podpoizvedbami
- INNER JOINS vrne samo vrstice, ki izpolnjujejo dane kriterije.
- ZUNANJI PRIDRUŽITVE lahko vrnejo tudi vrstice, kjer ni bilo mogoče najti nobenega ujemanja. Vrstice, ki se ne ujemajo, se vrnejo s ključno besedo NULL.
- Glavne vrste JOIN vključujejo Notranji, Levi Zunanji, Desni Zunanji, Prečni PRIKLOPKI itd.
- Pogosto uporabljena klavzula v JOIN operacijah je "ON". Klavzula "USING" zahteva, da so ujemajoči se stolpci z istim imenom.
- JOINS se lahko uporablja tudi v drugih klavzulah, kot so GROUP BY, WHERE, SUB QUERIES, AGREGATE FUNCTIONS itd.