[Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hioa.no) 06/11-15 Databaser høsten 2015 En liten rekap ER-diagram - vi modellerer dataene våre til danne best mulig grunnlag for informasjonen vi trenger entitetstyper sammenhenger Logisk Nivå - Vi omsetter modellen i relasjoner(tabeller) som kan implementeres i en relasjonsdatabasesystem. Normalisering - vi sjekker at databasen er passelig normalisert, slik at vi unngår anomalier. Behovet for normalisering avveies ofte mot andre behov (for eksempel effektivitet). Spørrespråk Spørrespråk er formelle uttrykk av informasjonsbehov som stilles til systemer. Mange slike språk i dataverdenen, tilpasset forskjellige typer informasjonssystemer. SQL er konstruert med tanke på søk i relasjonsdatabaser. Bygget på Codds relasjonsalgebra. Deles i to: DDL Data Description Language, brukes for å opprette og vedlikeholde databaseskjema Beksrivelse of struktur av tabeller DML Data Manipulation Language: Brukes for å legge inn, finne igjen og vedlikeholde data. Vi ser på DML, nærmere bestemt SELECT - delen: finne igjen data. I dag Spørringer mot en tabell Spørringer mot to eller flere tabeller SELECT Generell form Henter ut data og presenterer dem som en (midlertidig) tabell SELECT [DISTINCT] kolonner FROM tabeller [WHERE betingelser] [GROUP BY kolonner] [ORDER BY kolonner] ; Vanlig å skrive de reserverte ordene (nøkkelordene SELECT, DISTINCT osv. med store bokstaver. Avslutte med semikolon. Med "midlertidig" menes at en SELECT gir tabellens status der og da. Har man gjort en endring etter spørringen - må man evt. spørre på nytt. 1 of 13 06.11.2015 14:31 2 of 13 06.11.2015 14:31
Vi spør mot NRK-databasen Spørringer mot èn tabell Typiske eksempler Betrakt tabellen program. Hent ut alle kolonnene i tabellen SELECT * FROM Program Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Innslag(InnslagID, Innslagtittel) Sesong (SesongID, Sesongnavn, Episodeantall, SerieID) Serie(SerieID, Serietittel, Seriebeskrivelse) Medvirkende(MedvirkendeID, Fornavn, Etternavn) Sendetidspunkt (TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID) Programinnhold (InnslagID, ProgramID, Nummer, Tidskode) Deltagelse (ProgramID, MedvirkendeID, Rolle) En annen måte å oppnå det samme på, er å si SELECT ProgramID, Programtittel, Kategori, Programinfo, Varighet, Aldersgrense,Tilgjengelighet, Teksting, Episodenr, SesongID FROM Program Spør etter noen av kolonnene: SELECT Programtittel, Kategori FROM Program Dette kalles også en "Projeksjon". 3 of 13 06.11.2015 14:31 4 of 13 06.11.2015 14:31
Betingelser: Nøkkeldrdet WHERE Sammenlikningsoperatorer Større enn (> operatoren) Større enn eller lik (>=) Nøkkelordet WHERE. Her med nøyaktig likhet. Neste spørring søker etter Sjokoladesuget i tittelen. SELECT Programtittel, Programinfo, Kategori FROM Program WHERE Programtittel = 'Sjokoladesuget' Sortering: kommandoen Order By Stigende sortering ASC ( Ascending) ORDER BY Varighet ASC; Når vi bruker en tekstverdi i søket, må den omsluttes med apostrofer ('' - fnutter 'Sjokoladesuget') eller doble anførselstegn ("" hermetegn "Sjokoladesuget") Mindre enn (< operatoren) Synkende sortering DESC ( Descending) ORDER BY Varighet DESC Legg merke til at tallverdier angis uten fnutter (38, ikke '38'). Mindre enn eller lik(<= operatoren) 5 of 13 06.11.2015 14:31 6 of 13 06.11.2015 14:31
Mønsterlikhet: ordet LIKE Trunkering: Neste spørring søker etter programmer som begynner på S, og sorterer dem synkende på varighet. WHERE Programtittel LIKE 'S%' Betingelser med boolske operatorer: AND, OR og NOT Vi kombinerer ofte to eller flere betingelser med de boolske operatoreneand, OR og NOT. AND operatoren, den mest brukte. AND betyr egentlig semantisk sett "samtidig som". En kombinert betingelse med "AND", stemmer bare når alle leddene stemmer samtidig. List opp programmene som starter med 'S%' samtidig som de handler om sport. SELECT Programtittel, Kategori FROM Program WHERE Programtittel LIKE 'S%' AND Kategori = 'Sport' Og en ting til: Trenger ikke VISE alt vi spør om. Hvis vi vet at alt vi får er i kategori sport, er kanskje ikke så viktig å vise kategorien: bruker heller plassen på varigheten. WHERE Programtittel LIKE 'S%' AND Kategori = 'Sport' 7 of 13 06.11.2015 14:31 8 of 13 06.11.2015 14:31
Spørring mot flere tabeller Nærmere titt: Rader med forskjellige program-id er feil!!! Vi vil hente ut en liste over alle programmer og deres sendetidspunkter: Trenger data fra to tabeller: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Sendetidspunkt (TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID) SQL lar oss formulere søk mor flere tabeller, ved at vi oppgir tabellnavnene i etter FROM, separert med komma. Første forsøk. SELECT TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID, ProgramID, Programtittel FROM Program, Sendetidspunkt Går ikke, gir en feilmelding. Dette går ikke, da ProgramID finnes i begge tabellene, og må derfor kvalifiseres: Annet forsøk SELECT TidspunktID, Kanal, Sendedato, Klokkeslett, Sendetidspunkt.ProgramID, Program.ProgramID, Programtittel De rader som egentlig hører sammen er de hvor Program-id'ene er like. Hvordan vise bare de? Tredje forsøk: SELECT TidspunktID, Kanal, Sendedato, Klokkeslett, Sendetidspunkt.ProgramID, Program.ProgramID, Programtittel Siste linje kaller vi en JOIN-betingelse Den siler vekk irrelevante linjer fra det kartesiske produktet. Kolonner som har likt navn i begge tabeller må kvalifiseres: Sendetidspunkt.ProgramID, Program.ProgramID Unngå å vise surrogatnøkler Surrogatnøkler er egentlig ikke "nyttige" data for en bruker. De brukes i spørringer (ofte i join-betingelser), men vises som regel ikke. "Alle mot alle" Alle rader i Program-tabellen mot alle rader i Sendetidspunkttabellen. Det kartesiske produkt SELECT Kanal, Sendedato, Klokkeslett, Programtittel Litt mer sammensatte søk 9 of 13 06.11.2015 14:31 10 of 13 06.11.2015 14:31
JOIN betingelser kombineres ofte med andre betingelser med AND Gi meg bare programmene som ble sendt på NRK3 SELECT Kanal, Sendedato, Klokkeslett, Programtittel Flere enn to tabeller Hvilke medvirkende har deltatt i de forskjellige programmene? trenger tre tabeller. Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Medvirkende(MedvirkendeID, Fornavn, Etternavn) Deltagelse (ProgramID, MedvirkendeID, Rolle) AND Kanal = 'NRK3' Gi meg sportsrelaterte programmer sendt på NRK1 SELECT Kanal, Sendedato, Klokkeslett, Programtittel AND Kategori = 'sport' AND Kanal = 'NRK1' SELECT Fornavn, Etternavn, Programtittel FROM Program, Medvirkende, Deltagelse WHERE Program.ProgramID= Deltagelse.ProgramID AND Medvirkende.MedvirkendeID= Deltagelse.MedvirkendeID; 11 of 13 06.11.2015 14:31 12 of 13 06.11.2015 14:31
Aliaser For å gjøre søk litt lettere å tyde, bruker vi forkortelser, gjerne èn bokstav, på tabellnavn. Samme søk (med samme resultat) SELECT Fornavn, Etternavn, Programtittel FROM Program P, Medvirkende M, Deltagelse D WHERE P.ProgramID= D.ProgramID AND M.MedvirkendeID= D.MedvirkendeID; Og et lite søk til Hvilke medvirkende har deltatt i Sportsrevyen? SELECT Fornavn, Etternavn, Programtittel FROM Program P, Medvirkende M, Deltagelse D WHERE P.ProgramID= D.ProgramID AND M.MedvirkendeID= D.MedvirkendeID AND Programtittel="Sportsrevyen" ; Sist oppdatert 06/11-15 av Michael Preminger, michaelp@hioa.no 13 of 13 06.11.2015 14:31