Accesso ai Dati nei Sistemi Relazionali

Documenti analoghi
SELECT s.nome, e.data Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

Basi di Dati: Corso di laboratorio

<Nome Tabella>.<attributo>

Progettazione Logica

Linguaggio SQL seconda parte

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor

SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative

Caratteristiche dei linguaggi per Database

Laura Farinetti - DAUIN Politecnico di Torino. Sia dato lo schema relazionale costituito dalle tabelle (le chiavi primarie sono sottolineate)

Basi di Dati Esempi di SQL

SQL: Structured Query Language. T. Catarci, M. Scannapieco, Corso di Basi di Dati, A.A. 2008/2009, Sapienza Università di Roma

STUDIO. Esercizi proposti a lezione cap. 3 rev. dic da Ulmann, Widom Introduzione ai database. indirizzo. titolo. nome. recitain. attori.

Elena Baralis 2007 Politecnico di Torino 1

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Interrogazioni nidificate

Basi di Dati: Corso di laboratorio

SQL [2] Concetti avanzati di SQL. Esempi di interrogazioni

2- Il titolo dei film di F. Fellini prodotti dopo il SELECT f.titolo FROM Film f WHERE f.regista = Fellini AND f.annoproduzione > 1960

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

SQL. SQL: "storia. Sviluppato nella metà degli anni settanta (1974) presso il laboratorio di ricerca IBM di S.Josè. Dal 1983 ca. "standard di fatto"

D B M G. Linguaggio SQL: fondamenti. Istruzione SELECT: fondamenti. Elena Baralis 2007 Politecnico di Torino 1. Struttura di base

Il linguaggio SQL: raggruppamenti. Versione elettronica: SQLb-gruppi.pdf

Query. Query (Interrogazioni) SQL SQL. Significato dell interrogazione. Sintassi

Interrogazioni nidificate

SQL terza parte D O C E N T E P R O F. A L B E R T O B E L U S S I. Anno accademico 2010/11

Il linguaggio di Interrogazione SQL Esercizi

APPUNTI DELLA LEZIONE DI DATABASE DEL 26/10/2016 Studenti: Marco D'Amato, Adriano Luigi Piscopello Professore: Mario Bochicchio

CORSO ACCESS 2000 PARTE VI

Basi di Dati Esempi di SQL

Alessandra Raffaetà. Esempio: Compagnia di trasporti

Il linguaggio SQL: query innestate

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

Informatica per le Scienze Umane. Introduzione al corso: programma

Informatica per le Scienze Umane. Introduzione al corso: programma dettagliato

BASI DATI: algebra relazionale

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Tipi di sottoquery SQL

Alessandra Raffaetà. Qualificazione: notazione con il punto

Microsoft Access (parte 5) Query. Query. Query. Query. Creare una query

Access. P a r t e t e r z a

1- Il nome di tutte le sale di Pisa SELECT s.nome FROM Sale s WHERE s.città = 'Pisa'

Basi di dati I Prova di autovalutazione 30 ottobre 2014

Basi di dati I 27 gennaio 2016 Esame Compito A Tempo a disposizione: un ora e quarantacinque minuti. Libri chiusi.

Esempi SQL con Access. Orazio Battaglia

Linguaggio SQL. studenti matricola nome cognome citta anno 11 marco bini bologna laura sicuro rimini 1984 esami codice

ESERCITAZIONE 4 Giovedì 13 novembre 2014 (3 ore) SQL

Gestione di basi di dati in Access. SUISM Docente: Ugo de Liguoro a.a Asti

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Esempio di database relazionale con l utilizzo del prodotto MySQL

Eprogram ITIS V anno Unità 4 - Il linguaggio SQL

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione dei numeri relativi

Descrizione delle operazioni di calcolo. Espressioni costanti semplici

Schema Del DB Operazionale TELEFONATE

SELECT FROM ORDER BY SELECT FROM ORDER BY DESC DESC SELECT FROM ORDER BY DESC DESC SELECT FROM WHERE SELECT FROM WHERE AND SELECT FROM WHERE AND

Laboratorio di Programmazione Laurea in Ingegneria Civile e Ambientale

Programmazione in Java (I modulo)

Le variabili logiche possono essere combinate per mezzo di operatori detti connettivi logici. I principali sono:

Elena Baralis 2007 Politecnico di Torino 1

Bibliografia. INFORMATICA GENERALE Prof. Alberto Postiglione. Scienze della Comunicazione Università di Salerno. Definizione di DB e di DBMS

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Query in Access. Criteri, Valori Univoci, Operatori e Colonna Calcolata. Query (Interrogazione)

3. OPERAZIONI TRA CLASSI 2

Algebra di Boole. Andrea Passerini Informatica. Algebra di Boole

MICROSOFT ACCESS IL MODELLO E/R

Join in SQL (primo modo) Informatica. Tabella Dipartimento. Interrogazione 4a. Interrogazione 4b. Interrogazione 4a

Algebra relazionale. Algebra relazionale. Operatori dell algebra relazionale. Operatori dell algebra relazionale. Algebra relazionale.

Viene richiesto di MIN CARD(S,E) = 1 UPDATE DELETE MAX CARD(S,E) = 3 INSERT UPDATE

FUNZIONI BOOLEANE. Vero Falso

ALCUNI CENNI SUGLI INSIEMI

Corso di Laurea in Fisica. Geometria. a.a Canale 3 Prof. P. Piazza Magiche notazioni

B a s i d i D a t i ( M o d u l o T e o r i a ) P r o v a s c r i t t a

Corso di Informatica - prova scritta del 12/02/2008

Maiuscole e minuscole

Basi di Dati - V. Il linguaggio SQL. Il linguaggio SQL. Il linguaggio SQL (cont.) Corso di Laurea in Informatica Anno Accademico 2013/2014

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011

SQL. SQL: una visione panoramica. SQL: "storia" Definizione dei dati

SQL - Sottointerrogazioni

Laura Farinetti - DAUIN Politecnico di Torino. Sia dato lo schema relazionale costituito dalle tabelle (le chiavi primarie sono sottolineate)

1 Esercizi di Matlab. L operatore : permette di estrarre sottomatrici da una matrice assegnata. Vediamo alcuni esempi.

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

Compito Basi di Dati. Tempo concesso: 2 ore 18 Febbraio 2013 Nome: Cognome: Matricola:

INFORMATICA PER LE SCIENZE UMANE a.a. 2015/2016

Precorsi di matematica

SQL (STRUCTURED QUERY LANGUAGE)

! Un arco multiplo corrisponde ad un associazione molti-a-molti: il padre (libro) non determina funzionalmente il figlio (autore)

Cosa si intende con stato

Il modello relazionale

Corso di Basi di Dati A.A. 2015/2016

Laboratorio Informatica

Istruzioni DML di SQL

A B C D E F

Basi di Dati. Corso di Informatica. Memorizzazione dei Dati. Accesso ai Dati. Corso di Laurea in Conservazione e Restauro dei Beni Culturali

Cap. 2 - Rappresentazione in base 2 dei numeri interi

insieme c n ce c r e t r ez e z z a a par a t r ien e e e o no distinguere l uno dall altro insieme degli animali a quattro zampe

LOGICA MATEMATICA PER INFORMATICA (A.A. 12/13)

Dato lo SCHEMA RELAZIONALE:

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Progettazione del Software

MODELLO e RAPPRESENTAZIONE

Formule e funzioni. Fondamenti di informatica. Formule e funzioni. Formule e funzioni - errori. Formule e funzioni - errori

Transcript:

Accesso ai Dati nei Sistemi Relazionali I Sistemi Relazionali offrono in generale due modalità di uso della Base di Dati Uso interattivo Uso da programmi R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 1 Uso interattivo: l utente presenta al sistema una richiesta di dati. Tale richiesta prende il nome di interrogazione (query). L interrogazione viene interpretata dal sistema, che in risposta restituisce i dati richiesti. Nella richiesta devono essere specificate le proprietà dei dati che interessano. Se ad es. vogliamo l elenco dei libri scritti da Calvino, nella richiesta deve essere specificata questa proprietà. L interrogazione deve essere formulata per mezzo di un linguaggio formale R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 2

Uso da programmi: questo uso è riservato ad utenti programmatori. Le interrogazioni fanno parte di un programma applicativo che può essere eseguito dal sistema numerose volte, ed il risultato delle interrogazioni può essere utilizzato dal programma per successive elaborazioni Ci limiteremo a trattare l uso interattivo della BD. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 3 SQL per definire Interrogazioni sulla Base di Dati Le interrogazioni devono essere scritte in un linguaggio formale con caratteristiche tali da renderlo adatto ad esprimere interrogazioni sulla BD, e da essere facilmente interpretato dal sistema. Il linguaggio generalmente usato si chiama SQL (Structured Query Language). R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 4

ESEMPIO Si consideri il seguente schema relazionale Catalogo ( ISBN, Titolo, CasaEd, AnnoEd) Supponiamo che interessi conoscere il titolo e la la casa editrice dei libri pubblicati nel 2001. Occorre: 1. consultare la relazione Catalogo ISBN Titolo CasaEd AnnoEd 883860789-9 Baudolino Mondadori 2002 343859804-5 La storia Einaudi 2001 110786949-3 Bar sport Feltrinelli 2000 477800355-2 L amante Mondadori 2001 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 5 1. considerare solo le ennuple in cui AnnoEd = 2001 ISBN Titolo CasaEd AnnoEd 343859804-5 La storia Einaudi 2001 477800355-2 L amante Mondadori 2001 2. prelevare da queste ennuple i valori degli attributi Titolo e CasaEd Titolo La storia L amante CasaEd Einaudi Mondadori R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 6

Questa sequenza di operazioni viene eseguita dal Sistema di Gestione di Basi di Dati, purché gli venga trasmesso un opportuno comando (interrogazione) nel linguaggio SQL: SELECT Titolo, CasaEd FROM Catalogo WHERE AnnoEd = 2001 ove SELECT, FROM e WHERE sono parole riservate del linguaggio SQL. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 7 Una interrogazione SQL agisce sulle relazioni definite nella base di dati, e restituisce come risultato una relazione. Questa viene in generale visualizzata sul monitor, oppure stampata; può anche essere memorizzata nella base di dati o può essere utilizzata in altre interrogazioni. Nei casi più semplici una interrogazione SQL deve specificare Quali sono le informazioni che interessano In quali relazioni si trovano Quali proprietà devono avere R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 8

Quali sono le informazioni che interessano SELECT Attributo 1,Attributo 2,... è presente in ogni interrogazione e definisce lo schema della relazione risultato. Più avanti vedremo che può avere una forma più complessa. SELECT Titolo, CasaEd significa che ci interessano il titolo e la casa editrice R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 9 In quali relazioni si trovano FROM Relazione 1,Relazione 2,... è presente in ogni interrogazione e specifica quali relazioni occorre visitare per ottenere il risultato. FROM Catalogo significa che per estrarre le informazioni che interessano occorre prendere in esame la relazione Catalogo R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 10

Quali proprietà devono essere soddisfatte WHERE Condizione La condizione è espressa sugli attributi delle relazioni specificate nella clausola FROM. Può non essere presente, quando non si vogliono specificare condizioni. WHERE AnnoEd = 2001 significa che interessano informazioni relative ai libri editi nel 2001. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 11 Abbiamo visto che l interrogazione SELECT Titolo, CasaED FROM Catalogo WHERE AnnoEd = 2001 restituisce la relazione Titolo La storia L amante CasaEd Einaudi Mondadori contenente titolo e casa editrice dei libri editi nel 2001 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 12

Invece l interrogazione SELECT Titolo, CasaED FROM Catalogo restituisce la relazione Titolo Baudolino La storia Bar sport L amante CasaEd Mondadori Einaudi Feltrinelli Mondadori contenente titolo e casa editrice di tutti i libri presenti nel catalogo R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 13 Riepilogando la forma generale di un interrogazione SQL è, nei casi più semplici, la seguente: SELECT Attributo 1,Attributo 2,... FROM Relazione 1,Relazione 2,... WHERE Condizione Le parole in maiuscolo sono parole riservate del linguaggio SQL, sono fisse e specificano le clausole dell interrogazione; la clausola WHERE può mancare Le parole in minuscolo sono variabili, e rappresentano le relazioni, gli attributi, le condizioni che riguardano la specifica interrogazione R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 14

Si consideri la seguente interrogazione SELECT CasaEd FROM Catalogo Il risultato sarà CasaEd Mondadori Einaudi Feltrinelli Mondadori e se una casa editrice è presente nel catalogo con 1000 libri, il suo nome comparirà 1000 volte nel risultato R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 15 Se vogliamo evitare che ciò avvenga, scriveremo SELECT DISTINCT CasaEd FROM Catalogo Che ha come risultato le case editrici presenti nel catalogo, rappresentate una sola volta CasaEd Mondadori Einaudi Feltrinelli R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 16

In generale la specifica DISTINCT nella clausola SELECT elimina i duplicati dal risultato La forma generale di un interrogazione SQL che abbiamo visto fin qui è quindi la seguente: SELECT [DISTINCT] Attributo 1,Attributo 2,... FROM Relazione 1,Relazione 2,... [ WHERE Condizione] dove le parti racchiuse tra parentesi quadre possono mancare R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 17 L uso di * - Nella clausola SELECT si può specificare * in luogo della lista di attributi; in tal caso il risultato contiene tutti gli attributi delle relazioni specificate nella clausola FROM SELECT * FROM Catalogo WHERE CasaEd = Feltrinelli Restituisce come risultato ISBN Titolo CasaEd AnnoEd 110786949-3 Bar sport Feltrinelli 2000 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 18

WHERE Condizione Fin ora abbiamo considerato esempi molto semplici, ma la condizione presente nella clausola WHERE può avere una struttura molto complessa In generale le condizioni sono formate combinando predicati con gli operatori booleani and, or e not. AnnoEd > 1980 and CasaEd = Feltrinelli AnnoEd = 2000 and (CasaEd = Einaudi or CasaEd = Mondadori ) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 19 Predicato: è una condizione semplice del tipo ove: E 1 cfr E 2 cfr è un operatore di confronto, cioè uno degli operatori = < > <= >= <> (diverso) E 1 ed E 2 sono espressioni, che possono essere attributi, costanti oppure espressioni formate con gli usuali operatori aritmetici. Molto spesso E 1 è un attributo. E 2 può essere un comando SELECT R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 20

I predicati hanno valore true (vero) oppure false (falso). Essi possono essere combinati tra loro con gli operatori booleani and or not Gli operatori booleani rispettano le seguenti tabelle di verità: true and true = true true or true = true not true = false true and false = false true or false = true not false = true false and false = false false or false = false R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 21 La condizione presente nella clausola WHERE è ottenuta combinando predicati con gli operatori booleani; anch essa quindi assume valore true oppure false, in accordo con le tabelle di verità. Gli attributi che compaiono nei predicati devono appartenere alle relazioni presenti nella clausola FROM. Più avanti vedremo altre modalità per esprimere le condizioni. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 22

ESEMPI Consideriamo il solito schema di relazione Catalogo ( ISBN, Titolo, CasaEd, AnnoEd) e una sua istanza Catalogo ISBN Titolo CasaEd Anno 883860789-9 Baudolino Mondadori 2002 446830226-7 L amante Feltrinelli 2001 343859804-5 La storia Einaudi 2001 110786949-3 Bar sport Feltrinelli 2000 477800355-2 L amante Mondadori 2001 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 23 SELECT Titolo, CasaEd FROM Catalogo WHERE Anno = 2001 and CasaEd = Einaudi risultato Titolo La storia CasaEd Einaudi R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 24

SELECT Titolo, CasaEd FROM Catalogo WHERE Anno = 2001 or CasaEd = Einaudi risultato Titolo L amante La storia L amante CasaEd Feltrinelli Einaudi Mondadori R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 25 SELECT Titolo, CasaEd FROM Catalogo WHERE Anno = 2000 and CasaEd <> Feltrinelli Risultato Titolo CasaEd Il risultato di un interrogazione, che è sempre una relazione, può essere la relazione vuota; ciò significa, come nell ultimo esempio, che non vi sono dati che soddisfano alla condizione. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 26

SELECT CasaEd, Anno FROM Catalogo WHERE Titolo = Bibbia and Anno = (SELECT max(anno) FROM Catalogo WHERE Titolo = Bibbia ) Viene dapprima calcolata la SELECT tra parentesi, ed il suo risultato viene utilizzato per valutare la condizione; La SELECT esterna restituisce come risultato la CasaEd e L Anno della più recente edizione della Bibbia presente nel Catalogo (naturalmente il Catalogo non è quello dell esempio) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 27 Nell ultimo esempio è stato fatto uso di una struttura detta SOTTOSELECT, o SELECT annidata. Questa ha lo scopo di estrarre dalla BD un valore da utilizzare in una espressione Si osservi che la Sottoselect ha come risultato un singolo valore, altrimenti il confronto non si può effettuare Più avanti vedremo altri predicati per i quali non sussiste più questo vincoli, cioè la Sottoselect può avere come risultato una qualunque relazione. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 28

Interrogazioni su più relazioni Nella clausola FROM possono essere presenti più relazioni. Ciò è necessario quando le informazioni per eseguire l interrogazione sono distribuite su relazioni diverse, vale a dire: quando gli attributi presenti nella clausola SELECT o nella clausola WHERE appartengono a relazioni diverse R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 29 ESEMPIO Si consideri il seguente schema relazionale Film(CodFilm,Titolo,Regista,Anno) Attori(CodFilm*, Attore) e supponiamo di volere i titoli dei film in cui recita C. Eastwood L attributo Titolo è nella relazione Film mentre l attributo Attore è nella relazione Attori. Occorre pertanto visitare entrambe le relazioni. Supponiamo di avere le seguenti istanze di relazione: R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 30

FILM CodFilm Titolo Regista Anno PW54 Million dollar baby C.Eastwood 2004 MX23 Per un pugno di dollari S.Leone 1964 AY78 Eyes wide shut S.Kubrik 1999 ATTORI CodFilm Attore PW54 C. Eastwood MX23 C. Eastwood PW54 H. Swank PW54 M. Freeman MX23 G. M. Volonté AY78 T. Cruise AY78 N. Kidman R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 31 Il SGBD esegue la seguente procedura: 1_ Viene costruita una relazione concatenando le ennuple di Film e di Attori che sono in associazione (tali che CodFilm=CodFilm*) FILM&ATTORI CodF Titolo Regista Anno Attore PW54 Million dollar baby C.Eastwood 2004PW54 C.Eastwood MX23 Per un pugno di dollari S.Leone 1964MX23 C.Eastwood MX23 Per un pugno di dollari S.Leone 1964MX23 G.M.Volonté PW54 Million dollar baby C.Eastwood 2004PW54 H. Swank PW54 Million dollar baby C.Eastwood 2004PW54 M.Freeman AY78 Eyes wide shut S.Kubrik 1999AY78 T.Cruise AY78 Eyes wide shut S.Kubrik 1999AY78 N.Kidman R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 32

2_ Vengono prese in considerazione solo le ennuple in cui l attributo Attore ha valore C.Eastwood. FILM con C.Eastwood CodF Titolo Regista Anno Attore PW54 Million dollar baby C.Eastwood 2004PW54 C.Eastwood MX23 Per un pugno di dollari S.Leone 1964MX23 C.Eastwood 3_ Viene prelevato l attributo Titolo Titolo dei FILM con C.Eastwood Titolo Million dollar baby Per un pugno di dollari R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 33 Questa interrogazione in SQL si scrive: SELECT Titolo FROM Film, Attori WHERE Film.CodFilm = Attori.CodFilm and Attore = C.Eastwood dove Film.CodFilm ed Attori.CodFilm rappresentano il valore di CodFilm nella relazione Film e nella relazione Attori rispettivamente. La condizione Film.CodFilm = Attori.CodFilm serve ad esprimere il collegamento tra le ennuple di Film e quelle di Attori. Solo in questo modo C.Eastwood sarà associato ad un film in cui recita. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 34

Sottolineiamo il fatto che fra le due relazioni deve esistere un collegamento (una chiave esterna in una relazione, chiave primaria nell altra), e che nella clausola WHERE dell interrogazione deve essere esplicitato tale collegamento. Osserviamo che nella clausola FROM può essere presente un qualunque numero di relazioni, purché queste siano collegate tra di loro, e nella clausola WHERE siano specificati tutti i collegamenti. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 35 GIUNZIONE L operazione che associa le ennuple di due relazioni (ad es. le ennuple di Film con quelle di Attori) è detta giunzione, e le condizioni di eguaglianza tra la chiave esterna di una relazione e la chiave primaria di un altra (ad es Film.CodFilm = Attori.CodFilm) è detto predicato di giunzione. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 36

Precisazione sulla notazione Per motivi di chiarezza e per evitare ambiguità, è opportuno specificare, per ogni attributo, la relazione cui appartiene, con la notazione Relazione.Attributo. Pertanto l interogazione precedente diventa SELECT Film.Titolo FROM Film, Attori WHERE Film.CodFilm = Attori.CodFilm and Attori.Attore = C.Eastwood R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 37 Per motivi di brevità è opportuno assegnare nella clausola FROM un nome abbreviato alle relazioni, da utilizzare nelle altre clausole dell interrogazione: SELECT F.Titolo FROM Film F, Attori A WHERE F.CodFilm = A.CodFilm and A.Attore = C.Eastwood R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 38

Una interrogazione può essere complessa anche se la richiesta è molto semplice. Parliamo naturalmente di complessità dal punto di vista dell utente: la complessità per il calcolatore è un altra cosa. ESEMPIO Si consideri lo schema relazionale: R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 39 FILM(CodiceVHS, Titolo, Regista, Anno) ATTORI(Nome, Nazionalità) RECITA(CodiceVHS*, Nome *, Personaggio) CASSETTE(Collocazione, CodiceVHS*, DataNoleg, CodiceCliente*) CLIENTI(CodiceCliente, Cognome, Nome, Indirizzo, Telefono) e si voglia estrarre Cognome e Nome dei Clienti che hanno noleggiato cassette relative a film in cui recitano attori francesi R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 40

Cognome e Nome sono attributi della relazione Clienti. Questa è collegata a Cassette tramite CodiceCliente, Cassette è collegata a Film tramite CodiceVHS, Film è collegato a Recita tramite CodiceVHS, ed infine Recita è collegato con Attori tramite Nome; finalmente in Attori troviamo l attributo Nazionalità, e possiamo quindi verificare la condizione di ricerca. In SQL tale interrogazione è piuttosto fastidiosa da scrivere: R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 41 SELECT Cl.Cognome, Cl.Nome FROM Clienti Cl, Cassette. Ca, Film F, Recita R, Attori A WHERE Cl.CodiceCliente = Ca.CodiceCliente and Ca.CodiceVHS = F.CodiceVHS and F.CodiceVHS = R.CodiceVHS and R.Nome = A.Nome and A.Nazionalità = francese R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 42

Può essere utile, per individuare le relazioni da specificare nella clausola FROM, considerare lo schema E-R rappresentato dallo schema relazionale: da tale schema risulta evidente che per collegare Clienti con Attori occorre attraversare tutte le classi intermedie. Film Contiene Recita Cassette ènoleggiata Attori Clienti R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 43 La clausola ORDER BY La clausola ORDER BY, specificata dopo SELECT- FROM-WHERE fa sì che il risultato sia ordinato; si può scegliere fra ordinamento crescente (se non si specifica nulla), o decrescente (se si specifica desc). L ordinamento può essere fatto anche su più attributi. SELECT Cl.Cognome, Cl.Nome, Ca.DataNoleg FROM Clienti Cl, Cassette Ca WHERE Cl.CodiceCliente = Ca.CodiceCliente and Ca.DataNoleg < 31/03/05 ORDER BY Cl.Cognome, Cl.Nome R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 44

Funzioni di aggregazione SQL consente di estrarre dalla Base di Dati informazioni che non sono esplicitamente presenti, ma si ottengono da quelle presenti utilizzando opportune funzioni dette funzioni di aggregazione. ESEMPIO Studenti (Matricola, Nome, CorsodiLaurea) Esami (Matricola*, CodiceAF*, Voto) AttivitàFormativa(CodiceAF, NomeAF, CFU) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 45 Le funzioni di aggregazione consentono di estrarre dalla BD informazioni quali il numero di esami sostenuti da un determinato studente, il numero di studenti che hanno sostenuto un determinato esame, valori medi, massimi, minimi ecc.? Numero di esami sostenuti dallo studente con Matricola 123 SELECT Count(*) FROM Esami WHERE Matricola=123 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 46

Count(*) indica un conteggio: vengono contate le ennuple (ricordiamo che * indica l intera ennupla) di Esami che soddisfano alla condizione Matricola=123.? Il voto più basso dello studente con Matricola 123 SELECT Min(Voto) FROM Esami WHERE Matricola=123 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 47? Numero di studenti che hanno sostenuto l esame con CodiceAF AA252 SELECT Count(*) FROM Esami E WHERE CodiceAF=AA252 Al risultato di una funzione di aggregazione può essere dato un nome tramite il costrutto as: SELECT Count(*) as Numero_Esami_AA252 FROM Esami E WHERE CodiceMateria=AA252 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 48

? Numero di crediti acquisiti dallo studente con Matricola 123 SELECT Sum(CFU) as Crediti_di_123 FROM Esami E, AttivitàFormative A WHERE E.CodiceAF = A.CodiceAF and E.Matricola=123 Sum(CFU) indica l ordinaria somma aritmetica dei valori (che devono essere numerici) dell attributo CFU Attenzione! La funzione Sum non va confusa con la funzione Count R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 49 Per comprendere quest ultima interrogazione occorre ricordare che con la giunzione specificata dalla condizione E.CodiceAF = A.CodiceAF vengono concatenate le ennuple di Esami con quelle corrispondenti di AttivitàFormative e poi vengono estratte quelle che soddisfano alla condizione E.Matricola = 123. Con la funzione Sum viene poi eseguita la somma dei valori dell attributo CFU di tali ennuple. Consideriamo a seguente istanza della BD R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 50

AttivitàFormative CodAF NomeAF CFU AA252 Basi di.. 5 BB112 Storia... 10 CC205 Letter.. 10 Esami Matric CodAF Voto 123 AA252 30 234 BB112 24 345 AA252 28 123 BB112 27 123 CC205 22 345 BB112 27 La giunzione E.CodiceAF = A.CodiceAF da luogo alla seguente relazione R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 51 AttivitàFormative&Esami CodAF NomeAF CFU Matric CodAF Voto AA252 Basi di.. 5 123 AA252 30 AA252 Basi di.. 5 345 AA252 28 BB112 Storia... 5 234 BB112 24 BB112 Storia... 10 123 BB112 27 BB112 Storia... 10 345 BB112 27 CC205 Letter.. 10 123 CC205 22 La condizione E.Matricola=123 da luogo alla seguente relazione R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 52

AttivitàFormative&Esami di 123 CodAF NomeAF CFU Matric CodAF Voto AA252 Basi di.. 5 123 AA252 30 BB112 Storia... 10 123 BB112 27 CC205 Letter.. 10 123 CC205 22 La funzione Sum esegue la somma dei valori dell attributo CFU e si ottiene il risultato desiderato Crediti_di_123 25 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 53 L uso delle funzioni di aggregazione è limitato al caso in cui il risultato sia costituito da un solo valore; non possono cioè essere presenti allo stesso tempo nella clausola SELECT sia attributi che funzioni di aggregazione. La seguente interrogazione, ad es. è sbagliata (del resto avrebbe poco senso) SELECT Voto, Count(*) FROM Esami WHERE Matricola=123 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 54

Vedremo tra breve un uso più interessante delle funzioni di aggregazione. Le funzioni di aggregazione previste da SQL sono: avg media aritmetica (valori numerici) count numero di valori max valore massimo min valore minimo sum somma (valori numerici) Min e Max, quando sono applicatia valori non numerici, danno rispettivamente il primo e l ultimo valore nell ordine alfabetico. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 55 La clausola GROUP BY Si presenta sovente la necessità di avere informazioni su dati aggregati in base a qualche criterio. Ad es. il numero di esami sostenuti da ciascuno studente, il numero di studenti iscritti a ciascun Corso di Laurea,... SQL offre la possibilità di estrarre tali informazioni con l uso dell operatore GROUP BY. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 56

? Numero di studenti iscritti a ciascun Corso di Laurea SELECT CorsodiLaurea, count(*) as N Studenti FROM Studenti GROUP BY CorsodiLaurea Le ennuple di Studenti vengono raggruppate in base al Valore dell attributo CorsodiLaurea; ciascun gruppo genera una ennupla del risultato: Corso di Laurea, Numero di Studenti del CdL R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 57 Osserviamo che nella clausola Select son presenti sia funzioni di aggregazione che attributi. Ciò è consentito a patto che gli attributi siano presenti nella clausola Group By.? Per ogni studente, la matricola, il nome ed il numero di esami superati SELECT S.Matricola, S.Nome, count(*) as N Esami FROM Studenti S, Esami E WHERE S.Matricola = E.Matricola GROUP BY S.Matricola, S.Nome R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 58

Studenti Matric Nome CdL 123 Silvia SBC 234 Giulia CMT 345 Silvia SBC Vediamo come viene eseguita l interrogazione: Consideriamo la giunzione tra Studenti ed Esami R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 59 Studenti&Esami Matric Nome CdL Matric CodAF Voto 123 Silvia SBC 123 AA252 30 123 Silvia SBC 123 BB112 27 123 Silvia SBC 123 CC205 22 234 Giulia CMT 234 BB112 24 345 Silvia SBC 345 AA252 28 345 Silvia SBC 345 BB112 27 L esecuzione della clausola GROUP BY genera i seguenti gruppi R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 60

gruppo 123 Silvia Matric Nome CdL Matric CodAF Voto 123 Silvia SBC 123 AA252 30 123 Silvia SBC 123 BB112 27 123 Silvia SBC 123 CC205 22 gruppo 234 Giulia Matric Nome CdL Matric CodAF Voto 234 Giulia CMT 234 BB112 24 gruppo 345 Silvia Matric Nome CdL Matric CodAF Voto 345 Silvia SBC 345 AA252 28 345 Silvia SBC 345 BB112 27 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 61 dove sono stati rappresentati con carattere grassetto gli attributi di raggruppamento. Su ciascun gruppo viene poi calcolata la funzione di aggregazione Count(*) e per ciascun gruppo viene generata un ennupla del risultato, con gli attributi specificati nella clausola SELECT: S.Matricola, S.Nome, N Esami, quest ultimo calcolato come valore di count(*) Risultato Matric Nome N Esami 123 Silvia 3 234 Giulia 1 345 Silvia 2 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 62

Si osservi che se non avessimo specificato anche Matricola tra gli attributi di raggruppamento, poiché Nome non è chiave avremomo avuto un risultato errato, in quanto il sistema non avrebbe fatto distinzione tra le due studentesse di nome Silvia SELECT S.Nome, count(*), as N Esami FROM Studenti S, Esami E WHERE S.Matricola = E.Matricola GROUP BY Nome Genera i gruppi R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 63 gruppo Silvia Matric Nome CdL Matric CodAF Voto 123 Silvia SBC 123 AA252 30 123 Silvia SBC 123 BB112 27 123 Silvia SBC 123 CC205 22 345 Silvia SBC 345 AA252 28 345 Silvia SBC 345 BB112 27 gruppo Giulia Matric Nome CdL Matric CodAF Voto 234 Giulia CMT 234 BB112 24 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 64

Risultato Nome N Esami Silvia 5 Giulia 1 Attenzione! Non abusare della GROUP BY, ma utilizzarla solo se necessario. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 65 La clausola HAVING La clausola Having si utilizza solo in connessione con Group BY, e serve a specificare delle condizioni che devono essere soddisfatte dai gruppi.? La matricola ed il Numero di crediti acquisiti da ciascuno studente SELECT E.Matricola, sum(cfu) as N Crediti FROM Esami E, AttivitàFormative A WHERE E.CodiceAF = A.CodiceAF GROUP BY E.Matricola R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 66

? La matricola ed il Numero di crediti acquisiti da ciascuno studente di SBC SELECT E.Matricola, sum(cfu) as N Crediti FROM Studenti S, Esami E, AttivitàFormative A WHERE S.Matricola = E.Matricola and E.CodiceAF = A.CodiceAF and S.CorsodiLaurea = SBC GROUP BY E.Matricola La condizione S.CorsodiLaurea = SBC viene specificata nella clausola WHERE in quanto è espressa su un attributo di Studenti, e riguarda i singoli studenti. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 67 Ma supponiamo di volere:? La matricola ed il Numero di crediti acquisiti da ciascuno studente che non ha voti inferiori a 27. La condizione non ha voti inferiori a 27 è espressa sull attributo Voto della relazione Esami, ma riguarda l insieme degli esami sostenuti da uno studente, cioè riguarda i gruppi; non si può pertanto specificare nella clausola WHERE, ma solo dopo il raggruppamento, con la clausola HAVING R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 68

SELECT E.Matricola, sum(cfu) as N Crediti FROM Esami E, AttivitàFormative A WHERE E.CodiceAF = A.CodiceAF GROUP BY E.Matricola HAVING min(e.voto) > = 27 La condizione min(e.voto) > = 27 viene valutata su ciascun gruppo di esami dello stesso studente. Consideriamo il solito esempio R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 69 AttivitàFormative&Esami CodAF NomeAF CFU Matric CodAF Voto AA252 Basi di.. 5 123 AA252 30 AA252 Basi di.. 5 345 AA252 28 BB112 Storia... 5 234 BB112 24 BB112 Storia... 10 123 BB112 27 BB112 Storia... 10 345 BB112 27 CC205 Letter.. 10 123 CC205 22 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 70

gruppo 123 CodAF NomeAF CFU Matric CodAF Voto AA252 Basi di.. 5 123 AA252 30 BB112 Storia... 10 123 BB112 28 CC205 Letter.. 10 123 CC205 22 gruppo 234 CodAF NomeAF CFU Matric CodAF Voto BB112 Storia... 5 234 BB112 24 gruppo 345 CodAF NomeAF CFU Matric CodAF Voto AA252 Basi di.. 5 345 AA252 28 BB112 Storia... 10 345 BB112 27 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 71 Su ciascun gruppo viene valutata la condizione specificata nella clausola HAVING: solo il gruppo 345 soddisfa a tale condizione, e quindi è l unico che rimane per generare il risultato Risultato Matric N Crediti 345 15 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 72

ALTRI PREDICATI In tutti gli esempi visti sin qui, i predicati presenti nella clausola WHERE sono predicati di confronto: E 1 cfr E 2 Abbiamo anche visto che il secondo termine del confronto può essere costituito da un comando SELECT, purché abbia come risultato un valore singolo. Vedremo adesso altri predicati ed altri operatori che estendono le capacità espressive di SQL R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 73 Per gli esempi si consideri ancora lo schema FILM(CodiceVHS, Titolo, Regista, Anno) ATTORI(Nome, Nazionalità) RECITA(CodiceVHS*, Nome *, Personaggio) CASSETTE(Collocazione, CodiceVHS*, DataNoleg, CodiceCliente*) CLIENTI(CodiceCliente, Cognome, Nome, Indirizzo, Telefono) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 74

A IS NULL, A IS NOT NULL Controlla che l attributo A abbia o non abbia valore nullo? La collocazione delle cassette non noleggiate SELECT Collocazione FROM Cassette WHERE CodiceCliente is null R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 75? La collocazione delle cassette noleggiate dopo il 1/1/05 SELECT Collocazione FROM Cassette WHERE DataNoleg is not null and DataNoleg > 1/1/05 L uso del predicato is [not] null è l unico modo per stabilire se una csassetta è o non è noleggiata. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 76

Nel secondo esempio è necessario controllare che la DataNoleg non sia nulla (cioè la cassetta è noleggiata), altrimenti il predicato DataNoleg > 1/1/05 avrebbe valore indeterminato. Osserviamo che in effetti in SQL un predicato può assumere, oltre ai valori true e false, anche il valore unknown, in quei casi in cui non può essere valutato (attributi con valore nullo, sottoselect con risultato vuoto). Per gestire correttamente queste situazioni si utilizza appunto il predicato is not null, come nell esempio precedente R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 77 A LIKE maschera A NOT LIKE maschera Controlla che il valore dell attributo A sia o non sia conforme alla maschera. maschera è una sequenza qualunque di caratteri che può contenere i caratteri speciali - e % R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 78

Una parola è conforme alla maschera se I caratteri della maschera diversi da e da % coincidono con quelli della parola. Al carattere nella maschera corrisponde un qualunque carattere della parola Al carattere % nella maschera corrisponde una qualunque sequenza, anche vuota, di caratteri nella parola R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 79? CodiceCliente, Cognome e Nome dei Clienti il cui Codice contiene dalla quarta posizione in avanti i caratteri MRC75 SELECT CodiceCliente, Cognome, Nome FROM Clienti WHERE CodF LIKE ---MRC75% ad es. BCEMRC7548, 123MRC75, j23mrc75e6732 sono tutte parole conformi alla maschera ---MRC75% R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 80

A BETWEEN E1 AND E2 A NOT BETWEEN E1 AND E2 Controlla che il valore dell attributo A sia o non sia compreso tra E1 ed E2 Non ha grande interesse; A BETWEEN E1 AND E2 è equivalente a A > = E1 AND A < =E2 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 81 E IN (V1,V2, ) E IN (SOTTOSELECT) E NOT IN (V1, V2,...) E NOT IN (SOTTOSELECT) Controlla che il valore di E sia o non sia presente nella lista di valori V1,V2,...oppure nel risultato della SOTTOSELECT E IN (V1,V2, ) è equivalente a E=V1 or E=V2 or R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 82

Più interessante l uso di NOT IN con una Sottoselect:? Il CodiceVHS dei film in cui NON recitano attori francesi. SELECT R.CodiceVHS FROM Recita R WHERE Francia not in (SELECT Nazionalità FROM Attori A WHERE A.Nome = R.Nome) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 83 Osserviamo che l interrogazione :? Il CodiceVHS dei film in cui recitano attori francesi. può essere formulata in modo analogo SELECT R.CodiceVHS FROM Recita R WHERE Francia in (SELECT Nazionalità FROM Attori A WHERE A.Nome = R.Nome) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 84

ma è più semplice, sia per l utente che per il sistema, la seguente formulazione, che fa uso della giunzione evitando la sottoselect. SELECT R.CodiceVHS FROM Recita R, Attori A WHERE A.Nazionalità = Francia and A.Nome = R.Nome R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 85 EXISTS (SOTTOSELECT) Restituisce il valore true se il risultato della sottoselect non è vuoto NOT EXISTS (SOTTOSELECT) Restituisce il valore true se lil risultato della sottoselect è vuoto È più utile nella forma negata R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 86

? Il CodiceVHS dei film in cui NON recitano attori francesi. SELECT R.CodiceVHS FROM Recita R WHERE not exists (SELECT * FROM Attori A WHERE A.Nome = R.Nome and A.Nazionalità = Francia ) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 87 Osserviamo che, come nel caso precedente, l interrogazione :? Il CodiceVHS dei film in cui recitano attori francesi. può essere formulata in modo analogo SELECT R.CodiceVHS FROM Recita R WHERE exists (SELECT * FROM Attori A WHERE A.Nome = R.Nome and A.Nazionalità = Francia ) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 88

Quantificazione delle interrogazioni Questi ultimi esempi si prestano ad alcune riflessioni sulla natura delle interrogazioni Consideriamo le seguenti interrogazioni a) I film in cui recitano attori francesi b) I film in cui recitano solo attori francesi c) I film in cui non recitano attori francesi R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 89 L interrogazione a) si dice esistenziale. Un film appartiene al risultato se esiste almeno un attore francese che vi recita, e non importa se ci sono altri attori di altre nazionalità In SQL si esprime con una SELECT FROM WHERE senza necessità di sottoselect Le interrogazioni b) e c) si dicono universali Un film appartiene al risultato se tutti i gli attori che vi recitano sono francesi (interr b)) o se nessuno è francese (interr. c)). Per esprimerle in SQL è necessario far ricorso alla sottoselect R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 90

Consideriamo un altro esempio d) Matricola e Nome degli studenti che hanno voti inferiori a 27 Si tratta di una interrogazione esistenziale, basta che esista un voto dello studente inferiore a 27 SELECT DISTINCT S.Matricola, S.Nome FROM Studenti S, Esami E WHERE S.Matricola = E.Matricola and Voto < 27 Consideriamo la solita istanza della BD R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 91 Studenti Matric Nome CdL 123 Silvia SBC 234 Giulia CMT 345 Silvia SBC Risultato d) Matric Nome CdL 123 Silvia SBC 234 Giulia CMT Esami Matric CodAF Voto 123 AA252 30 234 BB112 24 345 AA252 28 123 BB112 27 123 CC205 22 345 BB112 27 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 92

e) Matricola e Nome degli studenti che non hanno voti inferiori a 27 Si tratta di una interrogazione universale e1) SELECT S.Matricola, S.Nome FROM Studenti S WHERE not exists (SELECT * FROM Esami E WHERE S.Matricola = E.Matricola and Voto < 27) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 93 Risultato e1) Matric Nome 345 Silvia Se avessimo scritto, per voler fare a meno della sottoselect e2) SELECT DISTINCT S.Matricola, S.Nome FROM Studenti S, Esami E WHERE S.Matricola = E.Matricola and not(voto < 27) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 94

avremmo avuto Risultato e2) Matric Nome 345 Silvia 123 Silvia in quanto 123 Silvia ha voti superiori a 27, ma poiché ha anche voti inferiori a 27 non soddisfa alla condizione espressa nella e). Osserviamo che la interrogazione e1) restituisce anche gli studenti che non hanno dato alcun esame. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 95 f) Matricola e Nome degli studenti che hanno tutti i voti inferiori a 27 Si tratta anche questa di una interrogazione universale SELECT S.Matricola, S.Nome FROM Studenti WHERE not exists (SELECT * FROM Esami E WHERE S.Matricola = E.Matricola and Voto > = 27) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 96

è identica alla e), basta negare la condizione. (voto > = 27 è equivalente a not(voto < 27))- In altre parole, prima di scrivere in SQL la Matricola e Nome degli studenti che hanno tutti i voti inferiori a 27 l abbiamo trasformata nella forma equivalente Matricola e Nome degli studenti che non hanno voti maggiuori o eguali a 27 R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 97 In altre parole ancora, abbiamo trasformato la condizione Ogni voto è inferiore a 27 nella forma equivalente Non esistono voti maggiori o eguali a 27. Questa tecnica consente di esprimere qualunque interrogazione universale con la struttura R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 98

SELECT Attributi FROM Relazioni1 WHERE not exists ( SELECT * FROM Relazioni2 WHERE.) Relazioni1 hanno gli attributi del risultato, Relazioni2 hanno gli attributi della condizione. Nella clausola Where interna deve esser presente anche la condizione di giunzione fra Relazioni2 e Relazioni1. Chiariremo questo discorso con altri esempi. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 99 Atri Predicati SQL offre altri predicati, in realtà ridondanti perché non aggiungono capacità di calcolo ma solo espressività. E cfr ALL (SOTTOSELECT) E cfr ANY (SOTTOSELECT) ove come al solito E è un espressione e cfr rappresenta un operatore di confronto. In questo modo si ha la possibilità di confrontare il valore di un espressione con un insieme di valori ottenuti come risultato di una sottoselect. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 100

E cfr ALL (SOTTOSELECT) ha valore true se l espressione sta nella relazione specificata con tutti gli elementi appartenenti al risultato della sottoselect E cfr ANY (SOTTOSELECT) ha valore true se l espressione sta nella relazione specificata con almeno uno degli elementi appartenenti al risultato della sottoselect Possono essere utili per esprimere interrogazioni universali. R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 101 SELECT S.Matricola, S.Nome FROM Studenti WHERE 27 > = all (SELECT E.Voto FROM Esami E WHERE S.Matricola = E.Matricola ) Restituisce Matricola e Nome degli studenti che hanno tutti i voti inferiori a 27; è un altro modo di formulare la f) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 102

SELECT S.Matricola, S.Nome FROM Studenti WHERE 27 > = any (SELECT E.Voto FROM Esami E WHERE S.Matricola = E.Matricola ) Restituisce Matricola e Nome degli studenti che hanno almeno un voto inferiore a 27; è un altro modo d formulare la d), ma si raccomanda di non utilizzarlo R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 103 Per concludere, ribadiamo che è necessario distinguere tra Interrogazione esistenziale: si esprime in SQL con una interrogazione di giunzione (senza sottoselect) e interrogazione universale: si esprime in SQL con predicati not in, not exists, cfr all seguiti da una sottoselect. Osserviamo che, nel caso di interrogazioni universale talvolta risulta più semplice formularla in forma negata, e poi esprimerla in SQL con il predicato not exists R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 104

ESEMPI Riprendiamo lo schema FILM(CodiceVHS, Titolo, Regista, Anno) ATTORI(Nome, Nazionalità) RECITA(CodiceVHS*, Nome *, Personaggio) consideriamo le seguenti interrogazioni R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 105 A. Gli attori italiani che hanno recitato nei film di Fellini B. Gli attori italiani che hanno recitato solo nei film di Fellini C. Per ogni attore, l anno di produzione del primo film di Fellini in cui ha recitato R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 106

A. Gli attori italiani che hanno recitato nei film di Fellini Si tratta di una interrogazione esistenziale: SELECT A.Nome FROM Attori A, Recita R, Film F WHERE A.Nome = R.Nome and R.CodiceVHS = F.CodiceVHS and F.Regista = Fellini R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 107 B Gli attori italiani che hanno recitato solo nei film di Fellini Si tratta di una interrogazione universale: SELECT A.Nome FROM Attori A WHERE Fellini = all (SELECT F.Regista FROM Film F, Recita R WHERE A.Nome = R.Nome and R.CodiceVHS = F.CodiceVHS) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 108

B Gli attori italiani che non hanno recito in film con regista diverso da Fellini SELECT A.Nome FROM Attori A WHERE not exists (SELECT * FROM Film F, Recita R WHERE A.Nome = R.Nome and R.CodiceVHS = F.CodiceVHS and F.Regista < > Fellini ) R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 109 C. Per ogni attore, l anno di produzione del primo film di Fellini in cui ha recitato Questa è un interrogazione esistenziale, che però richiede un raggruppamento SELECT A.Nome, min(f.anno) as AnnoPrimoFilm FROM Attori A, Recita R, Film F WHERE A.Nome = R.Nome and R.CodiceVHS = F.CodiceVHS and F.Regista = Fellini GROUP BY A.Nome R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 110

Se qualcuno si sente particolarmente bravo, scriva in SQL la seguente interrogazione A. Gli attori italiani che hanno recitato in tutti i film di Fellini R.Gori - G.Leoni Il linguaggio per interrogazioni SQL 111