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

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

Indre select-setninger Nestede select-setninger

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

Relasjoner terminologi

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

INF1300 Introduksjon til databaser

INF1300 Det meste av resten av

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

INF1300 Introduksjon til databaser

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

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

Notater: INF1300. Veronika Heimsbakk 8. januar 2013

SQL for INF1300. Stein Michael Storleer 7. november 2014

UNIVERSITETET I OSLO

Repetisjon: Normalformer og SQL

SQL for INF1300. Stein Michael Storleer 21. september 2015

SQL for INF1300. Stein Michael Storleer 15. september 2016

SQL: Repe)sjon og eksempler Deniz Akkøk Mathias Stang

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

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

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

SQL Structured Query Language

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

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

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

SQL Structured Query Language

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. 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 SQL. Structured Query Language. Institutt for Informatikk. INF Ellen Munthe-Kaas 1

SQL Structured Query Language

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

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

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

Oppgave 1 (Opprett en database og en tabell)

SQL, del 1 - select. Hva er SQL?

Relasjoner terminologi

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

SQL, del 1 - select. Hva er SQL?

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

LC238D Datamodellering og databaser SQL, del 1 - SELECT

SQL: SELECT-spørringer

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

Metaspråket for å beskrive grammatikk

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

Spørsmålskompilering del 1

Spørsmålskompilering del 1

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

Institutt for datateknikk. Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

INF1300 Introduksjon til databaser

IN3020 V2019 Obligatorisk oppgave nr. 1

SQL: SELECT-spørringer

Oppgave 1 Datamodellering 22 %

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.

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

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

IN2090 Databaser og datamodellering. 06 Enkele joins og nestede SELECT

INF1300 Introduksjon til databaser

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

Løsningsskisse til Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Systemutvikling fra kjernen og ut, fra skallet og inn

INF3100 V2015 Obligatorisk oppgave nr. 1

En liten rekap. Spørrespråk. I dag SELECT

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

INF3100 V2016 Obligatorisk oppgave nr. 1

INF1300 Introduksjon til databaser

Datamodellering og databaser SQL, del 2

Datamodellering og databaser SQL, del 2

INF1300 Introduksjon til databaser: SQL Structured Query Language

D: Ingen trykte eller håndskrevne hjelpemiddel tillatt. Bestemt, enkel kalkulator tillatt.

Bruke SQL fra Python. Med Psycopg2

Tabeller og enkle spørringer

- 1 - Filmdatabasen. [ORM-versjon] Ellen Munthe-Kaas Januar 2010

1. SQL spørringer mot flere tabeller

IN2090 Databaser og datamodellering. 09 Aggregering og sortering

INF3100 V2018 Obligatorisk oppgave nr. 1

Datamodellering og databaser SQL, del 2

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

EKSAMEN. Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene.

Databases 1. Extended Relational Algebra

Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

SQL / DML: Insert data. SQL as Data Manipulation Language (DML) SQL / DML: Overview. SQL / DML: Insert data. SQL / DML: Implementations of bulk load

Repetisjon. IN2090 Databaser og datamodellering. 06 Enkele joins og nestede SELECT. Eksempler: FilmDB. Enkle SELECT-spørringer i et nøtteskall

DBS18 - Strategier for Query-prosessering

Oppgave 1 1. Spørring: Resultattabell: 2. Spørring: Resultattabell: 3. Spørring:

Løsningsforslag uke 9 INF212 - Våren 2002 Jørgen Hermanrud Fjeld with precious assistance from Marte Arnestad Harald Askestad Kai-

IN2090 Databaser og datamodellering. 09 Aggregering og sortering

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

SQL 3: Opprette tabeller, datainnsetting og utsnitt

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

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

OQL Object Query Language

ORDBMS og OODBMS i praksis

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

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

Løsningsforslag maskindatabasen på Ifi SQL og normalisering

Et objektorientert spørrespr. rrespråk: Object Query Language (OQL)

Transkript:

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

/* Lage et view med oversikt over hvor mange funksjoner * filmarbeiderne med f l e r e enn 1 funksjon har hatt */ create view funksjoner ( personid, antroller ) as select p. personid, count ( distinct parttype ) from person p, filmparticipation x where x. personid = p. personid group by p. personid having count ( distinct parttype ) > 1; Vi kan nå bruke viewet som en tabell : select max( firstname ) max( lastname ) as navn, parttype as deltakerfunksjon, count ( * ) as antall_ filmer from person p, filmparticipation x, funksjoner f where x. personid = p. personid and f. personid = p. personid and f. antroller > 6 group by p. personid, parttype ;

samme setning, men nå med en relasjon bak from istedet for view : select max( firstname ) max( lastname ) as navn, parttype as deltakerfunksjon, count ( distinct filmid ) as antall_ filmer from person as p, filmparticipation as x, ( select p. personid as personid, count ( distinct parttype ) as antroller from person p, filmparticipation x where x. personid = p. personid group by p. personid having count ( distinct parttype ) > 1) as f where x. personid = p. personid and f. personid = p. personid and f. antroller > 6 group by p. personid, parttype ;

Vi får samme resultat med denne setningen : som inneholder en indre selectsetning select max( firstname ) max( lastname ) as navn, parttype as deltakerfunksjon, count ( distinct filmid ) as antall_ filmer from person p, filmparticipation x where x. personid = p. personid and 6 < ( select count ( distinct parttype ) from filmparticipation fp where fp. personid = p. personid ) group by p. personid, parttype ;

select p. personid, max( lastname ), max( firstname ) as navn, count ( distinct f. filmid ) as antfilmer, min( rank ) as minimumsvurdering from film f, filmrating r, filmparticipation x, person p, filmcountry c where r. filmid = f. filmid and rank is not null and p. personid = x. personid and f. filmid = x. filmid and parttype = cast and c. filmid = f. filmid and country not like India group by p. personid having count ( distinct f. filmid ) > 20 and min( rank ) > ( 1 + ( select avg( rank ) from filmitem i, film f, filmrating r where i. filmid = f. filmid and r. filmid = f. filmid and rank is not null ) ) ;

personid navn antfilmer minimumsvurdering ----------+-------------------+-----------+------------------- 286025 Barsi, Béla 22 6.7 711113 Caramitru, Ion 23 6.7 948697 Cotescu, Octavian 23 7.6 1897625 Hara, Setsuko 21 6.6 2157383 Okada, Mariko 26 6.5 2821977 López, Marga 22 6.8 3143273 Mishima, Masao 22 6.8 3287913 Naniwa, Chieko 21 6.5 4196905 Shpigel, Grigori 29 6.4 (9 rows)

fdb=> select lastname etternavn, fdb-> firstname fornavn, fdb-> count(*) as antall fdb-> from Person fdb-> where firstname like _% fdb-> group by lastname, firstname fdb-> having count(*) > 24 fdb-> order by antall desc ; etternavn fornavn antall -----------+---------+-------- Williams John 30 Williams David 30 Martin John 29 Scott Michael 28 King John 26 Lee David 26 Smith Michael 26 James David 26 Davis John 26 Miller John 25 White Michael 25 Johnson Michael 25 Smith Paul 25 Smith John 25 Scott David 25 Taylor John 25 Wilson John 25 Jones Chris 25 Murphy Michael 25 (19 rows)

fdb=> select title, count(distinct film.filmid) fdb-> from Film, Filmitem fdb-> where filmtype = C fdb-> and film.filmid = filmitem.filmid fdb-> group by title fdb-> having count(distinct film.filmid) > 25 fdb-> order by count(distinct film.filmid) desc; title count ---------------------+------- Popular Science 45 Love 42 Mother 41 Hamlet 39 Desire 37 Stranger, The 37 Unusual Occupations 35 Trap, The 34 Carmen 34 Home 33 Destiny 31 Jealousy 31 Honeymoon 29 Cinderella 29 Alone 29 Revenge 29 Dead End 28 Kiss, The 28 Escape 27 Temptation 27 Fear 26 Awakening, The 26 (22 rows)

select t i t l e, count ( distinct film. filmid ) from Film, Filmitem where seleksjonsbetingelse filmtype = C joinbetingelse : and film. filmid = filmitem. filmid group by t i t l e having count ( distinct film. filmid ) > 25 order by count ( distinct film. filmid ) desc ; select t i t l e, count ( distinct filmid ) from film natural join filmitem where filmtype = C group by t i t l e having count ( distinct filmid ) > 25 order by count ( distinct filmid ) desc ;

fdb=> select title, count(distinct filmid) fdb-> from film natural join filmitem fdb-> where filmtype = C fdb-> group by title fdb-> having count(distinct filmid) > 25 fdb-> order by count(distinct filmid) desc; title count ---------------------+------- Popular Science 45 Love 42 Mother 41 Hamlet 39 Desire 37 Stranger, The 37 Unusual Occupations 35 Trap, The 34 Carmen 34 Home 33 Destiny 31 Jealousy 31 Honeymoon 29 Cinderella 29 Alone 29 Revenge 29 Dead End 28 Kiss, The 28 Escape 27 Temptation 27 Fear 26 Awakening, The 26 (22 rows)

select p. personid, max( lastname ), max( firstname ) as navn, count ( distinct f. filmid ) as antfilmer, min( rank ) as minimumsvurdering from film f, filmrating r, filmparticipation x, person p, filmcountry c where r. filmid = f. filmid and rank is not null and p. personid = x. personid and f. filmid = x. filmid and parttype = cast and c. filmid = f. filmid and country not like India group by p. personid having count ( distinct f. filmid ) > 20 and min( rank ) > ( 1 + ( select avg( rank ) from filmitem i, film f, filmrating r where i. filmid = f. filmid and r. filmid = f. filmid and rank is not null ) ) ;

select p. personid, max( lastname ), max( firstname ) as navn, count ( distinct f. filmid ) as antfilmer, min( rank ) as minimumsvurdering from film f natural join filmrating r natural join filmparticipation natural join person p natural join filmcountry c where rank is not null and parttype = cast and country not like India group by p. personid having count ( distinct f. filmid ) > 20 and min( rank ) > ( 1 +( select avg( rank ) from filmitem i natural join film f natural join filmrating r where rank is not null ) ) ;

select p. personid, max( lastname ), max( firstname ) as navn, count ( distinct fp. filmid ) as antfilmer, min( rank ) as minimumsvurdering from filmrating r natural join filmparticipation fp natural join person p natural join filmcountry c where rank is not null and parttype = cast and country not like India group by p. personid having count ( distinct fp. filmid ) > 20 and min( rank ) > ( 1 + ( select avg( rank ) from filmitem natural join filmrating where rank is not null ) ) ;

Relasjonssammenligninger SQL har fem operatorer som sammenligner med innholdet i en hel relasjon: i SQL-2 exists R not exists R in R not in R any R all R betyr at R har minst én forekomst at R ikke har noen forekomster R / R en vilkårlig verdi i R alle verdier i R

ANY og ALL any og all brukes i praksis bare på relasjoner med ett attributt Eksempel: Finn antall selgere som tjener mer enn samtlige markedsførere Ansatt(anr, navn, lonn, avd) Avdeling(avdnr, avdelingsnavn, leder) Prosjektplan(pnr, anr, timer) select count ( * ) from Ansatt where avd = salg and lonn > all ( select lonn from Ansatt where avd = marketing ) ;

ANY og ALL any og all brukes i praksis bare på relasjoner med ett attributt Eksempel: Hva finner vi dersom vi bruker any istedet for all? Ansatt(anr, navn, lonn, avd) Avdeling(avdnr, avdelingsnavn, leder) Prosjektplan(pnr, anr, timer) select count ( * ) from Ansatt where avd = salg and lonn > any ( select lonn from Ansatt where avd = marketing ) ;

IN og NOT IN [ not ] in kan brukes på ett attributt eller på en liste av attributter Eksempel: Finn navn på ansatte som ikke har ført noen prosjekttimer Ansatt(anr, navn, lonn, avd) Avdeling(avdnr, avdelingsnavn, leder) Prosjektplan(pnr, anr, timer) select navn from Ansatt where anr not in ( select anr from Prosjektplan ) ;

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

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)

Eksempel Finn navn på ansatte som skal arbeide mer enn 10 timer på samtlige av sine prosjekter Ansatt(anr, navn, lonn, avd) Avdeling(avdnr, avdelingsnavn, leder) Prosjektplan(pnr, anr, timer) select A. navn from Ansatt A where not exists ( select * from Prosjektplan P where P. anr = A. anr and P. timer <= 10 ) ;

Eksempel Finn navn på ansatte som skal delta på alle prosjekter Ansatt(anr, navn, lonn, avd) Avdeling(avdnr, avdelingsnavn, leder) Prosjektplan(pnr, anr, timer) select A. navn from Ansatt 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 ) ) ;

Eksempel Finn navn på de ansatte som ikke skal delta på noe prosjekt ledet av en avdelingsleder Ansatt(anr, navn, lonn, avd) Avdeling(avdnr, avdelingsnavn, leder) Prosjekt(pnr, leder) Prosjektplan(pnr, anr, timer) select navn from Ansatt 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 ) ) ;

Filmer og r o l l e for personer med navnet Michael King select personid, t i t l e, parttype from film f natural join filmparticipation fp natural join person p where personid = any ( select personid from Person where lastname like King and firstname like Michael ) ;

Det samme for Ingmar Bergman select personid, t i t l e, parttype from film f natural join filmparticipation fp natural join person p where personid = any ( select personid from Person where lastname like Bergman and firstname like Ingmar ) ;

Hva gjør denne setningen? select rank, count ( filmid ) antall hvorfor ikke ( d i s t i n c t filmid )? from filmrating r natural join filmitem f i where filmtype= C group by rank order by antall desc ;

Rating av Ingmar Bergmans filmer : select rank, fr. * from filmrating fr natural join filmitem f i natural join filmparticipation fp where filmtype= C and personid = any ( select personid from Person where lastname like Bergman and firstname like Ingmar ) ;

Antall filmer som har bedre rating enn samtlige filmer Ingmar Bergman har vært involvert i select count ( distinct filmid ) as antall from filmrating fr natural join filmitem f i natural join filmparticipation fp where filmtype = C and rank > all ( select rank from filmrating fr natural join filmitem f i natural join filmparticipation fp where filmtype= C and personid = any ( select personid from Person where lastname like Bergman and firstname like Ingmar ) ) ;

Hvilke filmer b l i r med her? select count ( distinct filmid ) as antall from filmrating fr natural join filmitem f i natural join filmparticipation fp where filmtype = C and rank > any ( select rank from filmrating fr natural join filmitem f i natural join filmparticipation fp where filmtype= C and personid = any ( select personid from Person where lastname like Bergman and firstname like Ingmar ) ) ;

Denne bruker lang t i d : select count ( fp. filmid ) from filmparticipation fp, filmparticipation x where fp. filmid = x. filmid and fp. filmid not in ( select y. filmid from filmparticipation y where fp. filmid = y. filmid and y. parttype = director ) ; count 32227986 (1 row)

Denne er riktigere : fdb=> select count ( distinct filmid ) fdb > from filmparticipation fp fdb > natural join filmitem f i fdb > where filmtype = C fdb > and not exists fdb > ( select filmid fdb( > from filmparticipation x fdb( > where fp. filmid = x. filmid fdb(> and x. parttype = director ) ; count 31157 (1 row)

antall filmer i filmparticipation som _har_ regissør select count ( distinct filmid ) from filmparticipation fp natural join filmitem f i where filmtype = C and exists ( select filmid from filmparticipation x where fp. filmid = x. filmid and x. parttype = director ) ;

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