1 SQL, Definizione e interrogazione di basi di dati Capitolo 4: SQL ( SQL ( Slides Slides da da Atzeni Atzeni , Ceri, , Ceri, Paraboschi, Paraboschi, Torlonee Torlonee , Basi di dati , Basi di dati McGraw McGraw- Hill Hill , 2002) , 2002) SQL, Definizione e interrogazione di basi di dati 2 04/01/2010 SQL Structured Query Language è un linguaggio con varie funzionalità: contiene sia il DDL che il DML ne esistono varie versioni vediamo gli aspetti essenziali, non i dettagli
54
Embed
18-SQL Definizione e interrogazione 06 - sara.unisalento.itsara.unisalento.it/~mirto/beniculturali/page3/files/18-SQL... · SQL, Definizione e interrogazione di basi di dati Capitolo
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
SQL, Definizione e interrogazione di basi di dati
Capitolo 4: SQL (SQL (SlidesSlides da da AtzeniAtzeni, Ceri, , Ceri, Paraboschi, Paraboschi, TorloneeTorlonee, Basi di dati, Basi di datiMcGrawMcGraw--HillHill, 2002), 2002)
SQL, Definizione e interrogazione di basi di dati 204/01/2010
SQL
Structured Query Languageè un linguaggio con varie funzionalità:
contiene sia il DDL che il DMLne esistono varie versioni vediamo gli aspetti essenziali, non idettagli
2
SQL, Definizione e interrogazione di basi di dati 304/01/2010
Breve storia dell‘SQLSQL: Structured Query LanguageSQL sviluppato alla IBM nel 1973
Dal 1983 standard de factoPrimo standard nel 1986 rivisto nel 1989 (SQL-89)Secondo standard nel 1992 (SQL-2 o SQL-92)Terzo standard nel 1999 (SQL-3 o SQL-99)
Quasi tutti i DBMS commerciali adottano lo standard SQL piu’ estensioni proprie (non-standard)Alcuni sistemi commerciali
Oracle, Informix, Sybase, DB2, SQL-Server, etc.Alcuni sistemi open-source:
MySQL, PostgresEsistono sistemi commerciali che utilizzano interfacce tipo QBE (Query byExample): ACCESS
Tuttavia hanno sistemi per la traduzione automatica in SQL
SQL, Definizione e interrogazione di basi di dati 404/01/2010
Definizione dei dati in SQL
Istruzione CREATE TABLE:definisce uno schema di relazione e ne crea un’istanza vuotaspecifica attributi, domini e vincoli
3
SQL, Definizione e interrogazione di basi di dati 504/01/2010
CREATE TABLE, esempio
CREATE TABLE Impiegato(Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15),Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES
Dipartimento(NomeDip), UNIQUE (Cognome,Nome)
)
SQL, Definizione e interrogazione di basi di dati 604/01/2010
Domini
Domini elementari (predefiniti)Domini definiti dall'utente (semplici, ma riutilizzabili)
4
SQL, Definizione e interrogazione di basi di dati 704/01/2010
Domini elementari
Carattere: singoli caratteri o stringhe, anche di lunghezza variabile Bit: singoli booleani o stringheNumerici, esatti e approssimatiData, oraSistemi diversi estendono il set di base con domini non standard (vettori, periodi, ecc.)
SQL, Definizione e interrogazione di basi di dati 804/01/2010
Definizione di domini
Istruzione CREATE DOMAIN:definisce un dominio (semplice), utilizzabile indefinizioni di relazioni, anche con vincoli evalori di default
5
SQL, Definizione e interrogazione di basi di dati 904/01/2010
CREATE DOMAIN, esempio
CREATE DOMAIN Voto AS SMALLINT DEFAULT NULLCHECK ( value >=18 AND value <= 30 )
SQL, Definizione e interrogazione di basi di dati 1004/01/2010
Vincoli intrarelazionali
NOT NULLUNIQUE definisce chiaviPRIMARY KEY: chiave primaria (una sola,implica NOT NULL)CHECK, vedremo più avanti
6
SQL, Definizione e interrogazione di basi di dati 1104/01/2010
UNIQUE e PRIMARY KEY
due forme:nella definizione di un attributo, se forma da solo la chiavecome elemento separato
SQL, Definizione e interrogazione di basi di dati 1204/01/2010
CREATE TABLE, esempio
CREATE TABLE Impiegato(Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15),Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES
Dipartimento(NomeDip), UNIQUE (Cognome,Nome)
)
7
SQL, Definizione e interrogazione di basi di dati 1304/01/2010
Matricola CHAR(6) PRIMARY KEY
Matricola CHAR(6),…,PRIMARY KEY (Matricola)
PRIMARY KEY, alternative
SQL, Definizione e interrogazione di basi di dati 1404/01/2010
CREATE TABLE, esempio
CREATE TABLE Impiegato(Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL,Dipart CHAR(15),Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES
Dipartimento(NomeDip), UNIQUE (Cognome,Nome)
)
8
SQL, Definizione e interrogazione di basi di dati 1504/01/2010
Chiavi su più attributi, attenzione
Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, UNIQUE (Cognome,Nome),
Nome CHAR(20) NOT NULL UNIQUE, Cognome CHAR(20) NOT NULL UNIQUE,
Non è la stessa cosa!
SQL, Definizione e interrogazione di basi di dati 1604/01/2010
Vincoli interrelazionali
CHECK, vedremo più avantiREFERENCES e FOREIGN KEY permettono didefinire vincoli di integrità referenzialedi nuovo due sintassi
per singoli attributisu più attributi
E' possibile definire politiche di reazione allaviolazione
9
SQL, Definizione e interrogazione di basi di dati 1704/01/2010
Matricola398732959345
Vigili CognomeRossiNeriNeri
NomeLucaPieroMario
Mori Gino7543
InfrazioniCodice34321
733216452153524
Data1/2/954/3/955/4/965/2/98
Vigile3987329532959345
Prov NumeroMITOPRPR
39548KE39548839548839548
SQL, Definizione e interrogazione di basi di dati 1804/01/2010
InfrazioniCodice34321
733216452153524
Data1/2/954/3/955/4/965/2/98
Vigile3987329532959345
Prov NumeroMITOPRPR
39548KE39548839548839548
Auto Prov NumeroMITOPR
39548KE39548839548
CognomeRossiRossiNeri
NomeMarioMarioLuca
10
SQL, Definizione e interrogazione di basi di dati 1904/01/2010
CREATE TABLE, esempio
CREATE TABLE Infrazioni(Codice CHAR(6) NOT NULL PRIMARY KEY, Data DATE NOT NULL, Vigile INTEGER NOT NULL
REFERENCES Vigili(Matricola),Provincia CHAR(2), Numero CHAR(6) ,FOREIGN KEY(Provincia, Numero)
REFERENCES Auto(Provincia, Numero))
SQL, Definizione e interrogazione di basi di dati 2004/01/2010
Modifiche degli schemi
ALTER DOMAINALTER TABLEDROP DOMAINDROP TABLE...
11
SQL, Definizione e interrogazione di basi di dati 2104/01/2010
Definizione degli indici
è rilevante dal punto di vista delle prestazionima è a livello fisico e non logicoin passato era importante perché in alcuni sistemi era l'unico mezzo per definire chiaviCREATE INDEX
SQL, Definizione e interrogazione di basi di dati 2204/01/2010
SQL, operazioni sui dati
interrogazione: SELECT
modifica:INSERT, DELETE, UPDATE
12
SQL, Definizione e interrogazione di basi di dati 2304/01/2010
Istruzione SELECT per l’interrogazione
SELECT ListaAttributiFROM ListaTabelle[ WHERE Condizione ]
"target list"clausola FROMclausola WHERE
SQL, Definizione e interrogazione di basi di dati 2404/01/2010
Capacità del comando SELECT
SelezioneSelezione ProiezioneProiezione
TabellaTabella 11 TabellaTabella 22
TabellaTabella 11 TabellaTabella 11JoinJoin
13
SQL, Definizione e interrogazione di basi di dati 2504/01/2010
SELECT
SELECT ListaAttributiFROM ListaTabelle[ WHERE Condizione ]La query1. considera il prodotto cartesiano tra le tabelle in ListaTabelle2. fra queste seleziona solo le righe che soddisfano la Condizione3. e infine valuta le espressioni specificate nella target list
ListaAttributiLa SELECT implementa gli operatori RidenominazioneProiezione, Selezione e Join dell’algebra relazionale
Piu’ altro che vedremo piu’ avanti
SQL, Definizione e interrogazione di basi di dati 2604/01/2010
Convenzione scrittura comandi SQL
I comandi SQL non sono “case sensitive”Possono essere distribuiti in una o più righe terminate da un separatoreClausole diverse sono usualmente inserite in linee separatePer convenzione si usa scrivere i costrutti SQL in maiuscolo
SQL, Definizione e interrogazione di basi di dati 2704/01/2010
Nome EtàPersone
RedditoAndrea 27
Maria 55Anna 50
Filippo 26Luigi 50
Franco 60Olga 30
Sergio 85Luisa 75
Aldo 2521
4235304020413587
15
MadreMaternità FiglioLuisa
AnnaAnnaMariaMaria
LuisaMaria
OlgaFilippoAndrea
Aldo
Luigi
PadrePaternità Figlio
LuigiLuigi
FrancoFranco
SergioOlga
FilippoAndrea
Aldo
Franco
Database di esempio
SQL, Definizione e interrogazione di basi di dati 2804/01/2010
Esempio query
Nome e reddito delle persone con meno di trenta anni
πNome, Reddito(σEta<30(Persone))
SELECT nome, redditoFROM personeWHERE eta < 30
30Filippo15Aldo21AndreaRedditoNome
15
SQL, Definizione e interrogazione di basi di dati 2904/01/2010
Espressioni aritmetiche nella target list
Creare espressioni attraverso l’uso dei soliti operatori aritmetici: +, -, *, /Le priorita’ sono quelle standardPossono essere alterate con l’uso delle parentesi
SQL, Definizione e interrogazione di basi di dati 3004/01/2010
Uso degli operatori AritmeticiSQL> SELECT ename, sal, sal+300
PredicatoEspr op (Espr | “(“ Sottoselect “)” )op ∈ {=, <>, >, >=, <, <=}SottoSelect deve dare come risultato una tabella con un solo elemento o vuota (vedremo alcuni esempi)
21
SQL, Definizione e interrogazione di basi di dati 4104/01/2010
Uso degli Operatori di Confronto
SQL> SELECT ename, sal, comm2 FROM emp3 WHERE sal<=comm;
ENAME SAL COMM---------- --------- ---------MARTIN 1250 1400
SQL, Definizione e interrogazione di basi di dati 4204/01/2010
Altri Operatori di Confronto
Operatore
BETWEEN...AND...
IN(list)
LIKE
IS NULL
Significato
compreso tra due valori
Corrisp. ad uno dei valori nella lista
Operatore di pattern matching
Valore nullo
22
SQL, Definizione e interrogazione di basi di dati 4304/01/2010
SELECT paternita.figlio, padre, madreFROM maternita LEFT OUTER JOIN paternita
ON maternita.figlio = paternita.figlio
SELECT paternita.figlio, padre, madreFROM maternita FULL OUTER JOIN paternita
ON maternita.figlio = paternita.figlio
SQL, Definizione e interrogazione di basi di dati 6604/01/2010
Ordinamento del risultatoNome e reddito delle persone con meno ditrenta anni in ordine alfabetico
SELECT nome, redditoFROM personeWHERE eta < 30ORDER BY nome
34
SQL, Definizione e interrogazione di basi di dati 6704/01/2010
PersoneNome Reddito
Andrea 21Aldo 15
Filippo 30
PersoneNome Reddito
Andrea 21Aldo 15
Filippo 30
SELECT nome, redditoFROM personeWHERE eta < 30
SELECT nome, redditoFROM personeWHERE eta < 30ORDER BY nome
SQL, Definizione e interrogazione di basi di dati 6804/01/2010
Operatori aggregati
Nelle espressioni della target list possiamoavere anche espressioni che calcolano valori a partire da insiemi di ennupleSQL-2 prevede 5 possibili operatori di aggregamento:
conteggio, minimo, massimo, media, sommaGli operatori di aggregamento NON sono rappresentabili in Algebra Relazionale
35
SQL, Definizione e interrogazione di basi di dati 6904/01/2010
Operatori aggregati: COUNT
• COUNT restituisce il numero di righe o il numero di valori distinti di un particolare attributo
• Esempio: Il numero di figli di Franco:• SELECT count(*) as NumFigliDiFranco
FROM PaternitaWHERE Padre = 'Franco'
l’operatore aggregato (count) viene applicato al risultato dell’interrogazione:
SELECT * FROM PaternitaWHERE Padre = 'Franco'
SQL, Definizione e interrogazione di basi di dati 7004/01/2010
PadrePaternità Figlio
LuigiLuigi
SergioOlga
FilippoFrancoFranco
AndreaAldo
Franco
FrancoFranco
AndreaAldo
NumFigliDiFranco2
36
SQL, Definizione e interrogazione di basi di dati 7104/01/2010
COUNT e valori nulliNumero di tuple
SELECT count(*) FROM personeNumero di volte il campo ‘reddito’ non e’ NULL
SELECT count(reddito) FROM personeNumero di valori distinti del campo ‘reddito’ (senza i NULL)
SELECT count(distinct reddito) FROM persone
Nome EtàPersone RedditoAndrea 27
Maria 55Anna 50
Aldo 2521
2135
NULL
SQL, Definizione e interrogazione di basi di dati 7204/01/2010
Altri operatori aggregati
SUM, AVG, MAX, MINMedia dei redditi di coloro che hanno meno di 30 anni:SELECT avg(reddito) FROM persone WHERE eta < 30
Uso del JOIN: media dei redditi dei figli di Franco:SELECT avg(reddito) FROM persone JOIN paternita ON nome=figlio WHERE padre='Franco‘
Uso di piu’ operatori di aggregamento nella target list:SELECT avg(reddito), min(reddito), max(reddito) FROM persone WHERE eta < 30
37
SQL, Definizione e interrogazione di basi di dati 7304/01/2010
Operatori aggregati e valori nulli
SELECT avg(reddito) AS redditomedioFROM persone
Nome EtàPersone RedditoAndrea 27
Maria 55Anna 50
Aldo 2530
3636
NULL
SQL, Definizione e interrogazione di basi di dati 7404/01/2010
Operatori aggregati e target listun’interrogazione scorretta:
SELECT nome, max(reddito)FROM persone
di chi sarebbe il nome? La target list deve essere omogenea
SELECT min(eta), avg(reddito)FROM persone
38
SQL, Definizione e interrogazione di basi di dati 7504/01/2010
Le funzioni possono essere applicate a partizioni delle relazioniClausola GROUP BY
Syntax: GROUP BY listaAttributiIl numero di figli di ciascun padreSELECT padre, count(*) AS NumFigliFROM paternitaGROUP BY Padre
Operatori aggregati e raggruppamenti
Padrepaternita Figlio
LuigiLuigi
SergioOlga
FilippoFrancoFranco
AndreaAldo
Franco Padre NumFigli
LuigiSergio
2Franco 2
1
SQL, Definizione e interrogazione di basi di dati 7604/01/2010
Esempio GROUP BY
Per ogni dipartimento, restituire la somma degli stipendidi tutti gli impiegati (di quel dipartimento)Relazione: Employee(Name,Dept,Office,Salary,City)
39
SQL, Definizione e interrogazione di basi di dati 7704/01/2010
Semantica degli operatori di raggruppamento (1)
La query e’ innanzitutto eseguita senza operatori aggregati e senza GROUP BY:
SQL, Definizione e interrogazione di basi di dati 7804/01/2010
Semantica degli operatori di raggruppamento (2)
Quindi il risultato e’ diviso in sottoinsiemi aventi gli stessi valori per gli attributi indicati nel GROUP BY (Dept nel nostro caso)Quindi l’operatore di aggregamento e’ calcolato su ogni sottoinsieme:
40
SQL, Definizione e interrogazione di basi di dati 7904/01/2010
Raggruppamenti e target listscorretta
SELECT padre, avg(f.reddito), p.redditoFROM persone f JOIN paternita ON figlio = nome
JOIN persone p ON padre =p.nomeGROUP BY padre
correttaSELECT padre, avg(f.reddito)
FROM persone f JOIN paternita ON figlio = nome JOINpersone p ON padre =p.nome
GROUP BY padre
SQL, Definizione e interrogazione di basi di dati 8004/01/2010
Condizioni sui gruppi, clausola HAVING
Si possono applicare condizioni sul valore aggregato per ogni gruppoEsempio: I dipartimenti la cui somma dei salari e’maggiore di 100
41
SQL, Definizione e interrogazione di basi di dati 8104/01/2010
WHERE o HAVING?
I padri i cui figli sotto i 30 anni hanno un reddito medio maggiore di 25:
SELECT padre, avg(f.reddito)FROM persone f JOIN paternita ON figlio = nomeWHERE eta < 30 GROUP BY padre HAVING avg(f.reddito) > 25
SQL, Definizione e interrogazione di basi di dati 8204/01/2010
Sintassi, riassumiamo
SelectSQL ::= select ListaAttributiOEspressionifrom ListaTabelle[ where CondizioniSemplici ][ group by ListaAttributiDiRaggruppamento ][ having CondizioniAggregate ][ order by ListaAttributiDiOrdinamento ]
42
SQL, Definizione e interrogazione di basi di dati 8304/01/2010
Unione, intersezione e differenza
La SELECT da sola non permette di fare unioni; serve un costrutto esplicito:
SELECT …UNION [all]SELECT ...
i duplicati vengono eliminati (a meno che si usi all)anche dalle proiezioni!
SQL, Definizione e interrogazione di basi di dati 8404/01/2010
Notazione posizionale!SELECT padre FROM paternitaUNIONSELECT madreFROM maternita
quali nomi per gli attributi del risultato?nessuno quelli del primo operando…
43
SQL, Definizione e interrogazione di basi di dati 8504/01/2010
Luisa
AnnaAnnaMariaMaria
LuisaMaria
OlgaFilippoAndrea
Aldo
Luigi
Figlio
LuigiLuigi
FrancoFranco
SergioOlga
FilippoAndrea
Aldo
Franco
Luisa
AnnaAnnaMariaMaria
LuisaMaria
OlgaFilippoAndrea
Aldo
Luigi
Padre Figlio
LuigiLuigi
FrancoFranco
SergioOlga
FilippoAndrea
Aldo
Franco
SQL, Definizione e interrogazione di basi di dati 8604/01/2010
SQL, Definizione e interrogazione di basi di dati 8704/01/2010
Notazione posizionale, 3Anche con le ridenominazioni non cambia niente:
SELECT padre as genitore, figlioFROM paternitaUNIONSELECT figlio, madre as genitoreFROM maternita
Corretta:SELECT padre as genitore, figlioFROM paternitaUNIONSELECT madre as genitore, figlio FROM maternita
SQL, Definizione e interrogazione di basi di dati 8804/01/2010
Differenza
SELECT NomeFROM ImpiegatoEXCEPTSELECT Cognome as NomeFROM Impiegato
vedremo che si può esprimere con SELECT nidificate
45
SQL, Definizione e interrogazione di basi di dati 8904/01/2010
IntersezioneSELECT NomeFROM ImpiegatoINTERSECTSELECT Cognome as NomeFROM Impiegato
equivale a
SELECT I.NomeFROM Impiegato I, Impiegato JWHERE I.Nome = J.Cognome
SQL, Definizione e interrogazione di basi di dati 9004/01/2010
Interrogazioni nidificate
le condizioni in SQL permettono anche il confronto fra un attributo e il risultato di una sottoquery
Syntax:Scalare Operatore (ANY | ALL) SelectQueryANY: il predicato e’ vero se almeno uno dei valori restituiti da Querysoddisfano la condizioneALL: il predicato e’ vero se tutti i valori restituiti dalla Querysoddisfano la condizione
quantificatore esistenzialeEXISTS SelectQueryIl predicato e’ vero se la SelectQuery restituisce almeno una tupla
46
SQL, Definizione e interrogazione di basi di dati 9104/01/2010
Esempio di SELECT nidificatenome e reddito del padre di Franco
SELECT Nome, RedditoFROM Persone, PaternitaWHERE Nome = Padre AND Figlio = 'Franco'
SELECT Nome, RedditoFROM PersoneWHERE Nome = ( SELECT Padre
FROM PaternitaWHERE Figlio = 'Franco')
La query nella clausola WHERE e’ la query nidificata
SQL, Definizione e interrogazione di basi di dati 9204/01/2010
Interrogazioni nidificate, commenti
La forma nidificata è “meno dichiarativa”, ma talvolta più leggibile (richiede meno variabili)La forma piana e quella nidificata possono essere combinateLe sottointerrogazioni non possono contenere operatori insiemistici (“l’unione si fa solo al livello esterno”); la limitazione non è significativa
47
SQL, Definizione e interrogazione di basi di dati 9304/01/2010
Nome e reddito dei padri di persone che guadagnano piùdi 20 milioni
SELECT distinct P.Nome, P.RedditoFROM Persone P, Paternita, Persone FWHERE P.Nome = Padre AND Figlio = F.Nome
AND F.Reddito > 20
SELECT Nome, RedditoFROM PersoneWHERE Nome in (SELECT Padre
FROM PaternitaWHERE Figlio = any (SELECT Nome
FROM PersoneWHERE Reddito > 20))
SQL, Definizione e interrogazione di basi di dati 9404/01/2010
Nome e reddito dei padri di persone che guadagnano piùdi 20 milioni
SELECT distinct P.Nome, P.RedditoFROM Persone P, Paternita, Persone FWHERE P.Nome = Padre AND Figlio = F.Nome
AND F.Reddito > 20
SELECT Nome, RedditoFROM PersoneWHERE Nome in (SELECT Padre
FROM Paternita, Persone WHERE Figlio = NomeAND Reddito > 20)
48
SQL, Definizione e interrogazione di basi di dati 9504/01/2010
Negazione con le query nidificate
Trovare quei dipartimenti dove non c’e’ nessuno che sichiama ‘Brown’:
Oppure:
SQL, Definizione e interrogazione di basi di dati 9604/01/2010
Operatori IN e NOT IN
IN e’ sinonimo di: =ANY
NOT IN e’ sinonimo di: <>ALL
49
SQL, Definizione e interrogazione di basi di dati 9704/01/2010
MAX e MIN con le query nidificate
Esempio: Il dipartimento(i) dove lavora coluicon lo stipendio piu’ alto di tutta l’azienda:
Oppure:
SQL, Definizione e interrogazione di basi di dati 9804/01/2010
Interrogazioni nidificate, commenti, 2
La prima versione di SQL prevedeva solo la forma nidificata (o strutturata), con una sola relazione in ogni clausola FROM. Il che è insoddisfacente:
la dichiaratività è limitatanon si possono includere nella target list attributi di relazioni nei blocchi interni
50
SQL, Definizione e interrogazione di basi di dati 9904/01/2010
Nome e reddito dei padri di persone che guadagnano piùdi 20 milioni, con indicazione del reddito del figlio
SELECT distinct P.Nome, P.Reddito, F.RedditoFROM Persone P, Paternita, Persone FWHERE P.Nome = Padre AND Figlio = F.Nome
AND F.Reddito > 20
SELECT Nome, Reddito, ????FROM PersoneWHERE Nome in (SELECT Padre
FROM PaternitaWHERE Figlio = any (SELECT Nome
FROM PersoneWHERE Reddito > 20))
SQL, Definizione e interrogazione di basi di dati 10004/01/2010
Interrogazioni nidificate, commenti, 3regole di visibilità:
non è possibile fare riferimenti a variabili definite in blocchi più internise un nome di variabile è omesso, si assume riferimento alla variabile più “vicina”
in un blocco si può fare riferimento a variabili definite in blocchi più esterni
51
SQL, Definizione e interrogazione di basi di dati 10104/01/2010
Quantificazione esistenziale
Ulteriore tipo di condizioneEXISTS ( Sottoespressione )
Le persone che hanno almeno un figlio
SELECT *FROM PersoneWHERE EXISTS ( SELECT *
FROM PaternitaWHERE Padre = Nome) OR
EXISTS ( SELECT *FROM MaternitaWHERE Madre = Nome)
SQL, Definizione e interrogazione di basi di dati 10204/01/2010
I padri i cui figli guadagnano tutti più di venti milioni
SELECT distinct PadreFROM Paternita ZWHERE NOT EXISTS (
SQL, Definizione e interrogazione di basi di dati 10304/01/2010
Semantica delle espressioni “correlate”
La query piu’ interna puo’ usare variabili della queryesternaL’interrogazione interna viene eseguita una volta per ciascuna ennupla dell’interrogazione esternaEsempio, trovare tutti gli studenti che hanno un omonimo:
SQL, Definizione e interrogazione di basi di dati 10504/01/2010
Confronto su piu’ attributiIl confronto con il risultato di una query nidificata puo’essere basato su piu’ attributiStessa query di prima, trovare tutti gli studenti che hanno un omonimo:
SELECT *FROM Student SWHERE (Nome, Cognome) IN (SELECT Nome, Cognome
FROM Student S2WHERE S2.Matricola <> S.Matricola)
SQL, Definizione e interrogazione di basi di dati 10604/01/2010
Visibilità
scorretta:SELECT *FROM ImpiegatoWHERE Dipart in (SELECT Nome
FROM Dipartimento D1WHERE Nome = 'Produzione') OR
Dipart in (SELECT NomeFROM Dipartimento D2WHERE D2.Citta = D1.Citta)
D1 non e’ visibile nella seconda query nidificata in quanto le due sottoquery sono allo stesso livello
54
SQL, Definizione e interrogazione di basi di dati 10704/01/2010
Commenti finali sulle query nidificate
Query nidificate possono essere “meno dichiarative” in un certo senso ma spesso sono piu’ facilmenteinterpretabili
Suddivisibili in blocchi piu’ semplici da interpretareL’utilizzo di variabili deve rispettare le regole di visibilita’
Cioe’, una variabile puo’ essere usata solo all’interno dellostesso blocco e in un blocco piu’ interno
Comunque, query nidificate complesse possono esseredi difficile comprensione
Soprattutto quando si usano molte variabili comuni tra blocchidiversi