Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
HELIA 1 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Luento: SQL
Johdanto Sql:ään............................................................................... 2Sql-komentojen kirjoittaminen ........................................................ 3
Backus Naur Form, BNF............................................................. 5Tietojen käsittely (Data Manipulation)................................................ 6
Yksinkertaisia kyselyjä.................................................................... 7Distinct-määre ............................................................................. 9Rivien valinta eli WHERE ehto.................................................. 11Lajittelu (Order By) .................................................................... 20
SQL operaatioita ja funktioita ....................................................... 22Koostefunktiot (Aggregate Functions) .......................................... 24
Ryhmittely (GROUP BY) ........................................................... 27HAVING - määre ....................................................................... 29
LIITOS eli Monen taulukon kyselyt (JOIN) ................................... 31Karteesinen tulo ........................................................................ 37Ulkoliitos (Outer join)................................................................. 38
Alikyselyt (subqueries).................................................................. 43ANY ja ALL................................................................................ 46EXISTS ja NOT EXISTS ........................................................... 48
Yhdiste (union), Leikkaus (intersect), Erotus (except)................. 49Tietokannan datan muokkaus.......................................................... 53
Lisäys, INSERT ............................................................................ 53Päivitys, UPDATE......................................................................... 58Poisto, DELETE............................................................................ 59
TIEDON MÄÄRITTELY (Data Definition)......................................... 60Tietotyypit ..................................................................................... 61Tietokannan luonti ........................................................................ 66Tietokannan poisto ....................................................................... 67Taulun luonti (Create Table .......................................................... 68Taulun poistaminen (Drop Table) ................................................. 70Näkymän luonti (Create View)...................................................... 71Indeksin luonti (Create Index)....................................................... 72
HELIA 2 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Johdanto Sql:ään
• SQL on ensimmäinen ja ainoa laajasti hyväksyttytietokantakieli
• ISO:n (International Standards Organization) ja ANSI:n(American National Standards Institute)hyväksymä kieli
1. SQL892. SQL923. 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öasemalta2. Upotettuna proseduraaliseen kieleen
HELIA 3 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 taipienillä sen mukaan,mitä ne todellisuudessa ovat elimiten ne on talletettu tietokantaan
esim.sukunimi = ‘SMITH’
HELIA 4 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
• 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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Backus Naur Form, BNF
• SQL-syntaksin kuvauksessa käytetty kuvauskieli:
− ISOJA KIRJAIMIA käytetään esittämään varattuja sanojaja ne on kirjoitettava määrämuotoisina
− Pieniä kirjaimia käytetään ilmaisemaan käyttäjänmää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ä (...) tarkoittavatvalinnaista toistoa 0 tai useamman kerran;
Esim. {a|b}[,c...]
HELIA 6 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Tietojen käsittely (Data Manipulation)
DML-käskyt
• SELECT tietokannan kysely
• INSERT tiedon lisäys
• UPDATE tiedon päivitys
• DELETE 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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Yksinkertaisia kyselyjä
• Lauseen SELECT tehtävänä on etsiä ja näyttää tietoayhdestä 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 määräätään taulukot, joita käytetään
WHERE määrätään ehdon täyttävät rivit
GROUP BY ryhmitellään edellinen tulos
HAVING ryhmien valinta ehdon mukaan
SELECT määrätään sarakkeet, jotka valitaan
ORDER BY lajittelu
HELIA 8 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Kaikki sarakkeet, kaikki rivit. Listaa kaikkien henkilöiden kaikki tiedot.
SELECT sno, fname, lname, address, tel_no, position, sex,dob, salary, nin, bno
FROM staff;
tai
SELECT * FROM staff;
Esim. Tietyt sarakkeet, kaikki rivit (vrt. PROJEKTIO)
Listaa kaikkien henkilöiden numerot, nimet ja palkat.
SELECT sno, fname, lname, salary FROM staff;
sno
SL21SG37SG14SA9SG5SL41
fname
JohnAnnDavidMarySusanJulie
lname
WhiteBeechFordHoweBrandLee
address
...
tel_no
...
position
ManagerSnr AsstDeputyAssistantManagerAssistent
sex
MFMFFF
dob
...
salary
30000.0012000.0018000.009000.0024000.009000.00
nin
...
bno
B5B3B3B7B3B5
sno
SL21SG37SG14SA9SG5SL41
fname
JohnAnnDavidMarySusanJulie
lname
WhiteBeechFordHoweBrandLee
salary
30000.0012000.0018000.009000.0024000.009000.00
HELIA 9 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Distinct-määre
• DISTINCT sarake ==> valitaan vain yksi rivi yhtäsarakkeen arvoa kohti (dublikaatit jää pois)
• DISTINCT:N vastakohta on ALL, joka toimii oletuksena. Eisiis tarvitse kirjoittaa.
Esim. Hae kaikki vuokrattavien kohteiden numerot, joilla on ollutnäyttö
ratkaisu 1:
SELECT pno ==> Tulos FROM viewing;
ratkaisu 2:
SELECT DISTINCT pno ==> Tulos FROM viewing;
pno
PA14PG4PG4PA14PG36
pno
PA14PG4PG36
HELIA 10 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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;
tai SELECT sno, fname, lname, salary/12 AS
monthly_salary FROM staff;
• Kentän uusi nimi kerrotaan siis varatun sanan ASjälkeen
sno
SL21SG37SG14SA9SG5SL41
fname
JohnAnnDavidMarySusanJulie
lname
WhiteBeechFordHoweBrandLee
col4
2500.001000.001500.00
750.002000.00
750.00
sno
SL21SG37SG14SA9SG5SL41
fname
JohnAnnDavidMarySusanJulie
lname
WhiteBeechFordHoweBrandLee
Monthly_salary
2500.001000.001500.00
750.002000.00
750.00
HELIA 11 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 kuin10 000 £.
SELECT sno, fname, lname, salary FROM staff WHERE salary > 10000;
sno
SL21SG37SG14SG5
fname
JohnAnnDavidSusan
lname
WhiteBeechFordBrand
salary
30000.0012000.0018000.0024000.00
HELIA 12 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 onJohn White
SELECT sno FROM staff WHERE fname = ‘John’ AND lname = ‘White’;
sno
SL21
HELIA 13 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Listaa sellaisten haarakonttoreiden osoitteet, jotkasijaitsevat Lontoossa tai Glasgow:ssa.
SELECT bno, street, area, city, pcode FROM branch WHERE city = ‘London’ OR city = ‘Glasgow’;
Bno
B5B3B2
Street
22m Deer Rd163 Main St56 Clover Dr
Area
SidcupPatrick
City
LondonGlasgowLondon
Pcode
SW1 4EHG11 0QXNW10 6EU
HELIA 14 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
C) Arvoväli (range): testaa kuluuko lausekkeen arvo tiettyjen arvojen väliin
BETWEEN tai NOT BETWEEN
Esim. Listaa sellaisten henkilöiden tiedot, joiden palkka onvälillä 20 000 £ – 30 000 £
SELECT sno, fname, lname, position, salary FROM staff WHERE salary BETWEEN 20000 AND 30000;
tai
SELECT sno, fname, lname, position, salary FROM staff WHERE salary >=20000 AND salary <=30000;
sno
SL21SG5
fname
JohnSusan
lname
WhiteBrand
position
ManagerManager
salary
30000.0024000.00
HELIA 15 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
D) Joukko (set membership): testaa kuuluuko lausekkeenarvo johonkin arvojoukkoon
IN tai NOT IN
Esim. Listaa kaikki “managerit“ ja “deputyt“.
SELECT sno, fname, lname, position FROM staff WHERE position IN (‘Manager’, ‘Deputy’);
tai
SELECT sno, fname, lname, position FROM staff WHERE position =‘Manager’
OR position=‘Deputy’;
sno
SL21SG14SG5
fname
JohnDavidSusan
lname
WhiteFordBrand
position
ManagerDeputyManager
HELIA 16 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
E) Kaava (pattern match): testaa noudattaako merkkijonotiettyä kaavaa
LIKE tai NOT LIKE
% tarkoitta mitä tahansa merkkijonoa
– tarkoittaa mitä tahansa merkkiä
Esimerkkejä
sarake LIKE ‘H%’ sarakkeen arvo alkaa H:lla, loput mitä tahansa
sarake LIKE ‘H----’ sarakkeen arvo alkaa H:lla ja sitäpitää seurata 4 merkkiä
sarake LIKE ‘%e’ mikä tahansa merkkijono, jonka pituus on vähintään 1
ja joka päättyy kirjaimeen ‘e’
sarake NOT LIKE ‘H%’ sarkkeen arvo ei saa alkaa H:lla
sarake ‘15#%’ ESCAPE ‘#’ sarakkeen arvo 15%
HELIA 17 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Etsi kaikki henkilöt, joiden osoitekentässä on ‘Glasgow’-merkkijono
SELECT sno, fname, lname,address FROM staff WHERE address LIKE ‘%Glasgow%’;
sno
SG37SG14SG5
fname
AnnDavidSusan
lname
BeechFordBrand
address
81 George St,Glasgow PA1 2JR63 Ashby St, Patrick,Glasgow G115 Gt Western Rd,Glasgow G12
HELIA 18 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
F) Tyhjä (Null): testaa onko sarakkeen arvo tyhjä
IS NULL
tai
IS NOT NULL
Esim. Etsi sellaisten näyttöjen katsojien numerot, kohteidennumerot ja päivämäärät, joissa ei ole kommentteja
SELECT rno, pno, date FROM viewing WHERE comment IS NULL;
rno
CR56CR56
pno
PG4PG36
date
26-May-9528-Apr-95
HELIA 19 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
PÄIVÄMÄÄRÄSTÄ
• Päivämäärille on olemassa tyypit
• Date pelkkä päivämäärä
• Timestamp päivämäärä ja aika
• Tiedot talletetaan muodossa yyyy-mm-dd
• Jos päiväyksestä halutaan saada erikseen esim. vuosikä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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Lajittelu (Order By)
• lajittelu perustuu sarakkeiden nimiin
• ORDER BY -sivulauseeseen liitetään sarakkeidennimet, joiden mukaan lajitellaan
• lajittelu voi olla nouseva (ASCENDING, ASC , oletus)tai laskeva (DESCENDING, DESC)
• Jos lajittelusarakkeita useita, erotetaan ne toisistaanpilkulla
Esim. Listaa henkilöstö aakkosjärjestyksessä nimen mukaan
SELECT sno, fname, lname, salary FROM staff ORDER BY lname, fname;
sno
SG37SG5SG14SA9SL41SL21
fname
AnnSusanDavidMaryJulieJohn
lname
BeechBrandFordHoweLeeWhite
salary
12000.0024000.0018000.009000.009000.0030000.00
HELIA 21 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Listaa vuokrattavat huoneiston tyypin mukaisessajärjestyksessä
SELECT pno, type, rooms, rent FROM property_for_rent ORDER BY type;
Esim. Listaa vuokrattavat huoneiston tyypin mukaisessajärjestyksessä siten, että kalleimmat ensin
SELECT pno, type, rooms, rent FROM property_for_rent ORDER BY type, rent DESC;
Type
FlatFlatFlatFlatHouseHouse
Rooms
433465
Rent
400350375450650600
Pno
PL94PG4PG36PG16PA14PG21
Type
FlatFlatFlatFlatHouseHouse
Rooms
443365
Rent
450400375350650600
Pno
PG16PL94PG36PG4PA14PG21
HELIA 22 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
SQL operaatioita ja funktioita
|| Katenoi kaksi merkki-, tai bittijonoa Esim. fname || lname
UPPER muuttaa pienet kirjaimet suuriksi
LOWER muuttaa suuret kirjaimet pieniksi
CHAR_LENGTH palauttaa merkkijonon pituudenEsim. CHAR_LENGTH(‘Beech’) palauttaa 5
SUBSTRING palauttaa osajonon merkkijonostaEsim. SUBSTRING(‘Beech’ FROM 1 to 3)palauttaa merkkijonon ‘Bee’
POSITION palauttaa merkkijonon position toisestamerkkijonostaEsim. POSITION (‘ee’ IN ‘Beech’) palauttaa 2
TRIM poistaa merkkijonosta johtavat (LEADING),lopettavat (TRAILING) tai molemmat merkitEsim. TRIM (BOTH ‘*’ FROM ‘*** Hello World ***’)palauttaa merkkijonon ‘Hello World’
CAST konvertoi lausekkeen arvon toisen tyyppiseksiEsim. CAST(5E3 AS INTEGER)
HELIA 23 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 palauttaa nykyisen käyttäjän tunnuksen tai USER
SESSION_USER palauttaa istunnon hallitsijan tunnuksen
SYSTEM_USER 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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Kuinka monen vuokrattavan vuokra on enemmän kuin350 £?
SELECT COUNT(*) AS Lukumäärä FROM property_for_rent WHERE rent > 350;
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ä
5
Lukumäärä
2
HELIA 26 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Laske kaikkien managerien lukumäärä ja palkkojensumma.
SELECT Count (sno) AS lkm, SUM (salary) AS summa
FROM staff WHERE position = ‘Manager’;
Esim. Etsi pienin ja suurin palkka sekä palkkojen keskiarvo.
SELECT MIN(salary) AS pienin, MAX(salary) AS suurin, AVG(salary) AS keskiarvo FROM staff;
• Huomaa, että koostefunktioita käyttäessäsi, et voi tulostaataulun varsinaisia kenttiä. (Paitsi, jos käytät GROUP BY:ta)
lkm
2
summa
54000.00
keskiarvo
17000.00
suurin
30000.00
pienin
9000.00
HELIA 27 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 BY-mää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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Laske jokaisen haarakonttorin työntekijät ja palkkojensumma haarakonttoreittain
SELECT bno, COUNT (sno) AS lkm, SUM(salary) AS summa
FROM sfaff GROUP BY bno;
Mitä tapahtuu:
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
==>
ryhmitellään valitutsarakkeet ja rivit bno:nmukaan järjestykseen
lasketaan lukumäärä jasumma ryhmittäin
bno
B5B3B7
lkm
231
summa
39000.0054000.009000.00
==>
HELIA 29 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
HAVING - määre
• asettaa ehdon ryhmien valintaan eli valitaan siis HAVING-ehdon täyttävät ryhmät
• ISO-STANDARDI: sarakkeet, jotka esiintyvät HAVING-ehdossa, täytyy esiintyä GROUP BY-määreessä tai olla koostefunktionparametrina
Esim. Laske sellaisten haarakonttorien työntekijät japalkkojen summat, joilla on työntekijöitä enemmänkuin yksi.
SELECT bno, COUNT(sno) AS lkm, SUM(salary) AS summa FROM staff GROUP BY bno HAVING COUNT (sno) > 1;
bno
B5B3
lkm
23
summa
39000.0054000.00
HELIA 30 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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. millaisiaryhmiä muodostetaan.
• HAVING –osuutta tarvitaan yleensä vain silloin, kun tarvitaanehtoon joku kooste
HELIA 31 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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:
SELECT r.rno, fname, lname, pno, comment FROM renter r, viewing v WHERE r.rno = v.rno;
tauluille annettualiasnimet:renter = rviewing = v
viittaus renterinsarakeeseen rno
viittaus renterinsarakeeseen rnoja viewinginsarakkeeseen rno
rno
CR76CR56CR56CR56CR62
comment
too remote
too small
no dining room
fname
JohnAlineAlineAlineMary
lname
KayStewartStewartStewartTregear
pno
PG4PG36PA14PG4PA14
HELIA 32 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Listaa jokaisen haarakonttorin työntekijät, joilla onhoidettavanaan vuokrattava kohde.
SQL-89:
SELECT s.bno, s.sno, fname, lname, pno FROM staff s, property_for_rent p WHERE s.sno = p.sno;
SQL-92:
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;
sno
SG37SG37SG14SG14SA9SL41
fname
AnnAnnDavidDavidMaryJulie
lname
BeechBeechFordFordHoweLee
pno
PG21PG36PG4PG16PA14PL94
bno
B3B3B3B3B7B5
HELIA 34 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Listaa jokaisen haarakonttorin työntekijät, joilla on hoidettavanaan vuokrattava kohde listausjärjestys
haarakontteittain, työntekijöittäin ja kohteittain.
SQL-89:
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;
SQL-92:
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;
sno
SG14SG14SG37SG37SL41SA9
fname
DavidDavidAnnAnnMaryJulie
lname
FordFordBeechBeechHoweLee
pno
PG4PG16PG21PG36PL94PA14
bno
B3B3B3B3B5B7
HELIA 35 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Kolmen taulukon liitos:
Listaa jokaisen haarakonttorin työntekijät, joilla onhoidettavanaan vuokrattava kohde – listausjärjestyshaarakontteittain, työntekijöittäin ja kohteittain. Listaahaarakonttorin lisäksi haarakonttorin kaupunki.
SQL-89:
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;
SQL-92:
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;
Esim: Laske jokaisen haarakonttorin työntekijöittäin
sno
SG14SG14SG37SG37SL41SA9
fname
DavidDavidAnnAnnMaryJulie
lname
FordFordBeechBeechHoweLee
pno
PG4PG16PG21PG36PL94PA14
bno
B3B3B3B3B5B7
city
GlasgowGlasgowGlasgowGlasgowLondonAberdeen
HELIA 36 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
vuokrattavana olevat kohteet.
SQL-89:
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
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;
bno
B3B3B5B7
sno
SG14SG37SL41SA9
lkm
2211
HELIA 37 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 rivitjotka 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, lajitteletaulukko
HELIA 38 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Ulkoliitos (Outer join)
Esim.
BRANCH PROPERTY_FOR_RENT
(Sisä)liitos:
Esim: Listaa sellaisista haarakonttoreista, jotka sijaitsevatsamassa kaupungissa kuin vuokrattana oleva kohde,osastonumero ja kaupunki sekä vuokrattavastakohteesta 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
B3B4B2
bcity
GlasgowBristolLondon
pno
PA14PL94PG4
pcity
AberdeenLondonGlasgow
bno
B3B2
bcity
GlasgowLondon
pno
PG4PL94
pcity
GlasgowLondon
HELIA 39 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
VASEMMANPUOLEINEN ULKOLIITOS (left outer join)
Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotkasijaitsevat samassa kaupungissa. Listaa myössellaiset haarakonttorit, joiden kaupungissa ei olekohdetta.
SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch b LEFT JOIN property_for_rent p
ON b.bcity=p.pcity;
• FROM lauseen VASEMMAN puoleisen taulunkaupungin mukaan tehdään vertailu. Jos oikeanpuoleisesta ei löydy sopivaa, tulostetaan sesarakkeisiin null.
bno
B3B4B2
bcity
GlasgowBristolLondon
pno
PG4nullPL94
pcity
GlasgownullLondon
HELIA 40 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
OIKEANPUOLEINEN ULKOLIITOS (right outer join)
Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotkasijaitsevat samassa kaupungissa. Listaa myössellaiset vuokrattavat kohteet, joiden kaupungissa eiole haarakonttoria.
SELECT b.bno, b.bcity, p.pno, p.pcityFROM branch b RIGHT JOIN property_for_rent p
ON b.bcity=p.pcity;
• FROM lauseen OIKEAN puoleisen taulun kaupunginmukaan tehdään vertailu. Jos vasemman puoleisestaei löydy sopivaa, tulostetaan sen sarakkeisiin null.
bno
nullB3B2
bcity
nullGlasgowLondon
pno
PA14PG4PL94
pcity
AberdeenGlasgowLondon
HELIA 41 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
MOLEMMINPUOLEINEN ULKOLIITOS (Full outer join)
Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotkasijaitsevat samassa kaupungissa. Listaa myössellaiset haarakonttorit, joiden kaupungissa ei olekohdetta sekä vuokrattavat, joiden kaupungissa eiole haarakonttoria.
SELECT b.bno, b.bcity, p.pno, p.pcity FROM branch1 b FULL JOIN property_for_rent1 p
ON b.bcity=p.pcity;
• Kummalta puolelta tahansa voi sopiva rivi puuttua.
bno
nullB3B4B2
bcity
nullGlasgowBristolLondon
pno
PA14PG4nullPL94
pcity
AberdeenGlasgownullLondon
HELIA 42 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
• Olennaisesti ulkoliitokset koostuvat kahdesta kyselystä
1. Listaa haarakonttorit ja vuokrattavat kohteet, jotkasijaitsevat samassa kaupungissa.
2. Listaa myös sellaiset vuokrattavat, joidenkaupungissa ei ole haarakonttoria.
Voidaan käyttää UNION –operaatiota kts. vähänmyö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, jotkasijaitsevat samassa kaupungissa. Listaa myössellaiset vuokrattavat, joiden kaupungissa ei olehaarakonttoria.
SELECT b.bno, b.bcity, p.pno, p.pcityFROM branch b, property_for_rent p
WHERE + b.bcity = p.pcity ;
HELIA 43 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Alikyselyt (subqueries)
• SELECT, INSERT, UPDATE ja DELETE-lauseet voivatsisältää sisäkkäisen SELECT-lauseen
• sisäkkäisen SELECT_lauseen tulosta käytetäänulkoisessa 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 yhdenlausekkeen, paitsi silloin kun käytetään EXISTS-avainsanaa
3. alikyselyn tulee olla vertailun oikealla puolella
HELIA 44 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Listaa henkilöt, jotka ovat töissä ‘163 Main St’ sijaitsevassa haarakonttorissa.
SELECT sno, fname, lname, positionFROM staffWHERE bno =
(SELECT bno FROM branch WHERE address=‘163 Main St’);
Esim. Listaa henkilöt, joiden palkka on korkeampi kuinkaikkien työntekijöiden keskiarvo.
SELECT sno, fname, lname, position, salaryFROM staffWHERE salary >
(SELECT AVG(salary) FROM; staff);
sno
SG37SG14SG5
fname
AnnDavidSusan
lname
BeechFordBrand
position
Snr AsstDeputyManager
sno
SL21SG14SG5
fname
JohnDavidSusan
lname
WhiteFordBrand
position
ManagerDeputyManager
salary
30000.0018000.0024000.00
HELIA 45 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
• Jos on alikysely voi palauttaa enemmän kuin yhden rivin, eivoida käyttää >, <, = operaatioita.
• IN-operaatiota voidaan käyttää.
Esim. Listaa vuokrattavat kohteet, joiden vuokrauksen hoitaahenkilöt, jotka työskentelevät ‘163 Main St’:nhaarakonttorissa.
SELECT pno, street, area, city,pcode, type, rooms, rentFROM property_for_rentWHERE sno IN
(SELECT sno FROM staff WHERE bno =
(SELECT bno FROM branch WHERE street = ‘163 Main St’));
street
6 Lawrence St2 Monor Rd18 Dale Rd5 Novar Dr
area
Patrick
HyndlanHyndlan
city
GlasgowGlasgowGlasgowGlasgow
pcode
G11 0QXG32 4QXG12G12 9AX
type
FlatFlatHouseFlat
rooms
3354
rent
350375600450
pno
PG4PG36PG21PG16
HELIA 46 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
ANY ja ALL
• käytetään alikyselyissä, jotka palauttavat vain yhdensarakkeen arvot
ALL:
kaikki alikyselyn rivit täyttävät ehdon taijos alikyselyn tuottama tulos on tyhjä ==>TRUE
ANY tai SOME:
jos jokin alikysyelyn rivi täyttää ehdon==> TRUE
HELIA 47 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. Listaa henkilöt, joiden palkka on suurempi kuinyhdenkään haarakonttorin B3 työntekijän.
SELECT sno, fname, lname, position, salaryFROM staffWHERE salary > ANY
(SELECT salary FROM staff WHERE bno=‘B3’);
Esim. Listaa henkilöt, joiden palkka on suurempi kuinjokaisen haarakonttorin B3 työntekijän.
SELECT sno, fname, lname, position, salaryFROM staffWHERE salary > ALL
(SELECT salary FROM staff WHERE bno = ‘B3’);
sno
SL21SG14SG5
sno
SL21
fname
JohnDavidSusan
fname
John
lname
WhiteFordBrand
lname
White
position
ManagerDeputyManager
position
Manager
salary
30000.0018000.0024000.00
salary
30000.00
HELIA 48 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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, jos alikysely tuottaa tyhjän tuloksen
Esim. Listaa kaikki työntekijät, jotka työskentelevät Lontoonhaarakonttorissa
SELECT sno, fname, lname, position FROM staff s WHERE EXISTS (SELECT * FROM branch b WHERE s.bno = b.bno AND b.city=‘London’);
sno SL21 SL41
fname John Julie
lname White Lee
position Manager Assistent
HELIA 49 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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ä oleviensarakkeiden perusteella
• jos ALL-määre on lauseessa
==> taataan, että kaikki mahdolliset rivit tulevatmukaan
• oletuksena kaikki duplikaattirivit poistetaan
HELIA 50 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. YHDISTE (UNION)
Tuota lista alueista, joissa sijaitsee joko haarakonttoritai vuokrattava kohde.
(SELECT area FROM branch WHERE area IS NOT NULL)
UNION
(SELECT area FROM property_for_rent WHERE area IS NOT NULL);
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
area Sidcup Dyce Patrick Leigh Dee Kilburn Hyndland
HELIA 51 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. LEIKKAUS (INTERSECT)
Tuota lista kaupungeista, joissa sijaitsee sekähaarakonttori että vuokrattava.
(SELECT city FROM branch)
INTERSECT
(SELECT city FROM property_for_rent);
tai
(SELECT * FROM branch)
INTERSECT CORRESPONDING BY city
(SELECT * FROM property_for_rent);
city Aberdeen Glasgow London
city London Aberdeen Glasgow
HELIA 52 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Esim. EROTUS (EXCEPT)
Listaa kaupungit, joissa on haarakonttori, mutta ei olevuorattavia.
(SELECT city FROM branch )
EXCEPT
(SELECT city FROM property_for_rent);
tai
(SELECT * FROM branch)
EXCEPT CORRESPONDING BY city
(SELECT * FROM property_for_rent);
city Bristol
city Bristol
HELIA 53 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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
• jos puuttuu ==> SQL hakee listan CREATETABLE kuvauksen mukaan
• jos puuttuu ==> lisättäviä kenttien arvoja onoltava yhtä monta kuin taululla on olemassakenttiä
• jos sarakenimiä on ==> puuttuvat sarakkeetalustetaan oletusarvoilla tai NULL-arvoilla
• sovelluksen koodiin sarakenimet kannattaaaina laittaa
data_value_list:
• listan täytyy olla “samanlainen“ kuin column_list
HELIA 55 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
→ 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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 hoitamiensavuokrattavien 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 SL21 SG37 SG14 SA9 SG5 SL41
fname John Ann David Mary Susan Julie
lname White Beech Ford Howe Brand Lee
prop_cnt
0 2 2 1 0 1
HELIA 58 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 ehdontä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 vaihdapalkka 18000 £.
UPDATE staff SET position=‘Manager’, salary=18000 WHERE sno=‘SG14’;
HELIA 59 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Poisto, DELETE
DELETE FROM table_name
[WHERE search_condition];
• Jos WHERE-määre esiintyy, poistetaan vain ehdontä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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
TIEDON MÄÄRITTELY (Data Definition)
SQL:n TUNNUKSET (SQL Identifiers)
• Käyttäjän määrittämä tunnus muodostuumerkkijoukosta
• 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ää, onyhdentekevää kääntäjän kannalta, kirjoitetaankomerkit isolla vai pienellä. (Toisin kuin käytettäessäsarakkeeseen talletettua dataa)
HELIA 61 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Tietotyypit
A) MERKKI/MERKKIJONO
CHAR(n) n:n mittainen merkkijono
VARCHAR(n) korkeintaan n:n mittainen merkkijono
n välillä [0, 255]
• merkkijono voi
1) kiinteämittainen
Esim. sno CHAR (5)
2) vaihtuvamittainen
Esim. address VARCHAR (30)
maksimipituus
HELIA 62 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
B) BITTI/BITTIJONO
BIT [VARYING] [pituus]
• bittijono voi
1) kiinteämittainen
Esim. bit_jono BIT (5)
2) vaihtuvamittainen
Esim. bit_jono BIT VARYING (30)
maksimipituus
HELIA 63 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
C) TARKKA LUKU
DECIMAL[precision [ , scale]] precision on kentänpituus ja scale on desimaalienlukumäärä
INTEGER kokonaisluku välillä [-2 147 483648, 2 147 483647]
SMALLINT kokonaisluku välillä [-32 768, 32 767]
Esim.
rooms SMALLINT
salary DECIMAL (7,2) ==> ylin arvo 99 999.99
HELIA 64 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
D) LIUKULUKU
FLOAT liukuluku välillä [–5.4x1079, 7.2x1075]
Esim.
10E3
5.2E6
–0.2E–4
HELIA 65 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
E) AIKA
DATE
TIME [time_precision] [WITH TIME ZONE]
TIMESTAMP [time_precision] [WITH TIME ZONE]
time_precision: sekunttien tarkkuus, oletus 0 eli kokonaiset sekunnit
kalenteriaika +kellonaika
kellonaika: tunti, minuutti jasekuntti
HELIA 66 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Tietokannan luonti
• Vaihtelee tuotteittain
CREATE SCHEMA [name | AUTHORIZATION creator-identifiter]
CREATE DATABASE database_name
Esim.
CREATE SCHEMA sql_tests AUTHORIZATON Smith;
HELIA 67 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Tietokannan poisto
DROP SCHEMA name [RESTRICT | CASCADE]
RESTRICT: tietokannan on oltava tyhjä ennenpoistoa (oletus)
CASCADE: tyhjyystarkistusta ei ole
HELIA 68 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 } ]
[ON DELETE {CASCADE | SET NULL | SET DEFAULT | NO ACTION } ]
[, ...] }
{ [, [CONSTRAINT rnimi] CHECK (riviehto) ] [,...] } )
CASCADE: automaattinen muutos
HELIA 69 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
Taulun poistaminen (Drop Table)
(DROP TABLE)
DROP TABLE table_name [RESTRICT | CASCADE ]
RESTRICT: poisto vain silloin, jos tauluun ei viitata mistään muusta taulusta
CASCADE: poistetaan myös sellaiset rivit, joissa viitataan poistettuun tauluun
Esim. DROP TABLE property_for_rent;
HELIA 71 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 cityFROM property_for_rentWHERE ono = ‘CO46’);
Esim 2
CREATE VIEW allpersons(nro, etunimi, sukunimi) AS(SELECT sno, fname, lnameFROM staff)UNION(SELECT rno, fname, lnameFROM renter);
Näkymän poisto
DROP VIEW allpersons;
HELIA 72 (72)Räty, Virkki, Kurki LahtinenTiedonhallinta 9.3.2001
TH_luXX_SQL.doc 09.03.01 16:54
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 hakemistokenttienduplikaatteja
Esim.pääavaimen mukaisen hakemiston luonnissakäytetään UNIQUE-määrettä
CREATE UNIQUE INDEX sno_indON staff (sno);
CREATE UNIQUE INDEX pno_indON property_for_rent (pno);
CREATE INDEX rent_indON property_for_rent (area,rent);
Indeksin poistaminen
DROP INDEX rent_ind;