FÖ 8: Databaskursen 1. SQL 2. Utsökningar mot en tabell 3. Od Order by 4. Funktionerna upper, lower och initcap 5. Konkatenering 6. Kolumnalias 7. Distinct 8. Hantera nullvärden med nvl-funktionen 9. Between 10. Group by 11. Aggregatfunktionerna max, min, sum och avg 12. Nästlade sökningar 1 Pär Douhan, pdo@du.se
Övningsuppgifter ift Övningstabell SQL> desc personal Name Null? Type ------------------------------------- -------- ------------ PNR NOT NULL NUMBER(3) FNAMN VARCHAR2(15) ENAMN VARCHAR2(15) AVDELNING VARCHAR2(10) LÖN NUMBER(6) BONUS NUMBER(4) ANSTDATUM DATE Om du skriver ut filen: Fö 08 - Databas (SQL 1, utsökningar mot en tabell) Övning.docx så blir det lättare att hänga med! 2
Innehåll i övningstabellen Tabelldata PNR FNAMN ENAMN AVDELNING LÖN BONUS ANSTDATUM --- ---------- --------------- ---------- ---------- ---------- ---------- 1 Bo Ek Teknik 22400 1300 1991-02-25 2 Ewa Ek Teknik 24400 1987-08-01 3 Rolf Svensson Teknik 22400 1300 1991-02-25 4 Raoul Ortiz Reklam 31200 1700 2002-01-01 5 lena Olsson Personal 27540 1991-02-25 6 Arman Trebic Reklam 19850 2005-06-01 7 Ola Ek Teknik 22400 4750 1997-02-01 01 8 Bosse Karlmats personal 23560 1999-02-25 9 Lenita Ekström TEKNIK 29400 1100 1991-02-25 10 bo larsson ekonomi 25400 3
selectsatsen t SQL, Data Retrivial Language = select Används när vi skall läsa data i databasen. selectsatsen = the select statement select = vilka kolumner som skall vara med i resultatet. from = från vilken/vilka tabell/tabeller data skall hämtas. where = villkor för rader som skall uppfyllas. group by = grupperar kolumner som inte aggregatfunktioner jobbar med. having = villkor för kolumner som aggregatfunktioner t e jobbar med. order by = sortera resultatet stigande (a-ö) eller fallande (ö-a). Endast select och from är tvingande att vara med. 4
E1 E1: Visa alla rader, alla kolumner. select * ; -- * = alla kolumner, är inte optimalt! Datablocken "cashas" inte. select pnr,fnamn,enamn,avdelning,lön,bonus,anstdatum ; 5
E2 E2: Visa alla rader och kolumnerna fnamn, enamn, avdelning. select fnamn,enamn,avdelning avdelning ; FNAMN ENAMN AVDELNING --------------- --------------- --------- Bo Ek Teknik Ewa Ek Teknik Rolf Svensson Teknik Raoul Ortiz Reklam lena Olsson Personal Arman Trebic Reklam Ola Ek Teknik Bosse Karlmats personal Lenita Ekström TEKNIK bo larsson ekonomi 6
E3 E3: Samma som E2 men sortera efter avdelning fallande -- sortering, data i tabeller är alltid osorterad! asc = a-ö, 1-1000, stigande (är default om inget anges) desc = ö-a, 1000-1, fallande select fnamn,enamn,avdelning order by avdelning desc; FNAMN ENAMN AVDELNING --------------- --------------- --------- Bo Ek Teknik Ewa Ek Teknik Ola Ek Teknik Rolf Svensson Teknik Lenita Ekström TEKNIK Raoul Ortiz Reklam Arman Trebic Reklam Bosse Karlmats personal lena Olsson Personal bo larsson ekonomi 7 T - E
E4 E4: Ta fram pnr, enamn, lön för alla som jobbar på "teknik". select pnr,enamn,lön where avdelning = 'Teknik'; -- Problem! Hur gör vi nu? funktionerna upper(), lower() eller initcap() löser våra problem! select pnr,enamn,lön where lower(avdelning) = 'teknik'; PNR ENAMN LÖN --- --------------- ---------- 1 Ek 22400 2 Ek 24400 3 Svensson 22400 7 Ek 22400 9 Ekström 29400 8
E5 E5: Visa fnamn hopslaget med enamn med rubriken namn, stor begynnelsebokstav på namnen. Sortera på enamn stigande. select initcap(fnamn) ' ' initcap(enamn) as namn order by enamn asc; namn är kolumnalias för uttrycket till vänster. NAMN --------------- Bo Ek Ewa Ek Ola Ek Lenita Ekström Bosse Karlmats Bo Larsson Lena Olsson Raoul Ortiz Rolf Svensson Arman Trebic as är frivilligt att ha med. = konkateneringsoperator 'Kalle' 'Andersson' = 'KalleAndersson' 'Anna' ' ' 'Ekholm' = 'Anna Ekholm' = Alt Gr + (tangenten till vä. om Z) 9
E6 E6: Visa de avdelningar som finns med versaler, utan dubbletter. select distinct upper(avdelning) avdelningar ; distinct tar bort dubletter! AVDELNINGAR ---------- EKONOMI PERSONAL REKLAM TEKNIK Kolumnalias för 'distinct upper(avdelning)' utan as. 10
E7 E7: Visa fnamn, enamn, lön + bonus med rubriken Total lön för alla som tillhör teknikavdelningen, sortera så att den med högst lön kommer överst. select fnamn,enamn,lön + nvl(bonus,0) as "Total lön:" where upper(avdelning) = 'TEKNIK' order by lön + nvl(bonus,0) desc; nvl(bonus,0) = om kolumnen bonus innehåller ett null-värde, så ersätts detta med 0 (noll). "Alias" inom dubbelfnuttar ger exakt matchning av kolumnrubriken. FNAMN ENAMN Total lön: --------------- --------------- ---------- Lenita Ekström 30500 Ola Ek 27150 Ewa Ek 24400 Bo Ek 23700 Rolf Svensson 23700 11
E8 E8: Visa alla rader och kolumner för de som saknar bonus. select * where bonus = null; where bonus is null; PNR FNAMN ENAMN AVDELNING LÖN BONUS ANSTDATUM --- --------- ------------ ---------- ----- ----- ---------- 2 Ewa Ek Teknik 24400 1987-08-01 5 lena Olsson Personal 27540 1991-02-25 6 Arman Trebic Reklam 19850 2005-06-01 8 Bosse Karlmats personal 23560 1999-02-25 10 bo larsson ekonomi 25400 12
E9 E9: Visa fnamn, enamn, anstdatum. Om datum saknas skall 'saknas' skrivas ut. select fnamn,enamn, nvl(to_char(anstdatum,'yyyy-mm-dd'),'saknas') anstdatum ; för alias FNAMN ENAMN ANSTDATUM --------------- --------------- ---------- Bo Ek 1991-02-25 Ewa Ek 1987-08-01 Rolf Svensson 1991-02-25 25 Raoul Ortiz 2002-01-01 lena Olsson 1991-02-25 Arman Trebic 2005-06-01 Ola Ek 1997-02-01 01 Bosse Karlmats 1999-02-25 Lenita Ekström 1991-02-25 bo larsson saknas 13
E10 E10: Visa pnr, fnamn, enamn på de i personalen som har pnr mellan 3 och 6. select pnr,fnamn,enamn where pnr between 3 and 6; PNR FNAMN ENAMN --- --------------- -------- 3 Rolf Svensson 4 Raoul Ortiz 5 lena Olsson 6 Arman Trebic 14
E11 E11: Visa pnr för de i personalen som heter 'ek' i efternamn och som har mer än 24000 i lön. select pnr where lower(enamn) = 'ek' and lön > 24000; PNR --- 2 15
E12 E12: Visa enamn för de i personalen som heter 'Rolf' eller 'Lena' eller 'Raoul' i förnamn. select enamn where initcap(fnamn) it in('rolf','lena','raoul'); 'L ' l') ENAMN -------- Svensson Ortiz Olsson 16
E13 E13: Visa avdelning, antal personal på varje avdelning under rubriken 'antal'. select initcap(avdelning) avdelning,count(pnr) antal group by initcap(avdelning); AVDELNING ANTAL ---------- ---------- Ekonomi 1 Personal 2 Reklam 2 Teknik 5 17
Aggregatfunktioner Aggregatfunktioner g eller gruppfunktioner, utför beräkningar. select initcap(avdelning) avdelning,count(pnr) antal group by initcap(avdelning); AVDELNING ANTAL ---------- ---------- Ekonomi 1 Personal 1 2 Personal 1 Reklam 1 2 Reklam 1 Teknik 1 5 Teknik 1 Teknik 1 Teknik 1 Teknik 1 count = returnerar antalet rader. max = returnerar högsta värdet. min = returnerar lägsta värdet. avg = returnerar medelvärdet. sum = returnerar summan. Aggregatfunktionerna returnerar ett värde. select max(lön) ; 31200 18
E14 E14: Samma som E13, men visa bara de avdelningar som har fler än 3 anställda. select initcap(avdelning) avdelning,count(pnr) antal group by initcap(avdelning) having count(pnr) > 3; Villkor för gruppfunktioner AVDELNING ANTAL ---------- ---------- Teknik 5 having 19
E15 E15: Visa hur många rader det finns i tabellen personal. select count(*) ; COUNT(*) --------- 10 20
E16 E16: Visa total lönekostnad per år och avdelning. select initcap(avdelning),sum(lön) * 12 group by initcap(avdelning); INITCAP(AVDELNING) SUM(LÖN)*12 ------------------ ----------- Ekonomi 304800 Personal 613200 Reklam 612600 Teknik 1452000 21
E17 E17: Visa fnamn,enamn,lön för den som har den högsta lönen av alla. Den nästlade (=inre) select-satsen kommer att exekveras först! select fnamn,enamn,lön where lön = (select max(lön) ); select fnamn,enamn,lön where lön = 31200; FNAMN ENAMN LÖN --------------- --------------- ---------- Raoul Ortiz 31200 22
E18 E18: Visa pnr,fnamn för de som har ett enamn som börjar med bokstaven 'e' och slutar på bokstaven 'k' och som blev anställda före år 2001. select pnr,fnamn where lower(enamn) like 'e%' and upper(enamn) like '%K' and anstdatum < to_date('2001-01-01','yyyy-mm-dd'); PNR FNAMN --- ----- 1 Bo 2 Ewa 7 Ola % = "wild card" operator används tillsammans med like 23
The End 24