esercitazione per il corso basi di dati gabriel kuper nataliya rassadko [email protected] sql

36
Esercitazione per il corso “Basi di Dati” Gabriel Kuper Nataliya Rassadko [email protected] SQL

Upload: luigino-boni

Post on 01-May-2015

224 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Esercitazione per il corso “Basi di Dati” Gabriel Kuper

Nataliya [email protected]

SQL

Page 2: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Lezione 3

Compito da casaAmbiguitàVariabiliOperazioni su insiemi

INTERSECT UNION DIFFERENCE

Subquery

Page 3: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

AMBIGUITA’

Come possiamo distinguire gli attributi con gli stessi nomi? MovieStar(name, address, gender, birthdate) MovieExec(name, address, cert#, netWorth)

SQL permette l’utilizzo di espressioni:NomeTabella.NomeAttributo

Questo elimina il problema dell’ambiguità, cioè l’impossibilità di capire a quale specifico attributo si fa riferimento all’interno di una query

Page 4: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

AMBIGUITA’

Visualizzare l’elenco delle coppie (attori, produttori) che hanno lo stesso indirizzo

SELECT “MovieStar"."name" AS starName, "MovieExec"."name" AS producerName

FROM imdb."MovieStar", imdb."MovieExec"WHERE "MovieStar"."address"="MovieExec"."address";

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 5: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Esercizio alla lavagna

Formula algebrica per

πStar1.name,Star2.name(σStar1.address=Star2.address and Star1.name<Star2.name(ρM(Star1.name,address,gender,birthdate)(MovieStar)×ρM(Star2.name,address,gender,birthdate)(MovieStar)))

SELECT “MovieStar"."name" AS starName, "MovieExec"."name" AS producerName

FROM imdb."MovieStar", imdb."MovieExec"WHERE "MovieStar"."address"="MovieExec"."address";

Page 6: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

USO DI VARIABILI

SQL permette di utilizzare più istanze della stessa tabella all’interno della clausola FROM

Per fare questo è necessario fare un riferimento preciso all’istanza della tabella che si sta utilizzando

AS è la keyword che ci permette di fare questo

Page 7: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

USO DI VARIABILI

È possibile far riferimento a più esemplari della stessa tabella.

Tutte le volte che si introduce una alias per una tabella si dichiara in effetti una variabile di tipo tabella, che possiede come valore il contenuto della tabella di cui è alias.

SELECT table1.attribute, table2.attributeFROM table AS table1, table AS table2WHERE condizione

Page 8: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

ESERCIZIO(alla lavagna+demo)

Visualizzare l’elenco delle coppie di attori che convivono:

SELECT “Star1”.“name” AS nameA, “Star2”.”name” AS nameBFROM “MovieStar” AS Star1, “MovieStar” AS Star2WHERE “Star2”.”address”=“Star2”.”address”

AND “Star1”.”name”>“Star2”.”name”;

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 9: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Operazioni sugli Insiemi

INTERSECTUNIONEXCEPT

Page 10: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

UNIONE

In SQL il comando che permette di ottenere l’unione tra il risultato di diverse query è UNION

Page 11: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

UNIONE

L'operatore UNION esegue l’unione insiemistica di due tabelle generate da comandi SELECT, secondo la seguente sintassi.

dove i <campi> devono ovviamente essere gli stessi nelle due SELECT.

Page 12: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

UNIONE

Il risultato di una UNION consiste di tutti gli elementi della prima tabella piu’ tutti gli elementi della seconda tabella;

Con UNION i duplicati vengono cancellati automaticamente

Per mantenere i duplicati dobbiamo usare la parola chiava ALL

Page 13: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

ESERCIZIO

Visualizzare l’elenco dei titoli e degli anni che appaiono sia

nella tabella Movie sia nella tabella StarsIn

SELECT “title", “year"FROM imdb."Movie“

UNIONSELECT “movieTitle“ AS “title”, “movieYear“ AS “year”FROM imdb.“StarsIn“

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 14: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

UNIONE

La prima parte della query estrae titolo e anno dei film presenti nella tabella Movie.

La seconda della query estrae titolo e anno presenti nella tabella StarsIn.

UNION esegue l’unione dei due output.SQL richiede che la lista di colonne di entrambe le

select siano uguali per tipo, colonna per colonna.SQL elimina automaticamente le righe duplicate

usando UNION.

Page 15: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

INTERSEZIONE

SQL mette a disposizione il comando INTERSECT per ottenere l’intersezione dei risultati di due differenti query.

Il risultato di una INTERSECT consiste solo degli elementi che compaiono in entrambe le tabelle

Page 16: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

INTERSEZIONE

L'operatore INTERSECT esegue l’intersezione insiemistica di due tabelle generate da comandi SELECT, secondo la seguente sintassi.

dove i <campi> devono ovviamente essere gli stessi nelle due SELECT.

Page 17: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

ESERCIZIO

Visualizzare i nomi e gli indirizzi degli attori di sesso maschile che hanno prodotto un film con un “netWorth” maggiore di $1.000.000:

(SELECT "name", "address" FROM imdb."MovieStar“ WHERE "gender"='M')

INTERSECT(SELECT "name", "address"FROM imdb."MovieExec"WHERE "netWorth">1000000);

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 18: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

INTERSEZIONE

La prima parte estrae tutti gli attori di sesso maschile dalla tabella MovieStar.

La seconda parte estrae tutti i produttori di film con il parametro netWorth > $1.000.000

INTERSECT esegue l’intersezione dei due risultati e ritorna solo le righe presenti in entrambe le parti, quindi gli attori/produttori che rispettano le condizioni espresse in entrambi le parti delle query.

Page 19: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

DIFFERENZA

In sql il comando che permette di ottenere la differenza tra due set di attributi con lo stesso nome e’ EXCEPT.

1 2 3

Page 20: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

DIFFERENZA

L'operatore EXCEPT esegue la differenza insiemistica di due tabelle generate da comandi SELECT, secondo la seguente sintassi.

dove i <campi> devono ovviamente essere gli stessi nelle due SELECT.

Page 21: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

ESERCIZIO

Visualizzare tutti i produttori (name,address) che nonsono attori:

(SELECT “name", “address" FROM imdb."MovieExec“)

EXCEPT(SELECT “name“, “address” FROM imdb.“MovieStar“)

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 22: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

SUBQUERY

Le espressioni delle clausole FROM e WHERE possono essere presentati come SELECT

Si parla in questo caso di interrogazione nidificate

In SQL una query che è parte di un’altra query prende il nome di SUBQUERY

Una SUBQUERY può: Ritornare una singola costante da comparare con un altro

valore nella clausola WHERE Ritornare una tabella da utilizzare in modi differenti nella

clausola WHERE Ritornare una tabella da utilizzare nella clausola FROM

Page 23: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

ESERCIZIO (SUBQUERY 1)

Vediamo la query che ritorna il nome dei produttori del fim con titolo “Someone Like You …” :

SELECT "name"FROM imdb."Movie", imdb."MovieExec"WHERE "title"='Someone Like You...' AND "producerC#"="cert#";

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 24: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

SUBQUERY

La query vista nella slide precedente può essere formulta utilizzando le interrogazioni nidificate:

SELECT "name"FROM imdb."MovieExec"WHERE "cert#"=

(SELECT "producerC#"FROM imdb."Movie"WHERE "title"='Someone Like You...');

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 25: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

SUBQUERY 2

Se confrontiamo un attributo con il risultato di una interrogazione, abbiamo il problema della disomogeneità dei termini di confronto.

Da una parte abbiamo il risultato dell’esecuzione di una interrogazione SQL (insieme di valori)

Dall’altra abbiamo il valore dell’attributo per la particolare riga.

Page 26: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

SUBQUERY 2: CONDIZIONI SULLE TABELLE

EXISTS R true se R non e’ vuota; s IN R true se s e’ contenuta in R; s NOT IN R true se s non e’ contenuta in

R; s > ALL R true se s e’ maggiore di tutti i

valori in R; s > ANY R true se s e’ maggiore di almeno

un valore in R

NOT

Page 27: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

TUPLE in WHERE con SUBQUERY

SELECT nameFROM MovieExecWHERE cert# IN (SELECT producerC# FROM Movie WHERE (title, year) IN (SELECT movieTitle, movieYear FROM StarsIn WHERE starName=‘Harrison Ford’))

(movieTitle, movieYear) per garantire che tutte le

tuple sono uniche

(title, year) sono tuple paragonate con relazione

nidificata tramite IN

query nidificata ritorna relazione, quindi

operatore IN

Page 28: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Query Precedente

SELECT nameFROM MovieExec, Movie, StarsInWHERE cert#=producer# AND title=movieTitle AND year=movieYear AND starName=‘HarrisonFord’

Page 29: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

SUBQUERY

Subquery possono essere calcolati solo una volta (se siamo fortunati) e il risultato si utilizza nelle query “esterne”

In altro caso, quando subquery si valutano tante volte, si tratta di subquery correlati

Page 30: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

ESEMPIO

Seleziona i film con gli stessi nomi ma prodotti in anni diversi

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

SELECT “title"FROM "Movie“ AS “Old”,WHERE “year“<ANY

(SELECT “year”FROM “Movie”WHERE “title"=“Old".“title”);

Page 31: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

SUBQUERY 3

E’ possibile utilizzare la subquery nella clausola FROM al posto di una relazione.

Query che restituisce i produttori dei film in cui attore e’ Robert De Niro

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

SELECT "name"FROM imdb."MovieExec",(SELECT "producerC#“FROM imdb."Movie", imdb."StarsIn“WHERE "title"="movieTitle" AND"year"="movieYear" AND"starName"='De Niro, Robert') AS "Prod"WHERE "cert#"="Prod"."producerC#";

Page 32: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

EXIST

L’operatore logico Exist ammette come parametro un’interrogazione nidificata e restituisce il valore vero solo se l’interrogazione fornisce un risultato non vuoto.

Questo operatore può essere usato in modo significativo solo quando di “var” tra l’interrogazione esterna e nidificata.

Page 33: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

ESERCIZIO

Visualizzare i film che hanno degli omonimi (ovvero film con lo stesso titolo ma prodotti in anni diversi o da un diverso produttore)Movie(title,year,length,inColor,studioName,producerC#)

StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

SELECT *FROM “Movie” as MWHERE exist(SELECT *FROM “Movie” as M1WHERE M.“title”=M1.“title” and (M.“year”<>M1.“year” or M.“producerC#”<>M1.“producerc#”)

Page 34: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Compito da Casa 1

Quali attori-uomini partecipavano nel film “Terms of Endearment”?

Quali attori partecipavano nel film prodotti da MGM nel 1995?

Quali film sono più lunghi del film “Gone With the Wind”?Chi è dirigente di MGM?Trovare i dirigenti (degli studi) con netWorth maggiore di

quello di Mervin Griffin

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName)MovieStar(name,address,gender,birthdate)MovieExec(name,address,cert#,netWorth)Studio(name,address,presC#)

Page 35: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Compito da Casa 2

Trovare “maker” e “speed” di laptop che hanno “hd”>30Gb

Trovare “model” e “price” dei prodotti fatti dal “maker”=‘B’

Trovare tutti “maker” di laptop che non producono PCTrovare le coppie di “model” di PC che hanno stessi

“speed” e “ram”Trovare “maker” che producono almeno due modelli di

PC o laptop con “speed”>=1000MHz

Product (maker, model, type)PC (model, speed, ram, hd, rd, price)Laptop (model, speed, ram, hd, screem, price)Printer (model, color, type, price)

Page 36: Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko rassadko@disi.unitn.it SQL

Compito da Casa 3

Trovare tutte le navi con “displacement”>35 tonnelateTrovare “name”, “displacement” e “numGuns” delle navi

che partecipavano nelle battaglie (“battle”) alla isola Guadalcanal

Trovare tutti “country” dove si costruiscono le navi con tipo ‘bb’ o ‘bc’

Trovare tutte le navi che, dopo aver ricevuto i danni (“result”=‘damaged’) in qualche battaglia, partecipavano in altre battaglie

Trovare “name” di battaglie dove partecipavano almeno tre navi dalla stessa “country”

Classes (class, type, country, numGuns, bore, displacement)Ships (name, class, launched)Battles (name, date)Outcomes (ship, battle, result)