Povezivanje tabela u SQL-u
Uobičajena situacija je da su podaci smešteni u više povezanih tabela. Tabele navodimo u obliku liste, odvojene zarezom.
SELECT [lista izraza]
FROM [lista tabela]
WHERE [uslov]
ORDER BY [lista select polja]
Kada navedemo više tabela, potrebno je i da navedemo njihovu međusobnu vezu. Za razliku od nekih drugih (grafičkih) sistema gde je dovoljno jednom povezati tabele, u SQL upitima svaki put moramo navoditi vezu među poljima tabela.
Polja koja služe za povezivanje su obično parovi primarnih i stranih ključeva koji suštinski imaju iste vrednosti. Tako se povezivanje svodi na zadavanje uslova jednakosti za vezana polja.
SELECT [lista izraza]
FROM tabela_A, tabela_B, tabela_C
WHERE (polje_A = polje_B) AND (polje_B = polje_C)
Ako se slučajno desi da polja iz jedne i druge tabele imaju iste nazive, potrebno je da zadamo i naziv tabele uz naziv polja:
SELECT [lista izraza]
FROM tabela_A, tabela_B, tabela_C
WHERE (tabela_A.polje = tabela_B.polje) AND (tabela_B.polje = tabela_C.polje)
Primer
Uzmimo za primer tabelu sa knjigama. Kao pisac, nije zaista navedeno ime, već šifra pisca. Zašto? Jednostavno, za svakog pisca možemo imati više podataka, a bilo bi nepraktično da za svaku knjigu istog pisca navodimo sve te podatke.
sifra | naslov | stranice | zanr | pisac |
---|---|---|---|---|
0001 | Isijavanje | 390 | HOR | P02 |
0002 | Boja magije | 270 | FAN | P09 |
0005 | Čekajući Godoa | 90 | DRA | P11 |
0006 | To | 1070 | HOR | P02 |
0007 | Veštice na putu | 370 | FAN | P09 |
000A | Mračna kula | 200 | FAN | P02 |
000B | Prokleta avlija | 150 | IST | P01 |
Zbog toga smo podatke o piscima izdvojili u zasebnu tabelu. Veza između knjiga i pisaca je praktično šifra pisca, koja se pojavljuje u obe tabele. Tip veze je jedan prema više (jedan pisac može imati više knjiga), ali nam za kreiranje upita to sada nije bitno.
id | ime | rodjen | umro | zemlja |
---|---|---|---|---|
P01 | Ivo Andrić | 1892 | 1975 | YU |
P02 | Stiven King | 1947 | 0 | US |
P09 | Teri Pračet | 1948 | 2015 | GB |
P11 | Semjuel Beket | 1906 | 1989 | IR |
Sada ćemo napraviti SQL upit koji treba da nam ispiše nazive knjiga i imena pisaca. Najlakši način definisanja veze je preko WHERE klauzule.
SELECT naslov, ime
FROM knjige, pisci
WHERE pisac=id
naslov | ime |
---|---|
Isijavanje | Stiven King |
Boja magije | Teri Pračet |
Čekajući Godoa | Semjuel Beket |
To | Stiven King |
Veštice na putu | Teri Pračet |
Mračna kula | Stiven King |
Prokleta avlija | Ivo Andrić |
Naravno da možemo definisati i druge uslove za filtriranje podataka, kao i sortiranje.
SELECT naslov, stranice, ime, zemlja
FROM knjige
WHERE (pisac=id) AND (zanr='FAN')
ORDER BY stranice DESC
naslov | stranice | ime | zemlja |
---|---|---|---|
Veštice na putu | 370 | Teri Pračet | GB |
Boja magije | 270 | Teri Pračet | GB |
Mračna kula | 200 | Stiven King | US |