lisää sql:stä

37
Lisää Sql:stä... Haaga-Helia Ammattikorkeakoulu

Upload: dannon

Post on 13-Jan-2016

84 views

Category:

Documents


0 download

DESCRIPTION

Lisää Sql:stä. Haaga-Helia Ammattikorkeakoulu. Esimerkkitietokanta. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Lisää Sql:stä

Lisää Sql:stä...

Haaga-Helia Ammattikorkeakoulu

Page 2: Lisää Sql:stä

Esimerkkitietokanta

• Seuraavissa esimerkeissä käytämme esimerkkinä tietokantaa, jossa on kaksi taulua, joista toiseen on tallennettu tietoja liittyen opiskelijoiden tietoihin ja toiseen opiskelijoiden tenttituloksia, joissa perusavaimena on käytetty sosiaaliturvatunnusta

• Esimerkkitaulut näyttävät seuraavilta:

Page 3: Lisää Sql:stä

Oppilaat

Sotu Sukunimi Etunimi Osoite Postinumero Puhelin Laitos

Aloitusvuosi

130873-999R

Olli Sakari Gyldenintie 00200 040-5925781

1 1999

120277-5555

Leinonen Venla Pellonreuna 40520 014-242234 1 1995

120267-7777

Mononen Unto Keskustie 21000 040-876543 2 1994

110276-5577

Kauppinen Marko Patotie 33300 012-111111 2 1995

121177-6665

Nenonen Marika Kamppi 22222 09-66666 3 1993

120178-6367

Nojonen Liisa Kauppakatu 33333 09-555555 3 1999

Page 4: Lisää Sql:stä

TentitSotu Kurssitunnus Päivämäärä Arvosana

130873-999R Kem200 12.12.1994 3

130873-999R Kem300 21.1.1995 1

120267-7777 Kem200 12.12.1994 3

120267-7777 Kem222 22.1.1995 2

120267-7777 Kem230 2.2.1998 2

110276-5577 Kem555 1.1.1999 1

Page 5: Lisää Sql:stä

ALIKYSELY

SELECT etunimiFROM oppilaatWHERE sotu IN

(SELECT sotu FROM tentit WHERE arvosana = 3)

Tulostaa niiden oppilaiden etunimet, jotka ovat saaneet jostakin tentistä arvosanan 3.

Page 6: Lisää Sql:stä

Etunimi

Sakari

Unto

Page 7: Lisää Sql:stä

alikyselyä tarvitaan, jos ehdossa

tarvitaan jonkin toisen kyselyn tulosta (ylempi kysely on riippuvainen alemman kyselyn tuloksesta)

alikyselyä tarvitaan, jos kysely

kohdistuu useampaan kuin yhteen relaatioon

(liitos on tässä tilanteessa nopeampi) hakuehdossa on IN, koska alikysely

voi tuottaa useita vastauksia hakuehdossa voi olla myös vertailuoperaattori,

jos alikysely tuottaa vain yhden vastauksen

Page 8: Lisää Sql:stä

LIITOS (RELAATIOIDEN YHDISTÄMINEN)

”Haetaan oppilaiden sukunimet ja kyseisten oppilaiden kaikkien tenttien arvosanat”

SELECT Oppilaat.Sukunimi, Tentit.arvosanaFROM Oppilaat, TentitWHERE Oppilaat.sotu=Tentit.sotu

Page 9: Lisää Sql:stä

Tulos…

Sukunimi Arvosana

Olli 3

Olli 1

Mononen 3

Mononen 2

Mononen 2

Kauppinen 1

Page 10: Lisää Sql:stä

liitosta tarvitaan, jos kysely kohdistuu useampaan kuin yhteen

relaatioon

liitos voidaan tehdä, jos molemmista tauluista löytyy vastaava

sarake, joilla taulut voidaan yhdistää

liitosta käytetään aina ensisijaisesti, jos se on vain mahdollista, sillä liitos on

nopeampi kuin alikysely

Page 11: Lisää Sql:stä

SELECT O.Sukunimi, T.arvosanaFROM Oppilaat AS O, Tentit AS TWHERE O.sotu=T.sotu

taulu voidaan nimetä FROM-osassa toiseksi tämän kyselyn ajaksi

jos taulu nimetään uudelleen, sarakenimen edessä on

käytettävä ”uutta” taulunimeä

Page 12: Lisää Sql:stä

UNION

SELECT sukunimi, etunimiFROM OppilaatWHERE etunimi = ’Venla’ UNIONSELECT sukunimi, etunimi FROM OppilaatWHERE Sukunimi= ’Olli’

Page 13: Lisää Sql:stä

Sukunimi Etunimi

Leinonen Venla

Olli Sakari

yhdistää kahden tai useamman kyselyn tuloksen

SELECT-osa pitää olla samanlainen

karsii pois duplikaatti-vastaukset

Page 14: Lisää Sql:stä

FUNKTIOITA

COUNT (sarake) tulosrivien lukumäärä

AVG (sarake) keskiarvo

SUM (sarake) summa

MAX (sarake) suurin arvo

MIN (sarake) pienin arvo

Page 15: Lisää Sql:stä

funktiot tuottavat vain yhden vastauksen

SELECT-osassa ei voi olla sekä funktioita että yksittäisiä tietoja (ryhmittely on poikkeus)

funktiot huomioivat vain ei NULL-arvot

jos ehdossa täytyy vertailla jotain saraketta funktion tulokseen, funktio täytyy tehdä alikyselynä

funktio ei voi olla WHERE-ehdon jäsenenä

EI palkka > AVG(palkka)

Page 16: Lisää Sql:stä

SELECT AVG (aloitusvuosi)FROM Oppilaat

”hae keskimääräinen aloitusvuosi”

Expr…….

199….

Page 17: Lisää Sql:stä

SELECT MAX (Aloitusvuosi)FROM Oppilaat

”hae uusin opiskelija”

Expr…….

1999

Page 18: Lisää Sql:stä

SELECT MAX (aloitusvuosi)FROM OppilaatWHERE postinumero IN

(SELECT postinumero FROM Oppilaat WHERE postinumero>20000)

”Hae suurin opiskelijan aloitusvuosi opiskelijoilta, jotka asuvat pääkaupunkiseudun ulkopuolella

Expr…….

1999

Page 19: Lisää Sql:stä

SELECT SUM (arvosana)FROM TentitWHERE kurssitunnus = ’Kem200’

”Hae arvosanojen summa Kem200 kurssin tentituloksista”

Expr…….

6

Page 20: Lisää Sql:stä

SELECT sukunimiFROM OppilaatWHERE Aloitusvuosi <

(SELECT AVG(aloitusvuosi) FROM Oppilaat)

”Hae niiden opiskelijoiden sukunimet, jotka ovat viettäneet aikaansa opinahjossa keskimääräistä enemmän”

sukunimi

Mononen

Nenonen

Page 21: Lisää Sql:stä

RYHMITTELY

”tulosta kunkin laitoksen aloitusvuosien keskiarvo”

laitos Expr…….1 19972 19953 1996

SELECT laitos, AVG (aloitusvuosi)FROM OppilaatGROUP BY laitos

Page 22: Lisää Sql:stä

GROUP BY muodostaa annetun sarakkeen mukaan ryhmiä, joista haetaan

funktioilla tietoja

SELECT-osassa voi olla vain funktioita ja ryhmittelyn mukainen sarake

Page 23: Lisää Sql:stä

SELECT laitos, AVG (aloitusvuosi)FROM OppilaatWHERE laitos < 3GROUP BY laitosHAVING COUNT (aloitusvuosi) > 1

”laitoksennumero ja aloituvuosien keskiarvo niistä laitoksista, joiden laitosnumero on pienempi kuin 3 ja laitoksista on enemmän kuin yksi työntekijä ”

Osnumero Expr…….

1 1997

2 1995

Page 24: Lisää Sql:stä

WHERE-osassa rajoitetaan mukaanotettavia rivejä

HAVING-osassa rajoitetaan mukaanotettavia ryhmiä

Page 25: Lisää Sql:stä

PÄIVÄMÄÄRIEN KÄSITTELY

”Kurssitunnukset ja tenttipäivät niistä tenteistä, joissa on saatu arvosanoja alle 2:en”

Kurssitunnus PäiväKem300 21.1.1995Kem555 1.1.1999

SELECT kurssitunnus, päivämääräFROM TentitWHERE arvosana<2

Page 26: Lisää Sql:stä

SELECT kurssitunnus, arvosanaFROM TentitWHERE kurssitunnus=’Kem200’

ANDpäivämäärä< #06-30-1996#

”tulosta kurssitunnukset ja arvosanat niistä tenttisuorituksista, joiden kurssitunnus on Kem200 ja joiden ´suorituspäivä on aikaisempi kuin 30.6.1996”

Kurssitunnus Arvosana

Kem200 3

Kem200 3

Page 27: Lisää Sql:stä

PÄIVÄMÄÄRÄ-FUNKTIOITA

Date() meneillään oleva päivä(mm-dd-yy)

Year(sarake) päivämäärä-kentän vuosi

Month(sarake) päivämäärä-kentän kuukausi

Day(sarake) päivämäärä-kentän päivä

Näyttää päivämäärästä

DatePart(”yyyy”,sarake) vuoden numeron

DatePart(”m”,sarake) kuukauden numeron

DatePart(”d”,sarake) päivän numeron

Page 28: Lisää Sql:stä

Näkymän luominen

• Näkymä tarkoittaa SQL-kielen avulla määriteltyä kyselyä, jolle on annettu nimi ja joka on tallennettu kantaan (virtuaalitaulu)

• Näkymän kautta voi myös rajoitetusti päivittää kohdetaulujen dataa. Tämä ei kuitenkaan ole suositeltavaa.

• Rajoitukset ovat tuotekohtaisia

Page 29: Lisää Sql:stä

Näkymän käyttömahdollisuuksia

• Olennaisen tiedon näyttäminen tauluista

• Tallennetut näkymät ovat optimoituja SQL-lauseita

• Valmiilla näkymillä voidaan vähentää käyttäjien tarvetta luoda monimutkaisia SQL-lausekkeita

• Suojataan varsinaista tietokantaa/rakennetta

Page 30: Lisää Sql:stä

Näkymän luonti: Esimerkki

CREATE VIEW henkilot AS

SELECT t.tnimi, o.osnimi

FROM ttekija as t, osasto as o

WHERE t.osnumero=o.osnumero

Luo näkymän henkilot liitoksena ttekija- ja osasto –tauluista.

Page 31: Lisää Sql:stä

KYSELYJEN TEHOKKUUDESTA

liitos mieluummin kuin alikysely jos liitostauluja n, ehtoja pitäisi olla vähintään n-1 WHERE – lause määrää liittämisjärjestyksen WHERE – ehdoissa vältettävä aritmeettisia

operaatioita WHERE – ehdossa vältä LIKE:a OR tehoton ehdoissa (ei käytä indeksejä) vältä lajittelua (DISTINCT, ORDER BY,

GROUP BY) indeksit nopeuttavat hakua

Page 32: Lisää Sql:stä

RIVIEN LISÄYS (INSERT)

INSERT INTO ttekija

(tnumero, tnimi, osnumero, palkka)

VALUES

(2000, ’Niemi’, 30, 10000)

INSERT INTO taulu (sar1, ……., sarn)VALUES (arvo1, ……… , arvon)

Page 33: Lisää Sql:stä

INSERT INTO ttekija_historia

(tnumero, tnimi, osnumero, palkka)

VALUES

SELECT tnumero, tnimi, osnumero, palkka

FROM ttekija

WHERE osnumero = 10

Page 34: Lisää Sql:stä

RIVIEN PÄIVITYS (UPDATE)

UPDATE ttekija

SET palkka = 10000

”päivitä KAIKKIEN työntekijöiden palkaksi 10000”

UPDATE taulu SET sar1=arvo1, ……., sarn=arvon[ WHERE ehto

Page 35: Lisää Sql:stä

UPDATE ttekija

SET palkka = 15000

WHERE tnimi = ’Niemi’

”päivitä Niemi-nimisen työntekijän palkaksi 10000”

UPDATE ttekija

SET palkka = palkka * 1.1

WHERE nimike = ’suunnittelija’

”päivitä 1.1-kertaiseksi niiden työntekijöiden palkka, joiden nimike on suunnittelija”

Page 36: Lisää Sql:stä

RIVIEN POISTAMINEN (DELETE)

DELETE * FROM ttekija

”poista KAIKKI työntekijät”

DELETE * FROM taulu [ WHERE ehto ]

Page 37: Lisää Sql:stä

DELETE * FROM ttekijaWHERE tnumero = 3000

”poista työntekijä, jonka numero on 3000”

DELETE * FROM ttekijaWHERE palkka <

(SELECT AVG(palkka) FROM ttekija)

”poista ne työntekijät, joiden palkka on pienempi kuin keskipalkka”