Tulosta

CASE -kuvaus

Tietokanta

SQL -kyselyt

Yleistä kyselyistä

Sarakkeiden valinta

Rivien valinta

Tarkka vastaavuus

Vertailuoperaattorit

Lajittelu

AND

BETWEEN - AND

OR

IN

LIKE

NOT

Tyhjä merkkijono

Boolen algebra

Sulutus

Päivämääräfunktiot

Liitokset

Perinteinen liitos

Sisäliitos

Laskenta

Sarakkeilla

Ryhmillä

Muut

Alikyselyt

Kyselyiden yhdistäminen

Liitokset taulujen välillä

Liitoksella liität yhteen kaksi tai useampia tauluja siten, että vain ne rivit, jotka toteuttavat liitosehdon, poimitaan tulosjoukkoon.

Syntaksi:
SELECT kenttäluettelo
FROM taulu1, taulu2
WHERE taulu1.perusavain = taulu2.viiteavain

Liitoksessa FROM -lauseeseen tulee kaksi tai useampi taulu, joiden järjestyksellä ei ole väliä. Järjestys voi kuitenkin vaikuttaa joissain tietokannan hallintajärjestelmissä hakutuloksen nopeuteen. WHERE -lauseessa määrität ehdon taulujen yhdistämiselle käyttäen taulujen välistä "linkitystä" perusavain=viiteavain!

Liitoksissa kannattaa alusta lähtien nimetä taulut jollain kirjaime(i)lla, jolloin koodisi lyhenee ja kirjoitustyö helpottuu!

Liitos kahteen tauluun

kysely hakee blokin tiedot (Block -taulu) ja laadun nimen ja kuutiohinnan (Quality -taulu)
SELECT B.blockID, B.len, B.hei, B.wid, B.qualityID, Q.name, Q.cbmprice
FROM Block B, Quality Q
WHERE B.qualityID = Q.qualityID;

Kysely hakee kunkin blokin kohdalla qualityID kentän avulla blokkiin linkitetyn laadun!

Liitos kolmen tauluun

Seuraavalla kyselyllä haetaan kunkin louhimon valmitamat laadut (Q.quarryID = Qu.qualityID) ja tämän jälkeen laatuun linkitetyn blokin (Qu.qualityID=B.qualityID).

kysely hakee louhimoiden (Quarry) valmistamat blokit tammikuussa 2009
SELECT Q.quarryID, B.*
FROM Quarry Q, Quality Qu, Block B
WHERE Q.quarryID = Qu.quarryID AND Qu.qualityID = B.qualityID AND
              YEAR(B.dateproduced) = 2009 AND MONTH(B.dateproduced) = 1;

Huomaa, että Quality -taulu tulee olla kyselyssä mukana vaikkei sieltä mitään tulostettaisikaan!

------

Seuraavalla kyselyllä haetaan yrityksen LT varastossa olevia blokkeja, jotka on valmistettu tammikuussa 2009. Kysely hakee ensin Company -taulusta LT -rivin ja tämän jälkeen kaikki Quality -taulun rivit, joissa companyID on LT. Lopuksi suoritetaan toinen liitos, jolla haetaan laatuun linkitetyt blokit.

kysely hakee yrityksen LT valmistamat tuotteet tammikuussa 2009
SELECT C.companyID, B.*
FROM Company C, Quality Qu, Block B
WHERE C.companyID = "LT" AND C.companyID=Qu.companyID  AND Qu.qualityID = B.qualityID AND YEAR(B.dateproduced) = 1999 AND MONTH(B.dateproduced) = 1

Huomaa, että jos FROM -osassa on 2 taulua, niin tarvitset yhden liitoksen, jos 3 taulua niin kaksi liitosta 4 taulua niin 3 liitosta jne.!

Varo tätä!

Jos unohdat liitokset, niin SQL hakee silti kaikessa rauhassa tiedot!

Esimerkiksi kysely:
SELECT B.blockID, B.len, B.hei, B.wid, B.qualityID, Q.qualityID, Q.name, Q.cbmprice
FROM Block B, Quality Q

Hakee kaikki laadut ja kutakin laatua kohti kaikki blokit. Eli jos laatuja on 30 kappaletta ja tuotteita 2000 kappaletta, tuloksena on 30 * 2000 = 60 000 riviä!

Kuvasta nähdään että sama blokki 23841 on kyselyn mukaan useampaa laatua!

Huomaa, että hakunopeuteen vaikuttaa viite-avainten indeksit. Eli perusohjeena tietokannan toteutuksessa on aina se, että luo viite-avaimille oma indeksi (MySQL tekee indeksit automaattisesti!).

 

Juha Kiukas - juha@kiukas.fi - 040 551 0711