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

37
SQL: Lezione 2 Esercitazione per il corso “Basi di Dati” Gabriel Kuper Nataliya Rassadko ([email protected])

Transcript of SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko...

Page 1: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

SQL: Lezione 2Esercitazione per il corso “Basi di Dati”

Gabriel Kuper

Nataliya Rassadko ([email protected])

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

Lezione 2 Compito da casa WHERE: LIKE NULL UNKNOWN ORDER BY Esercizi

Page 3: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO Data la seguente tabella:

Movie(title, year, length, inColor, studioName, producerC#)

Visualizzare in una tabella con intestazione (Anno,titolo, Studio),tutti i film in bianco e nero, prodotti dopo l’anno 1990 ma prima del 1995.SELECT yeas as Anno, title as Titolo,

studioName as StudioFROM ‘movie’WHERE not ‘inColor’ AND year>’1990’ AND

year<‘1995’

Page 4: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIOData la seguente tabella:

Movie(title, year, length, inColor, studioName, producerC#)

Visualizzare tutti gli attributi dei film della serie shrek

SELECT *FROM ‘movie’WHERE title=’shrek’ or title=‘shrek 2’

or title=‘shrek 3’

Page 5: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO Data la seguente tabella

Scrivere la query che restituisce i nomi presenti Scrivere la query che restituisce i cognomi presenti Scrivere la query che restituisce le età presenti Scrivere la query che restituisce nome, cognome e

residenza di tutti i clienti Scrivere la query che restituisce tutti i dati dei clienti

Clienti

Cognome Nome Città Salario Età

Page 6: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIData la seguente tabella

Scrivere la query che restituisce nome e cognome di chi guadagna più di 2000; Scrivere la query che restituisce cognome e nome dei clienti che abitano a Trento; Scrivere la query che restituisce cognome e nome dei clienti che abitano a Trento e

guadagnano più di 2500; Scrivere la query che restituisce cognome, nome e salario dei clienti che hanno età

compresa fra 20 e 40 anni (estremi compresi); Scrivere la query che restituisce cognome, nome e salario dei clienti che risiedono a

Milano e hanno meno di 20 anni o più di 30.

Clienti

Cognome Nome Città Salario Età

Page 7: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

INTERROGAZIONI SQL La parte di SQL dedicata alla formulazione di

interrogazioni fa parte del DML. SQL esprime le interrogazioni in modo dichiarativo,

ovvero si specifica l’obiettivo dell’interrogazione e non il modo in cui ottenerlo.

Esistono molti modi diversi per esprimere la stessa interrogazione in SQL: il programmatore dovrà effettuare una scelta basandosi non (o non solo) sull’efficienza, ma anche su altri aspetti quali la leggibilità e la modificabilità dell’interrogazione.

Page 8: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

INTERROGAZIONI SEMPLICI Le operazioni di interrogazione in SQL

vengono specificate per mezzo della gia vista istruzione select.

select ListaAttributi

from ListaTabelle

[where Condizioni]

Page 9: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

Paragono di Stringhe Due stringhe sono uguali se contengono

simboli uguali nello stesso ordine Operatori >, >=, <, <= controllono ordine

lessicografico (alfabetico) bar<bargain<barracuda

In SQL, possiamo paragonare non solo stringa con stringa, ma anche stringa con campione s LIKE p

Page 10: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

LIKE Il campione può contenere caratteri specifici e

caratteri jolly. I normali caratteri devono corrispondere

esattamente ai caratteri specificati nella stringa di caratteri del modello.

I caratteri jolly possono venire abbinati a frammenti arbitrari della stringa.

Page 11: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

LIKE _(underscore) per indicare un singolo

carattere qualsiasi in quella posizione della stringa;

% (percento) per indicare una sequenza qualsiasi di caratteri in quella posizione della stringa.

Page 12: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

LIKE LIKE 'xyz%' vengono ricercate tutte le stringhe che

iniziano con i caratteri ‘xyz’

LIKE '%xyz' serve a ricercare tutte le stringhe che finiscono con i caratteri ‘xyz’

LIKE '%xyz%'’ per tutte le stringhe che contengono al loro interno i caratteri ‘xyz’

LIKE '_xyz' controlla le stringhe di 4 caratteri che finiscono con xyz

Page 13: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO 1Visualizzare titolo e anno dei film che sono stati

prodotti dagli studi cinematografici che hanno una ‘ch’ all’interno del nome.

SELECT “title”FROM “Movie”WHERE “studioName” LIKE ’%ch%’;

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: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO 2Estrarre tutti gli studi cinemantografici che hanno

prodotto film con titoli che contengono la parola pace.

SELECT “studioName”FROM “movie”WHERE “title” LIKE ‘%PACE%’;

Page 15: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO 3Estrarre tutti i film in cui hanno lavorato attori che

hanno come iniziali del nome “Fr”.

SELECT “title”FROM “Movie”, “StarsIn”,WHERE “starName” LIKE ‘FR%’;

Page 16: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO 4Estrarre tutti i film il titolo di quali contiene “’s”.

SELECT “title”FROM “Movie” WHERE “title” LIKE ‘%’’s%’;

Page 17: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESCAPE E se campione contiene simboli ‘%’ e ‘_’

come simboli definiti? s LIKE ‘x%%x%’ ESCAPE ‘x’

x è il simbolo di controllo Qualsiasi stringa che ha % come il simbolo

iniziale e finale “%” + qualsiasi_stringa + “%”

Page 18: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

NULL e UNKNOWN Il valore NULL significa:

unknown: esiste un valore ma non e’ conosciuto valore inapplicable: non ci sono valori che abbiano

senso (e.g., il valore dell’attributo studioName per un video amatoriale)

valore |_|: non si e’ autorizzati a conoscere il valore (e.g. netWorth value for some producers)

Page 19: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

NULL Dal punto di vista di teoria delle relazioni, non c’è

bisogna di NULL, perchè non ci possono essere le celle senza valore, se DB è progettata correttamente

Però DB “ideale” non è efficace DB in 3NF è efficace ma richiede la presenza di

NULL

Che cos’è 3NF? Esempi di non-3NF

Page 20: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

NULL e UNKNOWN Quando NULL e’ una parte di un operazione

aritmetica, il risultato e’ un NULL, e.g. 5*x=NULL, se x = NULL

Quando NULL e’ parte di un espressione di comparazione, il risultato e’ UNKNOWN, e.g., 5 > x = UNKNOWN, se x = NULL

NULL non e’ costante IS NULL ritorna true se un valore è nullo IS NOT NULL ritorna true se un valore non è nullo

Page 21: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

NULL & UNKNOW Supponiamo di avere la seguente query:

Intuitivamente immaginiamo che tutte le tuple dovrebbero essere ritornate

Select “title”From “Movie”Where “lenght”>=90 or “lenght”<90;

Page 22: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

NULL & UNKNOW In realtà non tutti valori saranno ritornati con

questa query. In questo caso, veranno ritornati solo le tuple

con valore non nullo dell’attributo length La query è equivalente a (esercizio):

Select *From “Movie”Where “lenght” is not NULL or “length” is NULL;

Page 23: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

NULL e UNKNOWN

x y x AND y x OR y NOT xTRUE TRUE TRUE TRUE FALSETRUE UNKNOWN UNKNOWN TRUE FALSETRUE FALSE FALSE TRUE FALSE

UNKNOWN TRUE UNKNOWN TRUE UNKNOWNUNKNOWN UNKNOWN UNKNOWN UNKNOWN UNKNOWNUNKNOWN FALSE FALSE UNKNOWN UNKNOWN

FALSE TRUE FALSE TRUE TRUEFALSE UNKNOWN FALSE UNKNOWN TRUEFALSE FALSE FALSE FALSE TRUE

Page 24: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ORDER BY È possibile utilizzare l’opzione order by su

più di un attributo. Quando due valori sono uguali per il primo

attributi vengono ordinati in base al secondo.

Page 25: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ORDER BY il risultato puo’ essere ordinato secondo uno

specifico attributo:

ORDER BY <list of attributes>

Per default l’ordine e’ crescente, per ordinare il risultato in maniera decrescente si usa la keyword: DESC e.g.:

Page 26: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ORDER BYVisualizzare i titoli dei film ordinati in basi alla durata

del film.

SELECT “title”FROM “Movie”ORDER BY “length”;

Page 27: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ORDER BY Visualizza i film (title, year, length) ordinati per

anno, se più film sono stati prodotti nello stesso anno l’ordinamento deve essere fatto per durata.

SELECT "title", "year", "length"FROM "Movie"ORDER BY "year", "length“;

Page 28: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ORDER BYVisualizzare tutti i film ordinati in maniera decrescente

per anno.

SELECT "title", "year", "length"FROM "Movie"ORDER BY "year" DESC;

Page 29: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO Visualizzare l’indirizzo dello studio cinematografico

“Dream Works SKG [us]”

SELECT “address”FROM “Studio”WHERE “name“ LIKE “Dream Works SKG [us]";

Page 30: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO Visualizzare il compleanno dell’attore Robert De

Niro (De Niro, Robert).

SELECT “birthdate”FROM “MovieStar"WHERE “name“ LIKE “De Niro, Robert";

Page 31: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO Data la tabella:

Impiegato (Nome,Cognome, Dipart, Ufficio, Stipendio,Città)

Restituire lo stipendio mensile dell’impiegato di cognome “Bianchi”

SELECT Stipendio/12 as StipendioMensileFROM ImpiegatoWHERE Cognome = ‘Bianchi’

Page 32: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO

Visualizzare , in ordine di produzione, tutti i film, se più film sono stati prodotti nello stesso anno ordinarli per ordine alfabetico rispetto al titolo.

SELECT *FROM “Movie”ORDER “year”, “title”;

Page 33: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO Estrarre gli impiegati che hanno un cognome che

termina con la vocale “i” e che ha una “o” in seconda posizione.

Impiegato (Nome,Cognome, Dipart, Ufficio, Stipendio,Città)

SELECT *FROM ImpiegatoWHERE Cognome LIKE ‘_o%i’

Page 34: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO Trovare tutte le star che appaiono nei film prodotti

prima del 1979 o con un titolo che contiene la parola “WAR”

SELECT “starName”FROM “StarIn”, “Movie”WHERE “movieTitle” = “title” and (“year”<“1979” or “title” LIKE ‘%WAR%’);

Page 35: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

ESERCIZIO: compito da casa Visualizzare in una tabella con intestazione, Nome,

tutti gli attori che hanno partecipato almeno ad un film in bianco e nero.

Page 36: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

Compito da casa 1 Product (maker, model, type) PC (model, speed, ram, hd, rd, price) Laptop (model, speed, ram, hd, screen, price) Printer (model, color, type, price)

Trovare tutti model del PC, speed del loro processore e capacità di hd, che costano (price) meno di 1200

Trovare tutti i maker dei printer del tipo type Trovare tutti model, ram, screen di laptop con

prezzo meno 1200

Page 37: SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko (rassadko@dit.unitn.it)

Compito da casa 2 Classes (class, type, country, numGuns, bore,

displacement) Ships (name, class, launched) Battles (name, date) Outcomes (ship, battle, result)

Trovare i classi (class) ed i paesi (country) che producono le navi (Ships) con almeno 10 numGuns

Trovare tutti i nomi (name) delle navi (Ships) varati (launched) prima 1918 e rinomire la colonna del risultato come shipName

Trovare i nomi delle navi (Ships) affondati (attributo result=‘sunk’) nelle battaglie marine e i nomi di quelle battaglie (battle)

Trovare i nomi di tutte le navi che hanno la lettere iniziale ‘R’ Trovare i nomi di tutte le navi che hanno almento tre parole (per esempio ‘King

George V’)