2.6.2 SQL lisaklauslite kasutamine

iDevice ikoon 2.6.2 SQL lisaklauslite kasutamine

Andmete uuenduskorraldus lubab tabeli mitut rida ja veergu uuendada samaaegselt. Rea valik teostatakse where klausliga, samas peab veeru uuenduse korralduses täpselt näitama.

Järgnevas näites uuendatakse kõikide õpilaste, kelle kood on 2, eesnimi ja perekonnanimi; kui unikaalne indeks on defineeritud koodina (vaadake indeksi definitsiooni juures olevat näidet) siis uuendatakse ainult üks kirje (või mitte ühtki, kui pole õpilast koodiga 2).

Näited:

update tudengid set perenimi="Juurikas" and eesnimi="Piret" where tkood=2;

Oleme seni vaadanud andmete muutmiskorraldusi, nüüd hakkame uurima, kuidas tabelitest vajalikku informatsiooni väljastada. Selleks kasutatakse korraldust select, mida laialdaselt kasutatakse ja mis on väga paindlik:

select ( colname, ...) from tname [where ...] [group by (colname, ...)] [order by (colname, ...)] [having ...] [into [temp] table tname];

kus on kasutatud tähiseid

colname - veerunimi;
tname - tabelinimi, millisest andmeid kustutatakse;
where - klausel, millist kirjeldati ülalpool delete ja update korralduste juures;
having - sarnaneb veidi where klausliga, kuid hinnatakse osalisi tulemusi.

order by klausel võimaldab väljastada andmeid korrastatud järjekorras, samal ajal kui group by klausel võimaldab andmete rühmitamist. Sellised korraldused, kus on kasutatud kõiki loetletud klausleid rakendatakse esimesena where, järgmisena order by ja group by ning alles siis having klauslit.
Teades select korralduse keerukust ja paindlikkust, vaatleme mitut erinevat näidet. Esimeses näites näitame, kuidas valima kogu informatsioon tabelist: tärn veergude nimekirja asemel osutab, et kõik tabeli veerud peaks olema valitud. Where klausli puudumine võimaldab valida kõik read.

Näited:

Select * from tudengid;

Teises näites valitakse kõikide õpilaste eesnimed ja perekonnanimed, kes olid vanemad, kui 18 aastat, kuupäeval 31.detsember 2003. Tulemus korrastatakse perekonnanime ja eesnime järgi. Pange tähele: veergude korrastusjärjekord on vaja eraldi näidata order by järel.

Näited:

select perenimi, eesnimi from tudengid where synnipaev <="31.12.1985" order by perenimi, eesnimi;

Kolmandas näites on rühmitatud kõik sama nimega õpilased; valitakse nimi koos sama nimega õpilaste arvuga. Loendamisfunktsioon count(*) väljastab rühmitatud ridade arvu. Näites pole kasutatud where klauslit, kuigi võiks olla.

Näited:

select eesnimi, count(*) from tudengid group by eesnimi order by eesnimi;

Neljas näide näitab, kuidas having klauslit kasutada harvaesinevate nimede valimiseks või ainult üks kord esinevate nimede valimiseks.

Näited:

select eesnimi, count(*) from tudengid group by eesnimi order by eesnimi having count(‘)=1;

Viiendas näites valitakse õppeainest osa võtvate õpilaste perenimi ja eesnimi. See teostatakse suhte loomise kaudu õpilaste ja oppeainete tabel vahel. Korraldusest aru saamiseks, peaks teadma, et oppeainete tabel sisaldab veerge aine ja tudeng (õpilane osaleb õppeaines). Korraldust uurides võib märgata seal kahte veergu nimega "eesnimi" - need veerud on eristatavad sest tabeli nimi on enne veerunime ja neid seob vahepealne punkt. Sellist süntaksit kasutatakse ka tingimuste näitamiseks where klauslis aga seda on kasutatud ainult selguse huvides (where tudeng = kood võib kirjutada probleemideta). Mõistmaks, kuidas korraldus töötab, vaatame kuidas ABHS seda teostab:

  • Leitakse otsekorrutis õppeained ja tudengid tabelite vahel
  • valitakse ainult read, kus "tudeng" veerg väärtus võrdub "kood" veerg väärtusega
  • luuakse projektsioon, mis kustutab kõik sobimatud veerud
  • tehakse päring valitud veergude (oppeained.tudeng, tudengid.eesnimi, perenimi) baasil saadud tabelist.

Kõik need operatsioonid vastavad loomulikule liitumisele (loomulik seos).

Näited:

select oppeained.eesnimi, perenimi, tudengid.eesnimi from oppeained, order by oppeained.eesnimi, perenimi, tudengid.eesnimi where oppeained.tudeng=tudengid.kood;

Kuues ja viimane näide kasutab viiendat näidet ja teostab täienduse, mis samuti lubab valida aineid, kus pole registreerunud õpilasi. Sellel juhul read sisaldavad aine andmeid ja neid ridu, kus õpilase andmed puuduvad (kuna aines pole õpilasi). Korralduse seisukohalt on piisav, kui lisada sõna outer enne tudengid tabeli nime. Seda tüüpi seotus on väline liitumine - outer join või vasak liitumine - left join. Välise liitumise süntaks võib olla tunduvalt keerulisem ja võib sõltuma kasutatava SQL keele standardist.

Näited:

select oppeained.eesnimi, perenimi, tudengid.eesnimi from oppeained, outer tudengid order by oppeained.eesnimi, perenimi, tudengid.eesnimi where oppeained.tudeng=tudengid.kood;