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.

Príklad:

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:

Príklad:

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.

Príklad:

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:

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.

Príklad:

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:

Príklad:

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);