MySQL Tutorial JOINS: INTERIOR, EXTERIOR, STÂNGA, DREAPTA, CRUCE

Ce sunt JOINS?

Unirile ajută la preluarea datelor din două sau mai multe tabele de baze de date.

Tabelele sunt legate între ele folosind chei primare și străine.

Notă: JOIN este subiectul cel mai greșit înțeles în rândul celor care leans SQL. Pentru simplitate și ușurință de înțelegere, vom folosi o nouă bază de date pentru a exersa eșantion. Așa cum se arată mai jos

id Nume Numele de familie movie_id
1 Adam Fierar 1
2 Ravi Kumar 2
3 Susan Davidson 5
4 Jenny Adrianna 8
5 Sub vânt Pong 10
id titlu categorie
1 ASSASSIN'S CREED: EMBERS Animații
2 Oțel real (2012) Animații
3 Alvin şi veveriţele Animații
4 Aventurile lui Tin Tin Animații
5 Sigur (2012) Acțiune
6 Casă sigură (2012) Acțiune
7 GIA 18+
8 Termen limită 2009 18+
9 Poza murdară 18+
10 Marley și cu mine Romantism

Tipuri de îmbinări

Cross JOIN

Cross JOIN este cea mai simplă formă de JOIN care potrivește fiecare rând dintr-un tabel de bază de date cu toate rândurile altuia.

Cu alte cuvinte, ne oferă combinații ale fiecărui rând din primul tabel cu toate înregistrările din al doilea tabel.

Să presupunem că vrem să obținem toate înregistrările membrilor față de toate înregistrările filmului, putem folosi scriptul prezentat mai jos pentru a obține rezultatele dorite.

Tipuri de îmbinări

SELECT * FROM `movies` CROSS JOIN `members`

Executarea scriptului de mai sus în MySQL banc de lucru 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

INNER JOIN

JOIN interior este folosit pentru a returna rânduri din ambele tabele care satisfac condiția dată.

Să presupunem că doriți să obțineți o listă cu membrii care au închiriat filme împreună cu titlurile filmelor închiriate de aceștia. Puteți utiliza pur și simplu un INNER JOIN pentru asta, care returnează rânduri din ambele tabele care îndeplinesc condițiile date.

INNER JOIN

SELECT members.`first_name` , members.`last_name` , movies.`title`
FROM members ,movies
WHERE movies.`id` = members.`movie_id`

Executarea scriptului de mai sus 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

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 A
INNER JOIN `movies` AS B
ON B.`id` = A.`movie_id`

JOIN-urile exterioare

MySQL JOIN-urile externe returnează toate înregistrările care se potrivesc din ambele tabele.

Poate detecta înregistrările care nu au nicio potrivire în tabelul alăturat. Se întoarce NULL valori pentru înregistrările tabelului îmbinat dacă nu se găsește nicio potrivire.

Sună confuz? Să ne uităm la un exemplu -

REDUCEREA LOCULUI

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 folosi pur și simplu REDUCEREA LOCULUI pentru scopul.

JOIN-urile exterioare

LEFT JOIN returnează toate rândurile din tabelul din stânga chiar dacă nu au fost găsite rânduri care să se potrivească în tabelul din dreapta. Acolo unde nu au fost găsite potriviri în tabelul din dreapta, este returnat NULL.

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
ON B.`movie_id` = A.`id`

Executarea scriptului de mai sus în MySQL Workbench dă. Puteți vedea că în rezultatul returnat, care este listat mai jos, pentru filmele care nu sunt închiriate, câmpurile pentru numele membrilor au valori NULL. Asta înseamnă că niciun membru care se potrivește nu a găsit tabelul de membri pentru acel film anume.

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
Note: Null is returned for non-matching rows on right

ÎNSCRIEȚI DREPT

RIGHT JOIN este, evident, opusul LEFT JOIN. RIGHT JOIN returnează toate coloanele din tabelul din dreapta, chiar dacă nu au fost găsite rânduri care să se potrivească în tabelul din stânga. Acolo unde nu au fost găsite potriviri în tabelul din stânga, este returnat NULL.

Î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

ÎNSCRIEȚI DREPT

SELECT  A.`first_name` , A.`last_name`, B.`title`
FROM `members` AS A
RIGHT JOIN `movies` AS B
ON 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
Note: Null is returned for non-matching rows on left

Clauzele „ON” și „UTILIZARE”.

În exemplele de interogare JOIN de mai sus, am folosit clauza ON pentru a potrivi înregistrările dintre tabel.

Clauza USING poate fi folosită și în același scop. Diferența cu UTILIZAREA este trebuie să aibă nume identice pentru coloanele potrivite din ambele tabele.

În tabelul „filme” am folosit până acum cheia primară cu numele „id”. Ne-am referit la aceeași în tabelul „membri” cu numele „movie_id”.

Să redenumim tabelele „filme” câmpul „id” pentru a avea numele „movie_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 mai sus LEFT JOIN.

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
USING ( `movie_id` )

În afară de utilizarea ON si UTILIZARE cu JOIN-uri poti folosi multe altele MySQL clauze ca GROUP BY, UNDE și chiar funcții precum USM, AVG, Etc

De ce ar trebui să folosim uniuni?

Acum vă puteți gândi de ce folosim JOIN-urile când putem face aceeași sarcină rulând interogări. Mai ales dacă aveți ceva experiență în programarea bazelor de date, știți că putem rula interogări una câte una, folosiți rezultatul fiecăreia în interogări succesive. Desigur, asta este posibil. Dar folosind JOIN-uri, puteți finaliza munca folosind o singură interogare cu orice parametri de căutare. Pe de altă parte MySQL poate obține performanțe mai bune cu JOIN-uri, deoarece poate folosi indexarea. Simpla utilizare a unei singure interogări JOIN, în loc de rularea mai multor interogări, reduce supraîncărcarea serverului. Folosind mai multe interogări în schimb, care duce la mai multe transferuri de date între MySQL și aplicații (software). Mai mult, necesită mai multe manipulări de date și în aplicația.

Este clar că putem realiza mai bine MySQL și performanța aplicației prin utilizarea JOIN-urilor.

Rezumat

  • JOINS ne permit să combinăm datele din mai mult de un tabel într-un singur set de rezultate.
  • JOINS au performanțe mai bune în comparație cu interogările secundare
  • INNER JOINS returnează numai rândurile care îndeplinesc criteriile date.
  • OUTER JOINS poate returna și rânduri în care nu au fost găsite potriviri. Rândurile nepotrivite sunt returnate cu cuvântul cheie NULL.
  • Principalele tipuri de JOIN includ Inner, Left Outer, Right Outer, Cross JOINS etc.
  • Clauza folosită frecvent în operațiunile JOIN este „ON”. Clauza „USING” necesită ca coloanele care se potrivesc să aibă același nume.
  • JOINS poate fi folosit și în alte clauze precum GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS etc.