Ce sunt JOINS?
Alăturările ajută la recuperarea datelor din două sau mai multe tabele de baze de date. Tabelele sunt legate reciproc folosind chei primare și străine.Notă: ÎNSCRIEREA este subiectul cel mai neînțeles dintre cei mai slabi SQL. Din motive de simplitate și ușurință în înțelegere, vom folosi o nouă bază de date pentru a practica eșantionul. Așa cum se arată mai jos
id | Nume | numele de familie | film_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
id | titlu | categorie |
---|---|---|
1 | CREATUL ASASINATULUI: EMBERS | Animații |
2 | Real Steel (2012) | Animații |
3 | Alvin și veverițele | Animații |
4 | Aventurile Tin Tin | Animații |
5 | Safe (2012) | Acțiune |
6 | Safe House (2012) | Acțiune |
7 | GIA | Peste 18 ani |
8 | Termen limită 2009 | Peste 18 ani |
9 | Imaginea murdară | Peste 18 ani |
10 | Marley și cu mine | Romantism |
Tipuri de îmbinări
Crucea ÎNSCRIEȚI-VĂ
Cross JOIN este o formă simplă de JOIN-uri care se potrivește cu fiecare rând dintr-un tabel de bază de date cu toate rândurile altui.
Cu alte cuvinte, ne oferă combinații ale fiecărui rând al primului tabel cu toate înregistrările din al doilea tabel.
Să presupunem că dorim să obținem toate înregistrările membrilor împotriva tuturor înregistrărilor filmelor, putem folosi scriptul prezentat mai jos pentru a obține rezultatele dorite.
SELECT * FROM `movies` CROSS JOIN `members`
Executarea scriptului de mai sus în MySQL workbench ne oferă următoarele 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 |
INTERIOR ÎNSCRIEȚI-VĂ
JOIN-ul interior este utilizat pentru a returna rânduri din ambele tabele care îndeplinesc condiția dată.
Să presupunem că doriți să obțineți lista membrilor care au închiriat filme împreună cu titluri de filme închiriate de aceștia. Puteți utiliza pur și simplu un INNER JOIN pentru asta, care returnează rânduri de pe ambele tabele care îndeplinesc condițiile date.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Executarea scriptului de mai sus dă
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 |
Rețineți că scriptul de rezultate de mai sus poate fi scris și după cum urmează pentru a obține aceleași rezultate.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
JOIN-uri exterioare
MySQL Outer JOIN returnează toate înregistrările care se potrivesc din ambele tabele.
Poate detecta înregistrări care nu au nicio potrivire în tabelul alăturat. Întoarce valori NULL pentru înregistrările tabelului unit dacă nu se găsește nicio potrivire.
Sună confuz? Să analizăm un exemplu -
ÎNREGISTRARE STÂNGA
Să presupunem că acum doriți să obțineți titluri ale tuturor filmelor împreună cu numele membrilor care le-au închiriat. Este clar că unele filme nu au fost închiriate de nimeni. Putem pur și simplu să folosim LEFT JOIN în acest scop.
ÎNREGISTRAREA STÂNGA returnează toate rândurile din tabelul din stânga, chiar dacă nu au fost găsite rânduri potrivite în tabelul din dreapta. În cazul în care nu au fost găsite potriviri în tabelul din dreapta, NULL este returnat.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Executarea scriptului de mai sus în MySQL workbench oferă. Puteți vedea că în rezultatul returnat, care este listat mai jos, pentru filmele care nu sunt închiriate, câmpurile de nume de membru au valori NULL. Asta înseamnă că niciun membru potrivit nu a găsit tabelul membrilor pentru filmul respectiv.
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 |
ÎNREGISTRARE DREPTĂ
ÎNREGISTRAREA DREAPTĂ este în mod evident opusul ÎNREGISTRARII ÎN STÂNGA RIGHT JOIN returnează toate coloanele din tabelul din dreapta, chiar dacă nu au fost găsite rânduri potrivite în tabelul din stânga. În cazul în care nu au fost găsite potriviri în tabelul din stânga, NULL este returnat.
În exemplul nostru, să presupunem că trebuie să obțineți numele membrilor și filmele închiriate de aceștia. Acum avem un nou membru care nu a închiriat încă niciun film
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Executarea scriptului de mai sus în MySQL workbench dă următoarele 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 |
Clauzele „ON” și „USING”
În exemplele de interogare JOIN de mai sus, am folosit clauza ON pentru a potrivi înregistrările dintre tabel.
Clauza USING poate fi utilizată și în același scop. Diferența cu USING este că trebuie să aibă nume identice pentru coloanele potrivite în ambele tabele.
Până în prezent, în tabelul „filme” am folosit cheia sa principală cu numele „id”. Ne-am referit la același lucru în tabelul „membri” cu numele „movie_id”.
Să redenumim tabelele „filme” câmpul „id” pentru a avea numele „film_id”. Facem acest lucru pentru a avea nume de câmpuri identice.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
În continuare, să folosim UTILIZARE cu exemplul de ÎNREGISTRARE STÂNGA de mai sus.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
În afară de utilizarea ON și UTILIZAREA cu JOIN-uri, puteți utiliza multe alte clauze MySQL precum GROUP BY, WHERE și chiar funcții precum SUM , AVG etc.
De ce ar trebui să folosim îmbinările?
Acum vă puteți gândi, de ce folosim JOIN-uri atunci când putem face aceeași sarcină executând interogări. Mai ales dacă aveți o anumită experiență în programarea bazelor de date, știți că putem rula interogări una câte una, folosiți ieșirea fiecăruia în interogări succesive. Desigur, acest lucru este posibil. Dar folosind JOIN-uri, puteți efectua munca utilizând o singură interogare cu parametrii de căutare. Pe de altă parte, MySQL poate obține performanțe mai bune cu JOIN-uri, deoarece poate utiliza indexarea. Pur și simplu utilizarea unei singure interogări JOIN în loc de a rula mai multe interogări reduce cheltuielile generale ale serverului. Folosind mai multe interogări care conduc mai multe transferuri de date între MySQL și aplicații (software). În plus, necesită mai multe manipulări de date și la sfârșitul aplicației.
Este clar că putem obține performanțe mai bune MySQL și aplicații prin utilizarea JOIN-urilor.
rezumat
- JOINS ne permite să combinăm date din mai multe tabele într-un singur set de rezultate.
- JOINS au performanțe mai bune comparativ cu interogările secundare
- INNER JOINS returnează numai rândurile care îndeplinesc criteriile date.
- JOINERILE EXTERNE pot, de asemenea, să returneze rânduri în care nu au fost găsite potriviri. Rândurile neegalate sunt returnate cu cuvântul cheie NULL.
- Principalele tipuri de JOIN includ interiorul, stânga exterioară, dreapta exterioară, încrucișarea etc.
- Clauza frecvent utilizată în operațiile JOIN este „ACTIVATĂ”. Clauza „UTILIZARE” necesită ca coloanele potrivite să aibă același nume.
- JOINS poate fi utilizat și în alte clauze, cum ar fi GROUP BY, WHERE, SUB QUERIES, FUNCȚII AGREGATE etc.