18-SQL Definizione e interrogazione 06 -...
-
Upload
hoangxuyen -
Category
Documents
-
view
227 -
download
0
Transcript of 18-SQL Definizione e interrogazione 06 -...
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
SELECT Professore, Corsi.CorsoFROM Corsi, Esami, Studenti
WHERE Corsi.Corso = Esami.CorsoAND Esami.Matricola = Studenti.MatricolaAND Nome=‘Teo Verdi’AND Voto > 24
14
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
2 FROM emp;
ENAME SAL exp---------- --------- ---------KING 5000 5300BLAKE 2850 3150CLARK 2450 2750JONES 2975 3275MARTIN 1250 1550ALLEN 1600 1900...14 rows selected.
16
SQL, Definizione e interrogazione di basi di dati 3104/01/2010
Precedenza operatori aritmeticiSQL> SELECT ename, sal, 12*sal+100
2 FROM emp;
ENAME SAL exp---------- --------- ----------KING 5000 60100BLAKE 2850 34300CLARK 2450 29500JONES 2975 35800MARTIN 1250 15100ALLEN 1600 19300...14 rows selected.
SQL, Definizione e interrogazione di basi di dati 3204/01/2010
Uso delle parentesiSQL> SELECT ename, sal, 12*(sal+100)
2 FROM emp;
ENAME SAL exp---------- --------- -----------KING 5000 61200BLAKE 2850 35400CLARK 2450 30600JONES 2975 36900MARTIN 1250 16200...14 rows selected.
17
SQL, Definizione e interrogazione di basi di dati 3304/01/2010
Alias delle colonne
Ridenominare il nome di una colonnaImplementa l’operatore (Ridenominazione) dell’algebra relazionale
L’alias deve seguire immediatamente il nome di una colonna (SENZA VIRGOLA)
può essere usata opzionalmente la parola chiave AS tra il nome della colonna e l’alias
Richiede doppio apice se l’alias ha degli spazi
SQL, Definizione e interrogazione di basi di dati 3404/01/2010
Uso dell’AliasSQL> SELECT ename AS name, sal salary
2 FROM emp;
NAME SALARY
------------- ---------
...
SQL> SELECT ename "Name",2 sal*12 "Annual Salary"3 FROM emp;
Name Annual Salary
------------- -------------
...
18
SQL, Definizione e interrogazione di basi di dati 3504/01/2010
Proiezione, senza selezioneNome e reddito di tutte le persone
πNome, Reddito(Persone)
SELECT nome, redditoFROM persone
SQL, Definizione e interrogazione di basi di dati 3604/01/2010
Selezione, senza proiezione
Uso dello `*` nella target listNome, età e reddito delle persone con meno ditrenta anni
σEta<30(Persone)
SELECT *FROM personeWHERE eta < 30
19
SQL, Definizione e interrogazione di basi di dati 3704/01/2010
Limitare le righe selezionate tramite WHERE
Corrisponde all’operatore (Restrizione) dell’algebra relazionale
La clausola WHERE segue la clausola FROME’ opzionale
SELECT [DISTINCT] {*| colonna [alias], ...}FROM tabella[WHERE condizione(i)];
SQL, Definizione e interrogazione di basi di dati 3804/01/2010
Uso della clausola WHERESQL> SELECT ename, job, deptno
2 FROM emp3 WHERE job='CLERK';
ENAME JOB DEPTNO---------- --------- ---------JAMES CLERK 30SMITH CLERK 20ADAMS CLERK 20MILLER CLERK 10
20
SQL, Definizione e interrogazione di basi di dati 3904/01/2010
Stringhe di caratteri e Date
Stringhe di caratteri e date vanno incluse tra apici.I caratteri sono case sensitive e le date sono format sensitiveSQL> SELECT ename, job, deptno
2 FROM emp3 WHERE ename = 'JAMES';
SQL, Definizione e interrogazione di basi di dati 4004/01/2010
Condizione di WHERE
Condizione : :=Predicato |“(“Condizione”)” |NOT Condizione |Condizione (AND | OR) Condizione
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
Uso dell’operatore BETWEEN
ENAME SAL---------- ---------MARTIN 1250TURNER 1500WARD 1250ADAMS 1100MILLER 1300
SQL> SELECT ename, sal2 FROM emp3 WHERE sal BETWEEN 1000 AND 1500;
Limiteinferiore
Limitesuperiore
BETWEEN consente la selezione di righe con attributi in un particolare range
SQL, Definizione e interrogazione di basi di dati 4404/01/2010
Predicato BETWEEN
Espr1 [NOT] BETWEEN Espr2 AND Espr3
Equivale a [NOT] Espr2 ≤Espr1 AND Espr1≤Espr3
23
SQL, Definizione e interrogazione di basi di dati 4504/01/2010
Uso dell’operatore IN E’ usato per selezionare righe che hanno un attributo che assume valori contenuti in una lista.
SQL> SELECT empno, ename, sal, mgr2 FROM emp3 WHERE mgr IN (7902, 7566, 7788);
EMPNO ENAME SAL MGR--------- ---------- --------- ---------
7902 FORD 3000 75667369 SMITH 800 79027788 SCOTT 3000 75667876 ADAMS 1100 7788
SQL, Definizione e interrogazione di basi di dati 4604/01/2010
Uso dell’operatore LIKE• LIKE è usato per effettuare ricerche wildcard
di una stringa di valori.• Le condizioni di ricerca possono contenere
sia letterali, caratteri o numeri.– % denota zero o più caratteri.– _ denota un carattere.
SQL> SELECT ename2 FROM emp3 WHERE ename LIKE 'S%';
24
SQL, Definizione e interrogazione di basi di dati 4704/01/2010
Uso dell’operatore LIKEIl pattern-matching di caratteri può essere
combinato
I’identificatore ESCAPE (\) deve essere usato per cercare "%" o "_".
SQL> SELECT ename2 FROM emp3 WHERE ename LIKE '_A%';
ENAME----------MARTINJAMES WARD
SQL, Definizione e interrogazione di basi di dati 4804/01/2010
Cognome Filiale EtàMatricola
Neri Milano 455998Rossi Roma 327309
Bruni Milano NULL9553
Impiegati
Neri Milano 455998Bruni Milano NULL9553
σ Età > 40 OR Età IS NULL (Impiegati)
Neri Milano 455998Bruni Milano NULL9553
Gestione dei valori nulli
25
SQL, Definizione e interrogazione di basi di dati 4904/01/2010
Gli impiegati la cui età è o potrebbe essere maggiore di 40
σ Età > 40 OR Età IS NULL (Impiegati)
SELECT *FROM impiegatiWHERE eta > 40 OR eta is null
SQL, Definizione e interrogazione di basi di dati 5004/01/2010
SQL e algebra relazionale
R1(A1,A2) R2(A3,A4)
SELECT R1.A1, R2.A4 FROM R1, R2WHERE R1.A2 = R2.A3
prodotto cartesiano (FROM)selezione (WHERE)proiezione (SELECT)
26
SQL, Definizione e interrogazione di basi di dati 5104/01/2010
SQL e algebra relazionale
R1(A1,A2) R2(A3,A4)
SELECT R1.A1, R2.A4 FROM R1, R2WHERE R1.A2 = R2.A3
πA1,A4 (σA2=A3 (R1 JOIN R2))
SQL, Definizione e interrogazione di basi di dati 5204/01/2010
possono essere necessarie ridenominazioni
nel prodotto cartesianonella target list
SELECT X.A1 AS B1, ...FROM R1 X, R2 Y, R1 ZWHERE X.A2 = Y.A3 AND ...
27
SQL, Definizione e interrogazione di basi di dati 5304/01/2010
SELECT X.A1 AS B1, Y.A4 AS B2FROM R1 X, R2 Y, R1 ZWHERE X.A2 = Y.A3 AND Y.A4 = Z.A1
δ B1,B2←A1,A4 (π A1,A4 (σ A2 = A3 AND A4 = C1(
R1 JOIN R2 JOIN δ C1,C2 ← A1,A2 (R1))))
Self JOIN su R1
SQL, Definizione e interrogazione di basi di dati 5404/01/2010
Cognome Filiale StipendioMatricola
Neri Milano 645998Neri Napoli 557309
Rossi Roma 645698Rossi Roma 449553
cognome e filiale di tutti gli impiegati
π Cognome, Filiale (Impiegati)
28
SQL, Definizione e interrogazione di basi di dati 5504/01/2010
Cognome Filiale
Neri MilanoNeri Napoli
Rossi Roma
Cognome Filiale
Neri MilanoNeri Napoli
Rossi RomaRossi Roma
SELECTcognome, filiale
FROM impiegati
SELECT distinctcognome, filiale
FROM impiegati
SQL, Definizione e interrogazione di basi di dati 5604/01/2010
Nome Età
Persone
Reddito
Andrea 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
29
SQL, Definizione e interrogazione di basi di dati 5704/01/2010
Selezione, proiezione e joinI padri di persone che guadagnano più di 20
πPadre(paternita JOIN Figlio=Nome (σReddito>20 (persone)))SELECT distinct padreFROM persone, paternitaWHERE figlio = nome AND
reddito > 20
SQL, Definizione e interrogazione di basi di dati 5804/01/2010
Join naturale
Padre e madre di ogni persona
paternita JOIN maternita
SELECT paternita.figlio,padre, madreFROM maternita, paternitaWHERE paternita.figlio = maternita.figlio
30
SQL, Definizione e interrogazione di basi di dati 5904/01/2010
Le persone che guadagnano più dei rispettivi padri;mostrare nome, reddito e reddito del padre
πNome, Reddito, RP (σReddito>RP(δNP,EP,RP Nome,Eta,Reddito(persone)
JOIN NP=Padre(paternita JOINFiglio =Nome persone)))
SELECT f.nome, f.reddito, p.redditoFROM persone p, paternita, persone fWHERE p.nome = padre AND
figlio = f.nome ANDf.reddito > p.reddito
Necessita’ di ridenominazione
SQL, Definizione e interrogazione di basi di dati 6004/01/2010
SELECT, con ridenominazionedel risultato
SELECT figlio, f.reddito AS reddito, p.reddito AS redditoPadre
FROM persone p, paternita, persone fWHERE p.nome = padre AND figlio = f.nome
AND f.reddito > p.reddito
SELECT x.figlio, f.reddito AS reddito, p.reddito AS redditoPadre
FROM persone p, paternita x, persone fWHERE p.nome = x.padre AND x.figlio = f.nome
AND f.reddito > p.reddito
O meglio
31
SQL, Definizione e interrogazione di basi di dati 6104/01/2010
Join esplicito (JOIN-ON)Sintassi:
SELECT …FROM Tabella { … JOIN Tabella ON CondDiJoin }, …[ WHERE AltraCondizione ]
Esempio: padre e madre di ogni persona (le due versioni):
SELECT paternita.figlio,padre, madreFROM maternita, paternitaWHERE paternita.figlio = maternita.figlio
SELECT madre, paternita.figlio, padre FROM maternita JOIN paternita ON
paternita.figlio = maternita.figlio
SQL, Definizione e interrogazione di basi di dati 6204/01/2010
Le persone che guadagnano più dei rispettivi padri; mostrare nome,reddito e reddito del padre
SELECT f.nome, f.reddito, p.redditoFROM persone p, paternita, persone fWHERE p.nome = padre AND
figlio = f.nome ANDf.reddito > p.reddito
SELECT f.nome, f.reddito, p.redditoFROM persone p JOIN paternita ON p.nome = padre
JOIN persone f ON figlio = f.nomeWHERE f.reddito > p.reddito
32
SQL, Definizione e interrogazione di basi di dati 6304/01/2010
Ulteriore estensione: join naturale(meno diffuso)
πFiglio,Padre,Madre(paternita JOIN Figlio = Nome δ Nome=Figlio(maternita))
paternita JOIN maternita
SELECT madre, paternita.figlio, padre FROM maternita JOIN paternita ON
paternita.figlio = maternita.figlio
SELECT madre, paternita.figlio, padre FROM maternita natural JOIN paternita
SQL, Definizione e interrogazione di basi di dati 6404/01/2010
Join esterno: "outer join"
Padre e, se nota, madre di ogni persona
SELECT paternita.figlio, padre, madreFROM paternita LEFT JOIN maternita
ON paternita.figlio = maternita.figlio
SELECT paternita.figlio, padre, madreFROM paternita LEFT OUTER JOIN maternita
ON paternita.figlio = maternita.figlio
`outer` e' opzionale
33
SQL, Definizione e interrogazione di basi di dati 6504/01/2010
Outer joinSELECT paternita.figlio, padre, madreFROM maternita JOIN paternita
ON maternita.figlio = paternita.figlio
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
Notazione posizionale, 2
SELECT padre, figlioFROM paternitaUNIONSELECT figlio, madreFROM maternita
SELECT padre, figlioFROM paternitaUNIONSELECT madre, figlioFROM maternita
44
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 (
SELECT *FROM Paternita W, PersoneWHERE W.Padre = Z.Padre
AND W.Figlio = Nome AND Reddito <= 20)
Quantificazione esistenziale, 2
52
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:
SELECT *FROM Student SWHERE EXISTS (SELECT *
FROM Student S2WHERE S2.Nome = S.NomeAND S2.Cognome = S.CognomeAND S2.Matricola <> S.Matricola)
SQL, Definizione e interrogazione di basi di dati 10404/01/2010
Semantica delle espressioni “correlate”, 2
Esempio, trovare tutti gli studenti che NON hanno un omonimo:
SELECT *FROM Student SWHERE NOT EXISTS (SELECT *
FROM Student S2WHERE S2.Nome = S.NomeAND S2.Cognome = S.CognomeAND S2.Matricola <> S.Matricola)
53
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