INF1300 Det meste av resten av

Like dokumenter
INF1300 Det meste av resten av SQL. Utleggsark v. 2.0

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser

Oppgave: Finn navn og tittel på alle som har arbeidet på prosjektet «Vintersalg»

Relasjoner terminologi

Alle attributter har NULL som mulig verdi. mulige verdier for integer: NULL, 0, 1, 2, 3...

SQL Structured Query Language. Repetisjon av select spørringer Nestede select spørringer Mengdeoperasjoner Views Flere operatorer

Indre select-setninger Nestede select-setninger

Relasjoner terminologi. Kopi av lysark fra forelesningen 13. oktober. Legges ut inntil notatet som samler alt om SQL kommer...

SQL Structured Query Language

SQL Structured Query Language

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ragnar Normann 1

SQL Structured Query Language

Notater: INF1300. Veronika Heimsbakk 8. januar 2013

Relasjoner terminologi

Join. Intuitivt: Skjøte sammen to relasjoner. Intuitivt: 1. Beregn R S 2. Velg ut de tuplene som tilfredsstiller joinbetingelsen C

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) INF Ellen Munthe-Kaas 1. Institutt for Informatikk

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

INF1300 Relasjonsalgebra. Et matematisk fundament for å forstå SQL-setninger

Repetisjon: Normalformer og SQL

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ragnar Normann 1

Spørsmålskompilering del 1

Spørsmålskompilering del 1

Databaser. Relasjonsmodellen 2 Læreboka: Kap. 2 Relasjonsmodellen

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning mandag 14.

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning onsdag 22.

UNIVERSITETET I OSLO SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

INF1300 SQL Structured Query Language del 1. Stoff som blir/ble forelest i oktober 2013

Tilkobling og Triggere

INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

SQL, del 1 - select. Hva er SQL?

Relasjonsalgebraen. Algebra

SQL: SELECT-spørringer

SQL, del 1 - select. Hva er SQL?

LC238D Datamodellering og databaser SQL, del 1 - SELECT

Relasjonsalgebra Kopi av lysark om relasjonsalgebra. Vi går igjennom denne for å lage et matematisk fundament for forståelsen av hvordan

Løsningsforslag til eksamen i IN2090 Databaser og datamodellering og INF1300 Introduksjon til databaser 6. desember :30 18:30 (4 timer)

Hva er Derby og Java DB? Denne forelesningen. Java Database Connectivity (JDBC) Hva er Derby og Java DB?

INF1300 Introduksjon til databaser

INF1300 Introduksjon til databaser: SQL Structured Query Language

JDBC. Java DataBase Connectivity SQL i Java Læreboken: 8.5, s Forelesning i TDT4145, 9. mars 2004 Av Gisle Grimen

Sensorveiledning for IN2090 og INF desember :30 18:30 (4 timer)

UNIVERSITETET SQL. Structured Query Language (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET I OSLO RELASJONSALGEBRA. Regning med relasjoner. Institutt for Informatikk. INF Ragnar Normann

INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO RELASJONSALGEBRA. Regning med relasjoner. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

INF 1010, vår 2005 Løsningsforslag uke 11

JDBC. Java Data Base Connec.vity

UNIVERSITETET RELASJONSALGEBRA. Regning g med relasjoner. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

SELECT DISTINCT Fornavn, Etternavn, Programtittel FROM Program P, Medvirkende M, Deltagelse D. SELECT Tilgjengelighet FROM Program

UNIVERSITETET I OSLO RELASJONSALGEBRA. Regning med relasjoner. Institutt for Informatikk. INF Ellen Munthe-Kaas

Java Database Connectivity (JDBC) Norvald H. Ryeng

Metaspråket for å beskrive grammatikk

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

SQL. SQL-standarder. Flere standarder: ANSI SQL SQL2 (SQL-92) SQL3 (SQL-99) = SQL2 + objekt-relasjonelle egenskaper mm

UNIVERSITETET I OSLO RELASJONSALGEBRA. Regning med relasjoner. Institutt for Informatikk INF Ellen Munthe-Kaas

ORDBMS og OODBMS i praksis

2: Hvilke verdier forekommer i attributtet filmtype i relasjonen filmitem? Lag en oversikt over filmtypene og hvor mange filmer innen hver type.

DBS18 - Strategier for Query-prosessering

Integritetsregler i SQL. Primærnøkler

Bruke SQL fra Python. Med Psycopg2

OQL Object Query Language

UNIVERSITETET I OSLO RELASJONSALGEBRA. Regning med relasjoner. Institutt for Informatikk INF Ellen Munthe-Kaas

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

UNIVERSITETET. Relasjonsalgebra. INF Ragnhild Kobro Runde

Videregående programmering 6

Bruke SQL fra Java. Med JDBC (Java Database Connec/vity)

Integritetsregler i SQL

SQL: Datatyper m.m. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Datatyper m.m. V18 1 / 12

INF1300 Relasjonsalgebra og SQL, mengder og bager. Lysark for forelesning v. 2.1

Oppgave 1 (Opprett en database og en tabell)

SQL for INF1300. Stein Michael Storleer 21. september 2015

Eksamen i Internetteknologi Fagkode: ITE1526

SQL for INF1300. Stein Michael Storleer 7. november 2014

1. SQL spørringer mot flere tabeller

SQL SELECT-FROM-WHERE. Skjemadefinisjon og datainnsetting i SQL. Semantikk bak ein-relasjons-spørring

Avansert bruk av SQL. Avanserte spørringer Valguttrykk Spørring på spørring Unionspørringer Delspørringer, vekselvirkende delspørringer Kvantorer

IN2090 Databaser og datamodellering. 09 Aggregering og sortering

Integritetsregler i SQL

SQL Structured Query Language. Definere tabeller Skranker Fylle tabeller med data

SQL: SELECT-spørringer

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

IN2090 Databaser og datamodellering. 09 Aggregering og sortering

Del 3: Evaluere uttrykk

INF1010 våren 2018 tirsdag 23. januar

Enklere syntaks for joins. IN2090 Databaser og datamodellering. 09 Aggregering og sortering. Eksempel: Variable i delspørringer (1)

Tabeller og enkle spørringer

Seminaroppgaver IN1010, uke 2

IN2090 Databaser og datamodellering. 06 Enkele joins og nestede SELECT

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Problemer med Indre joins. Inner joins og manglende verdier med aggregater. Left Outer Join. Outer Joins. Hvor mange har kjøpt hvert produkt?

Database security. Kapittel 14 Building Secure Software. Inf329, Høst 2005 Isabel Maldonado

UNIVERSITETET I OSLO

Spørsmålskompilering del 2

Transkript:

INF1300 Det meste av resten av SQL Utleggsark v. 1.0 Tekstmønstre I SQL kan vi bruke like for å sammenligne et tekst-attributt med et tekstmønster Et tekstmønster er en tekstkonstant hvor to tegn, kalt jokertegn, har spesiell betydning: _ (understrekning) passer med ett vilkårlig tegn % passer med en vilkårlig tekststreng (null eller flere tegn) 1: select firstname from person where firstname like O_a ; passer med Oda og Ola og O4a, men ikke med Olga 2: select firstname from person where firstname like O%a ; passer med alle navn som begynner med «O» og slutter med «a», som Ola, Olga, Othilia, Oda, Ofjhwskjfhkxxa michael@ifi.uio.no INF1300 12. oktober 2009 3 Dagens temaer Sammenligning med tekstmønstre Aggregeringsfunksjoner Nestede spørsmål Gruppering Relasjonssammenligninger: exists in any all View JDBC michael@ifi.uio.no INF1300 12. oktober 2009 2 Tekstmønstre 3: select firstname lastname as navn, gender as kjonn from person where firstname like and lastname not like %sen ; Resultatet blir en tabell over navn og kjønn på personer som har eksakt tre tegn i fornavnet og et etternavn som ikke slutter på «sen». Navnet består av for- og etternavn adskilt med én blank michael@ifi.uio.no INF1300 12. oktober 2009 4

Aggregeringsfunksjoner SQL har fem aggregeringsfunksjoner: navn virkning (returnerer) count teller antall min finner minste verdi max finner største verdi sum summerer verdier avg finner gjennomsnitt av verdier michael@ifi.uio.no INF1300 12. oktober 2009 5 min() og max() min(attributt) og max(attributt) gir henholdsvis minste og største verdi av attributtet Attributtet må være numerisk eller tekstlig (date og time håndteres som tekststrenger) : Gitt tabellen. Finn den største lønnsforskjellen i salgsavdelingen: select max(lonn) min(lonn) where avd = Salg ; Merk at det ikke er lov å ha regneuttrykk som parameter i min() og max() michael@ifi.uio.no INF1300 12. oktober 2009 7 count() select count(*) from person ; gir antall tupler i tabellen select count(*) as anttupler from person ; Som for alle attributter i select-listen, kan vi gi count(*) et nytt navn. select count( gender) from person ; gir antall tupler i tabellen hvor attributtet gender ikke er null select count( distinct firstname ) from person ; gir antall forskjellige verdier i attributtet firstname (null telles ikke med) michael@ifi.uio.no INF1300 12. oktober 2009 6 sum() og avg() sum(attributt) og avg(attributt) beregner henholdsvis summen og gjennomsnittet av verdiene i attributtet Attributtet må være numerisk Tupler hvor attributtet er null, blir ignorert. (Dette er viktig for avg()) : Gitt tabellen. Finn sum lønnsutgifter og gjennomsnittslønn for salgsavdelingen: select sum(lonn), avg(lonn) where avd = salg ; michael@ifi.uio.no INF1300 12. oktober 2009 8

Nestede spørsmål Gitt tabellen Finn antall selgere som tjener mer enn det dobbelte av markedsførernes gjennomsnittslønn select count * where avd = salg and lonn > ( select 2 * avg( lonn) where avd = marketing ) ; Merk: En select inne i where-betingelsen må være omsluttet av parenteser michael@ifi.uio.no INF1300 12. oktober 2009 9 Finn antall ansatte i hver avdeling og gjennomsnittlig lønn for disse: select a navn, count(*), avg( lonn), Avdeling where avd = avdnr group by a navn; Dette forutsetter at a-navn er en kandidatnøkkel. Hvis ikke måtte vi hatt group by avdnr. I så fall må vi muligens ta med avdnr i select-listen michael@ifi.uio.no INF1300 12. oktober 2009 11 group by (gruppering) Gruppering er å dele forekomstene inn i grupper og så gi en resultatlinje for hver gruppe Syntaksen er slik: select <resultatattributt liste > from <tabell liste > where <betingelse > group by <grupperingsattributt liste >; Resultatet beregnes slik: 1. Beregn select * from <tabell-liste> where <betingelse> 2. Lag grupper av de tuplene som er like i alle grupperingsattributtene 3. Utfør aggregeringsfunksjonene lokalt innenfor hver gruppe og presenter én resultatlinje for hver gruppe En god regel er å inkludere alle grupperingsattributtene i resultatattributt-listen. Merk: Attributter som ikke er grupperingsattributter, må være funksjonelt avhengige av grupperingsattributtene. michael@ifi.uio.no INF1300 12. oktober 2009 10 For hvert prosjekt, list opp medvirkende avdelinger og sorter dem etter innsats: select pnr as prosjekt, avdnr as avdnummer, max( a navn) as avdeling, sum( timer ) as innsats A, Avdeling, Prosjektplan P where avd = avdnr and A. anr = P. anr group by pnr, avdnr order by pnr, sum( timer ) desc; Siste linje kan erstattes med order by prosjekt, innsats desc; michael@ifi.uio.no INF1300 12. oktober 2009 12

Samme oppgave, men ta bare med avdelinger som skal bidra med minst 100 timer på prosjektet: select pnr as prosjekt, avdnr as avdnummer, max( a navn) as avdeling, sum( timer ) as innsats A, Avdeling, Prosjektplan P where avd = avdnr and A. anr = P. anr group by pnr, avdnr having sum( timer ) > 99 order by prosjekt, innsats desc; michael@ifi.uio.no INF1300 12. oktober 2009 13 Generelt utseende av SQL-spørsmål select [ distinct ] <resultatattributter> from <tabeller > [ where <utvalgbetingelse> ] [ group by <grupperingsattributter > [ having <resultatbetingelse > ] ] [ order by <ordningsattributter > ] Regler: Ordningsattributtene har utseendet: <attributt> [asc desc] Ordningsattributtene må være blant resultatattributtene Ifølge SQL-standarden skal grupperingsattributtene alltid være blant resultatattributtene, men de fleste DBMSer krever ikke dette michael@ifi.uio.no INF1300 12. oktober 2009 15 Samme oppgave, men ta bare med avdelinger som har minst 10 ansatte select pnr as prosjekt, avdnr as avdnummer, max( a navn) as avdeling, sum( timer ) as innsats A, Avdeling, Prosjektplan P where avd = avdnr and A. anr = P. anr group by pnr, avdnr having sum( timer ) > 99 and 9 < ( select count(*) A1 where A1.avd = avdnr) order by prosjekt, innsats desc; Merk bruken av avdnr i den indre select-setningen! Den gjør at den indre select-setningen må beregnes én gang for hver verdi av avdnr beregnet i den ytre select-setningen michael@ifi.uio.no INF1300 12. oktober 2009 14 WHERE vs. HAVING where-betingelsen velger ut de tuplene som skal danne datagrunnlaget for grupperingen having-betingelsen plukker ut de tuplene fra det ferdig-grupperte resultatet som skal med i det endelige svaret having-betingelsen kan inneholde aggregatfunksjoner, men det kan ikke where-betingelsen Siden having håndterer en (mye) mindre datamengde enn where, er det i kompliserte spørringer lurt å legge så mye som mulig av logikken inn i having-betingelsen michael@ifi.uio.no INF1300 12. oktober 2009 16

Hvordan SQL-spørsmål med GROUP BY evalueres 1. Selekter ifølge seleksjonsbetingelsene i where 2. Join relasjonene i from i henhold til joinbetingelsene i where 3. Grupper resultattuplene i henhold til like verdier i grupperingsattributtene angitt i group by-klausulen 4. Fjern de gruppene som ikke oppfyller resultatbetingelsen i having-klausulen 5. Projiser ifølge attributtene i select 6. Fjern flerforekomster hvis select distinc 7. Sorter i henhold til order by michael@ifi.uio.no INF1300 12. oktober 2009 17 ANY og ALL any og all brukes i praksis bare på relasjoner med ett attributt : Finn antall selgere som tjener mer enn samtlige markedsførere select count(*) where avd = salg and lonn > all ( select lonn where avd = marketing ) ; michael@ifi.uio.no INF1300 12. oktober 2009 19 Relasjonssammenligninger SQL har fem operatorer som sammenligner med innholdet i en hel relasjon: i SQL-2 betyr exists R at R har minst én forekomst not exists R at R ikke har noen forekomster in R R not in R / R any R en vilkårlig verdi i R all R alle verdier i R michael@ifi.uio.no INF1300 12. oktober 2009 18 IN og NOT IN [ not ] in kan brukes på ett attributt eller på en liste av attributter : Finn navn på ansatte som ikke har ført noen prosjekttimer select navn where anr not in ( select anr from Prosjektplan ) ; michael@ifi.uio.no INF1300 12. oktober 2009 20

EXISTS og NOT EXISTS exists R er sann hvis tabellen inneholder tupler (ett eller flere) not exists R er sann hvis tabellen ikke inneholder noen tupler Merk at SQL ikke har noen egen all-kvantor ( ) Skulle vi trenge en all-kvantor, må vi uttrykke den ved hjelp av andre SQL-konstruksjoner michael@ifi.uio.no INF1300 12. oktober 2009 21 Finn navn på ansatte som skal arbeide mer enn 10 timer på samtlige av sine prosjekter select A. navn A where not exists ( select * from Prosjektplan P where P. anr = A. anr and P. timer <= 10 ) ; michael@ifi.uio.no INF1300 12. oktober 2009 23 Noen nyttige formler fra logikken F G not F or G not (F and G) not F or not G not (F or G) not F and not G u.f not ( u.not F) u.f not ( u.not F) michael@ifi.uio.no INF1300 12. oktober 2009 22 Finn navn på ansatte som skal delta på alle prosjekter select A. navn A where not exists ( select pnr from Prosjektplan P1 where not exists ( select * from Prosjektplan P2 where P2.pnr = P1.pnr and P2. anr = A. anr ) ) ; michael@ifi.uio.no INF1300 12. oktober 2009 24

Finn navn på de ansatte som ikke skal delta på noe prosjekt ledet av en avdelingsleder Prosjekt(pnr, leder) select navn A where not exists ( select * from Prosjekt P, Prosjektplan PL where PL. anr = A. anr and PL.pnr = P.pnr and P. leder in ( select leder from Avdeling ) ) ; michael@ifi.uio.no INF1300 12. oktober 2009 25 Views Et view er en tenkt relasjon som vi bruker som mellomresultat i kompliserte SQL-beregninger Det er to måter å lage view på: create view navn(attributtliste) as select... create view navn as select... I det første tilfellet må det være like mange navn i attributtlisten som det er attributter i select-setningen I det andre tilfellet arver viewet attributtnavnene fra select-setningen Når man har laget et view, kan det brukes som en vanlig tabell i senere select-setninger michael@ifi.uio.no INF1300 12. oktober 2009 27 Plassering av sub-queries Det er lov å ha sub-queries (indre select-setninger) i from-klausulen where-klausulen having-klausulen SQL-standarden inneholder ingen øvre grense for antall sub-queries i et query Sub-queries skal alltid være omsluttet av parenteser michael@ifi.uio.no INF1300 12. oktober 2009 26 på view create view Innsats as select anr, sum( timer ) as timer from Prosjektplan group by anr ; create view Bonus( anr, bonusbeløp ) as ( select anr, 3000 from Innsats where timer >= 500 ) union ( select anr, 1500 from Innsats where timer >= 300 and timer < 500 ) ; michael@ifi.uio.no INF1300 12. oktober 2009 28

Hengetupler Når vi joiner to tabeller, kaller vi et tuppel som ikke har noen match i den andre relasjonen, et hengetuppel Hengetupler blir ikke med i resultatet av en (vanlig) join, også kalt en inner join Hvis vi ønsker å gjøre en join hvor vi beholder hengetuplene fra en eller begge tabellene, bruker vi en outer join michael@ifi.uio.no INF1300 12. oktober 2009 29 Right outer join Syntaks for en right outer join er slik: select <svar attributter > from tabell 1 right outer join tabell 2 on join betingelse ; Resultatet blir en join av tabell-1 og tabell-2, pluss en linje for hvert hengetuppel i tabell-2 der alle svar-attributtene fra tabell-1 er null Eventuelle hengetupler fra tabell-1 blir ikke med i resultatet michael@ifi.uio.no INF1300 12. oktober 2009 31 Left outer join Syntaks for en left outer join er slik: select <svar attributter > from tabell 1 left outer join tabell 2 on join betingelse ; Resultatet blir en join av tabell-1 og tabell-2, pluss en linje for hvert hengetuppel i tabell-1 der alle svar-attributtene fra tabell-2 er null Eventuelle hengetupler fra tabell-2 blir ikke med i resultatet michael@ifi.uio.no INF1300 12. oktober 2009 30 Full outer join Syntaks for en full outer join er slik: select <svar attributter > from tabell 1 full outer join tabell 2 on join betingelse ; Resultatet blir en join av tabell-1 og tabell-2, pluss en linje for hvert hengetuppel i tabell-1 der alle svar-attributtene fra tabell-2 er null og en linje for hvert hengetuppel i tabell-2 der alle svar-attributtene fra tabell-1 er null michael@ifi.uio.no INF1300 12. oktober 2009 32

JDBC (Java Data Base Connectivity) Tre nødvendige java-biblioteker: : import java. sql. * ; import java. util. * ; import java. io. * ; To hjelpemetoder: : static void warn( String msg, Exception e ) { System. err. println ( msg ) ; if ( e!= null ) { System. err. println ( " Fikk unntak: " + e. tostring ( ) ) ; System. err. println ( "Melding : " + e. getmessage ( ) ) ; System. err. println ( "Traceback: " ) ; e. printstacktrace ( System. err ) ; static void die ( String msg, Exception e ) { warn( msg, e ) ; System. exit ( 1 ) ; michael@ifi.uio.no INF1300 12. oktober 2009 33 JDBC I hovedprogrammet (f.eks. i main) opprettes kontakten med filmdatabasen slik: Connection con = openconnection ( ) ; Deretter kan man legge SQL-koden i en String sqlkode, opprette to objektpekere Statement stm = null ; ResultSet svar = null ; stm = con. createstatement ( ) ; svar = stm. executequery ( sqlkode ) ; michael@ifi.uio.no INF1300 12. oktober 2009 35 JDBC Metode for å opprette forbindelse med filmdatabasen: public static Connection openconnection ( ) { Connection con = null ; try { Class.forName( "org. postgresql. Driver" ) ; catch( Exception e) { die ( " Fant ingen JDBC driver ", e ) ; Properties p = new Properties ( ) ; p. put( " user", "<ditt Postgres brukernavn>" ) ; p. put( "password", "<ditt Postgres passord>" ) ; String url = " jdbc : postgresql :// kurspg/fdb" ; try { con = DriverManager. getconnection ( url, p ) ; catch( Exception e) { die ( " Feil DB URL, brukernavn eller passord ", null ) ; return con; michael@ifi.uio.no INF1300 12. oktober 2009 34 JDBC-eksempel Connection con = openconnection ( ) ; Statement stm = con. createstatement ( ) ; ResultSet svar = stm.executequery ( " select a navn, count (*) as ant, avg( lonn) as gjsnitt, Avdeling where avd = avdnr group by a navn" ) ; String a navn; int ant ; float gjsnitt ; while ( svar. next ( ) ) { a navn = svar. getstring ( "a navn" ) ; ant = svar. getint ( "ant" ) ; gjsnitt = svar. getfloat ( " gjsnitt " ) ; System. out. println ( "RAD = " + a navn + " " + ant + " " + gjsnitt ) ; michael@ifi.uio.no INF1300 12. oktober 2009 36