SQL:N PERUSTEET MARKKU SUNI
Relaatiomallisen tietokannan käsittely Tietojen saanti, talletus ja päivitys tapahtuu SQL-kielellä Yhtä operaatiota sanotaan kyselyksi (query) Kyselyjä voidaan laittaa peräkkäin SQL-kieli on varsin hyvin standardoitu On toimittajakohtaisia poikkeuksia SQL-kyselyn saa sijoitella riveille vapaasti Isot ja pienet kirjaimet ovat samanarvoisia Listat tunnistetaan siitä, että pilkku erottaa jäsenet
Katsotaanpa hiukan SQLkieltä
Peruskyselyn malli SQL:llä CREATE TABLE tulos AS SELECT henkilonro, nimi,, osoite, tilisaldo FROM henkilot, tilit WHERE henkilot.henkilonro = tilit.henkilonro AND tilisaldo > 100 ORDER BY nimi ;
Peruskyselyn malli SQL:llä CREATE TABLE tulos AS CREATE mitä syntyy tuloksena uusi taulu näkymä indeksi SELECT henkilonro, nimi, osoite, tilisaldo FROM henkilot, tilit WHERE henkilot.henkilonro = tilit.henkilonro AND tilisaldo > 100 ORDER BY nimi ;
Peruskyselyn malli SQL:llä CREATE TABLE tulos AS SELECT henkilonro, nimi, osoite, tilisaldo SELECT mitä (sarakkeita) halutaan tulokseen lausekkeet erotetaan pilkuilla toisistaan tauluissa jo olevia sarakkeiden perusteella laskettuja tms. muodostettuja kokonaan tyhjästä muodostettuja miten niitä nimitetään FROM henkilot, tilit WHERE henkilot.henkilonro = tilit.henkilonro AND tilisaldo > 100 ORDER BY nimi ;
Peruskyselyn malli SQL:llä CREATE TABLE tulos AS SELECT henkilonro, nimi, osoite, tilisaldo FROM henkilot, tilit FROM - mistä tauluista sarakkeita poimitaan yksi tai useita taulut erotetaan pilkuilla toisistaan mahdollisesti käytetään alias-nimiä WHERE henkilot.henkilonro = tilit.henkilonro AND tilisaldo > 100 ORDER BY nimi ;
Peruskyselyn malli SQL:llä CREATE TABLE tulos AS SELECT henkilonro, nimi, osoite, tilisaldo FROM henkilot, tilit WHERE henkilot.henkilonro = tilit.henkilonro AND tilisaldo > 100 WHERE ehdot, jotka täyttävät sarakkeet halutaan liittyvät taulujen sarakkeiden arvoihin voi olla hyvinkin monimutkaisia ehtoja voi olla sisäkkäisiä kyselyjä ehtoina ORDER BY nimi ;
Peruskyselyn malli SQL:llä CREATE TABLE tulos AS SELECT henkilonro, nimi, osoite, tilisaldo FROM henkilot, tilit WHERE henkilot.henkilonro = tilit.henkilonro AND tilisaldo > 100 ORDER BY nimi ; ORDER BY, GROUP BY miten tulos esitetään lajiteltuna, ryhmiteltynä mahdollisesti tehdään summia tms. ryhmittelyn mukaan
LAUSEKE on nimien ja operaattorien yhdistelmä, joka palauttaa arvon OPERAATTORI on esim. + - * / EHTO on lauseke,joka saa arvon tosi tai väärä EHTO on tapa rajoittaa valittavia rivejä EHTO on esim.: nimi = SUNI paino > 50 veropros > 40
SQL-kyselyn palauttamien rivien määrää rajoitetaan WHERE-ehdolla WHERE <ehtolauseke> Mukaan tulevat vain ehdon täyttävät rivit
SELECT * FROM tilaukset WHERE tilaustunnus = 10249; ja tuloksena tulee Tilaustunnus Asiakas Työntekijän nimi Tilauspäivämäärä 10249 Toms Spezialitäten Suyama, Michael 05-07-1996
Aritmeettiset operaattorit: + yhteenlasku - vähennyslasku * kertolasku / jakolasku ( ) sulut
Aritmeettiset operaattorit: yhteenlasku SELECT tilaustunnus, rahti, rahti+12 from tilaukset; Tilaustunnus rahti Expr1002 10248 145,71 mk 157,71 mk 10249 52,25 mk 64,25 mk 10250 296,24 mk 308,24 mk 10251 186,03 mk 198,03 mk 10252 230,85 mk 242,85 mk 10253 261,77 mk 273,77 mk 10254 103,41 mk 115,41 mk
Aritmeettiset operaattorit: yhteenlasku SELECT tilaustunnus, rahti, rahti+12 AS Mukana vero from tilaukset; Tilaustunnus rahti Mukana vero 10248 145,71 mk 157,71 mk 10249 52,25 mk 64,25 mk 10250 296,24 mk 308,24 mk 10251 186,03 mk 198,03 mk 10252 230,85 mk 242,85 mk 10253 261,77 mk 273,77 mk 10254 103,41 mk 115,41 mk
Aritmeettiset operaattorit: yhteenlasku SELECT tilaustunnus, rahti, ( rahti+12 ) AS Mukana vero from tilaukset; Tilaustunnus rahti Mukana vero 10248 145,71 mk 157,71 mk 10249 52,25 mk 64,25 mk 10250 296,24 mk 308,24 mk 10251 186,03 mk 198,03 mk 10252 230,85 mk 242,85 mk 10253 261,77 mk 273,77 mk 10254 103,41 mk 115,41 mk Joissakin järjestelmissä voi AS-sanan jättää pois
Aritmeettiset operaattorit: yhteenlasku SELECT tilaustunnus, -rahti, ( rahti+12 ) AS Mukana vero from tilaukset; Tilaustunnus Expr1001 Mukana vero 10248-145,71 mk 157,71 mk 10249-52,25 mk 64,25 mk 10250-296,24 mk 308,24 mk 10251-186,03 mk 198,03 mk 10252-230,85 mk 242,85 mk 10253-261,77 mk 273,77 mk 10254-103,41 mk 115,41 mk Joissakin järjestelmissä voi AS-sanan jättää pois
Aritmeettiset operaattorit: miinusmerkki SELECT tilaustunnus, -rahti AS negatiivinen, ( rahti+12 ) AS Mukana vero from tilaukset; Tilaustunnus negatiivinen Mukana vero 10248-145,71 mk 157,71 mk 10249-52,25 mk 64,25 mk 10250-296,24 mk 308,24 mk 10251-186,03 mk 198,03 mk 10252-230,85 mk 242,85 mk 10253-261,77 mk 273,77 mk 10254-103,41 mk 115,41 mk
SQL-kielen jotkin toteutukset hyväksyvät SELECT tilaustunnus, -rahti AS negatiivinen, rahti+12 AS Mukana vero FROM tilaukset; SELECT tilaustunnus, -rahti = negatiivinen, rahti+12 = Mukana vero FROM tilaukset; Aliasnimi SELECT tilaustunnus, -rahti negatiivinen, rahti+12 Mukana vero FROM tilaukset;
Aritmeettiset operaattorit SELECT tilaustunnus, rahti-15 AS veroton, ( rahti+12 ) AS Tullimukana from tilaukset; Tilaustunnus veroton Tullimukana 10248 130,71 mk 157,71 mk 10249 37,25 mk 64,25 mk 10250 281,24 mk 308,24 mk 10251 171,03 mk 198,03 mk 10252 215,85 mk 242,85 mk 10253 246,77 mk 273,77 mk 10254 88,41 mk 115,41 mk
Lasketaan, kun kerran ruvettiin SELECT tilaustunnus, rahti*1.22 AS Verollinen, ( rahti*1.22*0.85 ) AS Alennettu from tilaukset; Tilaustunnus Verollinen Alennettu 10248 177,7662 151,10127 10249 63,7389 54,17806 10250 361,4067 307,195695 10251 226,9566 192,91311 10252 281,637 239,39145 10253 319,3533 271,450305 10254 126,1602 107,23617
Lasketaan, kun kerran ruvettiin SELECT tilaustunnus, rahti*1.22 AS Verollinen, ( rahti*1.22*0.85 ) AS Alennettu from tilaukset WHERE rahti > 200; Tilaustunnus Verollinen Alennettu 10250 361,4067 307,195695 10252 281,637 239,39145 10253 319,3533 271,450305 10255 814,3317 692,181945 10257 449,6859 382,233015 10258 771,3999 655,689915 10260 302,4441 257,077485 10262 265,1121 225,345285 10263 801,8694 681,58899
CREATE TABLE SELECT tulos AS yritys, osoite, postinumero, toimituspäivämäärä, rahti FROM asiakkaat, tilaukset WHERE rahti > 500 ORDER BY yritys ;
Yritys osoite Postinumero Toimituspäivämäärä rahti Richter Supermarkt Grenzacherweg 71203 09-08-1996 667,49 mk Ernst Handel Kirchgasse 68010 14-08-1996 632,30 mk Ernst Handel Kirchgasse 68010 20-08-1996 657,27 mk Frankenversand Berliner Platz43808 26-08-1996 938,61 mk Wartian Herkku Torikatu 38901 29-08-1996 614,43 mk Morgenstern Gesund Heerstr. 22041 06-09-1996 565,97 mk QUICK-Stop Taucherstraße 10013 18-09-1996 1 031,58 mk Rattlesnake Grocery Milton Dr. 87110 27-09-1996 662,67 mk.......
CREATE TABLE SELECT tulos AS yritys, osoite, postinumero, toimituspäivämäärä, rahti FROM asiakkaat a, tilaukset t WHERE a.asiakastunnus = t.asiakastunnus AND rahti > 500 ORDER BY yritys ;
Yritys osoite Postinumero Toimituspäivämäärä rahti Around the Horn120 Hanover Sq.WA1 1DP 05-01-1998 658,44 mk Berglunds snabbköp Berguvsvägen 8S-958 01-04-1998 681,84 mk Berglunds snabbköp Berguvsvägen 8S-958 01-04-1998 681,84 mk Berglunds snabbköp Berguvsvägen 8S-958 29-05-1997 1 101,56 mk Berglunds snabbköp Berguvsvägen 8S-958 25-02-1998 849,83 mk Berglunds snabbköp Berguvsvägen 8S-958 16-07-1997 523,94 mk Berglunds snabbköp Berguvsvägen 8S-958 13-01-1997 758,88 mk Berglunds snabbköp Berguvsvägen 8S-958 08-09-1997 624,11 mk Blondel père et fils24, Kléber 67000 05-03-1997 704,97 mk Blondel père et fils24, Kléber67000 20-12-1996 592,65 mk.... Ja niin tuli toiseen järjestykseen.
Otetaanpas järjestelmällisesti koko juttu SQL-kielen rakenne on joustava: tekstin saa sijoittaa riveille vapaasti sopiva sisennys auttaa lukemista isot ja pienet kirjaimet samanarvoiset paitsi merkkijonoissa puolipiste päättää kyselyn
SQL-kielen lauseissa isot ja pienet kirjaimet ovat samanarvoiset Tämän kurssin materiaalissa pyritään noudattamaan konventiota: SQL-kielen avainsanat esitetään ISOILLA KIRJAIMILLA vain selkeyden vuoksi erottuvat paremmin
SELECT ilmoittaa mitä valitaan taulusta SELECT <sarakkeet> SELECT ; SELECT * ei sentään toimi ei ole, mitä valita valitsee kaikki sarakkeet SELECT yksi, toinen, kolmas SELECT yksi, toinen, kolmas
FROM ilmoittaa mistä taulu(i)sta valitaan taulut erotetaan pilkuilla SELECT... FROM... ; riittävä minimi
SELECT * FROM tilaukset; Tilaustunnus Asiakas Työntekijännimi Tilauspäivämäärä 02481 Vins et alcools Chevalier Buchanan, Steven 04-07-1996 10249 Toms Spezialitäten Suyama, Michael 05-07-1996 10250 Hanari Carnes Peacock, Margaret 08-07-1996 10251 Victuailles en stock Leverling, Janet 08-07-1996 10252 Suprêmes délices Peacock, Margaret 09-07-1996 10253 Hanari Carnes Leverling, Janet 10-07-1996 10254 Chop-suey Chinese Buchanan, Steven 11-07-1996... Joka rivi on kyllä pitempi, mutta kalvolla ei ole tilaa
Huomaamme tuloksena tulevat kaikki taulun rivit myös kaikki sarakkeet merkkimuotoinen tieto tasattu kentän vasempaan laitaan numeerinen tieto tasattu oikeaan laitaan tietokanta määrittelee itse sarakkeiden järjestyksen
SELECT FROM Asiakas, Tilaustunnus, Tilauspäivämäärä tilaukset; Asiakas Tilaustunnus Tilauspäivämäärä Vins et alcools Chevalier 10248 04-07-1996 Toms Spezialitäten 10249 05-07-1996 Hanari Carnes 10250 08-07-1996 Victuailles en stock 10251 08-07-1996 Suprêmes délices 10252 09-07-1996 Hanari Carnes 10253 10-07-1996 Chop-suey Chinese 10254 11-07-1996 Richter Supermarkt 10255 12-07-1996 Wellington Importadora 10256 15-07-1996....
SELECT FROM Asiakas, Tilaustunnus, Tilauspäivämäärä tilaukset; Halutut sarakkeet luetellaan SELECT-sanan jälkeen vain halutut sarakkeet luetellaan vain luetellut tulevat tulokseen kirjoitusjärjestys = niiden järjestys tuloksessa nimet erotetaan pilkulla pienten tai suurien kirjainten käyttö ei vaikuta tulokseen
SELECT FROM Tilauspäivämäärä tilaukset; Tilauspäivämäärä 04-07-1996 05-07-1996 08-07-1996 08-07-1996 09-07-1996 10-07-1996 11-07-1996
SELECT FROM DISTINCT Tilauspäivämäärä tilaukset; Tilauspäivämäärä 04-07-1996 05-07-1996 08-07-1996 09-07-1996 10-07-1996 11-07-1996 12-07-1996 15-07-1996
Mistä tiedot tulevat? tietokannoista,joiden luonnista puhutaan myöhemmin Onko muunlaista SQL:ä? Upotettu SQL on jonkin ohjelmointikielen laajennus Palauttavatko allaolevat kyselyt eri tuloksen: SELECT * FROM TILAUKSET; select * from tilaukset;
Mikä vikana allaolevissa: SELECT * SELECT * FROM tilaukset SELECT tilaustunnus tilauspäivämäärä from tilaukset; Mitkä allaolevista toimivat: SELECT * FROM tilaukset; SELECT * FROM tilaukset; SELECT * FROM tilaukset
Mirror cracked from side to side Doom has come upon me, cried The lady of Shalott