lisää sql:stä
DESCRIPTION
Lisää Sql:stä. Haaga-Helia Ammattikorkeakoulu. Esimerkkitietokanta. - PowerPoint PPT PresentationTRANSCRIPT
Lisää Sql:stä...
Haaga-Helia Ammattikorkeakoulu
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:
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
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
ALIKYSELY
SELECT etunimiFROM oppilaatWHERE sotu IN
(SELECT sotu FROM tentit WHERE arvosana = 3)
Tulostaa niiden oppilaiden etunimet, jotka ovat saaneet jostakin tentistä arvosanan 3.
Etunimi
Sakari
Unto
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
LIITOS (RELAATIOIDEN YHDISTÄMINEN)
”Haetaan oppilaiden sukunimet ja kyseisten oppilaiden kaikkien tenttien arvosanat”
SELECT Oppilaat.Sukunimi, Tentit.arvosanaFROM Oppilaat, TentitWHERE Oppilaat.sotu=Tentit.sotu
Tulos…
Sukunimi Arvosana
Olli 3
Olli 1
Mononen 3
Mononen 2
Mononen 2
Kauppinen 1
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
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ä
UNION
SELECT sukunimi, etunimiFROM OppilaatWHERE etunimi = ’Venla’ UNIONSELECT sukunimi, etunimi FROM OppilaatWHERE Sukunimi= ’Olli’
Sukunimi Etunimi
Leinonen Venla
Olli Sakari
yhdistää kahden tai useamman kyselyn tuloksen
SELECT-osa pitää olla samanlainen
karsii pois duplikaatti-vastaukset
FUNKTIOITA
COUNT (sarake) tulosrivien lukumäärä
AVG (sarake) keskiarvo
SUM (sarake) summa
MAX (sarake) suurin arvo
MIN (sarake) pienin arvo
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)
SELECT AVG (aloitusvuosi)FROM Oppilaat
”hae keskimääräinen aloitusvuosi”
Expr…….
199….
SELECT MAX (Aloitusvuosi)FROM Oppilaat
”hae uusin opiskelija”
Expr…….
1999
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
SELECT SUM (arvosana)FROM TentitWHERE kurssitunnus = ’Kem200’
”Hae arvosanojen summa Kem200 kurssin tentituloksista”
Expr…….
6
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
RYHMITTELY
”tulosta kunkin laitoksen aloitusvuosien keskiarvo”
laitos Expr…….1 19972 19953 1996
SELECT laitos, AVG (aloitusvuosi)FROM OppilaatGROUP BY laitos
GROUP BY muodostaa annetun sarakkeen mukaan ryhmiä, joista haetaan
funktioilla tietoja
SELECT-osassa voi olla vain funktioita ja ryhmittelyn mukainen sarake
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
WHERE-osassa rajoitetaan mukaanotettavia rivejä
HAVING-osassa rajoitetaan mukaanotettavia ryhmiä
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
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
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
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
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
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.
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
RIVIEN LISÄYS (INSERT)
INSERT INTO ttekija
(tnumero, tnimi, osnumero, palkka)
VALUES
(2000, ’Niemi’, 30, 10000)
INSERT INTO taulu (sar1, ……., sarn)VALUES (arvo1, ……… , arvon)
INSERT INTO ttekija_historia
(tnumero, tnimi, osnumero, palkka)
VALUES
SELECT tnumero, tnimi, osnumero, palkka
FROM ttekija
WHERE osnumero = 10
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
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”
RIVIEN POISTAMINEN (DELETE)
DELETE * FROM ttekija
”poista KAIKKI työntekijät”
DELETE * FROM taulu [ WHERE ehto ]
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”