Databaser och Informationssystem 5 hp IK008 Föreläsning 7 SQL, utsökningar mot en tabell Övningsuppgifter Övningstabell SQL> desc personal Name Null? Type ------------------------------------- -------- ------------ PNR NOT NULL NUMBER(3) FNAMN VARCHAR2(5) ENAMN VARCHAR2(5) AVDELNING VARCHAR2(0) LÖN NUMBER(6) BONUS NUMBER(4) ANSTDATUM DATE Om du skriver ut filen FÖ7_SQL_tabelldata.doc, så blir det lättare att följa med.
SELECT-satsen SQL, Data Retrivial Language = select Används när vi skall läsa data i databasen. selectsatsen = 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 jobbar med. order by = sortera resultatet stigande (a-ö) eller fallande (ö-a). Endast select och from är tvingande att vara med! E E: Visa alla rader, alla kolumner. select * ; -- * = alla kolumner, är inte optimalt! Datablocken "cashas" inte. select pnr,fnamn,enamn,avdelning,lön,bonus,anstdatum ; 2
E2 E2: Visa alla rader och kolumnerna fnamn, enamn, avdelning select fnamn,enamn,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 E3 E3: Samma som E2 men sortera efter avdelning fallande -- sortering, data i tabeller är alltid osorterad! asc = a-ö, -000, dvs stigande (är default) desc = ö-a, 000-, dvs 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 T - E 3
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() eller lower() eller initcap() löser våra problem! select pnr,enamn,lön where lower(avdelning) = 'teknik'; PNR ENAMN LÖN --- --------------- ---------- Ek 22400 2 Ek 24400 3 Svensson 22400 7 Ek 22400 9 Ekström 29400 E5 E5: Visa fnamn ihopslaget 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) 4
E6 E6: Visa de avdelningar som finns med versaler, utan dubletter select distinct upper(avdelning) avdelningar ; distinct tar bort dubletter! AVDELNINGAR ---------- EKONOMI PERSONAL REKLAM TEKNIK Kolumnalias för 'distinct upper(avdelning)' utan as. 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 2750 Ewa Ek 24400 Bo Ek 23700 Rolf Svensson 23700 5
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 987-08-0 5 lena Olsson Personal 27540 99-02-25 6 Arman Trebic Reklam 9850 2005-06-0 8 Bosse Karlmats personal 23560 999-02-25 0 bo larsson ekonomi 25400 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 99-02-25 Ewa Ek 987-08-0 Rolf Svensson 99-02-25 Raoul Ortiz 2002-0-0 lena Olsson 99-02-25 Arman Trebic 2005-06-0 Ola Ek 997-02-0 Bosse Karlmats 999-02-25 Lenita Ekström 99-02-25 bo larsson saknas 6
E0 E0: 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 E E: 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 7
E2 E2: visa enamn för de i personalen som heter 'Rolf' eller 'Lena' eller 'Raoul' i förnamn. select enamn where initcap(fnamn) in('rolf','lena','raoul'); ENAMN -------- Svensson Ortiz Olsson E3 E3: visa avdelning, antal personal på varje avdelning under rubiken 'antal'. select initcap(avdelning) avdelning,count(pnr) antal group by initcap(avdelning); AVDELNING ANTAL ---------- ---------- Ekonomi Personal 2 Reklam 2 Teknik 5 8
Aggregatfunktioner Aggregatfunktioner eller gruppfunktioner, utför beräkningar. select initcap(avdelning) avdelning,count(pnr) antal group by initcap(avdelning); count = returnerar antalet rader. max = returnerar högsta värdet. min = returnerar lägsta värdet. avg = returnerar medelvärdet. sum = returnerar summan. AVDELNING ANTAL ---------- ---------- Aggregatfunktionerna returnerar Ekonomi ett värde. Personal 2 Personal select max(lön) Reklam 2 ; Reklam Teknik 5 Teknik Teknik 3200 Teknik Teknik E4 E4: samma som E3, 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 9
E5 E5: Visa hur många rader det finns i tabellen personal. select count(*) ; COUNT(*) --------- 0 E6 E6: Visa total lönekostnad per år och avdelning. select initcap(avdelning),sum(lön) * 2 group by initcap(avdelning); INITCAP(AVDELNING) SUM(LÖN)*2 ------------------ ----------- Ekonomi 304800 Personal 63200 Reklam 62600 Teknik 452000 0
E7 E7: 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 = 3200; FNAMN ENAMN LÖN --------------- --------------- ---------- Raoul Ortiz 3200 E8 E8: 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 2000. select pnr,fnamn where lower(enamn) like 'e%' and upper(enamn) like '%K' and anstdatum < to_date('200-0-0','yyyy-mm-dd'); PNR FNAMN --- ----- Bo 2 Ewa 7 Ola % = "wild card" operator används tillsammans med like Ω