31.01.2015 Views

SELECT-lause

SELECT-lause

SELECT-lause

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!