Tabeller og enkle spørringer Database, relasjonsdatabase Databasehåndteringssystem (DBHS) Databasesystem Tabell, kolonne, rad, datatype, verdi, primærnøkkel Utvalgsspørringer i SQL Velge ut rader Velge ut kolonner Kalkulerte kolonner Sortering Gruppering og mengdefunksjoner Jokernotasjon og intervallsøk Pensum: Kapittel 1 og 2 Databaser Leksjon 1: Tabeller og enkle spørringer - 1
Det ligger som regel en database bak Databaser Leksjon 1: Tabeller og enkle spørringer - 2
Anvendelser av databaser Noen eksempler: Handel: Varer, kunder, bestillinger, leveranser,... Bibliotek: Bøker, låntakere, lån,... Bank: Kunder, kontoer, lån, innskudd, uttak, overføringer,... Sykehus: Pasienter, journaler, medisiner, ansatte, turnus,... Kart: Eiendommer, bygninger, veier, rørsystemer,... Kino: Filmer, forestillinger, reservasjoner,... Forskning: Spørreundersøkelse, respondenter, svar,... Alle (?) virksomheter bruker databaser. Mange systemer må være i drift 24/7 (virksomhetskritiske) Vår penger er jo bare et sett av data i noen databaser!!! Ved å se på hva databasen inneholder lærer vi mye om virksomheten. Databaser Leksjon 1: Tabeller og enkle spørringer - 3
Hvor starter man? Fysisk er en datamaskin komplisert. Abstrakt logisk er den enkel: Ut-enhet (skjerm) Inn-enhet (tastatur) Beregningsenhet Minne Platelager Harddisk En datamaskin kan to ting: Lagre data og utføre programmer. Vi tar utgangspunkt i datamaskinen som lagringsenhet. Hvilke data må en virksomhet lagre for å fungere? Databaser Leksjon 1: Tabeller og enkle spørringer - 4
Oppgavene til et databasesystem Et databasesystem har som oppgave å lagre store mengder data over lang tid på en sikker måte, og å tilby hensiktsmessige mekanismer for å gjenfinne data effektivt og korrekt, selv når et stort antall brukere jobber mot databasen samtidig og det oppstår kritiske situasjoner som diskkrasj og strømbrudd. I tillegg må databasesystemer kunne kommunisere med andre programsystemer, blant annet verktøy for utvikling av databaseapplikasjoner. DBHS = DataBaseHåndteringsSystem (engelsk: DBMS, eks: Access) SQL er et språk for å jobbe med databaser (skrive spørringer). Databasesystem SQL DBHS Database Bruker Databaser Leksjon 1: Tabeller og enkle spørringer - 5
Viktige begreper En database er en samling strukturerte data som blir brukt til et bestemt formål. Et databasehåndteringssystem (DBHS) er et verktøy for å lagre og gjenfinne store mengder delte data over lang tid på en sikker og effektiv måte for mange samtidige brukere. Eksempler: MySQL, MariaDB, Access, SQL Server, Oracle, DB2, Databasesystem = DBHS + database SQL er et språk for å kommunisere med databasesystemer. Brukere: Databaseadministrator (DBA) har ansvaret for den daglige driften av et databasesystem. Utviklere Sluttbrukere Databaser Leksjon 1: Tabeller og enkle spørringer - 6
Et papirskjema Etternavn: Hansen Fornavn: Hans Ansatt dato: 23.08.2006 Stilling: Programmerer Lønn: 325.000 Prosjektdeltakelse siste år: Prosjektkode Timer P1002 44 P1007 25 P1012 10 Databaser Leksjon 1: Tabeller og enkle spørringer - 7
Tabellen Ansatt AnsattNr Etternavn Fornavn AnsattDato Stilling Lønn 1 Veum Varg 01.01.1992 Løpegutt kr 183 000.00 2 Stein Trude 10.10.2000 DBA kr 270 700.00 3 Dudal Inger-Lise 24.12.1988 Sekretær kr 299 000.00 4 Hansen Hans 23.08.2006 Programmerer kr 325 000.00 5 Bjørnsen Henrik 01.01.2000 Tekstforfatter kr 375 000.00 6 Gredelin Sofie 18.05.1998 Underdirektør kr 625 850.00 7 Zimmermann Robert 17.05.1995 Regnskapsfører kr 375 000.00 8 Nilsen Lise 03.04.2002 Direktør kr 675 340.00 11 Fosheim Katinka 13.09.2011 Selger kr 420 000.00 13 Lovløs Ada 12.08.2005 Programmerer kr 384 250.00 16 Ibsen Bjørnstjerne 02.01.2008 Tekstforfatter kr 346 000.00 17 Fleksnes Marve 17.05.2009 Lagerleder kr 320 120.00 20 Felgen Reodor 12.12.2001 Sykkelreparatør kr 279 500.00 23 Karius Jens 13.12.2001 Salgssekretær kr 280 390.00 29 Wirkola Gabriel 21.04.2009 Sekretær kr 255 000.00 Databaser Leksjon 1: Tabeller og enkle spørringer - 8
Tabellen Prosjekt ProsjektNr Budsjett Leder Start Slutt 1001 kr 15 000.00 20 12.01.2011 12.03.2011 1002 kr 750 000.00 8 23.06.2011 23.07.2011 1007 kr 125 000.00 2 12.06.2012 1009 kr 500 000.00 20 01.01.2012 1012 kr 10 000.00 4 10.07.2012 1020 kr 900 000.00 8 23.07.2011 01.09.2011 Databaser Leksjon 1: Tabeller og enkle spørringer - 9
Ansatte og prosjekter Prosjekt 1047 Prosjekt 1055 Prosjekt 1063 Prosjekt 1056 En ansatt kan være med i 0, 1 eller mange prosjekter. Et prosjekt kan ha 0, 1 eller mange deltakere. Det er ikke hensiktsmessig å lagre prosjekter i Ansatt, eller deltakere i Prosjekt. Databaser Leksjon 1: Tabeller og enkle spørringer - 10
Tabellen ProsjektDeltakelse Hvilke ansatte har jobbet på hvilke prosjekter og hvor mange timer har de jobbet? ProsjektDeltakelse er en koblingstabell. Tabellen representerer et forhold mellom? ProsjektNr AnsattNr AntTimer 1001 1 12 1002 4 44 1002 8 20 1002 13 125 1002 20 2 1007 4 25 1007 11 20 1009 2 5 1009 17 10 1009 20 23 1012 4 10 1020 1 20 1020 8 35 1020 17 125 Databaser Leksjon 1: Tabeller og enkle spørringer - 11
Databasetabeller Alle verdier i en kolonne fra samme domene / datatype. OBS! Bare enkle verdier! Rad Kardinalitet = antall rader (her: 5) Grad = antall kolonner (her: 3) Kolonne Verdi Databaser Leksjon 1: Tabeller og enkle spørringer - 12
Nullmerker Legg merke til at det mangler noen verdier i tabellen Prosjekt. Vi kaller dette for nullmerker. Nullmerker kan skyldes at vi har glemt å registrere data, at vi ennå ikke kjenner til den korrekte verdien, eller at det ikke gir mening å registrere data. Nullmerker er ikke verdier. Nullmerker kan skape problemer! Hvorfor? Databaser Leksjon 1: Tabeller og enkle spørringer - 13
Relasjonsdatabase = «tabelldatabaser» En databasetabell kan betraktes som en matematisk relasjon (mer om dette i kapittel 6 og i MNF130). En relasjonsdatabase består (logisk sett) av en samling tabeller (endelige relasjoner). Andre typer av databaser: Hierarkiske databaser Nettverksdatabaser Objektorienterte databaser Objektrelasjonelle databaser Logiske databaser NoSQL-databaser (kanskje seinere i april/mai) Databaser Leksjon 1: Tabeller og enkle spørringer - 14
SQL er et «abstrakt» programmeringsspråk - vi sier hva vi ønsker mer enn hvordan det skal beregnes. En utvalgsspørring: SELECT AnsattNr, Etternavn, Lønn SQL WHERE Lønn < 280000 Hva må DBHS gjøre? Hva må DBHS vite? SELECT, FROM og WHERE er reserverte ord i SQL: De har en spesiell betydning. Databaser Leksjon 1: Tabeller og enkle spørringer - 15
Spørreresultat AnsattNr Etternavn Lønn 1 Veum kr 183 000.00 2 Stein kr 270 700.00 20 Felgen kr 279 500.00 29 Wirkola kr 255 000.00 En utvalgsspørring tar tabeller som «inndata» og leverer spørreresultater som «utdata». Spørreresultater er også på «tabellform». SQLspørring Databaser Leksjon 1: Tabeller og enkle spørringer - 16
Datamaskiner og formelle språk SQL (i motsetning til norsk eller fransk) er et formelt språk. Det er definert presise regler som avgjør om en setning er lovlig eller ikke. Datamaskiner har ikke evnen til å bruke sunn fornuft. Den minste skrivefeil fører til feilmelding eller uventet resultat. Eksempel: Maskinen forstår ikke at du mener «Etternavn» hvis du skriver «Etternavnet». God vane: Les feilmeldinger og lær deg hva de betyr! Databaser Leksjon 1: Tabeller og enkle spørringer - 17
Velge ut kolonner Når vi kun er interessert i noen av kolonnene: SELECT AnsattNr, Etternavn Databaser Leksjon 1: Tabeller og enkle spørringer - 18
Resultat av spørring: SELECT AnsattNr, Etternavn Hva få vi ved denne spørring? SELECT Etternavn, AnsattNr Databaser Leksjon 1: Tabeller og enkle spørringer - 19
Etternavn AnsattNr Veum 1 Stein 2 Dudal 3 Hansen 4 Bjørnsen 5 Gredelin 6 Zimmermann 7 Nilsen 8 Resultat av spørring: SELECT Etternavn, AnsattNr Er det det vi vil ha? Nei, vi ønsker de sortert! Fosheim 11 Lovløs 13 Ibsen 16 Fleksnes 17 Felgen 20 Karius 23 Wirkola 29 Databaser Leksjon 1: Tabeller og enkle spørringer - 20
Sortering Sortert navneliste: SELECT Etternavn, AnsattNr ORDER BY Etternavn Flere sorteringskriterier: SELECT Etternavn, Stilling, Lønn ORDER BY Stilling ASC, Lønn DESC ASC gir stigende sortering (standard) og DESC synkende. Databaser Leksjon 1: Tabeller og enkle spørringer - 21
SELECT...ORDER BY Stilling ASC, Lønn DESC Etternavn Stilling Lønn Stein DBA kr 270 700.00 Nilsen Direktør kr 675 340.00 Fleksnes Lagerleder kr 320 120.00 Veum Løpegutt kr 183 000.00 Lovløs Programmerer kr 384 250.00 Hansen Programmerer kr 325 000.00 Zimmermann Regnskapsfører kr 375 000.00 Karius Salgssekretær kr 280 390.00 Dudal Sekretær kr 299 000.00 Wirkola Sekretær kr 255 000.00 Fosheim Selger kr 420 000.00 Felgen Sykkelreparatør kr 279 500.00 Bjørnsen Tekstforfatter kr 375 000.00 Ibsen Tekstforfatter kr 346 000.00 Gredelin Underdirektør kr 625 850.00 Databaser Leksjon 1: Tabeller og enkle spørringer - 22
Velge ut kolonner Når vi vil ha alle kolonnene: SELECT AnsattNr, Etternavn, Fornavn, AnsattDato, Stilling, Lønn Forkortet skrivemåte: SELECT * Resultat er hele ansatt-tabellen. Merk at man ved bruk av stjerne kan ikke kontrollere rekkefølgen av kolonnene. Databaser Leksjon 1: Tabeller og enkle spørringer - 23
Velge ut kolonner Hva er problemet her? SELECT Stilling Databaser Leksjon 1: Tabeller og enkle spørringer - 24
Stilling Løpegutt DBA Sekretær Programmerer Tekstforfatter Underdirektør Regnskapsfører Direktør SELECT Stilling Vi få like mange rader som det er i ansatt-tabellen! Vi kan derfor få duplikater! Hvilket? Selger Programmerer Tekstforfatter Lagerleder Sykkelreparatør Salgssekretær Sekretær Databaser Leksjon 1: Tabeller og enkle spørringer - 25
Stilling Løpegutt DBA Sekretær Programmerer Tekstforfatter Underdirektør Regnskapsfører Direktør Selger Programmerer Tekstforfatter Lagerleder Sykkelreparatør Salgssekretær Sekretær SELECT Stilling Vi få like mange rader som det er i ansatt-tabellen! Vi kan derfor få duplikater! Hvilket? For å unngå dette skriver vi: SELECT DISTINCT Stilling Stilling Løpegutt DBA Sekretær Programmerer Tekstforfatter Underdirektør Regnskapsfører Direktør Selger Tekstforfatter Lagerleder Sykkelreparatør Salgssekretær Databaser Leksjon 1: Tabeller og enkle spørringer - 26
Velge ut rader Når vi vil plukke ut rader som oppfyller en gitt betingelse. SELECT * WHERE Lønn < 280000 En betingelse er et uttrykk som er sant eller galt (usant). Databaser Leksjon 1: Tabeller og enkle spørringer - 27
SELECT Etternavn... WHERE Lønn < 280000 AnsattNr Etternavn Fornavn AnsattDato Stilling Lønn 1 Veum Varg 01.01.1992 Løpegutt kr 183 000.00 2 Stein Trude 10.10.2000 DBA kr 270 700.00 3 Dudal Inger-Lise 24.12.1988 Sekretær kr 299 000.00 4 Hansen Hans 23.08.2006 Programmerer kr 325 000.00 5 Bjørnsen Henrik 01.01.2000 Tekstforfatter kr 375 000.00 6 Gredelin Sofie 18.05.1998 Underdirektør kr 625 850.00 7 Zimmermann Robert 17.05.1995 Regnskapsfører kr 375 000.00 8 Nilsen Lise 03.04.2002 Direktør kr 675 340.00 11 Fosheim Katinka 13.09.2011 Selger kr 420 000.00 13 Lovløs Ada 12.08.2005 Programmerer kr 384 250.00 16 Ibsen Bjørnstjerne 02.01.2008 Tekstforfatter kr 346 000.00 17 Fleksnes Marve 17.05.2009 Lagerleder kr 320 120.00 20 Felgen Reodor 12.12.2001 Sykkelreparatør kr 279 500.00 23 Karius Jens 13.12.2001 Salgssekretær kr 280 390.00 29 Wirkola Gabriel 21.04.2009 Sekretær kr 255 000.00 Databaser Leksjon 1: Tabeller og enkle spørringer - 28
Bruk parenteser! Vi ønsker å finne sekretærer/dba som tjener mer enn 280.000 kroner i året. SELECT * WHERE Lønn > 280000 AND Stilling = 'Sekretær' OR Stilling = DBA' Kan spørringen tolkes på flere måter? Oppnår vi det vi vil? Databaser Leksjon 1: Tabeller og enkle spørringer - 29
Jokernotasjon og intervallsøk Finn alle med etternavn som begynner på F: SELECT * WHERE Etternavn>='F'AND Etternavn<'G' Jokernotasjon er mer elegant her: SELECT * WHERE Etternavn LIKE 'F%' Hva med Etternavn = 'F%'? Finn alle som har etternavn som slutter på 'sen'! Access i standardoppsett bruker * i stedet for %. Databaser Leksjon 1: Tabeller og enkle spørringer - 30
Kalkulerte kolonner Det er lov å bruke uttrykk i SELECT-delen: SELECT AnsattNr, Etternavn, Lønn/12 AS [Lønn pr måned] Det er ikke nødvendig å lagre både årslønn og månedslønn! Lønn/12 er et uttrykk. For å få en meningsfull overskrift i utskriften gir vi denne kolonnen et navn. Access: [...] brukes rundt navn som inneholder blanke tegn. Oracle: Bruker ikke AS. Databaser Leksjon 1: Tabeller og enkle spørringer - 31
Funksjoner Kommatall kan konverteres til valuta: SELECT AnsattNr, Etternavn, CCur( Lønn/12 ) AS [Lønn pr måned] CCur (Convert to Currency) er et eksempel på en funksjon (Access) CCur En funksjon kan ha flere argumenter, men bare én returverdi. Til hver datatype finnes det mange funksjoner. Databaser Leksjon 1: Tabeller og enkle spørringer - 32
Operatorer og uttrykk Operatorer: Aritmetiske: *, /, +, - Sammenligning: >,<, =, >=, <=, <, <> Jokernotasjon: LIKE Test for nullmerke: IS NULL Boolske: NOT, AND, OR Intervalltest: BETWEEN AND Vi kan bygge opp uttrykk fra literaler (konstanter), kolonnenavn, funksjoner og operatorer: (Stilling LIKE 'S*') AND ((Lønn/12)>15000) Databaser Leksjon 1: Tabeller og enkle spørringer - 33
Sammensatte navn Vi har ofte kolonner med samme navn i to tabeller. Eksempel: AnsattNr i tabellen Ansatt og AnsattNr i tabellen ProsjektDeltakelse. Når vi jobber med flere tabeller må vi av og til bruke sammensatte navn. Det er alltid lov å bruke sammensatte navn: SELECT Ansatt.AnsattNr WHERE Ansatt.Lønn > 280000 Databaser Leksjon 1: Tabeller og enkle spørringer - 34
Dato og tid i Access Hvor lenge har de ansatte vært i bedriften (antall år)? SELECT Etternavn, DateDiff('yyyy',AnsattDato,Date()) Gjeldende tid: Date, Year, Month, Hour,... Regne med datoer: DateAdd, DateDiff Sammenligne datoer: <, >, <=, >=, = Literaler: '17.05.2012' Det er forskjeller mellom Access SQL og standard SQL når det gjelder funksjonsbibliotek, se vedlegg i boka. Databaser Leksjon 1: Tabeller og enkle spørringer - 35
Zooming og aggregerte data Ola Nordmann bor i Hansegata 3, Andebu og tjener 320.000 kr. pr. år. Zoomer vi langt nok inn i kartet kan vi vise egenskaper ved Ola. Zoomer vi ut ønsker vi aggregerte data: AVG, MIN, MAX, SUM, Databaser Leksjon 1: Tabeller og enkle spørringer - 36
Funksjoner Operasjoner på enkeltverdier: Eksempel: strengfunksjoner Operasjoner på verdisamlinger: AVG(kolnavn) gjennomsnitt SUM(kolnavn) sum COUNT(*) antall MIN(kolnavn) minimum MAX(kolnavn) maksimum Databaser Leksjon 1: Tabeller og enkle spørringer - 37
Mengdefunksjoner Gjennomsnittslønn: SELECT AVG(Lønn) AS Gjennomsnittslønn Hvordan finner vi samlede lønnsutgifter? Hvordan finner vi gjennomsnittslønn for sekretærer? Antall ansatte: SELECT COUNT(*) Hva blir resultatet av denne spørringen: SELECT SUM(Lønn) / COUNT(*) Hva om vi har nullmerker i kolonnen Lønn? SELECT SUM(Lønn) / COUNT(Lønn) Databaser Leksjon 1: Tabeller og enkle spørringer - 38
Gruppering Finn gjennomsnittlønn for hver stillingskategori. SELECT Stilling, AVG(Lønn) GROUP BY Stilling Stilling har kun få ulike verdier! Grupperingskolonner må være med i resultatet. Gruppering brukes ofte sammen med mengdefunksjoner. Databaser Leksjon 1: Tabeller og enkle spørringer - 39
Gruppebetingelse (HAVING) Hva blir resultatet her? SELECT Stilling, AVG(Lønn), COUNT(*) GROUP BY Stilling HAVING AVG(Lønn) > 280000 HAVING på grupper svarer til WHERE på rader. Merk: Det er ikke lov å bruke mengdefunksjoner i WHERE-betingelser. Databaser Leksjon 1: Tabeller og enkle spørringer - 40
Gruppebetingelser og radbetingelser Betingelser på rader og på grupper: SELECT Stilling, AVG(Lønn), COUNT(*) WHERE Year(AnsattDato) > 2002 GROUP BY Stilling HAVING AVG(Lønn) > 280000 Hvorfor kan ikke de to betingelsene slås sammen? Hvordan kan DBHS utføre spørringen? Databaser Leksjon 1: Tabeller og enkle spørringer - 41
Oppbygging av utvalgsspørringer Utvalgsspørringer (SELECT-spørringer) mot én tabell følger dette «mønsteret»: SELECT FROM WHERE GROUP BY HAVING ORDER BY Hvilke kolonner skal med? Hva heter tabellen? Hvilke rader skal med? Gruppere på hvilken kolonne? Hvilke grupper skal med? Sortere på hvilken kolonne? Ikke alle delene må være med i alle spørringer, og etter hvert skal vi se at spørringene også kan være mer kompliserte. Blant annet kan vi lage spørringer mot flere tabeller. SELECT er bare én blant mange SQL-kommandoer Databaser Leksjon 1: Tabeller og enkle spørringer - 42