- "Prave" baze sestavlja več tabel
- Pogosto želimo kot rezultat dobiti podatke, ki se "skrivajo" v več tabelah
SELECT in več tabel
Združevanje tabel
Dobimo kartezični produkt, torej n x m zapisov (če je n število zapisov v prvi, m pa v drugi bazi)
Kako do določenih stolpcev?
Združevanje na osnovi ključev
Izbor le določenih vrednosti
SELECT * FROM zaposleni, naslovi WHERE IDZaposlenega = "MK1 "
Koliko zapisov dobimo?
Koliko zapisov dobimo?
SELECT * FROM zaposleni, naslovi
WHERE naslovi.IDZaposlenega = zaposleni.IDZaposlenega = "MK1
"
Notranji stik
Stike običajno izvajamo preko ključev (primarni s tujim)
Če obstajajo zapisi v tabeli zaposlenih, ki nimajo pripadajočega zapisa v tabeli naslovov, jih v tabeli ni.
Opombe
Zunanji stik
Kaj, če bi želeli dobiti pare, kjer leva (ali desna) tabela nima para
Oracle
Standard
Obstaja tudi FULL OUTER JOIN
Vsa združevanja
Zunanje
Celoten stavek SELECT
Primer
NID | NIme | NPriimek |
1 | Damjan | Kmetec |
2 | Aljaž | Kmetec |
3 | Špela | Prezelj |
NID | NarociloID | Kolicina |
1 | 1 | 2 |
1 | 2 | 2 |
3 | 1 | 1 |
NULL | 1 | 2 |
NID | NIme | NPriimek | StNar | Kol |
1 | Damjan | Kmetec | 2 | 4 |
SELECT Nar.NID, Nar.NIme, Nar.NPriimek,
COUNT(NNar.NarociloID) StNar,
SUM(Nnar.Kolicina) Kol
FROM Narocniki Nar LEFT OUTER JOIN
NarocilaNarocnikov NNar ON
Nar.NarocnikID = NNar.NarocnikID
WHERE Nar.NarocnikPriimek = 'Kmetec'
GROUP BY NarocnikID, NarocnikIme , NarocnikPriimek
HAVING COUNT(NarociloID) > 1
ORDER BY NarocnikID
Vrstni red izvajanja
(7)SELECT <seznam> (8) DISTINCT (10) TOP
(1) FROM <leva table>
(3) <tip združevanja> JOIN <desna tabela>
(2) ON <pogoji združevanja>
(4) WHERE <omejitveni pogoji>
(5) GROUP BY <razvrščanje v skupine>
(6) HAVING <omejitveni pogoji>
(9) ORDER BY <urejanje>
Prvi korak
FROM Narocniki Nar ... JOIN NarocilaNarocnikov NNar
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NID | NNar.NarociloI | NNar.Kolicina |
1 | Damjan | Kmetec | 1 | 1 | 2 |
1 | Damjan | Kmetec | 1 | 2 | 2 |
1 | Damjan | Kmetec | 3 | 1 | 1 |
1 | Damjan | Kmetec | NULL | 1 | 2 |
2 | Aljaž | Kmetec | 1 | 1 | 2 |
2 | Aljaž | Kmetec | 1 | 2 | 2 |
2 | Aljaž | Kmetec | 3 | 1 | 1 |
2 | Aljaž | Kmetec | NULL | 1 | 2 |
3 | Špela | Prezelj | 1 | 1 | 2 |
3 | Špela | Prezelj | 1 | 2 | 2 |
3 | Špela | Prezelj | 3 | 1 | 1 |
3 | Špela | Prezelj | NULL | 1 | 2 |
Drugi korak
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NID | NNar.NarociloI | NNar.Kolicina | |
TRUE | 1 | Damjan | Kmetec | 1 | 1 | 2 |
TRUE | 1 | Damjan | Kmetec | 1 | 2 | 2 |
FALSE | 1 | Damjan | Kmetec | 3 | 1 | 1 |
UNKNOWN | 1 | Damjan | Kmetec | NULL | 1 | 2 |
FALSE | 2 | Aljaž | Kmetec | 1 | 1 | 2 |
FALSE | 2 | Aljaž | Kmetec | 1 | 2 | 2 |
FALSE | 2 | Aljaž | Kmetec | 3 | 1 | 1 |
UNKNOWN | 2 | Aljaž | Kmetec | NULL | 1 | 2 |
FALSE | 3 | Špela | Prezelj | 1 | 1 | 2 |
FALSE | 3 | Špela | Prezelj | 1 | 2 | 2 |
TRUE | 3 | Špela | Prezelj | 3 | 1 | 1 |
UNKNOWN | 3 | Špela | Prezelj | NULL | 1 | 2 |
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NID | NNar.NarociloI | NNar.Kolicina | |
TRUE | 1 | Damjan | Kmetec | 1 | 1 | 2 |
TRUE | 1 | Damjan | Kmetec | 1 | 2 | 2 |
TRUE | 3 | Špela | Prezelj | 3 | 1 | 1 |
Zunanje združevanje
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NID | NNar.NarociloI | NNar.Kolicina |
1 | Damjan | Kmetec | 1 | 1 | 2 |
1 | Damjan | Kmetec | 1 | 2 | 2 |
2 | Aljaž | Kmetec | NULL | NULL | NULL |
3 | Špela | Prezelj | 3 | 1 | 1 |
Where
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NID | NNar.NarociloI | NNar.Kolicina |
1 | Damjan | Kmetec | 1 | 1 | 2 |
1 | Damjan | Kmetec | 1 | 2 | 2 |
2 | Aljaž | Kmetec | NULL | NULL | NULL |
Group By
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NID | NNar.NarociloI | NNar.Kolicina |
1 | Damjan | Kmetec | 1 | 1 | 2 |
1 | 2 | 2 | |||
2 | Aljaž | Kmetec | NULL | NULL | NULL |
S Having izločimo skupine
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NID | NNar.NarociloI | NNar.Kolicina |
1 | Damjan | Kmetec | 1 | 1 | 2 |
1 | 2 | 2 |
In sedaj so na vrsti stolpci
Nar.NID | Nar.NIme | Nar.NPriimek | NNar.NarociloI | NNar.Kolicina |
1 | Damjan | Kmetec | 2 | 4 |