La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko SQL.

Presentazioni simili


Presentazione sul tema: "Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko SQL."— Transcript della presentazione:

1 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko SQL

2 Lezione 3 Compito da casa Ambiguità Variabili Operazioni su insiemi INTERSECT UNION DIFFERENCE Subquery

3 AMBIGUITA Come possiamo distinguire gli attributi con gli stessi nomi? MovieStar(name, address, gender, birthdate) MovieExec(name, address, cert#, netWorth) SQL permette lutilizzo di espressioni: NomeTabella.NomeAttributo Questo elimina il problema dellambiguità, cioè limpossibilità di capire a quale specifico attributo si fa riferimento allinterno di una query

4 AMBIGUITA Visualizzare lelenco 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#)

5 Esercizio alla lavagna Formula algebrica per π Star1.name,Star2.name ( σ Star1.address=Star2.address and Star1.name

6 USO DI VARIABILI SQL permette di utilizzare più istanze della stessa tabella allinterno della clausola FROM Per fare questo è necessario fare un riferimento preciso allistanza della tabella che si sta utilizzando AS è la keyword che ci permette di fare questo

7 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.attribute FROM table AS table1, table AS table2 WHERE condizione

8 ESERCIZIO (alla lavagna+demo) Visualizzare lelenco delle coppie di attori che convivono: SELECT Star1.name AS nameA, Star2.name AS nameB FROM MovieStar AS Star1, MovieStar AS Star2 WHERE 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#)

9 Operazioni sugli Insiemi INTERSECT UNION EXCEPT

10 UNIONE In SQL il comando che permette di ottenere lunione tra il risultato di diverse query è UNION

11 UNIONE L'operatore UNION esegue lunione insiemistica di due tabelle generate da comandi SELECT, secondo la seguente sintassi. dove i devono ovviamente essere gli stessi nelle due SELECT.

12 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

13 ESERCIZIO Visualizzare lelenco dei titoli e degli anni che appaiono sia nella tabella Movie sia nella tabella StarsIn SELECT title", year" FROM imdb."Movie UNION SELECT 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#)

14 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 lunione 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.

15 INTERSEZIONE SQL mette a disposizione il comando INTERSECT per ottenere lintersezione dei risultati di due differenti query. Il risultato di una INTERSECT consiste solo degli elementi che compaiono in entrambe le tabelle

16 INTERSEZIONE L'operatore INTERSECT esegue lintersezione insiemistica di due tabelle generate da comandi SELECT, secondo la seguente sintassi. dove i devono ovviamente essere gli stessi nelle due SELECT.

17 ESERCIZIO Visualizzare i nomi e gli indirizzi degli attori di sesso maschile che hanno prodotto un film con un netWorth maggiore di $ : (SELECT "name", "address" FROM imdb."MovieStar WHERE "gender"='M') INTERSECT (SELECT "name", "address" FROM imdb."MovieExec" WHERE "netWorth"> ); 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#)

18 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 > $ INTERSECT esegue lintersezione 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.

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

20 DIFFERENZA L'operatore EXCEPT esegue la differenza insiemistica di due tabelle generate da comandi SELECT, secondo la seguente sintassi. dove i devono ovviamente essere gli stessi nelle due SELECT.

21 ESERCIZIO Visualizzare tutti i produttori (name,address) che non sono 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#)

22 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 unaltra 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

23 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#)

24 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#)

25 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 dellesecuzione di una interrogazione SQL (insieme di valori) Dallaltra abbiamo il valore dellattributo per la particolare riga.

26 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

27 TUPLE in WHERE con SUBQUERY SELECT name FROM MovieExec WHERE 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

28 Query Precedente SELECT name FROM MovieExec, Movie, StarsIn WHERE cert#=producer# AND title=movieTitle AND year=movieYear AND starName=HarrisonFord

29 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

30 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

31 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#";

32 EXIST Loperatore logico Exist ammette come parametro uninterrogazione nidificata e restituisce il valore vero solo se linterrogazione fornisce un risultato non vuoto. Questo operatore può essere usato in modo significativo solo quando di var tra linterrogazione esterna e nidificata.

33 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 M WHERE exist (SELECT * FROM Movie as M1 WHERE M.title=M1.title and (M.year<>M1.year or M.producerC#<>M1.producerc#)

34 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#)

35 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 PC Trovare 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)

36 Compito da Casa 3 Trovare tutte le navi con displacement>35 tonnelate Trovare 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)


Scaricare ppt "Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko SQL."

Presentazioni simili


Annunci Google