Tietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto. Opettajien nimet: Opiskelijoiden pääaineet

Samankaltaiset tiedostot
Helsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto.

Kyselyn yleisrakenne:

määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta

Harjoitustehtävä 1. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. SQL kysely

määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta

select tulostietomäärittely from taulukkeet [where valintaehdot] [group by ryhmitystekijät] [having ryhmärajoitteet] [order by järjestysperusta]

4.3.4 SQL kyselyt... 45

Tietokantojen perusteet k2004helsingin yliopisto/tktl Tietokantojen perusteet, s 2005 SQL-perusteet. Harri Laine 1. SQL tietokantakieli

Helsingin yliopisto/tktl Tietokantojen perusteet, s 2007 SQL:n perusteet. Harri Laine 1. SQL tietokantakieli. SQL tietokantakieli

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

SQL-kielen perusteet. Tietokantojen perusteet

TIEDONHALLINTA - SYKSY Luento 10. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Tietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

Helsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

Helsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

5 SQL TIETOKANTAKIELI...33

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

SELECT-lauseen perusmuoto

SQL - STRUCTURED QUERY LANGUAGE

Liitokset - haut useaan tauluun

Yhdiste, leikkaus, erotus ym.

Esimerkki. pankkien talletus- ja lainatietokanta: Yhdiste, leikkaus, erotus ym. Leikkaus (intersect) Yhdiste (Union) Erotus (except/minus) Leikkaus

Hakukyselyt: SELECT * FROM taulu WHERE sarake1 = Malli Nimi [WHERE sarake1 LIKE M% ] [WHERE BETWEEN ehto1 AND ehto2] [WHERE sarake1 IN/= (alikysely)]

Helsingin yliopisto/ tktl DO Tietokantojen perusteet, s 2000 Relaatioalgebra Harri Laine 1. Relaatioalgebra

Relaation tyhjyyden testaaminen

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

CSE-A1200 Tietokannat

HELIA TIKO-05 1 (15) ICT03D Tieto ja tiedon varastointi Räty, Virkki

Relaatioalgebra. Kyselyt:

HELIA 1 (14) Outi Virkki Tiedonhallinta

HELIA TIKO-05 1 (17) ICT03D Tieto ja tiedon varastointi Räty, Virkki

Kirjoita kuhunkin erilliseen vastauspaperiin kurssin nimi, tentin päiväys, oma nimesi, syntymäaikasi ja nimikirjoituksesi.

Relaatioalgebra. Relaatioalgebra. Relaatioalgebra. Relaatioalgebra - erotus (set difference) Kyselyt:

CSE-A1200 Tietokannat

Kyselyt: Lähtökohtana joukko lukuja Laskukaava kertoo miten luvuista lasketaan tulos soveltamalla laskentaoperaatioita

joukko operaatioita, joilla relaatioista voidaan muodostaa uusia relaatioita joukko opin perusoperaatiot yhdiste, erotus, ristitulo, leikkaus

OUTER JOIN se vanha kunnon kaveri

D B. Kyselypuut ja ekvivalenssi

Helsingin yliopisto Tietojenkäsittelytieteen laitos (H.Laine) Tietokantojen perusteet. Liitteenä: Tiivistelmä SQL-syntaksista

TIEDONHALLINTA - SYKSY Luento 8. Saapumisryhmä: Pasi Ranne /9/13 Helsinki Metropolia University of Applied Sciences

SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito

2. Haet työntekijöiden tiedot etunimen mukaan nousevasti järjestettyinä. (ORDER BY) SELECT * FROM employees ORDER BY firstname ASC;

Tällä viikolla. Kotitehtävien tarkistus Upotettu SQL Indeksi-harjoitus täydennetään pelifirman tietokantamallia SQL-tehtäviä

HELIA TIKO-05 1 (22) ICT03D Tieto ja tiedon varastointi E.Räty, O.Virkki

4.1 Yleistä SQL:stä 4.2 SQL-lauseet 4.3 DML: datan hallinta 4.4 DDL: rakenteen määrittäminen 4.5 DCL: valtuuttaminen 4.6 TxCL: tapahtumanhallinta

Helsingin yliopisto/ tktl D Tietokantojen perusteet, s 2000 Relaatioalgebra. Harri Laine 1. Relaatioalgebra.

HELIA 1 (14) Outi Virkki Tiedonhallinta

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, , H.Laine

FROM-lausekkeessa voidaan määritellä useampi kuin yksi taulu, josta tietoja haetaan: Tuloksena on taululistassa lueteltujen taulujen rivien

HELIA SQL-harjoituksia 1(1) atk72d Versiopvm:

Tietokantojen perusteet, s 1999 SQL- osa Harri Laine 1. SQL -ohjelmistojen markkinaosuuksia SQL. SQL - historiaa. SQL - standardointi

Harjoitustehtävä 1. Harjoitustehtävän 1 ratkaisu. Harjoitustehtävä 1. Relaatioalgebra -liitokset (join) Liitos

CS-A1150 Tietokannat CS-A1150 Tietokannat / 39

Relaatiotietokantojen perusteista. Harri Laine Helsingin yliopisto

Tietokanta projektin alussa: create table kurssin_tila ( NOT NULL VARCHAR2(60) create table kurssin_tyyppi ( create table opintojakson_tyyppi (

Tällä viikolla. Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia

Kirjoita jokaiseen erilliseen vastauspaperiin kurssin nimi, tenttipäivä, oma nimesi (selkeästi), opiskelijanumerosi ja nimikirjoituksesi

SQL. ! nykystandardi SQL3 eli SQL'99. ! CREATE TABLE, ALTER TABLE ja DROP TABLE. ! CREATE VIEW ja DROP VIEW. ! CREATE INDEX ja DROP INDEX

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

Opiskeluoikeuksien maaran tiedonkeruu

CSE-A1200 Tietokannat

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Tietokannat II -kurssin harjoitustyö

Tietokantakurssit / TKTL

TIETOKANTOJEN PERUSTEET MARKKU SUNI

Helsingin yliopisto/tktl Kyselykielet, s 2006 Relaatiokalkyylit. Harri Laine 1

Helsingin yliopisto/tktl Kyselykielet, s 2006 Optimointi Harri Laine 1. Kyselyn optimointi. Kyselyn optimointi

D B. Tietokannan hallinta kertaus

SQL:N PERUSTEET MARKKU SUNI

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

HELIA 1 (15) Outi Virkki Tiedonhallinta

Kuva 7.2 vastaustaulu harjoitukseen 7.2

SQL:N PERUSTEET MARKKU SUNI

4.3.1 SQL tietokanta SQL:n kirjoitusasu SQL määrittelykielenä... 36

HAAGA-HELIA TIKO-05 1 (19) ICT23a Tietokannan suunnittelu ja toteutus O.Virkki

Makrojen mystinen maailma lyhyt oppimäärä

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Yleinen SQL. Yleinen SQL. SQL:n kehitys

Koostefunktiot. Viisi standardifunktiota: Esim. montako henkilöä on henkilo-taulussa:

Metropolia ammattikorkeakoulu TU00BS : ICT-teknologiaosaaminen Tuntitehtävät 5 Pasi Ranne

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

2. Käsiteanalyysi ja relaatiomalli

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

3. Taulujen määrittely ja muuttaminen

3. TAULUJEN MÄÄRITTELY JA MUUTTAMINEN

CS-A1150 Tietokannat CS-A1150 Tietokannat / 43

Tietokantojen perusteet k2004helsingin yliopisto/tktl Tietokantojen perusteet, s 2005 relaatiomalli Harri Laine 1.

Näkymät ja tiedon suojaus

Treenitietokannan suunnitteludokumentti

Tietokantojen suunnittelu, relaatiokantojen perusteita

Tietokannat II -kurssin harjoitustyö

1 YLEISTÄ (KS) SQL-TRAINER - KUVAUS NYKYISESTÄ JÄRJESTELMÄSTÄ (HL,KS) JATKOKEHITYKSEN VAATIMUKSET (HL,KS)...7

Opintopiiritehtävä 3: Verkkohuutokauppa

Tiedonhallinnan perusteet. H11 Ovien ja kulun valvontajärjestelmän tietokanta

Hohde Consulting 2004

Joko tunnet nämän Oracle10g SQL:n piirteet? Kari Aalto Saariston IT

OpenOffice.org Base 3.1.0

HELIA 1 (12) Outi Virkki Tiedonhallinta

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

Transkriptio:

DO NOT PRINT THIS DOCUMENT SQL -valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone varchar(12), PRIMARY KEY (opetunnus) ) ; CREATE TABLE opiskelija ( onumero numeric(5) NOT NULL, nimi varchar(40) NOT NULL, paa_aine varchar(12) NOT NULL, kaupunki varchar(30), aloitusvuosi numeric(4), PRIMARY KEY (onumero ) ) ; SQL-valintaehto Opettajien nimet: select nimi from opettaja; Opiskelijoiden pääaineet select distinct paa_aine from opiskelija; (löytyy mm. TKT) Tietojenkäsittelytieteen pääaineopiskelijoiden nimet select nimi from opiskelija where paa_aine = TKT ; SQL-valintaehto Espoossa asuvat matematiikan opiskelijat select * from opiskelija where paa_aine= MAT and kaupunki= Espoo ; Vuosina 1994-1997 opintonsa aloittaneet opiskelijat: select * from opiskelija where aloitusvuosi >=1994 and aloitusvuosi<=1997; tai select * from opiskelija where aloitusvuosi between 1994 and 1997; tai select * from opiskelija where aloitusvuosi in (1994,1995,1996,1997); Harri Laine 1

SQL-valintaehto Opiskelijat joiden sukunimi on Tele select * from opiskelija where nimi like Tele % ; (esimerkkitaulussa nimet ovat muodossa sukunimi+ space +etunimi) Opiskelijat, joiden etunimi alkaa L:llä select * from opiskelija where nimi like % L% ; välilyönti SQL-funktioita Opettajien sukunimet (Oraclessa) select substr(nimi, 1, instr(nimi, )-1) from opettaja; substr(sarake, alku,pituus) eristää osamerkkijonon standardissa substring(sarake FROM alku FOR pituus) Solidissa substring(sarake, alku, pituus) instring(sarake,merkkijono) antaa upotetun merkkijonon alkukohdan tai 0, jos ei löydy std:ssa ja Solisissa: position( merkkijono IN sarake) SQL-funktioita Opettajat, joiden puhelinnumero on parillinen select * from opettaja where substr(puh,length(puh),1) in ( 0, 2, 4, 6, 8 ); tai select * from opettaja where mod(to_number(puh),2)=0; Harri Laine 2

SQL- tuloksen järjestäminen Järjestetty tulos on käyttäjän kannalta helpommin hahmotettavissa, soveltuu tiedon etsintään SQL:ssä järjestys saadaan aikaan järjestysmääreellä order by sarake [ {asc[ending] desc[ending] }] [, ] ascending = nouseva järjestys, pienemmät arvot alussa (oletusjärjestys ellei mainita) descending = laskeva järjestys SQL- tuloksen järjestäminen Jos järjestysmääressä annetaan useita sarakkeita järjestetään rivit ensin ensimmäisenä annetun sarakkeen perusteella seuraavaksi ne rivit, joilla ensimmäisenä annetussa sarakkeessa on sama arvo järjestetään luettelon 2. sarakkeen perusteella seuraavaksi... Järjestys Order by A Order by A,B Order by A desc, B A B C D 2 4 8 7 1 4 6 7 3 1 5 2 2 3 5 1 1 1 4 2 3 2 4 6 1 5 5 2 A B C D 1 4 6 7 1 1 4 2 1 5 5 2 2 4 8 7 2 3 5 1 3 1 5 2 3 2 4 6 A B C D 1 1 4 2 1 4 6 7 1 5 5 2 2 3 5 1 2 4 8 7 3 1 5 2 3 2 4 6 A B C D 3 1 5 2 3 2 4 6 2 3 5 1 2 4 8 7 1 1 4 2 1 4 6 7 1 5 5 2 Harri Laine 3

SQL -järjestäminen Merkkitiedon järjestäminen saattaa olla järjestelmän asetuksista riippuvaa ja toimia eri järjestelmissä eri tavoin Esim. HY:n Oracle järjestää suomenkielisen aakkosjärjestyksen mukaisesti (V=W) eikä järjestäessään erottele isoja ja pieniä kirjaimia Usein järjestäminen tapahtuu kuitenkin merkin merkkikoodin mukaisesti Järjestäminen Opiskelijat pääaineittain opiskeluajan perusteella järjestettynä vanhimmasta nuorimpaan select paa_aine, aloitusvuosi, nimi from opiskelija order by paa_aine, aloitusvuosi; Järjestyksen määräämiseen käytettävien sarakkeiden on syytä olla tulostietolistan alussa (käyttöliittymätekniset syyt, ei SQL:n vaatimus) Jos kyselyn from osassa on useampia tauluja, muodostetaan näiden taulujen ristitulo, ellei where-osassa ole ehtoa, joka kytkisi rivit yhteen Jos where-osassa on rivit yhteenkytkevä ehto on kyseessä liitosoperaatio Harri Laine 4

CREATE TABLE kurssi ( koodi numeric(8) NOT NULL, nimi varchar(40) NOT NULL, opintoviikot numeric(5,1) NOT NULL, luennoija varchar(12) NOT NULL, PRIMARY KEY (koodi ), FOREIGN KEY (luennoija) REFERENCES opettaja) Kuka luennoi mitäkin kurssia: select kurssi.nimi, opettaja.nimi from opettaja, kurssi where luennoija=opetunnus order by kurssi.nimi; Liitos tehdään useimmiten vertaamalla taulun avainta toisessa taulussa olevaan siihen viittaavaan viiteavaimeen. Muunkinlaiset liitokset toki mahdollisia: Opiskelijat, jotka toimivat ehkä myös opettajina select opiskelija.nimi from opiskelija, opettaja where opiskelija.nimi=opettaja.nimi order by opiskelija.nimi; Taulujen järjestyksellä from osassa ei ole merkitystä kyselyn vastauksen kannalta sillä saattaa olla merkitystä kyselyn suoritusajan kannalta, mutta tämä on järjestelmäkohtaista Ehtojen järjestyksellä where-osassa ei ole merkitystä kyselyn vastauksen kannalta silläkin saattaa olla merkitystä kyselyn suoritusajan kannalta, mutta tämä on järjestelmäkohtaista Harri Laine 5

From-osassa voi olla useita tauluja Kaikki ne taulut, joiden dataa halutaan mukaan tulokseen on annettava from-osassa Tauluille voidaan from-osassa antaa tilapäinen kyselyn sisäinen nimi (alias, correlation name) from taulu [AS] alias liitettävillä tauluilla on usein samannimisiä sarakkeita, joten taulunimeä on käytettävä tarkenteena - alias voi olla lyhenne, joka vähentää kirjoitusvaivaa Jos sama taulu esiintyy from osassa useaan kertaan, on taulun esiintymät erotettava käyttämällä aliasta Esim.: Kurssiparit, joilla on sama luennoija select A.nimi, B.nimi from kurssi A, kurssi B where A.luennoija=B.luennoija and A.koodi<B.koodi order by A.nimi, B.nimi ehto A.koodi<B.koodi estää saman parin toistumisen eri järjestyksessä Vuoden 92 standardissa from-osaan sallittiin normaalien taulujen lisäksi myös kyselyiden tulostaulut ja liitostulokset (ei Oracle 7) from (alikysely) [[as] alias [( sarakeluettelo)] ] alikysely on normaali kysely sarakeluettelo uudelleennimeää alikyselyn tulossarakkeet tästä rakenteesta on hyötyä, jos halutaan yhdistää yksityiskohtaista tietoa ja yhteenvetotietoa, esimerkki myöhemmin yhteenvetotietojen yhteydessä Harri Laine 6

Liitostulokset from osassa: from taulu1 [<join type>]join taulu2 [ ON <liitosehdot>] <join type> = inner left outer right outer full outer Inner join on normaaliliitos (oletusarvo, jos join type-määrettä ei anneta) select kurssi.nimi, opettaja.nimi from opettaja join kurssi on luennoija=opetunnus order by kurssi.nimi Tämä on siis toinen tapa esittää liitos Jos kurssilla ei ole opettajaa, ei tulokseen tule mittään tietoa kurssista Ulkoliitokset ulkoliitoksella saadaan parittomaksi normaali-liitoksessa jäävät rivit mukaan tulokseen Kaikki kurssit, luennoijatietoineen: select kurssi.nimi, opettaja.nimi from kurssi left outer join luennoija on luennoija=opetunnus order by kurssi.nimi nyt luennoijattomatkin kurssit tulevat mukaan, luennoija.nimi saa arvon null select opettaja.nimi, kurssi.nimi from kurssi right outer join luennoija on luennoija=opetunnus order by opettaja.nimi näin saadaan kaikki opettajat, myös ne, jotka eivät luennoi Tyypillinen virhe liitoksissa on jättää jokin liitosehto pois, jolloin tuloksen rivijoukko tulee huomattvasti suuremmaksi kuin pitäisi jos from osassa on n kpl liitettäviä tauluja tarvitaan vähintään n-1 liitosehtoa. Taulujen liittäminen voi perustua useaan sarakkeeseen, jolloin ehtolausekkessa tarvittavien alkeisehtojen määrä voi moninkertaistua. Harri Laine 7

Yleensä kyselyt rakentuvat siten, että niissä on jokin keskeinen taulu johon, muita liitetään. Voi olla ettei tuosta keskeisestä taulusta tule mitään dataa tulokseksi. liitokset Keskeinen taulu SQL - liitokset CREATE TABLE harjoitusryhma ( kurssikoodi numeric(4) NOT NULL, ryhmanro numeric(2) NOT NULL, viikonpaiva varchar(12) NOT NULL, alkamisaika numeric(2) NOT NULL, sali varchar(12) NOT NULL, opettaja varchar(12) NOT NULL, PRIMARY KEY (kurssikoodi, ryhmanro), FOREIGN KEY (kurssikoodi) REFERENCES kurssi, FOREIGN KEY (opettaja) REFERENCES opettaja ) ; SQL - liitokset CREATE TABLE ilmoittautuminen ( kurssikoodi numeric(8) not null, ryhmanro numeric(2) not null, opisknro numeric(5) NOT NULL, ilm_aika date NOT NULL, PRIMARY KEY (opisknro, kurssikoodi), FOREIGN KEY (kurssikoodi, ryhmanro) REFERENCES harjoitusryhma, FOREIGN KEY (opisknro) REFERENCES opiskelija ) Harri Laine 8

SQL - liitokset Raportti kurssin Java ohjelmointi harjoitusryhmistä select H.ryhmanro rno, Ope.nimi ope, H.viikonpaiva, H.alkamisaika, O. Nimi opiskelija from Harjoitusryhma H, opettaja Ope, opiskelija O, ilmoittautuminen I, kurssi K where H.kurssikoodi=K.koodi and I.kurssikoodi=H.kurssikoodi and I.ryhmanro=H.ryhmanro and Ope.Opetunnus=H. Opettaja and I.Opisknro=O.onumero order by H.ryhmanro, O.nimi; SQL - liitokset ilmoittautuminen I.kurssikoodi=H.kurssikoodi and I.ryhmanro=H.ryhmanro harjoitusryhma I.Opisknro=O.onumero opiskelija Ope.Opetunnus=H. Opettaja opettaja H.kurssikoodi=K.koodi kurssi Alikyselyllä tarkoitetaan kyselyyn upotettua toista kyselyä. Upotettua kyselyä voidaan käyttää kyselyn from osassa mutta myös where osassa valintaehtojen operandina. On pidettävä mielessä, että alikyselykin tuottaa tuloksenaan taulun Alikyselyiden käyttöön valintaehdoissa on omia predikaatteja ja lisätarkenteita, jotka määrittelevät, miten ehdon operandia sovelletaan alikyselyn tulokseen Harri Laine 9

Vertailuoperaatio IN vertailuoperaatiossa a IN B operandi B on joukko, joten sen tilalle alikysely soveltuu suoraan a in (alikysely) on tosi, jos vakio a tai sarakkeen a arvo sisältyy alikyselyn tulokseen. Luennoivat opettajat: select nimi from opettaja where opetunnus in (select luennoija in kurssi) order by nimi; Luennoimattomat opettajat: select nimi from opettaja where opetunnus not in (select luennoija from kurssi) order by nimi; Standardin mukaan ja Oraclessa IN vertailun osapuolena voi olla myös sarakeyhdistelmä (Solidissa vain yksittäinen sarake). Harjoitusryhmät, joihin ei ole ilmoittautunut ketään select nimi, ryhmanro from kurssi, harjoitusryhma where kurssi.koodi=harjoitusryhma.kurssikoodi and (kurssikoodi, ryhmanro) not in (select kurssikoodi, ryhmanro from ilmoittautuminen) order by nimi, ryhmanro; Harri Laine 10

Muut vertailuoperaatiot ovat yksittäisten arvojen välisiä. Tällaisten osapuolina voi käyttää alikyselyä, jos on varmaa että kysely tuottaa tuloksenaan enintään yhden rivin. Tulee ajoaikainen virhe, jos ei tuotakaan. Tällaisia ovat tyypillisesti yhteenvetokyselyt (myöhemmin) Lisämääreillä SOME = ANY ja ALL voidaan yksittäisten arvojen vertailuun perustuvaa operaatiota soveltaa arvojoukoon: SOME = jokin joukon arvo toteuttaa ehdon ALL = kaikki joukon arvot toteuttavat ehdon Luennoivat opettajat: select nimi from opettaja where opetunnus = SOME (select luennoija from kurssi) order by nimi; = SOME on siis sama kuin IN Mistä kurssista saa eniten opintoviikkoja? select nimi from kurssi where opintoviikot >= ALL (select opintoviikot from kurssi) order by nimi; Yksittäisen arvon tyhjyyttä testataan IS NULL tai IS NOT NULL predikaateilla Alikyselyn tyhjyyden testaamiseen ovat tarjolla EXISTS ja NOT EXISTS predikaatit Exists (alikysely) on tosi, jos alikysely tuottaa ainakin yhden tulosrivin Not exists (alikysely) on tosi, jos vastaus on tyhjä eli ei yhtään riviä (ei tarjolla Solidissa) Kyselyn tyhjyyttä on mielekästä testata vain ns. kytkettyjen alikyselyjen yhteydessä Harri Laine 11

Aiemmissa esimerkeissä alikysely on ollut täysin riippumaton sen sisältävästä pääkyselystä (= sen voisi suorittaa erillisenä kyselynä ja sen tulos olisi sama kuin pääkyselyyn upotettuna = se ei viittaa mihinkään pääkyselyn elementtiin) Kytketyssä alikyselyssä tilanne on toinen: sitä ei voi suorittaa erillisenä, koska jokin siinä oleva valintaehto tai tulostiedon määritys käyttää hyväkseen pääkyselyn saraketta Luennoivat opettajat: select nimi from opettaja where exists (select luennoija from kurssi where luennoija= opettaja.opetunnus) order by nimi; Tässä alikysely suoritetaan jokaista opettajariviä kohden erikseen ja opettajarivi tulee tulokseen, jos alikyselyn tulos ei ole tyhjä. Luennoijat jotka pitävät harjoituksia kursseillaan Select O.nimi from opettaja O, kurssi K where O.opetunnus=K.luennoija and O.opetunnus in (select opettaja from harjoitusryhma where kurssikoodi=k.koodi); Select O.nimi from opettaja O, kurssi K where O.opetunnus=K.luennoija and exists (select A from harjoitusryhma where opettaja=o.opetunnus and kurssikoodi=k.koodi); Select O.nimi from opettaja O, kurssi K where O.opetunnus=K.luennoija and (O.opetunnus,K.koodi) in (select opettaja, kurssikoodi from harjoitusryhma ); Harri Laine 12

Ketjutus select nimi from opettaja where opetunnus in (select opettaja from harjoitusryhma where kurssikoodi in (select koodi from kurssi where nimi like Java% )); Java-alkuisten kurssien opettajien nimet. SQL - joukko-opin perusoperaatiot Kyselyjä voi yhdistää union (yhdiste), intersect (leikkaus) ja except (erotus) operaatioilla. Järjestysmääre koskee koko tulosta. Select [union intersect except] kysely order by...; union karsii toistuvat rivit Oraclessa except:n tilalla minus SQL - joukko-opin perusoperaatiot Opiskelijat, jotka ovat myös opettajia select nimi from opettaja intersect select nimi from opiskelija order by nimi; Harri Laine 13