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