La caratteristica più importante del linguaggio SQL è la sua capacità di estrarre le informazioni desiderata dal database mediante INTERROGAZIONI. L'interrogazione di un database è una delle operazioni che viene effettuata con maggiore frequenza.
Queste funzionalità sono fornite dal comando SELECT che è semplice da usare e allo stesso tempo molto potente.
SELECT colonne - lista di attributiFROM lista di tabelleWHERE condizioni ;La query esegue il prodotto cartesiano delle tabelle nella clausola FROM, considera solo le righe che soddisfano la condizione nella clausola WHERE e per ogni riga valuta le espressioni nella TARGET LIST (nomi dei campi - attributi)Le TRE operazioni fondamentali che esprime il comando SELECT sono:
* -> restituisce tutti i campi della tabella
DISTINCT nome_campo -> elimina le righe duplicate in un campo
COUNT (*) -> conta il numero di tuple
COUNT(attributo) -> conta i valori di un attributo (considerando i duplicati)
COUNT(DISTINCT attributo) -> conta i valori di una attributo (senza duplicati)
MIN(attributo) - MAX(attributo) - AVG(attributo) - SUM(attributo)
ORDER BY: in che ordine si presenta il risultato --> campo DESC / ASC
GROUP BY: consente di realizzare l'operazione di aggregazione o raggruppamento
HAVING: può essere usato solo in combinazione con la clausola GROUP BY e permette di specificare condizioni sui gruppi di tuple generati dalla clausola GROUP BY in modo da selezionare solo i gruppi che rispettano certi criteri
Qualora ci sia l'esigenza di maggiore chiarezza nella descrizione del comando, oppure ci siano due attributi con lo stesso nome in due tabelle diverse, è opportuno utilizzare la DOT NOTATION che prevede l'uso del punto (.) come separatore tra elementi diversi.
per una maggiore comodità, possono essere usate anche delle abbreviazioni definite ALIAS -> stringa di testo che descrive in modo appropriato una colonna della tabella risultante da una query, attraverso il comando AS, si crea una nuova colonna fittizia che non va a modificare la tabella originale. Utile per inserire campi calcolati senza modificare la tabella.
SELECT (primo campo+secondo campo) AS "somma parziale"FROM tabella;Creo il modello ER dello schema relazionale proposto e posso considerare che la tabella RECITA è la semplificazione della relazione N:N tra le tabelle ATTORI e FILM
2. Il titolo dei film di L. Pieraccioni prodotti dopo il 2015
SELECT f.TitoloFROM Film fWHERE f.Regista="L. Pieraccioni" AND f.AnnoProduzione>20153. Il titolo e la durata dei film di fantascienza americani o giapponesi prodotti prima del 2010
SELECT f.Titolo, f.DurataFROM Film fWHERE f.Genere="Fantascienza" AND (f.Nazionalità="Americana" OR f.Nazionalità="Giapponese") AND f.AnnoProduzione<20104. Il titolo dei film di fantascienza americani prodotti dopo il 2010 oppure quelli francesi
SELECT f.TitoloFROM Film fWHERE f.Genere="Fantascienza" AND ((f.Nazionalità="Americana" AND f.AnnoProduzione>2010) OR f.Nazionalità="Francese")5. Il titolo ed il genere dei film proiettati il giorno di Natale 2019
SELECT DISTINCT f.Titolo, f.GenereFROM Film f, Proiezioni pWHERE p.DataProiezione=#25/12/19# AND f.CodFilm=p.CodFilm6. I nomi delle sale di Bolzano in cui il giorno di Natale 2019 è stato proiettato un film con Checco Zalone
SELECT DISTINCT s.NomeFROM Film f, Attori a, Sale s, Proiezioni p, RecitaWHERE p.DataProiezione=#25/12/19# AND s.Città="Bolzano" AND a.Nome="Checco Zalone" AND a.CodAttore=Recita.CodAttore AND Recita.CodFilm=f.CodFilm AND f.CodFilm=p.CodFilm AND p.CodSala=s.CodSala7. Per ogni film in cui recita un attore italiano, il titolo del film e il nome dell'attore
SELECT f.Titolo, a.NomeFROM Film f, Attori a, RecitaWHERE a.CodAttore=Recita.CodAttore AND Recita.CodFilm=f.CodFilm AND a.Nazionalità="Italiana"8. Per ogni film che è stato proiettato a Bolzano nel gennaio 2018, il titolo del film e il nome della sala
SELECT DISTINCT f.Titolo, s.NomeFROM Sale s, Proiezioni p, Film fWHERE f.CodFilm=s.CodFilm AND p.CodSala=s.CodSala AND s.Città = "Bolzano" AND p.DataProiezione BETWEEN #01/01/18# AND #31/01/18#9. Il numero di sale di Bolzano con meno di 100 posti
SELECT count(*)FROM Sale sWHERE s.Città="Bolzano" AND s.Posti<10010. Per ogni città, il numero di sale
SELECT count(*), s.CittàFROM Sale sGROUP BY s.Città11. Per ogni città, il numero di sale con più di 100 posti
SELECT count(*), s.CittàFROM Sale sWHERE s.Posti>100GROUP BY s.Città12. Per ogni regista, l'incasso totale di tutte le proiezioni dei suoi film
SELECT f.Regista, sum(p.Incasso) as IncassoTOTFROM Film f, Proiezioni pWHERE f.CodFilm=p.CodFilmGROUP BY f.Regista13. Per ogni regista e per ogni attore, il numero di film del regista con l'attore
SELECT f.Regista, a.Nome, count(*) as NumeroFilmFROM Attori a, Recita r, Film fWHERE a.CodAttore=r.CodAttore AND rCodFilm=f.CodFilmGROUP BY f.Regista, a.CodAttore, a.Nome14. Il numero di attori dei film in cui appaiono solo attori nati prima del 1980
SELECT f.Titolo, count(*) as NumeroAttoriFROM Attori a, Recita r, Film fWHERE a.CodAttore=r.CodAttore AND r.CodFilm=f.CodFilmGROUP BY f.CodFilm, f.TitoloHAVING max(a.AnnoNascita)<198015. Per ogni film di fantascienza che non è mai stato proiettato prima del 01/01/01 il titolo e l'incasso totale di tutte le sue proiezioni
SELECT f.Titolo, sum(p.Incasso) as IncassoTOTFROM Film f, Proiezioni pWHERE f.Genere="Fantascienza" AND f.CodFilm=p.CodFilmGROUP BY f.CodFilm, f.TitoloHAVING min(p.data)>=#01/01/01#16. Per ogni sala di Bolzano, che nel mese di gennaio 2019 ha incassato più di 25000 €, il nome della sala e l'incasso totale (sempre del mese di gennaio 2019)
SELECT s.Nome, sum(p.Incasso) as IncassoTOTFROM Sala s, Proiezioni pWHERE p.CodSala=s.CodSala AND s.Città="Bolzano" AND p.DataProiezione BETWEEN #01/01/19# AND #31/01/19#GROUP BY s.CodSala, s.NomeHAVING IncassoTOT>2500017. I titoli dei film che non sono mai stati proiettati a Bolzano
SELECT f.TitoloFROM Film f,WHERE not exists (SELECT *FROM Sala s, Proiezioni pWHERE s.Città="Bolzano" AND f.CodFilm=p.CodFilm AND p.CodSala=s.CodSala)18. I titoli dei film che sono stati proiettati solo a Bolzano
SELECT f.TitoloFROM Film f,WHERE not exists (SELECT *FROM Sala s, Proiezioni pWHERE s.Città<>"Bolzano" AND f.CodFilm=p.CodFilm AND p.CodSala=s.CodSala)19. I titoli dei film le cui proiezioni hanno sempre ottenuto un incasso superiore a 500 €
SELECT f.TitoloFROM Film f,WHERE not exists (SELECT *FROM Proiezioni pWHERE p.Incasso<=500 AND f.CodFilm=p.CodFilm