HELIA TIKO-05 1 (15) SQL / DML 3 Liitos...2 SQL-92:n join operaatio...4 SQL-89:n join operaatio:...5 Karteesinen tulo... 10 Ulkoliitos (Outer join)... 11 Vasemmanpuoleinen ulkoliitos... 12 Oikeanpuoleinen ulkoliitos... 13 Molemminpuoleinen ulkoliitos... 14
HELIA TIKO-05 2 (15) Liitos ~ JOIN, sisäliitos ~ Kysely useammasta (kuin yhdestä) taulusta ~ liitosoperaatiossa yhdistellään kahden relaation rivejä yhdeksi tulostauluksi jonkun ehdon (esim. liitosehdon) mukaan Esim: Liitetään jokainen asunnon näyttörivi asuntoa katsoneen asiakkaan riviin. VIEWING clientno propertyno viewdate comments CR56 PA14 24-MAY-01 too small CR76 PG4 20-APR-01 too --ote CR56 PG4 26-MAY-01 CR62 PA14 14-MAY-01 no dining room CR56 PG36 28-APR-01 CLIENT clientno fname lname telno preftype maxrent CR76 John Kay 0207-774-5632 Flat 425 CR56 Aline Stewart 0141-848-1825 Flat 350 CR74 Mike Ritchie 01475-392178 House 750 CR62 Mary Tregar 01224-196720 Flat 600 CR76 John Kay 0207-774-5632 Flat 425 client no prope rtyno viewdate comments client no CR56 PA14 24-MAY-01 too small CR56 Aline Stewart CR76 PG4 20-APR-01 too --ote CR76 John Kay CR56 PG4 26-MAY-01 CR56 Aline Stewart CR62 PA14 liitosehto (viewing.clientno = client.clientnro) 14-MAY-01 no dining room CR62 Mary CR56 PG36 28-APR-01 CR56 Aline Stewart fname lname telno pref typ e 0141-848-1825 0207-774-5632 0141-848-1825 Tregar 01224-196720 0141-848-1825 max rent Flat 350 Flat 425 Flat 350 Flat 600 Flat 350
HELIA TIKO-05 3 (15) ~ yksi kysely voi sisältää useita liitosoperaatioita ~ SELECT-kyselyssä liitos voidaan määritellä eri tavoin: o SQL92: JOIN ON osalla(tai JOIN USING/NATURAL JOIN -osalla) o SQL89: FROM-osaan liittävät taulut ja WHERE-osaan liitosehto muiden ehtojen joukkoon
HELIA TIKO-05 4 (15) Esim: Listaa sellaisten asiakkaiden nimet, joille on näytetty vähintään yksi vuokrattavana oleva asuntokohde. SQL-92:n join operaatio SELECT FROM JOIN c.clientno, fname, lname, propertyno client c viewing v ON c.clientno = v.clientno; taulun lyhyt aliasnimi clientno fname lname propertyno CR76 John Kay PG4 CR56 Aline Stewart PG36 CR56 Aline Stewart PA14 CR56 Aline Stewart PG4 CR62 Mary Tregear PA14 SELECT FROM JOIN clientno, fname, lname, propertyno client viewing USING (clientno); SELECT clientno, fname, lname, propertyno FROM client NATURAL JOIN viewing;
HELIA TIKO-05 5 (15) SQL-89:n join operaatio: viittaus client-taulun sarakkeeseen clientno SELECT FROM WHERE c.clientno, fname, lname, propertyno client c, viewing v c.clientno = v.clientno; viittaus client-taulun sarakkeeseen clientno ja viewing-taulun sarakkeeseen clientno tauluille annettu lyhyet aliasnimet: client = c viewing = v
HELIA TIKO-05 6 (15) Esim. Listaa jokaisen haarakonttorin työntekijät, joilla on hoidettavanaan vuokrattava asuntokohde. SQL-89: SELECT FROM WHERE s.branchno, s.staffno, fname, lname, pno staff s, propertyforrent p s.staffno = p.staffno; SQL-92: SELECT FROM JOIN s.branchno, s.staffno, fname, lname, pno staff s propertyforrent p ON s.staffno=p.staffno; SELECT FROM JOIN s.branchno, staffno, fname, lname, pno staff s propertyforrent USING (staffno); SELECT s.branchno, staffno, fname, lname, pno FROM staff s NATURAL JOIN propertyforrent; branchno staffno fname lname propertyno B3 SG37 Ann Beech PG21 B3 SG37 Ann Beech PG36 B3 SG14 David Ford PG4 B3 SG14 David Ford PG16 B7 SA9 Mary Howe PA14 B5 SL41 Julie Lee PL94 (pno = propertyno)
HELIA TIKO-05 7 (15) Esim. Listaa jokaisen haarakonttorin työntekijät, joilla on hoidettavanaan vuokrattava kohde listausjärjestys haarakonttoreittain, työntekijöittäin ja kohteittain. SQL-89: SELECT s.branchno, s.staffno, fname, lname, pno FROM staff s, propertyforrent p WHERE s.staffno = p.staffno ORDER BY s.branchno, s.staffno, pno; SQL-92: SELECT s.branchno, s.staffno, fname, lname, pno FROM staff s JOIN propertyforrent p ON s.staffno=p.staffno ORDER BY s.branchno, s.staffno, pno; branchno staffno fname lname propertyno B3 SG14 David Ford PG4 B3 SG14 David Ford PG16 B3 SG37 Ann Beech PG21 B3 SG37 Ann Beech PG36 B5 SL41 Julie Lee PL94 B7 SA9 Mary Howe PA14 (pno = propertyno)
HELIA TIKO-05 8 (15) Esim. Kolmen taulun liitos: Listaa jokaisen haarakonttorin työntekijät, joilla on hoidettavanaan vuokrattava kohde listausjärjestys haarakonttoreittain, työntekijöittäin ja kohteittain. Listaa haarakonttorin lisäksi haarakonttorin kaupunki. SQL-89: SELECT b.branchno, b.city, s.staffno, fname, lname, pno FROM branch b, staff s, propertyforrent p WHERE b.branchno = s.branchno AND s.staffno = p.staffno ORDER BY b.branchno, s.staffno, pno; SQL-92: SELECT b.branchno, b.city, s.staffno, fname, lname, pno FROM branch b JOIN staff s ON b.branchno=s.branchno JOIN propertyforrent p ON s.staffno=p.staffno ORDER BY b.branchno, s.staffno, pno; branchno city staffno fname lname propertyno B3 Glasgow SG14 David Ford PG4 B3 Glasgow SG14 David Ford PG16 B3 Glasgow SG37 Ann Beech PG21 B3 Glasgow SG37 Ann Beech PG36 B5 London SL41 Julie Lee PL94 B7 Aberdeen SA9 Mary Howe PA14 (pno = propertyno)
HELIA TIKO-05 9 (15) Esim: Laske jokaisen haarakonttorin työntekijöittäin vuokrattavana olevat kohteiden lukumäärä. SQL-89: SELECT s.branchno, s.staffno, COUNT (*) as lkm FROM staff s, propertyforrent p WHERE s.staffno=p.staffno GROUP BY s.branchno, s.staffno ORDER BY s.branchno, s.staffno; SQL-92: SELECT s.branchno, s.staffno, COUNT (*) as lkm FROM staff s JOIN propertyforrent p ON s.staffno=p.staffno GROUP BY s.branchno, s.staffno ORDER BY s.branchno, s.staffno; branchno staffno lkm B3 SG14 2 B3 SG37 2 B7 SA9 1 B5 SL41 1
HELIA TIKO-05 10 (15) Karteesinen tulo ~ Ristitulo ~ Taulun jokaisen rivin liittäminen toisen tai useamman taulun jokaiseen riviin SQL-89: SELECT [DISTINCT ALL] {* column_list } FROM table_name1, table_name2; SQL-92: SELECT [DISTINCT ALL] {* column_list } FROM table_name1 CROSS JOIN table_name2; Huom: ei yhdistävää määrettä: WHERE-ehtoa SQL-89:ssä ON-osaa (tms.) SQL-92:ssa! Karteesista tuloa tarvitaan äärimmäisen harvoin; tyypillisesti se on ohjelmoijan virhe, joka saattaa kaataa tietokantapalvelimen!
HELIA TIKO-05 11 (15) Ulkoliitos (Outer join) Esim. BRANCH PROPERTYFORRENT branchno bcity propertyno pcity B3 Glasgow PA14 Aberdeen B4 Bristol PL94 London B2 London PG4 Glasgow Esim: (Sisä)liitos: Listaa sellaisista haarakonttoreista, jotka sijaitsevat samassa kaupungissa kuin vuokrattavana oleva kohde. Listaukseen mukaan haarakonttorista numero ja kaupunki sekä vuokrattavasta kohteesta kohdenumero ja sijaintikaupunki. SELECT FROM JOIN b.branchno, b.bcity, p.propertyno, p.pcity branch b propertyforrent ON b.bcity = p.pcity; branchno bcity propertyno pcity B3 Glasgow PG4 Glasgow B2 London PL94 London
HELIA TIKO-05 12 (15) 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. vasemmanpuoleinen taulu SELECT b.branchno, b.bcity, p.propertyno, p.pcity FROM branch b LEFT JOIN propertyforrent p ON b.bcity=p.pcity; branchno bcity propertyno pcity B3 Glasgow PG4 Glasgow B4 Bristol Null Null B2 London PL94 London JOIN -määreen vasemmanpuoleisen taulun kaupungin mukaan tehdään vertailu. Jos oikean puoleisesta ei löydy sopivaa, tulostetaan sen sarakkeisiin null. Ts. JOIN -määreen vasemmanpuoleisesta taulusta otetaan 'kaikki' rivit, vaikkei oikeanpuoleisesta taulusta vastinriviä löytyisikään
HELIA TIKO-05 13 (15) 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.branchno, b.bcity, p.propertyno, p.pcity FROM branch b RIGHT JOIN propertyforrent p ON b.bcity=p.pcity; oikeanpuoleinen taulu branchno bcity propertyno pcity Null Null PA14 Aberdeen B3 Glasgow PG4 Glasgow B2 London PL94 London JOIN määreen oikeanpuoleisen taulun kaupungin mukaan tehdään vertailu. Jos vasemmanpuoleisesta ei löydy sopivaa, tulostetaan sen sarakkeisiin null. Ts. JOIN -määreen oikeanpuoleisesta taulusta otetaan 'kaikki' rivit, vaikkei vasemman puoleisesta taulusta vastinriviä löytyisikään
HELIA TIKO-05 14 (15) Molemminpuoleinen ulkoliitos ~ full outer join Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotka sijaitsevat samassa kaupungissa. Listaa myös sellaiset haarakonttorit, joiden kaupungissa ei ole vuokrakohdetta sekä sellaiset vuokrakohteet, joiden kaupungissa ei ole haarakonttoria. SELECT b.branchno, b.bcity, p.propertyno, p.pcity FROM branch b FULL JOIN propertyforrent p ON b.bcity=p.pcity; branchno bcity propertyno pcity Null Null PA14 Aberdeen B3 Glasgow PG4 Glasgow B4 Bristol Null Null B2 London PL94 London Kummalta puolelta tahansa voi vastinrivi puuttua.
HELIA TIKO-05 15 (15) Standardista poikkeavia ulkoliitoksia Esim. Listaa haarakonttorit ja vuokrattavat kohteet, jotka sijaitsevat samassa kaupungissa. Listaa myös sellaiset vuokrakohteet, joiden kaupungissa ei ole haarakonttoria. SELECT b.branchno, b.bcity, p.propertyno, p.pcity FROM branch b, propertyforrent p WHERE b.bcity (+) = p.pcity ;