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

Post on 01-May-2015

217 views 2 download

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

SQL: Lezione 2Esercitazione 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

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’

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’

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à

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à

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.

INTERROGAZIONI SEMPLICI Le operazioni di interrogazione in SQL

vengono specificate per mezzo della gia vista istruzione select.

select ListaAttributi

from ListaTabelle

[where Condizioni]

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

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.

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.

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

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

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%’;

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%’;

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

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

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 + “%”

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)

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

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

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;

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;

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

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.

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.:

ORDER BYVisualizzare i titoli dei film ordinati in basi alla durata

del film.

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

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“;

ORDER BYVisualizzare tutti i film ordinati in maniera decrescente

per anno.

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

ESERCIZIO Visualizzare l’indirizzo dello studio cinematografico

“Dream Works SKG [us]”

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

ESERCIZIO Visualizzare il compleanno dell’attore Robert De

Niro (De Niro, Robert).

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

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’

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”;

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’

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%’);

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.

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

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’)