SELECT-lause
SELECT-lause
SELECT-lause
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
SQL-perusteet,<br />
<strong>SELECT</strong>-, INSERT-, CREATE-<strong>lause</strong>et<br />
A271117, Tietokannat<br />
Teemu Saarelainen<br />
teemu.saarelainen@kyamk.fi<br />
Lähteet:<br />
Leon Atkinson: core MySQL<br />
Ari Hovi: SQL-opas<br />
TTY:n tietokantojen perusteet-kurssin opintomoniste<br />
Eri web-lähteet
SQL-relaatiokanta<br />
Relaatiokannassa tieto talletetaan siis tauluihin eli relaatioihin<br />
Relaatiot sisältävät rivejä eli monikkoja<br />
Relaatio voisi olla esimerkiksi:<br />
Opiskelija<br />
Opiskelija_ID Etunimi Sukunimi Osoite Puhelinnro Opintopisteet<br />
000123 Olli Opiskelija Opiskelijankatu 1 A 2 045 6789 012 96<br />
000124 Outi Opiskelija Opiskelijankatu 2 A 1 044 5678 901 120<br />
000125 Ilona Insinööri Insinöörintie 42 050 9876 543 240<br />
…
<strong>SELECT</strong>-<strong>lause</strong><br />
Pääasiassa tietokannasta haetaan tietoa eli suoritetaan erilaisia<br />
hakuja<br />
SQL:ssä hakuja tehdään <strong>SELECT</strong>-<strong>lause</strong>ella, joka on yleensä<br />
(yksinkertaisesti) muotoa:<br />
<strong>SELECT</strong> FROM WHERE ;<br />
<strong>SELECT</strong>:n jälkeisessä ominaisuuslistassa luetellaan ne<br />
ominaisuudet, jotka halutaan mukaan tulokseen (*=kaikki)<br />
FROM:n jälkeisessä taulut-kohdassa luetellaan ne taulut, joihin<br />
haku kohdistuu<br />
WHERE:n jälkeen ehdot-osassa kerrotaan, mitkä kriteerit<br />
tulokseen tulevien rivien tulee täyttää
<strong>SELECT</strong>-<strong>lause</strong><br />
Esimerkiksi äskeiseen Opiskelija-tauluun voitaisiin<br />
suorittaa haku:<br />
<strong>SELECT</strong> Etunimi,Sukunimi,Osoite FROM Opiskelija WHERE<br />
Sukunimi = ’Opiskelija’;<br />
Tämä haku palauttaisi seuraavan tuloksen:<br />
Etunimi Sukunimi Osoite<br />
Olli Opiskelija Opiskelijankatu 1 A 2<br />
Outi Opiskelija Opiskelijankatu 2 A 1
<strong>SELECT</strong>-<strong>lause</strong><br />
Ehtoihin voidaan sijoittaa useampikin rajoite<br />
Jos äskeiseen tauluun suoritetaan haku:<br />
<strong>SELECT</strong> Osoite FROM Opiskelija WHERE Etunimi = ’Outi’<br />
AND Sukunimi = ’Opiskelija’;<br />
Saadaan tulos:<br />
Osoite<br />
Opiskelijankatu 2 A 1
<strong>SELECT</strong>-<strong>lause</strong><br />
<strong>SELECT</strong>-<strong>lause</strong>ella saatu tuloskin on oikeastaan relaatio<br />
Tulosrelaation ominaisuuksien nimet voi myös vaihtaa<br />
haluamikseen:<br />
<strong>SELECT</strong> AS ;<br />
Esimerkiksi:<br />
<strong>SELECT</strong> Opiskelija_ID AS Tunnus, Opintopisteet AS op FROM<br />
Opiskelija;<br />
Tunnus op<br />
000123 96<br />
000124 120<br />
000125 240
<strong>SELECT</strong>-<strong>lause</strong><br />
Myös yksinkertaista laskentaa voi tehdä <strong>SELECT</strong>-<strong>lause</strong>essa<br />
Esimerkiksi:<br />
<strong>SELECT</strong> Opiskelija_ID AS Tunnus, 2*Opintopisteet/3 AS<br />
opintoviikot FROM Opiskelija;<br />
Tunnus opintoviikot<br />
000123 64<br />
000124 80<br />
000125 160
Useaan relaation viittaaminen<br />
<strong>SELECT</strong>-<strong>lause</strong>essa voi viitata myös useaan relaatioon (FROMkohdassa)<br />
Oletetaan että Opiskelija-taulun lisäksi on erillinen taulu<br />
ilmoittautumisista kursseille<br />
Ilmoittautuminen<br />
Opiskelijatunnus<br />
Kurssitunnus<br />
000123 A276007<br />
000123 A276117<br />
000124 A276007<br />
Jos halutaan tietyn opiskelijan ilmoittautumiset, niin haun voisi<br />
tietysti tehdä kahdessa osassa – ensin haettaisiin opiskelijan<br />
tunnus nimen perusteella ja sitten kurssit tunnuksen perusteella
Useaan relaation viittaaminen<br />
Haut voi kuitenkin yhdistää melko helposti<br />
FROM-kentässä listataan ne relaatiot, joiden ominaisuuksia<br />
tarvitaan<br />
WHERE-kentässä käytetään AND avainsanalla erotettuna kahta<br />
ehtoa<br />
Näin haku voisi olla:<br />
<strong>SELECT</strong> Kurssitunnus FROM Ilmoittautuminen, Opiskelija WHERE<br />
Opiskelijatunnus = Opiskelija_ID AND Name = ’Olli Opiskelija’;<br />
Ja tulokseksi tulisi:<br />
Kurssitunnus<br />
A276007<br />
A276117
Rivimuuttujat<br />
Rivimuuttujilla voidaan relaatioille antaa lyhenteitä (tai<br />
aliaksia) seuraavasti:<br />
<strong>SELECT</strong> * FROM AS <br />
WHERE … ;<br />
Yhdelle relaatiolle voidaan antaa useampia rivimuuttujanimiä<br />
Tästä on hyötyä, jos joudutaan vertailemaan saman<br />
relaation eri rivejä keskenään<br />
”Normaalilla” kyselyllä tämä ei olisi mahdollista – miten<br />
erotettaisiin kahden eri rivin samanniminen ominaisuus
Rivimuuttujat<br />
Esimerkiksi voitaisiin hakea opiskelijoista samassa osoitteessa<br />
asuvat:<br />
<strong>SELECT</strong> Op1.Etunimi, Op1.Sukunimi, Op2.Etunimi, Op2.Sukunimi<br />
FROM Opiskelija AS Op1, Opiskelija AS Op2 WHERE Op1.Osoite =<br />
Op2.Osoite AND Op1.Opiskelija_ID < Op2.Opiskelija_ID;<br />
Mikäli jälkimmäistä ehtoa ei olisi, tulostuisivat nimet kahteen<br />
kertaan:<br />
Samassa osoitteessa asuvat opiskelijat löytyvät<br />
• ensin niin, että Op1 on taulussa ensiksi oleva ja Op2 taulussa<br />
jälkimmäisenä oleva<br />
• sen jälkeen niin, että Op1 on taulussa jälkimmäisenä oleva ja Op2<br />
taulussa ensiksi oleva
Ehto-<strong>lause</strong>kkeista<br />
WHERE-kohdassa voidaan rajata hakua merkeillä:<br />
=, , , =<br />
Ehtojen yhteydessä voi myös suorittaa laskentaa<br />
merkeillä:<br />
+, -, *, /<br />
Ehdoissa voi verrata asioita sekä relaatioiden<br />
attribuutteihin että vakioihin, merkkijonoihin, tms.<br />
Muista kuitenkin, että kaikki ominaisuudet, joita käytetään<br />
vertailujen yhteydessä pitää löytyä FROM-osan relaatioista
Merkkijonot<br />
Merkkijonojen samanlaisuutta voi vertailla LIKE-operaattorilla:<br />
<strong>SELECT</strong> * FROM WHERE LIKE ;<br />
Tässä kuvaus on merkkijonon rakennetta kuvaava kaava, jossa<br />
voi käyttää erikoismerkkejä % ja _<br />
Ehto<strong>lause</strong>ke<br />
% vastaa mitä tahansa merkkijonoa<br />
_ vastaa yhtä mitä tahansa merkkiä<br />
LIKE <br />
on tosi, jos verrattava ominaisuus toteuttaa annetun<br />
rakennekaavan
SQL:n muita ominaisuuksia<br />
Jos kahdella eri relaatiolla on samanniminen ominaisuus, niin ne<br />
voidaan erotella käyttämällä relaation nimeä ”etuliitteenä”<br />
Eli esimerkiksi: Opiskelija.Etunimi<br />
viittaa yksikäsitteisesti Opiskelija-relaation Etunimiominaisuuteen<br />
Joskus haun tulokseen voi tulla ns. kaksoiskappaleita (koska<br />
tulokset ovat itse asiassa monijoukkoja, eivät joukkoja)<br />
Nämä voidaan poistaa käyttämällä DISTINCT-avainsanaa ennen<br />
ominaisuuden nimeä:<br />
<strong>SELECT</strong> DISTINCT Sukunimi FROM Opiskelija;
Tuloksen järjestäminen<br />
Tuloksen rivit voidaan järjestää ORDER BY-operaattorilla:<br />
<strong>SELECT</strong> FROM ORDER BY<br />
;<br />
Järjestys voidaan määritellä myös useamman attribuutin<br />
suhteen<br />
Järjestys on oletusarvoisesti kasvava (ascending)<br />
Järjestyksen voi määrittää laskevaksi lisäämällä DESCavainsana<br />
määrittelyn loppuun<br />
Esimerkki:<br />
<strong>SELECT</strong> * FROM Opiskelija ORDER BY Sukunimi DESC;
Koosteoperaattorit<br />
Koosteoperaattorit laskevat yhden arvon jostakin relaation<br />
sarakkeesta<br />
Koosteoperaattoreita ovat<br />
• SUM – summa<br />
• AVG – keskiarvo<br />
• MIN – pienin arvo<br />
• MAX – suurin arvo<br />
• COUNT - sarakkeen arvojen lukumäärä (DISTINCT-määreellä<br />
saadaan erilaisten arvojen lukumäärä)<br />
Esimerkki:<br />
<strong>SELECT</strong> AVG(Opintopisteet) FROM Opiskelija;<br />
Lisäksi määritteellä GROUP BY voidaan tehdä ryhmittelyä tietyn<br />
sarakkeen arvon perusteella
Alikyselyt<br />
Alikyselyillä voidaan useampia kyselyjä ”ketjuttaa” ja<br />
kyselyn osia korvata toisen kyselyn tuloksilla<br />
Alikyselyjä voidaan käyttää<br />
• <strong>SELECT</strong>-<strong>lause</strong>issa, WHERE, HAVING ja <strong>SELECT</strong> –osissa<br />
• INSERT, DELETE ja UPDATE -<strong>lause</strong>issa<br />
• Alikyselyn sisällä, alikyselyn alikyselyn sisällä, jne.<br />
Esimerkki:<br />
<strong>SELECT</strong> Etunimi, Sukunimi FROM Opiskelija WHERE<br />
Opintopisteet = (<strong>SELECT</strong> MAX(Opintopisteet) FROM<br />
Opiskelija);
Uuden taulun luonti: CREATE TABLE<br />
Uusi taulu voidaan luoda käyttämällä <strong>lause</strong>tta<br />
CREATE TABLE (<br />
, , …);<br />
Taululle pitää siis antaa nimi ja määrittää sen<br />
ominaisuudet<br />
Sulku<strong>lause</strong>kkeen sisään tulevat taulun ominaisuuksien<br />
nimet ja tyypit pareittain pilkulla erotettuna
Uuden taulun luonti: CREATE TABLE<br />
Esimerkki:<br />
CREATE TABLE Suoritus (Suoritus_ID INT, Op_jakso_ID<br />
CHAR(7), Opiskelija_ID INT, Arvosana CHAR(1),<br />
Suorituspvm DATE);<br />
Tämä luo taulun nimeltään Suoritus, jossa on kaksi<br />
kokonaisluvun sisältävää ominaisuutta, yksi 7 merkkiä<br />
sisältävä, yksi yhden merkin sisältävä ja yksi päivämäärän<br />
sisältävä ominaisuus<br />
Mikäli halutaan, että ominaisuus ei saa jäädä tyhjäksi, niin<br />
attribuutin tyypin perään pitää lisätä määre NOT NULL
Tiedon lisääminen relaatioon: INSERT INTO<br />
Relaatioon voi lisätä uuden rivin käyttämällä <strong>lause</strong>tta<br />
INSERT INTO VALUES (, , …);<br />
Lauseelle annetaan taulun nimi sekä määritellään jokaisen<br />
ominaisuuden arvo sulku<strong>lause</strong>kkeen sisään<br />
Esimerkki (lisätään edellisen kohdan Suoritukset tauluun):<br />
INSERT INTO Suoritukset VALUES(000123, 277007, 000124, ’S’,<br />
2008-10-06);<br />
Edellinen lisäisi Suoritukset tauluun seuraavanlaisen rivin<br />
Suoritus_ID Op_jakso_ID Opiskelija_ID Arvosana Suorituspvm<br />
000123 277007 000124 S 2008-10-06
Tiedon lisääminen relaatioon: INSERT INTO<br />
Toinen vaihtoehto on antaa vain tiettyjen ominaisuuksien arvot:<br />
INSERT INTO (, , …) VALUES (,<br />
, …);<br />
Esimerkki (lisätään edellisen kohdan Suoritukset tauluun):<br />
INSERT INTO Suoritukset (Op_jakso_ID, Opiskelija_ID, Arvosana,<br />
Suorituspvm) VALUES(277117, 000123, ’P’, 2008-10-06);<br />
Tämä lisäisi Suoritukset tauluun (edellisen perään) seuraavanlaisen rivin<br />
Suoritus_ID Op_jakso_ID Opiskelija_ID Arvosana Suorituspvm<br />
000123 277007 000124 S 2008-10-06<br />
277117 000123 P 2008-10-06