HELIA TIKO-05 1 (17) SQL / DML 4 Alikyselyt...2 Joukko-operaatiot...7 Yhdiste, unioni...8 Leikkaus...9 Erotus... 10 Tietokannan datan muokkaus... 11 Lisäys... 11 Yhden rivin lisääminen... 12 Useamman rivin kopiointi... 14 Päivitys... 15 Poisto... 17
HELIA TIKO-05 2 (17) Alikyselyt ~ subqueries SELECT, INSERT, UPDATE ja DELETE-lauseet voivat sisältää sisäkkäisen SELECT-lauseen alikysely ympäröidään suluilla ( ) WHERE ehdossa alikyselyn tulee olla vertailun oikealla puolella ORDER BY-määrettä ei saa käyttää alikyselyssä (ulkoisessa lauseessa kyllä) Huom. Alikyselyn voi usein korvata liitoksella. (Liitos on tehokkaampi.)
HELIA TIKO-05 3 (17) Esim. Listaa henkilöt, jotka ovat töissä 163 Main St sijaitsevassa haarakonttorissa. SELECT staffno, fname, lname, oposition FROM staff WHERE brachnno = (SELECT branchno FROM branch WHERE address= 163 Main St ); staffno fname lname oposition SG37 Ann Beech Snr Asst SA9 David Ford Deputy SG5 Susan Brand Manager Vrt. SELECT FROM JOIN WHERE staffno, fname, lname, oposition staff s branch b ON s.brachnno = b. brachnno b.address= 163 Main St ;
HELIA TIKO-05 4 (17) Esim. Listaa henkilöt, joiden palkka on korkeampi kuin kaikkien työntekijöiden palkkojen keskiarvo. SELECT staffno, fname, lname, oposition, salary FROM staff WHERE salary > (SELECT AVG(salary) FROM staff); staffno fname Lname oposition Salary SL21 John White Manager 30000.00 SA9 David Ford Deputy 18000.00 SG5 Susan Brand Manager 24000.00 Huom! Alikysely on ainoa vaihtoehto (ok), kun vertailu tehdään koostefunktion arvoon
HELIA TIKO-05 5 (17) Jos alikysely voi palauttaa useamman kuin yhden rivin, ei voida käyttää >, <, = operaatioita. IN-operaatio ok Esim. Listaa työtekijät, jotka hoitavat jonkun asuntokohteen vuokrausta SELECT staffno, fname, lname FROM staff WHERE staffno IN (SELECT staffno FROM propertyforrent); sno name lname SA9 Mary Howe SA9 David Ford SG37 Ann Beech SL41 Julie Lee Vrt. SELECT staffno, fname, lname FROM staff s JOIN propertyforrent p ON s.staffno = p.staffno; Jälleen JOIN olisi parempi (=tehokkaampi) ratkaisu
HELIA TIKO-05 6 (17) Esim. Listaa vuokrattavat kohteet, joiden vuokrauksen hoitavat henkilöt, jotka työskentelevät 163 Main St :n haarakonttorissa. SELECT FROM WHERE propertyno, street, area, city, postcode, propertytype, rooms, rent propertyforrent staffno IN (SELECT staffno FROM staff WHERE branchno = (SELECT branchno FROM branch WHERE street = 163 Main St )); Proper tyno PG4 Street Area City Post code 6 Lawrence St Proper tytype Room s Rent Patrick Glasgow G11 0QX Flat 3 350 PG36 2 Monor Rd Glasgow G32 4QX Flat 3 375 PG21 18 Dale Rd Hyndlan Glasgow G12 House 5 600 PG16 5 Novar Dr Hyndlan Glasgow G12 9AX Flat 4 450 kysely, jossa alikyselyn alikysely Jälleen JOIN olisi parempi (=tehokkaampi) ratkaisu
HELIA TIKO-05 7 (17) Joukko-operaatiot 1. Yhdiste (union) 2. Leikkaus (intersect) 3. Erotus (except) Relaatioiden A ja B yhdiste sisältää rivit, jotka löytyvät joko A tai B taulusta. Relaatioiden A ja B leikkaus sisältää rivit, jotka löytyvät sekä A että B taulusta. Relaatioiden A ja B erotus sisältää rivit, jotka löytyvät A mutta eivät B taulusta. joukko-operaatoita voidaan käyttää samarakenteisille tulosrelaatioille samanrakenteisissa relaatioissa sarakkeiden lkm on sama sekä sarakkeiden tietotyypit ja pituudet ovat samat setoperator [ALL] [ CORRESPONDING [ BY {column1 [,...] }]] CORRESPONDING BY -määre: operaatio tehdään määreen perässä olevien sarakkeiden perusteella ALL-määre kaikki mahdolliset rivit tulevat mukaan (oletuksena duplikaattirivit poistetaan)
HELIA TIKO-05 8 (17) Yhdiste, unioni ~ union Esim. Tuota lista kaupungeista, joissa sijaitsee joko haarakonttori tai vuokrattava asunto. (SELECT FROM WHERE UNION (SELECT FROM WHERE city branch city IS NOT NULL) city propertyforrent city IS NOT NULL); tai City Glasgow London Aberdeen Bristol (SELECT * FROM branch WHERE city IS NOT NULL) UNION CORRESPONDING BY city (SELECT * FROM propertyrorrent WHERE city IS NOT NULL);
HELIA TIKO-05 9 (17) Leikkaus ~ intersect Esim. Tuota lista kaupungeista, joissa sijaitsee sekä haarakonttori että vuokrattava asunto. (SELECT city FROM branch) INTERSECT (SELECT city FROM propertyforrent); City Glasgow London tai (SELECT * FROM branch) INTERSECT CORRESPONDING BY city (SELECT * FROM propertyforrent);
HELIA TIKO-05 10 (17) Erotus ~ except ~ (Oraclessa poikkeuksellisesti minus) Esim. Listaa kaupungit, joissa on haarakonttori, mutta ei ole vuorattavia asuntoja. (SELECT city FROM branch ) EXCEPT (SELECT city FROM propertyforrent); City Bristol tai (SELECT * FROM branch) EXCEPT CORRESPONDING BY city (SELECT * FROM propertyforrent);
HELIA TIKO-05 11 (17) Tietokannan datan muokkaus INSERT tiedon (rivien) lisäys tauluun UPDATE taulussa olevan tiedon muuttaminen / päivitys DELETE tiedon (rivien) poisto taulusta Lisäys ~ insert kahdenlaisia lisäyksiä: a) yhden rivin lisäämisen nimettyyn tauluun b) useamman rivin kopiointi taulusta toiseen
HELIA TIKO-05 12 (17) Yhden rivin lisääminen INSERT INTO table_name [ (column_list) ] VALUES (data_value_list) ; table_name column_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 kenttiä jos sarakenimiä on puuttuvat sarakkeet alustetaan oletusarvoilla tai NULL-arvoilla data_value_list yhteensopiva column_list:n kanssa: arvojen lukumäärä sama järjestys sama arvon kuuluttava ko. sarakkeen arvojoukkoon sovelluksen koodiin sarakenimet kannattaa aina laittaa
HELIA TIKO-05 13 (17) 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 (staffno, fname, lname, oposition, sex, salary, brachnno) VALUES ( SG44, Anne, Jones, Assistent, F,,8300, B3 );
HELIA TIKO-05 14 (17) Useamman rivin kopiointi 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 hoitamiensa vuokrattavien kohteiden lukumäärät. INSERT INTO staff_prop_count (SELECT s.staffno, fname, lname, COUNT (*) FROM staff s, propertyforrent p WHERE s.staffno=p.staffno GROUP BY s.staffno, fname, lname) UNION (SELECT staffno, fanme, lname, 0 FROM staff WHERE staffno NOT IN (SELECT staffno FROM propertyforrent)); sno fname lname prop_cnt SG37 Ann Beech 2 SA9 David Ford 2 SG5 Susan Brand 0 SL21 John White 0 SA9 Mary Howe 1 SL41 Julie Lee 1
HELIA TIKO-05 15 (17) Päivitys ~ update UPDATE table_name SET column_name1=data_value1 [,column_name2=data_value2...] [WHERE search_condition]; Jos WHERE-määre, päivitetään vain ehdon täyttävät rivit, muuten päivitetään kaikki rivit Esim. Lisää jokaisen työntekijän palkkaa 3 %:lla. UPDATE staff SET salary = salary * 1.03; Esim. Anna managereille 5 %:n palkankorotus. UPDATE staff SET salary = salary * 1.05 WHERE oposition = Manager ;
HELIA TIKO-05 16 (17) Esim. Ylennä David Ford (staffno= SG14 ) manageriksi ja vaihda palkaksi 18000. UPDATE SET WHERE staff oposition= Manager, salary=18000 staffno= SG14 ;
HELIA TIKO-05 17 (17) Poisto ~ delete DELETE FROM table_name [WHERE search_condition]; Jos WHERE-määre, poistetaan vain ehdon täyttävät rivit, muuten poistetaan kaikki rivit Esim. Poista kaikki asuntokohteen PG4 näytöt. DELETE FROM viewing WHERE propertyno= PG4 ; Esim. Poista kaikki asuntonäytöt. DELETE FROM viewing;