V určitých okamihoch pri práci s rozsiahlejšou databázou zistíme, že s jednoduchými SQL dotazmi nevystačíme a potrebujeme získať naraz údaje z viacerých tabuliek, ktoré sú navzájom prepojené určitou závislosťou.
Zoberme si prípad, že máme jednu tabuľku v ktorej máme zoznam našich pracovníkov s osobnými číslami. Táto tabuľka nám poskytuje iba statický pohľad na evidenciu pracovníkov, ich počet a označenie jedinečným identifikačným číslom. V druhej tabuľke (pracoviska) máme zotriedené a pomenované všetky pracoviská na ktorých sa vyskytujú naši zamestnanci. Na občerstvenie pamäti uvádzam celý postup vytvorenia tabuliek:
create table pracovnici (pracovnik_id int, pracovnik_meno varchar(25))
create table pracoviska (pracovisko_id int, pracovnik_id int,
pracovisko_nazov varchar(25))
INSERT INTO pracovnici (pracovnik_id, pracovnik_meno) VALUES ('07', 'Jozef 3');
INSERT INTO pracovnici (pracovnik_id, pracovnik_meno) VALUES ('08', 'Peter 1');
INSERT INTO pracovnici (pracovnik_id, pracovnik_meno) VALUES ('02', 'Andrej 1');
INSERT INTO pracoviska (pracovisko_id, pracovnik_id, pracovisko_nazov)
VALUES ('11', '02', 'kniznica');
INSERT INTO pracoviska (pracovisko_id, pracovnik_id, pracovisko_nazov)
VALUES ('14', '02', 'uctaren');
INSERT INTO pracoviska (pracovisko_id, pracovnik_id, pracovisko_nazov)
VALUES ('19', '07', 'sklad');
mysql> select * from pracovnici;
+--------------+----------------+
| pracovnik_id | pracovnik_meno |
+--------------+----------------+
| 2 | Andrej 1 |
| 7 | Jozef 3 |
| 8 | Peter 1 |
+--------------+----------------+
3 rows in set (0.11 sec)
mysql> select * from pracoviska;
+---------------+--------------+------------------+
| pracovisko_id | pracovnik_id | pracovisko_nazov |
+---------------+--------------+------------------+
| 11 | 2 | kniznica |
| 14 | 2 | uctaren |
| 19 | 7 | sklad |
+---------------+--------------+------------------+
3 rows in set (0.06 sec)
Jednoduchým selectom môžeme zistiť zoznam našich pracovníkov z tabuľky (pracovnici) a napriklad zoznam pracovísk z druhej tabuľky (pracoviska). Problém nastáva v prípade že chceme zistiť meno pracovníka ktorý pracuje napríklad v sklade. Druhá tabuľka totiž neobsahuje údaje o menách pracovníkov. Riešenie by mohlo spočívať v spojení našich dvoch tabuliek do jednej, ale ... no ale najskôr si to ukážme:
pracovisko_id |
pracovisko_nazov |
pracovnik_id |
meno |
11 |
kniznica |
2 |
Andrej 1 |
14 |
uctaren |
2 |
Andrej 1 |
19 |
sklad |
8 |
Peter 1 |
Keď máme takto pekne spojené dve tabuľky, nebude pre nás problém vyselektovať pracovisko určitého pracovníka:
SELECT pracovisko_nazov FROM (spojena_tabulka) WHERE pracovnik_meno='Andrej 1'
No dobre, ale čo tak použiť jeden príkaz SELECT bez nutnosti spájania našich dvoch tabuliek do jednej. Samozrejme aj to je možné a ukážeme si to na následovnom príklade:
mysql> SELECT pracovisko_nazov FROM pracovnici,pracoviska
-> WHERE (pracovnici.pracovnik_id=pracoviska.pracovnik_id)
-> AND (pracovnik_meno='Andrej 1');
A výsledok by mohol vypadať asi takto:
+------------------+
| pracovisko_nazov |
+------------------+
| kniznica |
| uctaren |
+------------------+
2 rows in set (0.00 sec)
V tomto selecte sme spojili dve tabuľky prostredníctvom spoločného kľúča za časťou WHERE a v ďalšej časti príkazu sme odfiltrovali požadovaného pracovnika. Tento proces sa nazýva (v pôvodnomm tvare) "Cartesian-filter join", čiže ho môžeme prirovnať ku Kartezianskému súčinu dvoch matíc (v našom prípade tabuliek) kde je výsledok vrátený na základe ďalších kritérií. Ale to už zachádzame trochu do Lineaárnej algebry a teraz v lete to nie je určite príjemné ;-)
V budúcej časti si povieme trochu hlbšie o spájaní SQL tabuliek.