[Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hioa.no) 10/11-15 DISTINCT Pregnante navn på kolonner Boolske operatorer: OR, NOT Beregningsfunksjoner og Gruppering NULL-verdier Maria Bello har to roller i Den mistenkte 10:13, men fordi vi ikke viser roller (interessert bare i medvirkende og program), vises "hennes" rad likt to ganger. Løsningen: SELECT DISTINCT Fornavn, Etternavn, Programtittel P, Medvirkende M, Deltagelse D AND M.MedvirkendeID= D.MedvirkendeID; Tilbake til spørringer mot en tabell, for et øyeblikk. SELECT Tilgjengelighet Av og til trenger vi en kontekst i våre søkeresulater I en slik spørring ønsker vi vite hva slags tilgjengelightsverdier vi har. Da er det nok å se hver verdi en gang. SELECT Etternavn, Programtittel P, Medvirkende M, Deltagelse D AND M.MedvirkendeID= D.MedvirkendeID AND D.Rolle="Skuespiller"; SELECT DISTINCT Tilgjengelighet Her vet vi at vi bare viser navn på skuespillere, og derfor ønsker å omdøpe kolonnen Etternavn i visningen til Skuespillernavn Det er også nokså typisk i Søk mot flere tabeller. For eksempel: SELECT Fornavn, Etternavn, Programtittel P, Medvirkende M, Deltagelse D AND M.MedvirkendeID= D.MedvirkendeID; SELECT Etternavn AS Skuespillernavn, Programtittel P, Medvirkende M, Deltagelse D AND M.MedvirkendeID= D.MedvirkendeID AND D.Rolle="Skuespiller"; 1 of 12 10.11.2015 14:49 2 of 12 10.11.2015 14:49
Ikke lik (<>) Vi kombinerer ofte to eller flere betingelser med de boolske operatorene AND, OR og NOT. Jeg vil liste opp alle program, med varighet, som ikke er sportsprogrammer AND betyr egentlig semantisk sett "samtidig som". SELECT Programtittel, Varighet WHERE Kategori <> 'Sport' En kombinert betingelse med "AND", stemmer bare når alle leddene stemmer samtidig. Har sett på i forbindelse med joins og andre betingelser. En kombinasjon av betingelser med OR stemmer når minst en av betingelsene er oppfylt. "Enten... eller" LIKE med venstre- og tosidig trunkering SELECT Programtittel, Kategori, Varighet, Tilgjengelighet WHERE Programtittel = 'Sjokoladesuget' OR Programtittel = 'Sportsrevyen'; List alle program hvis kategori slutter med "underholdning" (venstretrunkering) SELECT Programtittel, Varighet, Kategori WHERE Kategori LIKE '%underholdning'; Tosidig trunkering (litt tullete spørring, kanskje...) SELECT Programtittel, Varighet, Kategori WHERE Kategori LIKE '%og%'; 3 of 12 10.11.2015 14:49 4 of 12 10.11.2015 14:49
hente ut alle Programmer som har NOT betyr "utelukk". enten kategorien Filmer og serier eller kategorien Kultur og underholdning, NOT er ikke en selvstendig operator, kan brukes med AND (AND NOT) eller med OR (OR NOT) Samtidig som programmene er tillatt for alle aldersgrupper. Også her er det viktig å passe på å bruke parenteser. SELECT Programtittel, Kategori, Aldersgrense WHERE Kategori = 'Filmer og serier' OR Kategori = 'Kultur og underholdning' AND Aldersgrense = 'Tillatt for alle aldersgrupper'; SELECT Programtittel, Kategori, Varighet, Tilgjengelighet WHERE Programtittel = 'Sjokoladesuget' OR Programtittel = 'Sportsrevyen' AND NOT Tilgjengelighet = "Norge" "Aldersgrense 15 år" bryter åpenbart med det vi ønsker (tillatt for alle). OR og AND i èn kombinasjon er ikke logisk godt nok definerbart. Det samme kan ofte uttrykkes med <>- operatoren Her må vi bruke parenteser: "OR" mellom "Filmer og Serier" behandles først, deretter kombineres resultatet med Aldersgrensen med en "AND" SELECT Programtittel, Kategori, Aldersgrense WHERE Kategori = 'Filmer og serier' SELECT Programtittel, Kategori, Varighet, Tilgjengelighet WHERE Programtittel = 'Sjokoladesuget' OR Programtittel = 'Sportsrevyen' AND Tilgjengelighet <> "Norge" OR Kategori = 'Kultur og underholdning' AND Aldersgrense = 'Tillatt for alle aldersgrupper'; 5 of 12 10.11.2015 14:49 6 of 12 10.11.2015 14:49
SUM() AVG() - beregne gjemmomsnittet av verdier i en returnert kolonne: SELECT AVG(Varighet) SELECT SUM(Varighet) MAX() - Finn den største verdien SELECT MAX(Varighet) COUNT() SELECT COUNT(Programtittel) MIN() - finn den minste verdien SELECT MIN(Varighet) Alle disse funksjonene, AVG, SUM, MAX, MIN og COUNT, kan brukes også på delresultater. Eksempel: SELECT SUM(Varighet) WHERE Varighet < 38 Svar= 19 Disse funksjonene brukes ofte i forbindelse med gruppering. 7 of 12 10.11.2015 14:49 8 of 12 10.11.2015 14:49
Eksempel: SELECT Tilgjengelighet, COUNT(Tilgjengelighet) GROUP BY Tilgjengelighet; Alle kolonner i en tabell, bortsett fra primærnøkkelen kan, for noen rader, stå tomme. Da har de stort sett spesialverdien NULL Her er tabellen Medlemskap fra Bokormen (SELECT * FROM Medlemskap). Aktive medlemmer har NULL-verdier i utmeldingskolonnen. Count brukes til telle størrelse på grupper. Grupper defineres ofte av verdiene i en kollone, slik at verdiene i en gruppe er like. Brukes typisk om en kolonne som oppstår fra en beregningsfunksjon: SQL har spesialbetingelsene IS NULL og IS NOT NULL for å teste på Null-verdier. Eksempel: Når meldte det "eldste" aktive medlemmet seg inn i bokormen? SELECT Min(Inndato) AS innmeldingsdato FROM Medlemskap M WHERE Utdato IS NULL SELECT Tilgjengelighet, COUNT(Tilgjengelighet) AS Antall GROUP BY Tilgjengelighet; Dette gir oss en mer pregnant overskrift. 9 of 12 10.11.2015 14:49 10 of 12 10.11.2015 14:49
Tilbake til gruppering List ut titler på bestilte bøker og hvor ofte de er blitt bestilt. Prinsipp: Vi grupperer resultatene på (like) ISBN'er, og teller antall i gruppene. En rad representerer en gruppe SELECT B.ISBN AS BokID, Count(BG.Medlemsnr) AS antallganger FROM Bok B, Bestilling BG, Medlem M WHERE B.ISBN=BG.ISBN AND M. Medlemsnr=BG.Medlemsnr GROUP BY BokID ORDER BY antallganger DESC Hva heter de aktive medlemmene, når meldte de seg inn og hvilken klubb er de medlem i? SELECT Fornavn, Etternavn, Inndato, Klubbnavn FROM Medlem M, Medlemskap MK, Klubb K WHERE M.Medlemsnr=MK.Medlemsnr AND K.KlubbID=MK.KlubbID AND Utdato IS NULL Når, og fra hvilke klubber meldte medlemmer seg ut, og hvem er de? SELECT Fornavn, Etternavn, Utdato, Klubbnavn FROM Medlem M, Medlemskap MK, Klubb K WHERE M.Medlemsnr=MK.Medlemsnr AND K.KlubbID=MK.KlubbID AND Utdato IS NOT NULL 11 of 12 10.11.2015 14:49 12 of 12 10.11.2015 14:49