HAAGA-HELIA TIKO - Heti09 1 (22) SQL SQL... 2 Historiaa... 2 Standardit... 3 Käyttö... 4 Sql-komentojen kirjoittaminen... 5 DDL... 7 Tietokantaobjektien määrittely... 7 SQL:n keskeiset tietotyypit... 8 SQL:n keskeiset tietotyypit ja tietokantatuotteet... 9 Eheyssääntöjen määrittely... 10 Syntaksikuvaukset... 13 Backus Naur Form... 13 Taulun luonti... 14 Taulun muuttaminen... 15 Taulun poistaminen... 16 DML... 17 Lisäys, INSERT... 18 Poisto, DELETE... 21 Haku, SELECT... 22
HAAGA-HELIA TIKO - Heti09 2 (22) SQL ~ Structured Query Language ~ Relaatiotietokantojen määrittely- ja käsittelykieli SQL on ensimmäinen ja ainoa laajasti hyväksytty tietokantakieli 1. DDL = Data Definition Language Tietokannan taulujen ja eheyssääntöjen määrittely 2. DML = Data Manipulation Language Tietokannan tietojen haku ja päivitys 3. DCL = Data Control Language Käyttöoikeuksein hallinta ja transaktiokäsittely Historiaa 1970 Codd:n artikkeli relaatiotietokannoista 1974 SEQUEL kyselykieli / IBM 1979 1. kaupallinen SQL-tuote: Relational Software (nyk. Oracle) 1986 1. standardi Nykyään SQL:n sisältäviä relaatiotietokanta- (& sovelluskehitysohjelmistoja) satoja
HAAGA-HELIA TIKO - Heti09 3 (22) Standardit ISOn (International Standards Organization) ja ANSIn (American National Standard Institute) hyväksymä standardi 1. SQL86 - SQL1 uudistettu 1989 2. SQL92 - SQL2 3. SQL99 - SQL3 4. SQL:2003 mm. XML-tuki 5. SQL:2008 Suurin osa nykyisistä tietokannanhallintajärjestelmistä tukee SQL89:ä on toteuttanut osan SQL92 -standardista on toteuttanut osan SQL99 -standardista on toteuttanut standardoimattomia piirteitä eri toimittajien SQL:t eivät välttämättä ole keskenään kokonaan yhteensopivia! suuri osa ymmärtää standardin mukaista SQL:ää (mutta ei sen kaikkia ominaisuuksia)
HAAGA-HELIA TIKO - Heti09 4 (22) Käyttö 1. Itsenäisenä kyselykielenä (interaktiivisesti työasemalta) 2. Toisen ohjelmointikielen täydennyksenä (upotettuna) 3. Osana sovelluskehitysvälinettä DDL - tietokannan luominen ja ylläpito Tietokannan objektien (taulujen ja niihin liittyvien eheyssääntöjen ym. tietokantaobjektien) luominen, muuttaminen & poisto: create-, alter-, drop lauseet DML - tietojen päivitys ja hyödyntäminen 1. Tietojen haku select lause 2. Tietojen päivitys insert-, update-, delete lauseet DCL - käyttöoikeuksien ja transaktioiden hallinta Transaktiokäsittely commit-, rollback lauseet Käyttöoikeuksien hallinta: grant-, revoke-lauseet
HAAGA-HELIA TIKO - Heti09 5 (22) Sql-komentojen kirjoittaminen Varatut sanat kirjoitetaan ja käytetään täsmälleen syntaksin mukaan voidaan kirjoittaa isoilla tai pienillä kirjaimilla (yleensä isoilla kirjaimilla ) Käyttäjän määrittelemät sanat esim. sarakkeiden ja taulujen nimet voidaan kirjoittaa isoilla tai pienillä kirjaimilla (yleensä pienillä kirjaimilla) Dataa käsiteltäessä kirjaimet kirjoitetaan isoilla tai pienillä sen mukaan, miten ne on tallennettu tietokantaan Esim: WHERE sukunimi = SMITH vrt. WHERE sukunimi = 'Smith'
HAAGA-HELIA TIKO - Heti09 6 (22) lauseiden (clause) kirjoittaminen on vapaata, mutta seuraavien ohjeiden noudattamista suositellaan: 1. Kukin määre lauseessa alkaa uudelta riviltä 2. Kukin määre lauseessa samalla linjalla Esim. SELECT sno, fname, lname,position FROM staff WHERE position = Manager ; 3. 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 ;
HAAGA-HELIA TIKO - Heti09 7 (22) DDL Tietokantaobjektien määrittely tietokannan (rakenteiden) luominen ja ylläpito Esim: Create lause CREATE TABLE opettaja (opettajanro INTEGER PRIMARY KEY, etunimi VARCHAR(20) NOT NULL, sukunimi VARCHAR(30) NOT NULL, puhelin CHAR(15), lyhenne CHAR(10) NOT NULL ); Alter lause ALTER TABLE opettaja ADD (syntpvm DATE); ALTER TABLE opettaja ALTER (lyhenne CHAR(6)); Drop lause DROP TABLE opettaja;
HAAGA-HELIA TIKO - Heti09 8 (22) SQL:n keskeiset tietotyypit Merkkijonot CHAR (n) CHARACTER VARCHAR(n) n:n mittainen merkkijono (kiinteämittainen) korkeintaan n:n mittainen merkkijono (vaihtuvamittainen) CHARACTER VARYING n välillä 1..255 SQL:2008 ei ota enää kantaa merkkijonon pituuteen! Esim. hloid CHAR (5) titteli VARCHAR (30) Tarkka luku NUMERIC INTEGER kokonaisluku [-2 147 483648, 2 147 483647] SMALLINTEGER kokonaisluku [-32 768, 32 767] DECIMAL desimaaliluku [pituus[,desimaalin pituus]] Esim. Hloid SMALLINT Palkka DECIMAL (7,2) ==> ylin arvo 99 999.99 Aika DATE TIME [time_precision] [WITH TIME ZONE] TIMESTAMP [time_precision] [WITH TIME ZONE] INTERVAL time_precision Päivämäärä Kellonaika: tunti minuutti ja sekunti Kalenteriaika +kellonaika sekuntien tarkkuus, oletus 0 eli kokonaiset sekunnit Esim. tentti_pvm DATE aloitus_aika TIME
HAAGA-HELIA TIKO - Heti09 9 (22) SQL:n keskeiset tietotyypit ja tietokantatuotteet SQL Selite SQL Server Oracle DB2 2012 (sisäiset) CHAR(n) merkkijono, 1<=n<=8000 1<=n<=2000 1<=n<=254 kiinteämittainen VARCHAR[2](n) merkkijono, n<=8000 n<=4000 n<=32672 vaihtuvamittainen XML XML dokumentti < 2 GB XMLtype < 2 GB DEC[IMAL] (p,s) 1<=p<=38-1 <=p<=31 NUMERIC Decimal-tyypin synonyymi OK - OK NUMBER [(p,s)] 1<=p<=38 SMALLINT[EGER] 16 bit kokonaisluku -32768.. 32767 OK - OK INT[EGER] 32 bit kokonaisluku OK - OK -2,147,483,648.. 2,147,483,647 FLOAT (p) Liukuluku, tarkkuus: OK = number = double p<=24 -> 7 merk nroa 25<=p<=53 -> 15 m. nroa REAL 32 bit R E+/-38 Binary_float R E+/-38 BOOLEAN BIT - - DATETIME Date & time Ks DATE - DATE päivämäärä OK Datetime OK TIME kellonaika OK - OK TIMESTAMP aikaleima Eri merkitys! OK OK INTERVAL aikaväli - INTERVAL YEAR INTERVAL DAY -
HAAGA-HELIA TIKO - Heti09 10 (22) Eheyssääntöjen määrittely Eheyssääntö voidaan kirjoittaa a) Taulukohtaisesti (onnistuu aina) b) Sarakekohtaisesti (jos sääntö kohdistuu vain 1 sarakkeeseen) Pääavain a) [CONSTRAINT nimi] PRIMARY KEY (sarakelista) b) PRIMARY KEY Viiteavain a) [CONSTRAINT nimi] FOREIGN KEY (sarakelista) REFERENCES [omistaja.]perustaulu[(sarakelista)] b) FOREIGN KEY REFERENCES [omistaja.]perustaulu[(sarakelista)] Huom! Hakasulut tarkoittavat vapaavalintaista komennon osaa Esim. [constraint nimi]
HAAGA-HELIA TIKO - Heti09 11 (22) Esim. Taulukohtaiset eheyssäännöt CREATE TABLE property_for_rent (pno VARCHAR (5) NOT NULL,street VARCHAR (25) NOT NULL,city VARCHAR(15) NOT NULL,type CHAR(1) NOT NULL DEFAULT F,rooms SMALLINT NOT NULL DEFAULT 4,rent DECIMAL(6,2) NOT NULL DEFAULT 0,checked DATE NOT NULL,ono VARCHAR(5) NOT NULL,sno VARCHAR(5),bno VARCHAR(3) NOT NULL,PRIMARY KEY (pno),foreign KEY (sno) REFERENCES staff,foreign KEY (ono) REFERENCES owner,foreign KEY (bno) REFERENCES branch ); Esim. Sarakekohtaiset eheyssäännöt CREATE TABLE property_for_rent (pno VARCHAR (5) NOT NULL PRIMARY KEY,street VARCHAR (25) NOT NULL,city VARCHAR(15) NOT NULL,type CHAR(1) NOT NULL DEFAULT F,rooms SMALLINT NOT NULL DEFAULT 4,rent DECIMAL(6,2) NOT NULL DEFAULT 0,checked DATE NOT NULL,ono VARCHAR(5) NOT NULL FOREIGN KEY REFERENCES owner,sno VARCHAR(5) FOREIGN KEY REFERENCES staff,bno VARCHAR(3) NOT NULL FOREIGN KEY REFERENCES branch );
HAAGA-HELIA TIKO - Heti09 12 (22) Esim. Kurssihallinto OPETTAJA Opettajano Ope_sukunimi Ope_etunimi Ope_lyhenne Ope_puh KURSSI Kurssino Kurssin_nimi Vastuuopettajano KURSSITOTEUTUS Kurssino Toteutusno Kurs_Opettajano Aloitus_pvm OPISKELIJA Opiskelijano Opi_sukunimi Opi_etunimi Opi_katuosoite Opi_postino Opi_aloitusvuosi CREATE TABLE opettaja (opettajano INTEGER PRIMARY KEY,ope_sukunimi VARCHAR(30) NOT NULL,ope_etunimi VARCHAR(20) NOT NULL,ope_lyhenne CHAR(5) VARCHAR(20),ope_puh ); CREATE TABLE kurssitoteutus (kurssino CHAR(6) NOT NULL,toteutusno INT NOT NULL,kurs_opettajano INT NOT NULL,aloitus_pvm DATE NOT NULL,CONSTRAINT pk_krstot PRIMARY KEY (kurssino,toteutusno),constraint fk_krstot_krs FOREIGN KEY (kurssino) REFERENCES kurssi(kurssino),constraint fk_krstot_ope FOREIGN KEY (kurs_opettajano) REFERENCES opettaja(opettajano) ); ILMOITTAUTUMINEN Kurssino Toteutusno Opiskelijano Arvosana Arvosana_pvm
HAAGA-HELIA TIKO - Heti09 13 (22) Syntaksikuvaukset Backus Naur Form ~ BNF ~ SQL-syntaksin kuvauksessa käytetty kuvauskieli: 1. ISOT KIRJAIMET esittävät varattuja sanoja; ne on kirjoitettava määrämuotoisina 2. pienet kirjaimet esittävät käyttäjän määrittämiä sanoja 3. Pystyviiva tarkoittaa valintaa vaihtoehtojen välillä Esim. a b c a tai b tai c 4. Aaltosulut tarkoittavat vaadittua (=pakollista) elementtiä Esim. { a } 5. Hakasulut tarkoittavat vapaavalintaista elementtiä Esim. [ a ] 6. Kolme peräkkäistä pistettä (...) tarkoittavat valinnaista toistoa 0 tai useamman kerran Esim. { a b } [, c...]
HAAGA-HELIA TIKO - Heti09 14 (22) Taulun luonti CREATE TABLE [omistaja.] taulu ( {sarakenimi tietotyyppi [,...] [DEFAULT vakio systeemimuuttuja] [NOT NULL] [[CONSTRAINT nimi] (sarake-ehto)] [,[CONSTRAINT nimi] PRIMARY KEY (sarakelista)] {[,[CONSTRAINT nimi] UNIQUE (sarakelista)] [,...]} {[,[CONSTRAINT nimi] FOREIGN KEY (sarakelista) [,...] } ); REFERENCES [omistaja.]perustaulu[(sarakelista)]
HAAGA-HELIA TIKO - Heti09 15 (22) Taulun muuttaminen ALTER TABLE taulunimi ADD ( {sarakenimi tietotyyppi [,...] [DEFAULT vakio systeemimuuttuja] [NOT NULL] [[CONSTRAINT nimi] (sarake-ehto)] [,[CONSTRAINT nimi] PRIMARY KEY (sarakelista)] {[,[CONSTRAINT nimi] UNIQUE (sarakelista)] [,...]} {[,[CONSTRAINT nimi] FOREIGN KEY (sarakelista) [,...] } ); REFERENCES [omistaja.]perustaulu[(sarakelista)] ALTER TABLE taulunimi ALTER ( {sarakenimi [tietotyyppi] [DEFAULT vakio systeemimuuttuja] [NOT NULL] [[CONSTRAINT nimi] (sarake-ehto)] [,...] [,[CONSTRAINT nimi] PRIMARY KEY (sarakelista)] {[,[CONSTRAINT nimi] UNIQUE (sarakelista)] [,...]} {[,[CONSTRAINT nimi] FOREIGN KEY (sarakelista) [,...] } ); REFERENCES [omistaja.]perustaulu[(sarakelista)]
HAAGA-HELIA TIKO - Heti09 16 (22) Taulun poistaminen DROP TABLE taulunimi [RESTRICT CASCADE ] ; RESTRICT: poisto vain silloin, jos tauluun ei viitata mistään muusta taulusta CASCADE: poistetaan myös sellaiset rivit, joissa viitataan poistettavaan tauluun
HAAGA-HELIA TIKO - Heti09 17 (22) DML ~ Data Manipulation ~ Tietojen käsittely INSERT UPDATE DELETE SELECT tiedon (rivien) lisäys tauluun taulussa olevan tiedon muuttaminen / päivitys tiedon (rivien) poisto taulusta kysely tietokannasta Literaalit ovat SQL:ssä käytettäviä vakioita Niitä erotetaan tässä kaksi päätyyppiä: 1. Yksinkertaisissa lainausmerkeissä olevat ( ) Ei-numeeriset arvot Manager Päivämäärät 2000-09-20 2. Ilman lainausmerkkejä olevat numeeriset arvot 45
HAAGA-HELIA TIKO - Heti09 18 (22) Lisäys, INSERT kahdenlaisia lisäyksiä: a) sallii yhden rivin lisäämisen nimettyyn tauluun b) useamman rivin kopiointi taulusta toiseen (tätä käsitellään kurssin lopulla)
HAAGA-HELIA TIKO - Heti09 19 (22) a) Yhden rivin lisäämisen nimettyyn tauluun INSERT INTO table_name [ (column_list) ] VALUES (data_value_list) ; table_name column_list data_value_list taulun (tai näkymän) nimi yksi tai useampi sarakenimi pilkulla erotettuna / vapaaehtoinen: jos puuttuu SQL hakee listan CREATE TABLE kuvauksen mukaan lisättäviä arvoja on oltava yhtä monta kuin taululla on sarakkeita jos sarakenimiä on puuttuvat sarakkeet alustetaan oletusarvoilla tai NULL-arvoilla yhteensopiva column_list:n kanssa: arvojen lukumäärä sama järjestys sama arvon kuuluttava ko. sarakkeen arvojoukkoon sovelluksen koodiin sarakenimet kannattaa aina laittaa
HAAGA-HELIA TIKO - Heti09 20 (22) Esim. Lisää staff-tauluun 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 ); 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 );
HAAGA-HELIA TIKO - Heti09 21 (22) Poisto, DELETE DELETE FROM table_name [WHERE search_condition]; Jos WHERE-määre esiintyy, poistetaan vain ehdon täyttävät rivit, muuten poistetaan taulun kaikki rivit Esim. Poista kaikki asuntokohteiden näytöt. DELETE FROM viewing; Esim. Poista kaikki asuntokohteelle PG4 tapahtuneet näytöt. DELETE FROM viewing WHERE pno= PG4 ;
HAAGA-HELIA TIKO - Heti09 22 (22) Haku, SELECT SELECT-lause etsii ja näyttää tietoja yhdestä tai useammasta tietokannan taulusta SELECT [DISTINCT ALL] { * [column_expression [AS new_name]] [,...]} FROM table_name [alias] [,...] [WHERE condition] [GROUP BY comlumn_list ] [HAVING condition] [ORDER BY column_list] Esim. SELECT * FROM staff; ALL on oletusarvo, eli haetaan kaikki mitä löytyy; ALL määrettä ei yleensä kirjoiteta SQL-lauseeseen SELECT-komentoon tutustutaan tarkemmin seuraavilla viikoilla!