Yhdiste, leikkaus, erotus ym. SQL tarjoaa myös relaatioalgebran operaatiot yhdiste, leikkaus, erotus Näissä operaatioissa taulujen on oltava samarakenteisia, ts. niissä on oltava samantyyppiset vastinsarakkeet. Informaatiojärjestelmät, kevät 1997 4.2.1999 1 Esimerkki. pankkien talletus- ja lainatietokanta: AsOsoite AsKaupunki Kaivotie Vantaa Koivikko Helsinki Länsitie Vantaa Itäväylä Helsinki Laine Otakaari Espoo TALLETUS Tilinro Summa 22222 2000 33333 3000 KONTTORI Varat KKaupunki SYP5 210 000 Espoo 170 000 Tampere PSP6 80 000 Espoo LAINA Tilinro Summa SYP5 500 Laine 4000 202 2500 PSP6 660 500 444 1500 Informaatiojärjestelmät, kevät 1997 4.2.1999 2 Yhdiste (Union) (kysely) UNION (kysely) Luettele ne asiakkaat, joilla on talletus tai laina tai molemmat -konttorissa. (SELECT WHERE = '') UNION (SELECT WHERE = ''); Informaatiojärjestelmät, kevät 1997 4.2.1999 3 Leikkaus (intersect) (kysely) INTERSECT (kysely) Luettele ne asiakkaat, joilla on sekä talletus että laina -konttorissa. (SELECT DISTINCT WHERE = '') INTERSECT (SELECT DISTINCT WHERE = ''); Informaatiojärjestelmät, kevät 1997 4.2.1999 4 Leikkaus Miksi SELECT DISTINCT? INTERSECT ei poista duplikaatteja (niitä ei leikkausoperaation tuloksena synny). Erotus (except/minus) (kysely) EXCEPT (kysely) Luettele ne asiakkaat, joilla on talletus mutta ei lainaa -konttorissa. (SELECT DISTINCT WHERE ='') EXCEPT (SELECT WHERE = ''); Informaatiojärjestelmät, kevät 1997 4.2.1999 5 Informaatiojärjestelmät, kevät 1997 4.2.1999 6 Tietojenkäsittelytieteen laitos 1/5
Erotus Miksi kyselyn jälkimmäisessä puoliskossa ei käytetä SELECT DISTINCT -muotoa? UNION, INTERSECT ja EXCEPT standardissa, MINUS Oraclessa Esimerkkikanta. Kirjasto KIRJA Nimi 111111-1111 090909-9999 121212-2222 Sippu ISBN Kirjannimi Tekijä 111 Oh! Pascal Cooper 552 Algebra I Myrberg 444 Samlade dikter Fröding 898 Lisp Winston 789 Electronics Smith LAINAUS ISBN Pvm 111 12.02.94 121212-2222 898 22.05.94 789 24.03.94 111111-1111 444 01.01.94 Informaatiojärjestelmät, kevät 1997 4.2.1999 7 Informaatiojärjestelmät, kevät 1997 4.2.1999 8 WHERE-lauseen ehdon osapuolena voi olla toinen kysely. Niiden lainaajien nimet, joilla on kirjoja lainassa? SELECT Nimi Asi, Lainaus Lai WHERE Asi. = Lai.; Edellinen kysely sisäkkäisten kyselyiden avulla SELECT Nimi (SELECT us); Sisempi kysely palauttaa joukon hetuja: 121212-2222 111111-1111 Informaatiojärjestelmät, kevät 1997 4.2.1999 9 Informaatiojärjestelmät, kevät 1997 4.2.1999 10 Ulommassa kyselyssä taulusta valitaan ne rivit, joiden hetut täsmäävät sisäkyselyn kanssa: SELECT Nimi sisäkyselyn hetut; Mitä kysely lopulta tulostaa? Nimi Sippu Informaatiojärjestelmät, kevät 1997 4.2.1999 11 Niiden kirjojen nimet, jotka on lainattu 01.03.94 jälkeen: K, Lainaus L WHERE (K.ISBN = L.ISBN) AND (L.Pvm > 01.03.94); Tai näin: SELECT Kirjannimi WHERE ISBN IN (SELECT ISBN us WHERE Pvm > 01.03.94); ISBN 898 789 Kirjannimi Lisp Electronics Informaatiojärjestelmät, kevät 1997 4.2.1999 12 Tietojenkäsittelytieteen laitos 2/5
ISBN:t oltava samaa tyyppiä, attribuuttien nimien ei toki tarvitse olla samat. IN-määre tutkii joukkoon kuulumista ( ). Yhtä monta IN- määrettä ( sisäkkäistä pykälää ) kuin on liitosehtojakin. Informaatiojärjestelmät, kevät 1997 4.2.1999 13, Lainaus, Asiakas WHERE Kirja.ISBN=Lainaus.ISBN AND Lainaus.=Asiakas. AND Asiakas.Nimi= ; Kirjannimi Oh! Pascal WHERE ISBN IN ISBN Electronics (SELECT ISBN 111 FROM LAINAUS 789 (SELECT FROM WHERE Nimi= )); Informaatiojärjestelmät, kevät 1997 4.2.1999 14 Riippumaton sisäkysely SELECT Pvm us (SELECT WHERE Nimi = ''); Pvm 12.02.94 24.03.94 sisemmän kyselyn WHERE-osassa viittaus ulomman kyselyn relaatioon => sisempi kysely mahdoton toteuttaa erikseen "ykkösvaiheena" (vrt. edell. sivu) => toteutetaan sisäkysely kerran jokaista ulomman kyselyn mahdollista riviä kohti Informaatiojärjestelmät, kevät 1997 4.2.1999 15 Informaatiojärjestelmät, kevät 1997 4.2.1999 16 Kirjojen nimet, jotka ovat lainassa ja kirjan tekijän nimi on sama kuin lainaajan nimi: SELECT Kirjannimi, Lainaus, Asiakas WHERE Lainaus.=Asiakas. AND Lainaus.ISBN=Kirja.ISBN AND Asiakas.Nimi = Kirja.Tekijä; WHERE ISBN in ( SELECT ISBN us, Asiakas WHERE Lainaus.=Asiakas. and Nimi = Kirja.Tekijä ); Informaatiojärjestelmät, kevät 1997 4.2.1999 17 Informaatiojärjestelmät, kevät 1997 4.2.1999 18 Tietojenkäsittelytieteen laitos 3/5
Esimerkki. pankkien talletus- ja lainatietokanta: AsOsoite AsKaupunki Kaivotie Vantaa Koivikko Helsinki Länsitie Vantaa Itäväylä Helsinki Laine Otakaari Espoo TALLETUS Tilinro Summa 22222 2000 33333 3000 KONTTORI Varat KKaupunki SYP5 210 000 Espoo 170 000 Tampere PSP6 80 000 Espoo LAINA Tilinro Summa SYP5 500 Laine 4000 202 2500 PSP6 660 500 444 1500 Informaatiojärjestelmät, kevät 1997 4.2.1999 19 Leikkaus (INTERSECT) sisäkyselyn avulla Luettele ne asiakkaat, joilla on sekä talletus että laina -konttorissa. SELECT DISTINCT WHERE ( = '') AND IN (SELECT Asnimi WHERE Knimi = ''); Informaatiojärjestelmät, kevät 1997 4.2.1999 20 IN-määrettä voi edeltää myös useampi attribuutti. Edellinen kysely toisin: SELECT DISTINCT WHERE ( = '') AND (, ) IN Laine (SELECT Knimi, Asnimi ); SYP5 PSP6 Informaatiojärjestelmät, kevät 1997 4.2.1999 21 Erotus (MINUS) sisäkyselyn avulla Luettele ne asiakkaat, joilla on talletus mutta ei lainaa -konttorissa. SELECT DISTINCT WHERE ( = '') AND NOT IN (SELECT Asnimi WHERE Knimi = ''); Informaatiojärjestelmät, kevät 1997 4.2.1999 22 Tai taas toisin: SELECT DISTINCT WHERE ( = '') AND (, ) NOT IN (SELECT Knimi, Asnimi SYP5 Laine ); PSP6 Informaatiojärjestelmät, kevät 1997 4.2.1999 23 Lisäpiirteitä: Samaan tauluun viittaaminen aliaksilla Luettele ne asiakkaat, joilla on talletus sellaisessa konttorissa, jossa lla on talletus. SELECT DISTINCT Tal. T, Talletus Tal WHERE (T.Asnimi = '') AND (T. = Tal.); Informaatiojärjestelmät, kevät 1997 4.2.1999 24 Tietojenkäsittelytieteen laitos 4/5
T TAL Lisäpiirteitä: Samaan tauluun viittaaminen viitenimillä Tilinro Summa 22222 2000 33333 3000 Tilinro Summa 22222 2000 33333 3000 Toinen tapa on sisäkyselyn ja IN-määreen käyttäminen: SELECT DISTINCT WHERE IN Knimi (SELECT Knimi WHERE = ''); Miksi DISTINCT-määre? Informaatiojärjestelmät, kevät 1997 4.2.1999 25 Informaatiojärjestelmät, kevät 1997 4.2.1999 26 Lisäpiirteitä: SOME ja ALL IN-määreellä testataan, kuuluuko WHEREosan alkio sisäkyselyn tuottamaan joukkoon vai ei, eli vertailun osapuolen on oltava sama kuin jokin joukon alkio (siis =) Joskus voidaan tarvita myös vertailuoperaattoreita: < <= > >= <> Informaatiojärjestelmät, kevät 1997 4.2.1999 27 SOME Luettele ne konttorit, joilla on enemmän varoja kuin jollakin Espoossa sijaitsevalla konttorilla. (Eli ne, joilla on enemmän kuin sillä Espoossa olevalla konttorilla, jolla on kaikkein vähiten!) SELECT SYP5 WHERE Varat > SOME Varat 210 000 80 000 (SELECT Varat WHERE KKaupunki = 'Espoo'); SOME:n tilalle käy ANY! Informaatiojärjestelmät, kevät 1997 4.2.1999 28 ALL Luettele ne konttorit, joilla on enemmän varoja kuin millä tahansa Espoossa sijaitsevalla konttorilla. SELECT WHERE Varat > ALL tyhjä! (SELECT Varat Varat WHERE KKaupunki = 'Espoo'); 210 000 80 000 Informaatiojärjestelmät, kevät 1997 4.2.1999 29 Vertailuoperaattorien käyttö Vertailuoperaattoreita voidaan käyttää suoraan (ilman SOMEa tai ALLia), jos ollaan varmoja siitä, että sisäkysely tuottaa tulokseksi aina täsmälleen yhden rivin. Esimerkiksi koostefunktioiden yhteydessä käy näin. Informaatiojärjestelmät, kevät 1997 4.2.1999 30 Tietojenkäsittelytieteen laitos 5/5