Spájanie tabuliek
Väzby medzi tabuľkami používajú rôzne typy spojení. Typy spojení sa rozdeľujú do dvoch hlavných skupín:
- vnútorné spojenia
- vonkajšie spojenia
Vnútorné spojenie
Jednoduché spojenie cez jeden stĺpec
Ide o SELECT, v ktorom sa v podmienke WHERE porovnávajú stĺpce jednej a druhej tabuľky. Ku stĺpcom jednotlivých tabuliek sa pristupuje pomocou selektoru (bodky).
Ako príklad si vytvoríme nové tabuľky, s názvami "useky" a "funkcie". V tabuľke "useky" sa budú nachádzať atribúty id s primárnym kľúčom, názov úseku a id funkcie. V druhej tabuľke "funkcie" sa budú nachádzať atribúty id a názov funkcie. Do tabuľky "udaje" pridáme nové atribúty id úseku a id funkcie.
SELECT meno, priezvisko, usek, funkcia FROM udaje, useky, funkcie WHERE udaje.id_u = useky.id and udaje.id_f = funkcie.id;
Dopyt nevráti záznamy zo všetkých tabuliek, ale len tie, ktoré spolu súvisia. Vypíše sa nám nasledovná tabuľka:
| meno | priezvisko | usek | funkcia |
|---|---|---|---|
| Jozko | Stary | ekonomicky | asistent |
| Maria | Mala | ekonomicky | uctovnik |
| Ema | Balazova | obchodny | asistent |
| Maria | Novakova | obchodny | riaditel |
| Ján | Novak | obchodny | riaditel |
Použitie SELECT * vráti všetky stĺpce zo všetkých tabuliek. Pomocou SELECT nazov_tabulky.* je možné vrátiť dáta z jednej tabulky a pritom použiť spojenie.
INNER JOIN
Vyššie uvedený príklad príkazu SELECT môžeme upraviť s použitím slova JOIN nasledovne:
SELECT meno, priezvisko, usek, funkcia FROM udaje JOIN useky, funkcie WHERE udaje.id_u = useky.id and udaje.id_f = funkcie.id; //používa sa aj kľúčové slovo INNER JOIN, ktoré sa skracuje len na JOIN
Tieto spojenia sú nazývané vnútorné, pretože sú zobrazené iba tie dáta, ktoré sa v oboch tabuľkách zhodujú. Osoby, ktoré nemajú zadané hodnoty úsek a funkcia sa v tabuľke nikdy nezobrazia, pretože podmienka where to neumožňuje.
Ak by sme chceli vypísať osoby na jednotlivých úsekoch môžeme to spraviť aj nasledovne:
Príklad:SELECT meno, priezvisko, usek FROM udaje JOIN useky ON udaje.id_u = useky.id;
Vonkajšie spojenie
LEFT JOIN
Aby sme zahrnuli všetky osoby aj s úsekmi a zároveň osoby, ktoré nemajú zadaný žiadny úsek, čiže majú hodnotu NULL, máme v MySQL klauzulu LEFT JOIN prípadne RIGHT JOIN.
SELECT meno, priezvisko, usek FROM udaje LEFT JOIN useky ON udaje.id_u = useky.id;
Výstupom bude nasledovná tabuľka:
| meno | priezvisko | usek |
|---|---|---|
| Jozko | Stary | ekonomicky |
| Maria | Mala | ekonomicky |
| Ema | Balazova | obchodny |
| Maria | Novakova | obchodny |
| Ján | Novak | obchodny |
| Samo | Strucik | NULL |
LEFT JOIN spôsobí, že sa zahrnú všetky dáta z ľavej (teda z prvej) tabuľky a z pravej tabuľky sa zahrnú súvisiace dáta, prípadne aj s hodnotou NULL.
RIGHT JOIN
Použitím tohto spojenia dosiahneme vo výslednom výpise zahrnutie všetkých riadkov z pravej (teda z druhej) tabuľky. Ak nebol nájdený odpovedajúci riadok v ľavej tabuľke, budú vo výsledku hodnoty NULL vo všetkých stĺpcoch použitých z prvej tabuľky. Úplne by sme si vystačili iba s ľavým spojením a jednoduchým prehodením poradia spájaných tabuliek okolo príkazu LEFT JOIN.
Nasledovný príkaz bude mať rovnaký výsledok ako predošlý príklad:
SELECT meno, priezvisko, usek FROM useky RIGHT JOIN udaje ON udaje.id_u = useky.id;
Ďalšie spojenia
Tieto typy spojení sa takmer nikdy nepoužívajú.
CROSS JOIN
CROSS JOIN spojí tabuľky tak, že výsledkom je ich kartézsky súčin.
SELECT udaje.id, udaje.meno, udaje.priezvisko, useky.usek FROM udaje CROSS JOIN useky;
Vyfiltruje sa nám nasledovná tabuľka:
| id | meno | priezvisko | usek |
|---|---|---|---|
| 1 | Jozko | Stary | ekonomicky |
| 1 | Jozko | Stary | obchodny |
| 2 | Maria | Mala | ekonomicky |
| 2 | Maria | Mala | obchodny |
| 3 | Ema | Balazova | ekonomicky |
| 3 | Ema | Balazova | obchodny |
| 4 | Maria | Novakova | ekonomicky |
| 4 | Maria | Novakova | obchodny |
| 5 | Ján | Novak | ekonomicky |
| 5 | Ján | Novak | obchodny |
| 6 | Samo | Strucik | ekonomicky |
| 6 | Samo | Strucik | obchodny |
NATURAL JOIN
Pri použití NATURAL JOIN či už NATURAL LEFT JOIN alebo NATURAL RIGHT JOIN sú použité všetky stĺpce z oboch tabuliek, ktoré majú rovnaký názov. V našom prípade by tento príkaz nefungoval, ale vyzeral by nasledovne:
SELECT * FROM udaje NATURAL JOIN useky;
JOIN ... USING
Funguje tak, že síce spája pomocou rovnako nazvaných polí v oboch tabuľkách, ale umožňuje nám toto pole vymenovať. Ak by sme v našom príklade mali pole zastupujúce úsek nazvaný id_u príkaz by vyzeral nasledovne:
Príklad:SELECT * FROM udaje JOIN useky using (id_u);

