HELIA 1 (72) Luento: SQL Johdanto Sql:ään... 2 Sql-komentojen kirjoittaminen... 3 Backus Naur Form, BNF... 5 Tietojen käsittely (Data Manipulation)... 6 Yksinkertaisia kyselyjä... 7 Distinct-määre... 9 Rivien valinta eli WHERE ehto... 11 Lajittelu (Order By)... 20 SQL operaatioita ja funktioita... 22 Koostefunktiot (Aggregate Functions)... 24 Ryhmittely (GROUP BY)... 27 HAVING - määre... 29 LIITOS eli Monen taulukon kyselyt (JOIN)... 31 Karteesinen tulo... 37 Ulkoliitos (Outer join)... 38 Alikyselyt (subqueries)... 43 ANY ja ALL... 46 EXISTS ja NOT EXISTS... 48 Yhdiste (union), Leikkaus (intersect), Erotus (except)... 49 Tietokannan datan muokkaus... 53 Lisäys, INSERT... 53 Päivitys, UPDATE... 58 Poisto, DELETE... 59 TIEDON MÄÄRITTELY (Data Definition)... 60 Tietotyypit... 61 Tietokannan luonti... 66 Tietokannan poisto... 67 Taulun luonti (Create Table... 68 Taulun poistaminen (Drop Table)... 70 Näkymän luonti (Create View)... 71 Indeksin luonti (Create Index)... 72
HELIA 2 (72) Johdanto Sql:ään SQL on ensimmäinen ja ainoa laajasti hyväksytty tietokantakieli ISO:n (International Standards Organization) ja ANSI:n (American National Standards Institute) hyväksymä kieli 1. SQL89 2. SQL92 3. SQL99 SQL:ssä on 2 pääkomponenttia: Tiedon määrittelykieli (Data Definition Language = DDL) Tietokantarakenteen määrittelyyn Tiedon käsittelykieli (Data Manipulation Language = DML) Tiedon hakuun ja päivittämiseen SQL:ää voidaan käyttää kahdella tavalla: 1. Interaktiivisesti työasemalta 2. Upotettuna proseduraaliseen kieleen
HELIA 3 (72) Sql-komentojen kirjoittaminen SQL-lauseet muodostuvat seuraavista osista: Varatut sanat Kirjoitettava ja käytettävä tiukan säännön mukaan Kirjoitetaan yleensä isoilla kijaimilla (pienetkin menevät kääntäjästä läpi) Käyttäjän määrittelemät sanat Yleisesti ottaen voidaan kirjoittaa isoilla tai pienillä kirjaimilla Dataa käsiteltäessä on kirjaimet kirjoitettava isoilla tai pienillä sen mukaan, mitä ne todellisuudessa ovat eli miten ne on talletettu tietokantaan esim. sukunimi = SMITH
HELIA 4 (72) Vaikka lauseiden kirjoittaminen on varsin vapaata, suositellaan seuraavien ohjeiden noudattamista: Kukin määre lauseessa (clause) pitäisi alkaa uudelta riviltä kukin määre lauseessa samalla linjalla Esim. SELECT sno, fname, lname,position FROM staff WHERE position = Manager ; jos määre sisältää useita osia, käytetään sisennystä, jotta määreen merkitys tulisi paremmin näkyviin Esim. SELECT sno, fname, lname, position, bno FROM staff WHERE position = Manager ;
HELIA 5 (72) Backus Naur Form, BNF SQL-syntaksin kuvauksessa käytetty kuvauskieli: ISOJA KIRJAIMIA käytetään esittämään varattuja sanoja ja ne on kirjoitettava määrämuotoisina Pieniä kirjaimia käytetään ilmaisemaan käyttäjän määrittämiä sanoja Pystyviiva tarkoittaa valintaa vaihtoehtojen välillä; Esim. a b c a tai b tai c Aaltosulut tarkoittavat vaadittua elementtiä; Esim. {a} Hakasulut tarkoittavat vapaavalintaista elementtiä; Esim. [a] Kolme peräkkäistä pistettä (...) tarkoittavat valinnaista toistoa 0 tai useamman kerran; Esim. {a b}[,c...]
HELIA 6 (72) Tietojen käsittely (Data Manipulation) DML-käskyt SELECT INSERT UPDATE DELETE tietokannan kysely tiedon lisäys tiedon päivitys tiedon tuhoaminen Literaalit ovat SQL:ssä käytettäviä vakioita Niitä erotetaan tässä kaksi päätyyppiä: Yksinkertaisissa lainausmerkeissä olevat ( ) Ei-numeeriset arvot ilmoitetaan näin, esim. Manager Päivämäärät esim. 2000-09-20 Ilman lainausmerkkejä olevat Numeeriset arvot ilmoitetaan näin, esim. 45
HELIA 7 (72) Yksinkertaisia kyselyjä Lauseen SELECT tehtävänä on etsiä ja näyttää tietoa yhdestä tai useammasta tietokannan taulusta Lauseen SELECT yleinen muoto on seuraava: SELECT [DISTINCT ALL] {* [column_expression [AS new_name]] [,...]} FROM table_name [alias] [,...] [WHERE condition] [GROUP BY comlumn_list] [HAVING condition] [ORDER BY column_list] select- lauseen järjestys: FROM WHERE GROUP BY HAVING määräätään taulukot, joita käytetään määrätään ehdon täyttävät rivit ryhmitellään edellinen tulos ryhmien valinta ehdon mukaan SELECT määrätään sarakkeet, jotka valitaan ORDER BY lajittelu
HELIA 8 (72) Esim. Kaikki sarakkeet, kaikki rivit. Listaa kaikkien henkilöiden kaikki tiedot. tai SELECT sno, fname, lname, address, tel_no, position, sex, dob, salary, nin, bno FROM staff; SELECT * FROM staff; sno fname lname address tel_no position sex dob salary nin bno SL21 SG37 SG14 SA9 SG5 SL41 John Ann David Mary Susan Julie White Beech Ford Howe Brand Lee...... Manager Snr Asst Deputy Assistant Manager Assistent M F M F F F... 30000.00 12000.00 18000.00 9000.00 24000.00 9000.00... B5 B3 B3 B7 B3 B5 Esim. Tietyt sarakkeet, kaikki rivit (vrt. PROJEKTIO) Listaa kaikkien henkilöiden numerot, nimet ja palkat. SELECT sno, fname, lname, salary FROM staff; sno SL21 SG37 SG14 SA9 SG5 SL41 fname John Ann David Mary Susan Julie lname White Beech Ford Howe Brand Lee salary 30000.00 12000.00 18000.00 9000.00 24000.00 9000.00
HELIA 9 (72) Distinct-määre DISTINCT sarake ==> valitaan vain yksi rivi yhtä sarakkeen arvoa kohti (dublikaatit jää pois) DISTINCT:N vastakohta on ALL, joka toimii oletuksena. Ei siis tarvitse kirjoittaa. Esim. Hae kaikki vuokrattavien kohteiden numerot, joilla on ollut näyttö ratkaisu 1: SELECT pno FROM viewing; ratkaisu 2: ==> Tulos pno PA14 PG4 PG4 PA14 PG36 SELECT DISTINCT pno ==> Tulos FROM viewing; pno PA14 PG4 PG36
HELIA 10 (72) Esim. Lasketut kentät Tuota lista henkilöiden numeroista, nimistä ja palkoista siten, että henkilön palkka tulostetaan kukkausipalkkana SELECT sno, fname, lname, salary/12 FROM staff; sno fname lname col4 SL21 SG37 SG14 SA9 SG5 SL41 John Ann David Mary Susan Julie White Beech Ford Howe Brand Lee 2500.00 1000.00 1500.00 750.00 2000.00 750.00 tai SELECT sno, fname, lname, salary/12 AS monthly_salary FROM staff; Kentän uusi nimi kerrotaan siis varatun sanan AS jälkeen sno fname lname Monthly_salary SL21 SG37 SG14 SA9 SG5 SL41 John Ann David Mary Susan Julie White Beech Ford Howe Brand Lee 2500.00 1000.00 1500.00 750.00 2000.00 750.00
HELIA 11 (72) Rivien valinta eli WHERE ehto A) Vertailu (comparison): vertaa lauseketta toiseen vertauluoperaattorit: =, <, >, <=, >= <> (erisuuruus ISO standardi),!= (erisuuruus ei ISO) Esim. Listaa kaikki henkilöt, joiden palkka on suurempi kuin 10 000. SELECT sno, fname, lname, salary FROM staff WHERE salary > 10000; sno fname lname salary SL21 SG37 SG14 SG5 John Ann David Susan White Beech Ford Brand 30000.00 12000.00 18000.00 24000.00
HELIA 12 (72) B) Loogiset operaattorit: OR, AND, NOT lausekkeen evaluointi vasemmalta oikealla suluissa oleva evaluoidaan ensin operaatoreiden prioriteettijärjestys: NOT, AND ja OR Esim. Tulosta henkilönumerot henkilöiltä, joiden nimi on John White SELECT sno FROM staff WHERE fname = John AND lname = White ; sno SL21
HELIA 13 (72) Esim. Listaa sellaisten haarakonttoreiden osoitteet, jotka sijaitsevat Lontoossa tai Glasgow:ssa. SELECT bno, street, area, city, pcode FROM branch WHERE city = London OR city = Glasgow ; Bno Street Area City Pcode B5 B3 B2 22m Deer Rd 163 Main St 56 Clover Dr Sidcup Patrick London Glasgow London SW1 4EH G11 0QX NW10 6EU
HELIA 14 (72) C) Arvoväli (range): testaa kuluuko lausekkeen arvo tiettyjen arvojen väliin BETWEEN tai NOT BETWEEN Esim. Listaa sellaisten henkilöiden tiedot, joiden palkka on välillä 20 000 30 000 SELECT sno, fname, lname, position, salary FROM staff WHERE salary BETWEEN 20000 AND 30000; sno fname lname position salary SL21 SG5 John Susan White Brand Manager Manager 30000.00 24000.00 tai SELECT sno, fname, lname, position, salary FROM staff WHERE salary >=20000 AND salary <=30000;
HELIA 15 (72) D) Joukko (set membership): testaa kuuluuko lausekkeen arvo johonkin arvojoukkoon IN tai NOT IN Esim. Listaa kaikki managerit ja deputyt. SELECT sno, fname, lname, position FROM staff WHERE position IN ( Manager, Deputy ); sno fname lname position SL21 SG14 SG5 John David Susan White Ford Brand Manager Deputy Manager tai SELECT sno, fname, lname, position FROM staff WHERE position = Manager OR position= Deputy ;
HELIA 16 (72) E) Kaava (pattern match): testaa noudattaako merkkijono tiettyä kaavaa LIKE tai NOT LIKE % tarkoitta mitä tahansa merkkijonoa tarkoittaa mitä tahansa merkkiä Esimerkkejä sarake LIKE H% sarake LIKE H---- sarake LIKE %e sarake NOT LIKE H% sarakkeen arvo alkaa H:lla, loput mitä tahansa sarakkeen arvo alkaa H:lla ja sitä pitää seurata 4 merkkiä mikä tahansa merkkijono, jonka pituus on vähintään 1 ja joka päättyy kirjaimeen e sarkkeen arvo ei saa alkaa H:lla sarake 15#% ESCAPE # sarakkeen arvo 15%
HELIA 17 (72) Esim. Etsi kaikki henkilöt, joiden osoitekentässä on Glasgow -merkkijono SELECT sno, fname, lname,address FROM staff WHERE address LIKE %Glasgow% ; sno fname lname address SG37 SG14 SG5 Ann David Susan Beech Ford Brand 81 George St,Glasgow PA1 2JR 63 Ashby St, Patrick,Glasgow G11 5 Gt Western Rd,Glasgow G12
HELIA 18 (72) F) Tyhjä (Null): testaa onko sarakkeen arvo tyhjä IS NULL tai IS NOT NULL Esim. Etsi sellaisten näyttöjen katsojien numerot, kohteiden numerot ja päivämäärät, joissa ei ole kommentteja SELECT rno, pno, date FROM viewing WHERE comment IS NULL; rno CR56 CR56 pno PG4 PG36 date 26-May-95 28-Apr-95
HELIA 19 (72) PÄIVÄMÄÄRÄSTÄ Päivämäärille on olemassa tyypit Date Timestamp pelkkä päivämäärä päivämäärä ja aika Tiedot talletetaan muodossa yyyy-mm-dd Jos päiväyksestä halutaan saada erikseen esim. vuosi käytetään extract funktiota Esim. SELECT EXTRACT (YEAR FROM date) FROM viewing WHERE comment IS NULL; Samoin toimivat päivä (DAY) ja kuukausi (MONTH)
HELIA 20 (72) Lajittelu (Order By) lajittelu perustuu sarakkeiden nimiin ORDER BY -sivulauseeseen liitetään sarakkeiden nimet, joiden mukaan lajitellaan lajittelu voi olla nouseva (ASCENDING, ASC, oletus) tai laskeva (DESCENDING, DESC) Jos lajittelusarakkeita useita, erotetaan ne toisistaan pilkulla Esim. Listaa henkilöstö aakkosjärjestyksessä nimen mukaan SELECT sno, fname, lname, salary FROM staff ORDER BY lname, fname; sno fname lname salary SG37 SG5 SG14 SA9 SL41 SL21 Ann Susan David Mary Julie John Beech Brand Ford Howe Lee White 12000.00 24000.00 18000.00 9000.00 9000.00 30000.00
HELIA 21 (72) Esim. Listaa vuokrattavat huoneiston tyypin mukaisessa järjestyksessä SELECT pno, type, rooms, rent FROM property_for_rent ORDER BY type; Pno Type Rooms Rent PL94 PG4 PG36 PG16 PA14 PG21 Flat Flat Flat Flat House House 4 3 3 4 6 5 400 350 375 450 650 600 Esim. Listaa vuokrattavat huoneiston tyypin mukaisessa järjestyksessä siten, että kalleimmat ensin SELECT pno, type, rooms, rent FROM property_for_rent ORDER BY type, rent DESC; Pno Type Rooms Rent PG16 PL94 PG36 PG4 PA14 PG21 Flat Flat Flat Flat House House 4 4 3 3 6 5 450 400 375 350 650 600
HELIA 22 (72) SQL operaatioita ja funktioita Katenoi kaksi merkki-, tai bittijonoa Esim. fname lname UPPER LOWER muuttaa pienet kirjaimet suuriksi muuttaa suuret kirjaimet pieniksi CHAR_LENGTH palauttaa merkkijonon pituuden Esim. CHAR_LENGTH( Beech ) palauttaa 5 SUBSTRING POSITION TRIM palauttaa osajonon merkkijonosta Esim. SUBSTRING( Beech FROM 1 to 3) palauttaa merkkijonon Bee palauttaa merkkijonon position toisesta merkkijonosta Esim. POSITION ( ee IN Beech ) palauttaa 2 poistaa merkkijonosta johtavat (LEADING), lopettavat (TRAILING) tai molemmat merkit Esim. TRIM (BOTH * FROM *** Hello World *** ) palauttaa merkkijonon Hello World CAST konvertoi lausekkeen arvon toisen tyyppiseksi Esim. CAST(5E3 AS INTEGER)
HELIA 23 (72) CURRENT_DATE palauttaa nykyisen päivämäärän CURRENT_TIME palauttaa nykyisen ajanhetken Esim. CURRENT_TIME(2) palauttaa ajan sadasosasekunnin tarkkuudella CURRENT_TIME_STAMP palauttaa nykyisen päivämäärän ja ajan Esim. CURRENT_TIME_STAMP(0) palauttaa päivämäärän ja ajan sekunnin tarkkuudella EXTRACT palauttaa ajan tai jakson osan Esim. EXTRACT (YEAR FROM staff.dob) CURRENT_USER tai USER SESSION_USER SYSTEM_USER palauttaa nykyisen käyttäjän tunnuksen palauttaa istunnon hallitsijan tunnuksen palauttaa systeemikäyttäjän tunnuksen CASE palauttaa arvon esimerkiksi seuraavasti CASE type WHEN House THEN 1 WHEN Flat THEN 2 ELSE 0 END
HELIA 24 (72) Koostefunktiot (Aggregate Functions) ISO:n standardissa määritellään 5 ryhmäfunktiota COUNT: palauttaa valitun sarakkeen arvojen lukumäärän SUM: palauttaa valitun sarakkeen summan AVG: palauttaa valitun sarakkeen arvojen keskiarvon MIN: palauttaa valitun sarakkeen pienimmän arvon MAX: palauttaa valitun sarakkeen suurimman arvon
HELIA 25 (72) Esim. Kuinka monen vuokrattavan vuokra on enemmän kuin 350? SELECT COUNT(*) AS Lukumäärä FROM property_for_rent WHERE rent > 350; Lukumäärä 5 Esim. Montako eri vuokrattavaa näytettiin toukokuussa 1995? SELECT COUNT (DISTINCT pno) AS Lukumäärä FROM viewing WHERE date BETWEEN 1-May-95 AND 31-May-95 ; Lukumäärä 2
HELIA 26 (72) Esim. Laske kaikkien managerien lukumäärä ja palkkojen summa. SELECT Count (sno) AS lkm, SUM (salary) AS summa FROM staff WHERE position = Manager ; lkm 2 summa 54000.00 Esim. Etsi pienin ja suurin palkka sekä palkkojen keskiarvo. SELECT MIN(salary) AS pienin, MAX(salary) AS suurin, AVG(salary) AS keskiarvo FROM staff; pienin 9000.00 suurin 30000.00 keskiarvo 17000.00 Huomaa, että koostefunktioita käyttäessäsi, et voi tulostaa taulun varsinaisia kenttiä. (Paitsi, jos käytät GROUP BY:ta)
HELIA 27 (72) Ryhmittely (GROUP BY) ryhmittelee valitut rivit ja tuottaa jokaisesta ryhmästä yhden rivin SÄÄNTÖ: select-lause voi sisältää niitä sarakkeita, jotka esiintyvät myös GROUP BYmääreessä koostefunktioita vakioita lausekkeen, joka sisältää edellisten kombinaatioita ISO-STANDARDI: jos kahdella rivillä on ryhmittelysarakkeen arvo NULL ==> rivit joutuvat samaan ryhmään
HELIA 28 (72) Esim. Laske jokaisen haarakonttorin työntekijät ja palkkojen summa haarakonttoreittain SELECT bno, COUNT (sno) AS lkm, SUM(salary) AS summa FROM sfaff GROUP BY bno; Mitä tapahtuu: ryhmitellään valitut sarakkeet ja rivit bno:n mukaan järjestykseen ==> lasketaan lukumäärä ja summa ryhmittäin bno sno salary COUNT(sno) SUM(salary) B5 SL21 30000.00 2 39000.00 B5 SL41 9000.00 B3 SG37 12000.00 B3 SG14 18000.00 3 54000.00 B3 SG5 24000.00 B7 SA9 9000.00 1 9000.00 ==> bno B5 B3 B7 lkm 2 3 1 summa 39000.00 54000.00 9000.00
HELIA 29 (72) HAVING - määre asettaa ehdon ryhmien valintaan eli valitaan siis HAVINGehdon täyttävät ryhmät ISO-STANDARDI: sarakkeet, jotka esiintyvät HAVINGehdossa, täytyy esiintyä GROUP BYmääreessä tai olla koostefunktion parametrina Esim. Laske sellaisten haarakonttorien työntekijät ja palkkojen summat, joilla on työntekijöitä enemmän kuin yksi. SELECT bno, COUNT(sno) AS lkm, SUM(salary) AS summa FROM staff GROUP BY bno HAVING COUNT (sno) > 1; bno B5 B3 lkm 2 3 summa 39000.00 54000.00
HELIA 30 (72) WHERE VS. HAVING HAVING osuutta ei voi käyttää ilman GROUP BY osuutta WHERE osuuteen tulevat ehdot kohdistuvat kuhunkin riviin HAVING osuuden ehdot kohdistuvat ryhmiin ts. millaisia ryhmiä muodostetaan. HAVING osuutta tarvitaan yleensä vain silloin, kun tarvitaan ehtoon joku kooste
HELIA 31 (72) LIITOS eli Monen taulukon kyselyt (JOIN) A) JOIN-operaatio Esim: Listaa sellaisten vuorkaajien nimet, joille on näytetty vähintään yksi vuokrattavana oleva kohde. SQL-89: viittaus renterin sarakeeseen rno SELECT r.rno, fname, lname, pno, comment FROM renter r, viewing v WHERE r.rno = v.rno; tauluille annettu aliasnimet: renter = r viewing = v rno fname lname pno comment viittaus renterin sarakeeseen rno ja viewingin sarakkeeseen rno CR76 CR56 CR56 CR56 CR62 John Aline Aline Aline Mary Kay Stewart Stewart Stewart Tregear PG4 PG36 PA14 PG4 PA14 too remote too small no dining room
HELIA 32 (72) SQL-92 JOIN OPERAATIOT: SELECT r.rno, fname, lname, pno, comment FROM renter r JOIN viewing v ON r.rno = v.rno; SELECT rno, fname, lname, pno, comment FROM renter JOIN viewing USING rno; SELECT rno, fname, lname, pno, comment FROM renter NATURAL JOIN viewing;
HELIA 33 (72) Esim. Listaa jokaisen haarakonttorin työntekijät, joilla on hoidettavanaan vuokrattava kohde. SQL-89: SQL-92: SELECT s.bno, s.sno, fname, lname, pno FROM staff s, property_for_rent p WHERE s.sno = p.sno; SELECT s.bno, s.sno, fname, lname, pno FROM staff s JOIN property_for_rent p ON s.sno=p.sno; SELECT staff.bno, sno, fname, lname, pno FROM staff JOIN property_for_rent USING sno; SELECT staff.bno, sno, fname, lname, pno FROM staff NATURAL JOIN property_for_rent; bno sno fname lname pno B3 B3 B3 B3 B7 B5 SG37 SG37 SG14 SG14 SA9 SL41 Ann Ann David David Mary Julie Beech Beech Ford Ford Howe Lee PG21 PG36 PG4 PG16 PA14 PL94
HELIA 34 (72) Esim. Listaa jokaisen haarakonttorin työntekijät, joilla on hoidettavanaan vuokrattava kohde listausjärjestys haarakontteittain, työntekijöittäin ja kohteittain. SQL-89: SQL-92: SELECT s.bno, s.sno, fname, lname, pno FROM staff s, property_for_rent p WHERE s.sno = p.sno ORDER BY s.bno, s.sno, pno; SELECT s.bno, s.sno, fname, lname, pno FROM staff s JOIN property_for_rent p ON s.sno=p.sno ORDER BY s.bno, s.sno, pno; SELECT staff.bno, sno, fname, lname, pno FROM staff JOIN property_for_rent USING sno ORDER BY staff.bno, sno, pno; bno sno fname lname pno B3 B3 B3 B3 B5 B7 SG14 SG14 SG37 SG37 SL41 SA9 David David Ann Ann Mary Julie Ford Ford Beech Beech Howe Lee PG4 PG16 PG21 PG36 PL94 PA14
HELIA 35 (72) Esim. Kolmen taulukon liitos: SQL-89: SQL-92: Listaa jokaisen haarakonttorin työntekijät, joilla on hoidettavanaan vuokrattava kohde listausjärjestys haarakontteittain, työntekijöittäin ja kohteittain. Listaa haarakonttorin lisäksi haarakonttorin kaupunki. SELECT b.bno, b.city, s.sno, fname, lname, pno FROM branch b, staff s, property_for_rent p WHERE b.bno = s.bno AND s.sno = p.sno ORDER BY b.bno, s.sno, pno; SELECT b.bno, b.city, s.sno, fname, lname, pno FROM branch b JOIN staff s ON b.bno=s.bno JOIN property_for_rent p ON s.sno=p.sno ORDER BY b.bno, s.sno, pno; SELECT bno, b.city, sno, fname, lname, pno FROM branch b JOIN staff s USING bno JOIN property_for_rent USING sno ORDER BY bno, sno, pno; bno city sno fname lname pno B3 B3 B3 B3 B5 B7 Glasgow Glasgow Glasgow Glasgow London Aberdeen SG14 SG14 SG37 SG37 SL41 SA9 David David Ann Ann Mary Julie Ford Ford Beech Beech Howe Lee PG4 PG16 PG21 PG36 PL94 PA14 Esim: Laske jokaisen haarakonttorin työntekijöittäin
HELIA 36 (72) SQL-89: vuokrattavana olevat kohteet. SELECT s.bno, s.sno, COUNT (*) as lkm FROM staff s, property_for_rent p WHERE s.sno=p.sno GROUP BY s.bno, s.sno ORDER BY s.bno, s.sno bno B3 B3 B5 B7 sno SG14 SG37 SL41 SA9 lkm 2 2 1 1 SQL-92: SELECT s.bno, s.sno, COUNT (*) as lkm FROM staff s JOIN property_for_rent p ON s.sno=p.sno GROUP BY s.bno, s.sno ORDER BY s.bno, s.sno; SELECT s.bno, sno, COUNT (*) as lkm FROM staff s JOIN property_for_rent USING sno GROUP BY s.bno, sno ORDER by s.bno, sno;
HELIA 37 (72) Karteesinen tulo SELECT [DISTINCT ALL] {* column_list } FROM table_name1 CROSS JOIN table_name2; SELECT [DISTINCT ALL] {* column_list } FROM table_name1, table_name2; Liitoksen tuottaminen: 1. Tee ensin karteesinen tulo 2. Jos lauseessa on WHERE-määre, poista kaikki ne rivit jotka eivät toteuta where-ehtoa 3. Jätä vain lauseessa luetellut sarakkeet 4. Jos SELECT DISTINCT on määritelty, poista duplikaatit 5. Jos lause sisältää ORDER BY-määreen, lajittele taulukko
HELIA 38 (72) Ulkoliitos (Outer join) Esim. BRANCH PROPERTY_FOR_RENT bno bcity pno pcity B3 B4 B2 Glasgow Bristol London PA14 PL94 PG4 Aberdeen London Glasgow (Sisä)liitos: Esim: Listaa sellaisista haarakonttoreista, jotka sijaitsevat samassa kaupungissa kuin vuokrattana oleva kohde, osastonumero ja kaupunki sekä vuokrattavasta kohteesta kohdenumero ja sijaintikaupunki. SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch b JOIN property_for_rent ON b.bcity = p.pcity; bno bcity pno pcity B3 B2 Glasgow London PG4 PL94 Glasgow London
HELIA 39 (72) VASEMMANPUOLEINEN ULKOLIITOS (left outer join) Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotka sijaitsevat samassa kaupungissa. Listaa myös sellaiset haarakonttorit, joiden kaupungissa ei ole kohdetta. SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch b LEFT JOIN property_for_rent p ON b.bcity=p.pcity; bno bcity pno pcity B3 B4 B2 Glasgow Bristol London PG4 null PL94 Glasgow null London FROM lauseen VASEMMAN puoleisen taulun kaupungin mukaan tehdään vertailu. Jos oikean puoleisesta ei löydy sopivaa, tulostetaan se sarakkeisiin null.
HELIA 40 (72) OIKEANPUOLEINEN ULKOLIITOS (right outer join) Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotka sijaitsevat samassa kaupungissa. Listaa myös sellaiset vuokrattavat kohteet, joiden kaupungissa ei ole haarakonttoria. SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch b RIGHT JOIN property_for_rent p ON b.bcity=p.pcity; bno bcity pno pcity null B3 B2 null Glasgow London PA14 PG4 PL94 Aberdeen Glasgow London FROM lauseen OIKEAN puoleisen taulun kaupungin mukaan tehdään vertailu. Jos vasemman puoleisesta ei löydy sopivaa, tulostetaan sen sarakkeisiin null.
HELIA 41 (72) MOLEMMINPUOLEINEN ULKOLIITOS (Full outer join) Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotka sijaitsevat samassa kaupungissa. Listaa myös sellaiset haarakonttorit, joiden kaupungissa ei ole kohdetta sekä vuokrattavat, joiden kaupungissa ei ole haarakonttoria. SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch1 b FULL JOIN property_for_rent1 p ON b.bcity=p.pcity; bno bcity pno pcity null B3 B4 B2 null Glasgow Bristol London PA14 PG4 null PL94 Aberdeen Glasgow null London Kummalta puolelta tahansa voi sopiva rivi puuttua.
HELIA 42 (72) Olennaisesti ulkoliitokset koostuvat kahdesta kyselystä 1. Listaa haarakonttorit ja vuokrattavat kohteet, jotka sijaitsevat samassa kaupungissa. 2. Listaa myös sellaiset vuokrattavat, joiden kaupungissa ei ole haarakonttoria. Voidaan käyttää UNION operaatiota kts. vähän myöhemmin materiaalissa. (SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch b, property_for_rent p WHERE b.bcity = p.pcity) UNION (SELECT,, p.pno, p.pcity FROM branch b, property_for_rent p WHERE p.pcity NOT IN (SELECT b.bcity FROM branch b)) ; Epästandardin mukainen ulkoliitos (Ei toimi Solidissa, eikä saa käyttää kokeessa) Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotka sijaitsevat samassa kaupungissa. Listaa myös sellaiset vuokrattavat, joiden kaupungissa ei ole haarakonttoria. SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch b, property_for_rent p WHERE + b.bcity = p.pcity ;
HELIA 43 (72) Alikyselyt (subqueries) SELECT, INSERT, UPDATE ja DELETE-lauseet voivat sisältää sisäkkäisen SELECT-lauseen sisäkkäisen SELECT_lauseen tulosta käytetään ulkoisessa lauseessa taulukkona/kohteena alikysely ympäröidään suluilla ( ) sääntöjä: 1. ORDER BY-määrettä ei saa käyttää alikyselyssä (ulkoisessa lausessaa kyllä) 2. alikysely voi sisältää vain yhden sarakkeen tai yhden lausekkeen, paitsi silloin kun käytetään EXISTSavainsanaa 3. alikyselyn tulee olla vertailun oikealla puolella
HELIA 44 (72) Esim. Listaa henkilöt, jotka ovat töissä 163 Main St sijaitsevassa haarakonttorissa. SELECT sno, fname, lname, position FROM staff WHERE bno = (SELECT bno FROM branch WHERE address= 163 Main St ); sno fname lname position SG37 SG14 SG5 Ann David Susan Beech Ford Brand Snr Asst Deputy Manager Esim. Listaa henkilöt, joiden palkka on korkeampi kuin kaikkien työntekijöiden keskiarvo. SELECT sno, fname, lname, position, salary FROM staff WHERE salary > (SELECT AVG(salary) FROM; staff); sno fname lname position salary SL21 SG14 SG5 John David Susan White Ford Brand Manager Deputy Manager 30000.00 18000.00 24000.00
HELIA 45 (72) Jos on alikysely voi palauttaa enemmän kuin yhden rivin, ei voida käyttää >, <, = operaatioita. IN-operaatiota voidaan käyttää. Esim. Listaa vuokrattavat kohteet, joiden vuokrauksen hoitaa henkilöt, jotka työskentelevät 163 Main St :n haarakonttorissa. SELECT pno, street, area, city,pcode, type, rooms, rent FROM property_for_rent WHERE sno IN (SELECT sno FROM staff WHERE bno = (SELECT bno FROM branch WHERE street = 163 Main St )); pno street area city pcode type rooms rent PG4 PG36 PG21 PG16 6 Lawrence St 2 Monor Rd 18 Dale Rd 5 Novar Dr Patrick Hyndlan Hyndlan Glasgow Glasgow Glasgow Glasgow G11 0QX G32 4QX G12 G12 9AX Flat Flat House Flat 3 3 5 4 350 375 600 450
HELIA 46 (72) ANY ja ALL käytetään alikyselyissä, jotka palauttavat vain yhden sarakkeen arvot ALL: kaikki alikyselyn rivit täyttävät ehdon tai jos alikyselyn tuottama tulos on tyhjä ==>TRUE ANY tai SOME: jos jokin alikysyelyn rivi täyttää ehdon ==> TRUE
HELIA 47 (72) Esim. Listaa henkilöt, joiden palkka on suurempi kuin yhdenkään haarakonttorin B3 työntekijän. SELECT sno, fname, lname, position, salary FROM staff WHERE salary > ANY (SELECT salary FROM staff WHERE bno= B3 ); sno fname lname position salary SL21 SG14 SG5 John David Susan White Ford Brand Manager Deputy Manager 30000.00 18000.00 24000.00 Esim. Listaa henkilöt, joiden palkka on suurempi kuin jokaisen haarakonttorin B3 työntekijän. SELECT sno, fname, lname, position, salary FROM staff WHERE salary > ALL (SELECT salary FROM staff WHERE bno = B3 ); sno fname lname position salary SL21 John White Manager 30000.00
HELIA 48 (72) EXISTS ja NOT EXISTS EXISTS sopii vain alikyselyn kanssa palauttaa true/false tuloksen Alikyselyssä voi olla miten monta attribuuttia tahansa EXISTS TRUE, jos alikysely tuottaa vähintään yhden rivin EXISTS FALSE, tuloksen jos alikysely tuottaa tyhjän Esim. Listaa kaikki työntekijät, jotka työskentelevät Lontoon haarakonttorissa SELECT sno, fname, lname, position FROM staff s WHERE EXISTS (SELECT * FROM branch b WHERE s.bno = b.bno AND b.city= London ); sno fname lname position SL21 SL41 John Julie White Lee Manager Assistent
HELIA 49 (72) Yhdiste (union), Leikkaus (intersect), Erotus (except) voidaan käyttää vain samarakenteisille taulukoille ISO-standardi: operator [ALL] [ CORRESPONDING [ BY {column1 [,...] }]] jos CORRESPONDING BY -määre on lauseessa ==> operaatio tehdään määreen perässä olevien sarakkeiden perusteella jos ALL-määre on lauseessa ==> taataan, että kaikki mahdolliset rivit tulevat mukaan oletuksena kaikki duplikaattirivit poistetaan
HELIA 50 (72) Esim. YHDISTE (UNION) Tuota lista alueista, joissa sijaitsee joko haarakonttori tai vuokrattava kohde. (SELECT area FROM branch WHERE area IS NOT NULL) UNION (SELECT area FROM property_for_rent WHERE area IS NOT NULL); area Sidcup Dyce Patrick Leigh Dee Kilburn Hyndland tai (SELECT * FROM branch WHERE area IS NOT NULL) UNION CORRESPONDING BY area (SELECT * FROM property_for_rent WHERE area IS NOT NULL); area Sidcup Dyce Patrick Leigh Dee Kilburn Hyndland
HELIA 51 (72) Esim. LEIKKAUS (INTERSECT) Tuota lista kaupungeista, joissa sijaitsee sekä haarakonttori että vuokrattava. (SELECT city FROM branch) INTERSECT city Aberdeen Glasgow London (SELECT city FROM property_for_rent); tai (SELECT * FROM branch) INTERSECT CORRESPONDING BY city (SELECT * FROM property_for_rent); city London Aberdeen Glasgow
HELIA 52 (72) Esim. EROTUS (EXCEPT) Listaa kaupungit, joissa on haarakonttori, mutta ei ole vuorattavia. (SELECT city FROM branch ) EXCEPT city Bristol (SELECT city FROM property_for_rent); tai (SELECT * FROM branch) EXCEPT CORRESPONDING BY city (SELECT * FROM property_for_rent); city Bristol
HELIA 53 (72) Tietokannan datan muokkaus INSERT rivien lisäys taulukkoon UPDATE olemassa olevan tiedon päivitys DELETE taulukon rivien poisto Lisäys, INSERT kahdenlaisia lisäyksiä a) sallii yhden rivin lisäämisen nimettyyn tauluun b) useamman rivin kopiointi taulusta toiseen
HELIA 54 (72) a) Yhden rivin lisäämisen nimettyyn tauluun INSERT INTO table_name [ (column_list) ] VALUES (data_value_list) table_name: joko perustaulu tai näkymä column_list: yksi tai useampi sarakenimi erotettuna pilkulla vaihtoehtoinen data_value_list: jos puuttuu ==> SQL hakee listan CREATE TABLE kuvauksen mukaan jos puuttuu ==> lisättäviä kenttien arvoja on oltava yhtä monta kuin taululla on olemassa kenttiä jos sarakenimiä on ==> puuttuvat sarakkeet alustetaan oletusarvoilla tai NULL-arvoilla sovelluksen koodiin sarakenimet kannattaa aina laittaa listan täytyy olla samanlainen kuin column_list
HELIA 55 (72) arvojen lukumäärä sama järjestys sama arvon kuuluttava ko. sarakkeen arvojoukkoon Esim. Lisää staff-taulukkoon uusi henkilö. INSERT INTO staff VALUES ( SG16, Alan, Brown, 67 Endrick Rd, Glasgow G32 9QX, 0141-211-3001, Assistent, M, DATE 1957-05-25, 8300, WN848391H, B3 );
HELIA 56 (72) Esim. Lisää työntekijä, jonka tiedoista tiedetään vain numero, nimi, asema, sukupuoli, palkka ja haarakonttori. INSERT INTO staff (sno, fname, lname, position, sex, salary, bno) VALUES ( SG44, Anne, Jones, Assistent, F, 8300, B3 );
HELIA 57 (72) b) useamman rivin kopiointi taulusta toiseen INSERT INTO table_name [ (column_list) ] SELECT... Esim. Oletetaan, että on olemassa relaatio staff_prop-count (sno, fname, lname, prop_cnt) Lisää em. tauluun työntekijät ja heidän hoitamiensa vuokrattavien kohteiden lukumäärät. INSERT INTO staff_prop_count (SELECT s.sno, fname, lname, COUNT (*) FROM staff s, property_for_rent p WHERE s.sno=p.sno GROUP BY s.sno, fname, lname) UNION (SELECT sno, fanme, lname, 0 FROM staff WHERE sno NOT IN (SELECT sno FROM property_for_rent)); sno fname lname prop_cnt SL21 SG37 SG14 SA9 SG5 SL41 John Ann David Mary Susan Julie White Beech Ford Howe Brand Lee 0 2 2 1 0 1
HELIA 58 (72) Päivitys, UPDATE UPDATE table_name SET column_name1=data_value1 [,column_name2=data_value2...] [WHERE search_condition]; Jos WHERE-määre esiintyy, päivitetään vain ehdon täyttävät rivit, muuten päivitetään taulukon kaikki rivit Esim. Lisää jokaisen työntekijän palkkaa 3 %:lla. UPDATE staff SET salary = salary * 1.93; Esim. Anna managereille 5 %:n palkankorotus. UPDATE staff SET salary = salary * 1.05 WHERE position = Manager ; Esim. Ylennä David Ford (sno= SG14 ) manageriksi ja vaihda palkka 18000. UPDATE staff SET position= Manager, salary=18000 WHERE sno= SG14 ;
HELIA 59 (72) Poisto, DELETE DELETE FROM table_name [WHERE search_condition]; Jos WHERE-määre esiintyy, poistetaan vain ehdon täyttävät rivit, muuten poistetaan taulukon kaikki rivit Esim. Poista kaikki kohteelle PG4 tapahtuneet näytöt. DELETE FROM viewing WHERE pno= PG4 ; Esim. Poista kaikki näytöt. DELETE FROM viewing;
HELIA 60 (72) TIEDON MÄÄRITTELY (Data Definition) SQL:n TUNNUKSET (SQL Identifiers) Käyttäjän määrittämä tunnus muodostuu merkkijoukosta ISO-standardi hyväksyy seuraavat: Isot kirjaimet (ylärekisteri) A... Z Pienet kirjaimet (alarekisteri) a...z Numerot 0... 9 Alaviiva _ Kun käytetään taulun nimeä tai kenttää, on yhdentekevää kääntäjän kannalta, kirjoitetaanko merkit isolla vai pienellä. (Toisin kuin käytettäessä sarakkeeseen talletettua dataa)
HELIA 61 (72) Tietotyypit A) MERKKI/MERKKIJONO CHAR(n) VARCHAR(n) n:n mittainen merkkijono korkeintaan n:n mittainen merkkijono n välillä [0, 255] merkkijono voi 1) kiinteämittainen Esim. sno CHAR (5) 2) vaihtuvamittainen maksimipituus Esim. address VARCHAR (30)
HELIA 62 (72) B) BITTI/BITTIJONO BIT [VARYING] [pituus] bittijono voi 1) kiinteämittainen Esim. bit_jono BIT (5) 2) vaihtuvamittainen maksimipituus Esim. bit_jono BIT VARYING (30)
HELIA 63 (72) C) TARKKA LUKU DECIMAL[precision [, scale]] INTEGER SMALLINT precision on kentän pituus ja scale on desimaalien lukumäärä kokonaisluku välillä [-2 147 483648, 2 147 483647] kokonaisluku välillä [-32 768, 32 767] Esim. rooms SMALLINT salary DECIMAL (7,2) ==> ylin arvo 99 999.99
HELIA 64 (72) D) LIUKULUKU FLOAT liukuluku välillä [ 5.4x10 79, 7.2x10 75 ] Esim. 10E3 5.2E6 0.2E 4
HELIA 65 (72) E) AIKA DATE TIME [time_precision] [WITH TIME ZONE] kellonaika: tunti, minuutti ja sekuntti TIMESTAMP [time_precision] [WITH TIME ZONE] kalenteriaika + kellonaika time_precision: sekunttien tarkkuus, oletus 0 eli kokonaiset sekunnit
HELIA 66 (72) Tietokannan luonti Vaihtelee tuotteittain CREATE SCHEMA [name AUTHORIZATION creator-identifiter] CREATE DATABASE database_name Esim. CREATE SCHEMA sql_tests AUTHORIZATON Smith;
HELIA 67 (72) Tietokannan poisto DROP SCHEMA name [RESTRICT CASCADE] RESTRICT: tietokannan on oltava tyhjä ennen poistoa (oletus) CASCADE: tyhjyystarkistusta ei ole
HELIA 68 (72) Taulun luonti (Create Table (CREATE TABLE) CREATE TABLE [omistaja.] taulu ( {sarakenimi tietotyyppi [DEFAULT vakio systeemimuuttuja] [NOT NULL] [[CONSTRAINT rnimi] CHECK(sarake-ehto)] [,...] } [,[CONSTRAINT rnimi] PRIMARY KEY (sarakelista)] {[,[CONSTRAINT rnimi] UNIQUE (sarakelista)] [,...]} {[,[CONSTRAINT rnimi] FOREIGN KEY (sarakelista) REFERENCES [omistaja.]perustaulu[(sarakelista)] [ON UPDATE {CASCADE SET NULL SET DEFAULT NO ACTION } ] CASCADE: automaattinen muutos [ON DELETE {CASCADE SET NULL SET DEFAULT NO ACTION } ] [,...] } { [, [CONSTRAINT rnimi] CHECK (riviehto) ] [,...] } )
HELIA 69 (72) Esim. CREATE TABLE property_for_rent ( pno VARCHAR (5) NOT NULL, street VARCHAR (25) NOT NULL, area VARCHAR(15), city VARCHAR(15) NOT NULL, pcode VARCHAR(8), type CHAR(1) NOT NULL DEFAULT F, rooms SMALLINT NOT NULL DEFAULT 4, rent DECIMAL(6,2) NOT NULL DEFAULT 0, ono VARCHAR(5) NOT NULL, sno VARCHAR(5) CONSTRANT staff_not_handling_too_much CHECK (NOT EXISTS (SELECT sno FROM property_for_rent GROUP BY sno HAVING COUNT(*) > 10)), bno VARCHAR(3) NOT NULL, PRIMARY KEY (pno), FOREIGN KEY (sno) REFERENCES staff ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (ono) REFERENCES owner ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY (bno) REFERENCES branch ON DELETE NO ACTION ON UPDATE CASCADE);
HELIA 70 (72) Taulun poistaminen (Drop Table) (DROP TABLE) DROP TABLE table_name [RESTRICT CASCADE ] RESTRICT: CASCADE: poisto vain silloin, jos tauluun ei viitata mistään muusta taulusta poistetaan myös sellaiset rivit, joissa viitataan poistettuun tauluun Esim. DROP TABLE property_for_rent;
HELIA 71 (72) Näkymän luonti (Create View) (CREATE VIEW) Näkymät luodaan perustauluista Näkymä voi kohdistua yhteen tai useampaan tauluun Esim 1 CREATE VIEW pof AS (SELECT pno, street, area city FROM property_for_rent WHERE ono = CO46 ); Esim 2 CREATE VIEW allpersons(nro, etunimi, sukunimi) AS (SELECT sno, fname, lname FROM staff) UNION (SELECT rno, fname, lname FROM renter); Näkymän poisto DROP VIEW allpersons;
HELIA 72 (72) Indeksin luonti (Create Index) (CREATE INDEX) hakemistoja voidaan luodan vain perustauluille CREATE [UNIQUE] INDEX index_name ON table_name (column [ASC DESC] [,...]) unique: hakemistoon ei voi laittaa hakemistokenttien duplikaatteja Esim.pääavaimen mukaisen hakemiston luonnissa käytetään UNIQUE-määrettä CREATE UNIQUE INDEX sno_ind ON staff (sno); CREATE UNIQUE INDEX pno_ind ON property_for_rent (pno); CREATE INDEX rent_ind ON property_for_rent (area,rent); Indeksin poistaminen DROP INDEX rent_ind;