SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko...
-
Upload
capricia-vitale -
Category
Documents
-
view
217 -
download
2
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 ([email protected])
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’)