cursSQL Lectia6
cursSQL Lectia6
1
ele putând avea definit şi un alias, adică un nume mai scurt prin care pot fi accesate. Tipul de uniune care
returnează un produs cartezian se mai numeşte şi uniune încrucişată.
Nu există o limită în ceea ce priveşte numărul de tabele ce pot fi unite în cadrul unei instrucţiuni
SELECT. Aşadar, putem avea două sau oricât de multe tabele unite printr-o joncţiune. Însă, cu cât avem
mai multe tabele legate într-un join, iar tabelele sunt populate cu date numeroase, timpul de răspuns la o
anumită solicitare poate fi mai mare.
Referindu-ne acum la joncţiunile cu clauză WHERE, acestea se pot împărţi în următoarele tipuri
de join-uri:
• INNER JOIN – joncţiune naturală;
• OUTER JOIN – joncţiune externă;
• SELF JOIN – joncţiunea unei tabele cu ea însăşi.
6.4 INNER JOIN
Joncţiunea naturală (INNER JOIN) a două tabele reprezintă înregistrările din prima tabelă care au
corespondent în cea de-a doua tabelă. Deci, INNER JOIN reprezintă, de fapt, intersecţia valorilor din
cele două tabele. Dacă sunt linii (înregistrări) în prima tabelă care nu au corespondent în cealaltă, ele nu
sunt extrase (selectate).
Uniunile de tip INNER JOIN se aplică atunci când uniunea se realizează între două tabele şi
dorim ca din ambele tabele să fie afişate doar acele linii pentru care condiţia de legătură este satisfăcută.
Sintaxa acestei comenzi este următoarea:
SELECT exp1, exp2 ... FROM tabela1 [AS alias1] INNER JOIN tabela2 [AS alias2]
ON condiţie;
Evident, dacă există coloane care se numesc la fel în ambele tabele, vom prefixa acele coloane cu numele
tabelei sau alias-ul tabelei din care face parte acea coloană (tabelă.coloană).
În acest tip de join, cuvântul cheie INNER poate fi omis, prin specificarea clauzei JOIN se
subînţelege că este vorba de o joncţiune de acest tip – INNER JOIN.
6.5 OUTER JOIN
Joncţiunile externe (OUTER JOIN) se împart în:
• LEFT OUTER JOIN;
• RIGHT OUTER JOIN.
Cele două tipuri de joncţiuni externe mai sunt denumite şi în forma prescurtată LEFT JOIN, respectiv,
RIGHT JOIN.
LEFT JOIN reprezintă toate înregistrările din tabela din partea stângă (prima tabelă) care au
corespondent sau nu în tabela din partea dreaptă (cea de-a doua tabelă). Altfel spus, este vorba de
înregistrările din prima tabelă care se regăsesc sau nu se regăsesc în cea de-a doua tabelă.
2
În termeni de teoria mulţimilor, considerând cele două tabele ca fiind două mulţimi A şi B, LEFT
JOIN între cele două tabele (A şi B) reprezintă (A \ B) U (A ∩ B). Deci, LEFT JOIN reprezintă
rezultatul diferenţei dintre cele două mulţimi reunit cu rezultatul intersecţiei celor două mulţimi.
În mod similar, RIGHT JOIN reprezintă toate înregistrările din tabela din partea dreaptă (a doua
tabelă) care au corespondent sau nu în tabela din partea stângă (prima tabelă).
Cu alte cuvinte, RIGHT JOIN returnează acelaşi rezultat, cu deosebirea că se vor extrage
înregistrările din a doua tabelă care au sau nu înregistrări în prima. Este, practic, reciproca joncţiunii
LEFT JOIN.
RIGHT JOIN este mult mai puţin folosită deoarece se poate transforma foarte simplu într-un
LEFT JOIN prin schimbarea ordinii celor două tabele. De aceea, forma cea mai utilizată a joncţiunilor
externe este LEFT JOIN.
Uniunile de tip LEFT OUTER JOIN se aplică atunci când uniunea se realizează între două tabele
şi dorim ca din prima tabelă să fie incluse absolut toate liniile iar din a doua tabelă doar acele linii care
îndeplinesc condiţia specificată la clauza ON. La acele linii din prima tabelă care nu au corespondent în a
doua tabelă, în dreptul câmpurilor acesteia din urmă se va trece valoarea NULL.
Sintaxa instrucţiunii pentru LEFT OUTER JOIN este următoarea:
SELECT exp1, exp2 ... FROM tabela1 [AS alias1] LEFT OUTER JOIN tabela2 [AS alias2]
ON condiţie;
Uniunile de tip RIGHT OUTER JOIN sunt similare cu cele de tip LEFT OUTER JOIN. După
cum e de aşteptat, prin analogie cu situaţia precedentă, se aplică atunci când uniunea se realizează între
două tabele şi dorim ca din a doua tabelă să fie incluse absolut toate liniile, iar din prima doar acele linii
pentru care condiţia de la clauza ON este îndeplinită. La acele linii din a doua tabelă care nu au
corespondent în prima tabelă, în dreptul câmpurilor acesteia din urmă se va trece valoarea NULL.
Sintaxa instrucţiunii pentru RIGHT OUTER JOIN este următoarea:
SELECT exp1, exp2 ... FROM tabela1 [AS alias1] RIGHT OUTER JOIN tabela2 [AS alias2]
ON condiţie;
6.6 SELF JOIN
SELF JOIN sau joncţiunea unei tabele cu ea însăşi este utilizată pentru a se uni o tabelă tot cu ea
în scopul extragerii anumitor date. În acest sens tabela este redenumită temporar în cadrul instrucţiunii
care realizează SELF JOIN-ul. SELF JOIN mai poartă numele de auto-uniuni, pentru că o tabelă se
leagă tot cu ea prin acest tip de joncţiune.
Auto-uniunile reprezintă faptul că se pot face uniuni în care ambele tabele sunt, de fapt, una şi
aceaşi tabelă, însă au alias-uri diferite şi se consideră unite printr-o coloană.
6.7 Crearea de join-uri utilizând clauza USING
Clauza USING permite ca o condiţie să fie pusă pe o singură coloană. Pentru a folosi această
clauză este necesar să se numească la fel coloana în ambele tabele.
3
Sintaxa generală cu clauza USING este următoarea:
SELECT tabela1.coloana, tabela2.coloana, FROM tabela1 JOIN tabela2
USING (nume_coloana);
6.8 Crearea de join-uri utilizând clauza ON
Clauza ON este folosită pentru a specifica condiţii arbitrare sau coloanele care participă la JOIN.
Condiţia de join este separată de celelalte condţii de căutare. De altfel, această clauză ON a fost introdusă
în sintaxa comenzilor de join prezentate la punctele anterioare.
6.9 Alias-uri
Pentru tabelele care alcătuiesc uniunea se pot stabili alias-uri de nume, sub forma nume_tabelă as
alias_nume, introduse în clauza FROM a instrucţiunii SELECT. Alias-urile pot fi utilizate în orice parte
a instrucţiunii SELECT. Adresarea unei coloane a unei tabele se va face, atunci când tabela are un alias,
sub forma nume_alias.nume_coloană. Este recomandat să asigurăm nume scurte pentru alias-urile
tabelelor. Un alt avantaj al alias-urilor este că putem realiza auto-uniuni, în cadrul cărora aceeaşi tabelă
poate avea alias-uri diferite. Acest aspect l-am explicat şi când am prezentat SELF JOIN. Utilizarea unui
alias duce şi la o scurtare a sintaxei SQL într-o comandă.
Pe lângă alias-urile pentru tabele se mai pot folosi alias-uri şi pentru coloanele unei tabele, dar şi
pentru câmpuri cu valoare calculată sau pentru câmpuri rezultate prin aplicarea unei funcţii de agregare.
Sintaxa unei instrucţiuni de selecţie din mai multe tabele este următoarea:
SELECT exp1, exp2 ... FROM tabelă1 [AS alias1], tabelă2 [AS alias2]
[WHERE condiţii];
Expresiile din interogarea SELECT, exp1, exp2, ... vor trebui să conţină numele coloanelor din
tabele, dacă nu există confuzii (coloane care au în ambele tabele acelaşi nume) sau numele alias-urilor
acelor coloane urmate de caracterul „.” (punct) şi de numele coloanelor, în caz contrar, adică în caz că
există confuzii. O astfel de comandă, evident, poate fi generalizată şi pentru mai mult de două tabele.
6.10 Reuniuni
Majoritatea interogărilor conţin o singură instrucţiune SELECT, care returnează date din una sau
mai multe tabele. Dar este permisă şi efectuarea mai multor interogări şi returnarea rezultatelor sub forma
unui singur set de rezultate ale interogării. Aceste interogări combinate se numesc reuniuni sau interogări
compuse.
Interogările SQL se combină folosind operatorul UNION. Prin utilizarea acestui operator se pot
specifica instrucţiuni SELECT multiple iar rezultatele lor pot fi combinate într-un singur set de rezultate.
O reuniune trebuie să fie alcătuită din două sau mai multe instrucţiuni SELECT, separate prin
cuvântul cheie UNION.
Fiecare instrucţiune SELECT trebuie să conţină acelaşi număr de coloane, expresii sau funcţii
agregat, dar nu contează ordinea în care sunt specificate coloanele. Coloanele din instrucţiunile SELECT
trebuie să abiă tipuri de date compatibile.
4
Operatorul UNION elimină în mod automat toate rândurile duplicate din setul de rezultate al
interogării. Deci, dacă sunt înregistrări returnate de mai multe instrucţiuni SELECT dintr-o reuniune, este
afişată o singură dată această înregistrare.
Sintaxa unei instrucţiuni în care se realizează o reuniune a datelor din două tabele prin utilizarea
operatorului UNION este următoarea:
SELECT nume_coloană1, nume_coloană2, ... FROM tabela1 [WHERE condiţii]
UNION
SELECT nume_coloană1, nume_coloană2, ... FROM tabela2 [WHERE condiţii];
Pentru ordonarea rezultatelor obţinute în urma efectuării unei reuniuni, clauza ORDER BY se
trece la final, după ultima instrucţiune SELECT.
Reluăm sintaxa instrucţiunii anterioare, adăugând şi clauza ORDER BY:
SELECT nume_coloană1, nume_coloană2, ... FROM tabela1 [WHERE condiţii]
UNION
SELECT nume_coloană1, nume_coloană2, ... FROM tabela2 [WHERE condiţii];
ORDER BY nume_coloană;
În această lecţie am abordat noţiunile de joncţiune sau uniune de tabele şi reuniune. Am
prezentat tipurile de joncţiuni (join-uri) care se pot întâlni în MySQL, şi, de asemenea am discutat despre
unirea interogărilor folosind operatorul UNION.
Aşadar, începând cu această lecţie am început să expunem lucruri mai complexe din domeniul
bazelor de date. Lecţia următoare continuă să abordeze teme cu o complexitate mai mare, şi anume, vom
prezenta subinterogările în MySQL, şi vom introduce termenul de tabelă virtuală (vedere, view) şi
vom prezenta modul în care sunt definite aceste tabele virtuale.