Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoΠάνθηρας Βλαχόπουλος Modificato 6 anni fa
1
SQL, Definizione e interrogazione di basi di dati
Capitolo 4: SQL (Slides da Atzeni, Ceri, Paraboschi, Torlonee, Basi di dati McGraw-Hill, 2002)
2
SQL, Definizione e interrogazione di basi di dati
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 13/10/2018 SQL, Definizione e interrogazione di basi di dati
3
SQL, Definizione e interrogazione di basi di dati
Breve storia dell‘SQL SQL: Structured Query Language SQL sviluppato alla IBM nel 1973 Dal 1983 standard de facto Primo 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, Postgres Esistono sistemi commerciali che utilizzano interfacce tipo QBE (Query by Example): ACCESS Tuttavia hanno sistemi per la traduzione automatica in SQL 13/10/2018 SQL, Definizione e interrogazione di basi di dati
4
Definizione dei dati in SQL
Istruzione CREATE TABLE: definisce uno schema di relazione e ne crea un’istanza vuota specifica attributi, domini e vincoli 13/10/2018 SQL, Definizione e interrogazione di basi di dati
5
SQL, Definizione e interrogazione di basi di dati
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) ) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
6
SQL, Definizione e interrogazione di basi di dati
Domini Domini elementari (predefiniti) Domini definiti dall'utente (semplici, ma riutilizzabili) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
7
SQL, Definizione e interrogazione di basi di dati
Domini elementari Carattere: singoli caratteri o stringhe, anche di lunghezza variabile Bit: singoli booleani o stringhe Numerici, esatti e approssimati Data, ora Sistemi diversi estendono il set di base con domini non standard (vettori, periodi, ecc.) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
8
SQL, Definizione e interrogazione di basi di dati
Definizione di domini Istruzione CREATE DOMAIN: definisce un dominio (semplice), utilizzabile in definizioni di relazioni, anche con vincoli e valori di default 13/10/2018 SQL, Definizione e interrogazione di basi di dati
9
SQL, Definizione e interrogazione di basi di dati
CREATE DOMAIN, esempio CREATE DOMAIN Voto AS SMALLINT DEFAULT NULL CHECK ( value >=18 AND value <= 30 ) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
10
Vincoli intrarelazionali
NOT NULL UNIQUE definisce chiavi PRIMARY KEY: chiave primaria (una sola, implica NOT NULL) CHECK, vedremo più avanti 13/10/2018 SQL, Definizione e interrogazione di basi di dati
11
SQL, Definizione e interrogazione di basi di dati
UNIQUE e PRIMARY KEY due forme: nella definizione di un attributo, se forma da solo la chiave come elemento separato 13/10/2018 SQL, Definizione e interrogazione di basi di dati
12
SQL, Definizione e interrogazione di basi di dati
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) ) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
13
PRIMARY KEY, alternative
Matricola CHAR(6) PRIMARY KEY Matricola CHAR(6), …, PRIMARY KEY (Matricola) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
14
SQL, Definizione e interrogazione di basi di dati
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) ) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
15
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! 13/10/2018 SQL, Definizione e interrogazione di basi di dati
16
Vincoli interrelazionali
CHECK, vedremo più avanti REFERENCES e FOREIGN KEY permettono di definire vincoli di integrità referenziale di nuovo due sintassi per singoli attributi su più attributi E' possibile definire politiche di reazione alla violazione 13/10/2018 SQL, Definizione e interrogazione di basi di dati
17
SQL, Definizione e interrogazione di basi di dati
Infrazioni Codice 34321 73321 64521 53524 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 9345 Prov Numero MI TO PR 39548K E39548 839548 Matricola 3987 3295 9345 Vigili Cognome Rossi Neri Nome Luca Piero Mario Mori Gino 7543 13/10/2018 SQL, Definizione e interrogazione di basi di dati
18
SQL, Definizione e interrogazione di basi di dati
Infrazioni Codice 34321 73321 64521 53524 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 9345 Prov Numero MI TO PR 39548K E39548 839548 Auto Prov Numero MI TO PR 39548K E39548 839548 Cognome Rossi Neri Nome Mario Luca 13/10/2018 SQL, Definizione e interrogazione di basi di dati
19
SQL, Definizione e interrogazione di basi di dati
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) ) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
20
Modifiche degli schemi
ALTER DOMAIN ALTER TABLE DROP DOMAIN DROP TABLE ... 13/10/2018 SQL, Definizione e interrogazione di basi di dati
21
Definizione degli indici
è rilevante dal punto di vista delle prestazioni ma è a livello fisico e non logico in passato era importante perché in alcuni sistemi era l'unico mezzo per definire chiavi CREATE INDEX 13/10/2018 SQL, Definizione e interrogazione di basi di dati
22
SQL, operazioni sui dati
interrogazione: SELECT modifica: INSERT, DELETE, UPDATE 13/10/2018 SQL, Definizione e interrogazione di basi di dati
23
Istruzione SELECT per l’interrogazione
SELECT ListaAttributi FROM ListaTabelle [ WHERE Condizione ] "target list" clausola FROM clausola WHERE 13/10/2018 SQL, Definizione e interrogazione di basi di dati
24
Capacità del comando SELECT
Selezione Proiezione Tabella 1 Tabella 1 Join Tabella 1 Tabella 2 13/10/2018 SQL, Definizione e interrogazione di basi di dati
25
SQL, Definizione e interrogazione di basi di dati
SELECT SELECT ListaAttributi FROM ListaTabelle [ WHERE Condizione ] La query considera il prodotto cartesiano tra le tabelle in ListaTabelle fra queste seleziona solo le righe che soddisfano la Condizione e infine valuta le espressioni specificate nella target list ListaAttributi La SELECT implementa gli operatori Ridenominazione Proiezione, Selezione e Join dell’algebra relazionale Piu’ altro che vedremo piu’ avanti 13/10/2018 SQL, Definizione e interrogazione di basi di dati
26
Convenzione scrittura comandi SQL
I comandi SQL non sono “case sensitive” Possono essere distribuiti in una o più righe terminate da un separatore Clausole diverse sono usualmente inserite in linee separate Per convenzione si usa scrivere i costrutti SQL in maiuscolo SELECT Professore, Corsi.Corso FROM Corsi, Esami, Studenti WHERE Corsi.Corso = Esami.Corso AND Esami.Matricola = Studenti.Matricola AND Nome=‘Teo Verdi’ AND Voto > 24 13/10/2018 SQL, Definizione e interrogazione di basi di dati
27
SQL, Definizione e interrogazione di basi di dati
Database di esempio Nome Età Persone Reddito Madre Maternità Figlio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Andrea 27 Maria 55 Anna 50 Filippo 26 Luigi Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25 21 42 35 40 20 41 87 15 Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo 13/10/2018 SQL, Definizione e interrogazione di basi di dati
28
Esempio query SELECT nome, reddito FROM persone WHERE eta < 30 Nome
Nome e reddito delle persone con meno di trenta anni πNome, Reddito(σEta<30(Persone)) SELECT nome, reddito FROM persone WHERE eta < 30 Nome Reddito Andrea 21 Aldo 15 Filippo 30 13/10/2018 SQL, Definizione e interrogazione di basi di dati
29
Espressioni aritmetiche nella target list
Creare espressioni attraverso l’uso dei soliti operatori aritmetici: +, -, *, / Le priorita’ sono quelle standard Possono essere alterate con l’uso delle parentesi 13/10/2018 SQL, Definizione e interrogazione di basi di dati
30
Uso degli operatori Aritmetici
SQL> SELECT ename, sal, sal+300 2 FROM emp; ENAME SAL exp KING BLAKE CLARK JONES MARTIN ALLEN ... 14 rows selected. 13/10/2018 SQL, Definizione e interrogazione di basi di dati
31
Precedenza operatori aritmetici
SQL> SELECT ename, sal, 12*sal+100 2 FROM emp; ENAME SAL exp KING BLAKE CLARK JONES MARTIN ALLEN ... 14 rows selected. 13/10/2018 SQL, Definizione e interrogazione di basi di dati
32
SQL, Definizione e interrogazione di basi di dati
Uso delle parentesi SQL> SELECT ename, sal, 12*(sal+100) 2 FROM emp; ENAME SAL exp KING BLAKE CLARK JONES MARTIN ... 14 rows selected. 13/10/2018 SQL, Definizione e interrogazione di basi di dati
33
SQL, Definizione e interrogazione di basi di dati
Alias delle colonne Ridenominare il nome di una colonna Implementa 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 13/10/2018 SQL, Definizione e interrogazione di basi di dati
34
SQL, Definizione e interrogazione di basi di dati
Uso dell’Alias SQL> SELECT ename AS name, sal salary 2 FROM emp; NAME SALARY SQL> SELECT ename "Name", sal*12 "Annual Salary" 3 FROM emp; Name Annual Salary 13/10/2018 SQL, Definizione e interrogazione di basi di dati
35
Proiezione, senza selezione
Nome e reddito di tutte le persone πNome, Reddito(Persone) SELECT nome, reddito FROM persone 13/10/2018 SQL, Definizione e interrogazione di basi di dati
36
Selezione, senza proiezione
Uso dello `*` nella target list Nome, età e reddito delle persone con meno di trenta anni σEta<30(Persone) SELECT * FROM persone WHERE eta < 30 13/10/2018 SQL, Definizione e interrogazione di basi di dati
37
Limitare le righe selezionate tramite WHERE
Corrisponde all’operatore (Restrizione) dell’algebra relazionale La clausola WHERE segue la clausola FROM E’ opzionale SELECT [DISTINCT] {*| colonna [alias], ...} FROM tabella [WHERE condizione(i)]; 13/10/2018 SQL, Definizione e interrogazione di basi di dati
38
Uso della clausola WHERE
SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE job='CLERK'; ENAME JOB DEPTNO JAMES CLERK SMITH CLERK ADAMS CLERK MILLER CLERK 13/10/2018 SQL, Definizione e interrogazione di basi di dati
39
Stringhe di caratteri e Date
Stringhe di caratteri e date vanno incluse tra apici. I caratteri sono case sensitive e le date sono format sensitive SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE ename = 'JAMES'; 13/10/2018 SQL, Definizione e interrogazione di basi di dati
40
SQL, Definizione e interrogazione di basi di dati
Condizione di WHERE Condizione : := Predicato | “(“Condizione”)” | NOT Condizione | Condizione (AND | OR) Condizione Predicato Espr op (Espr | “(“ Sottoselect “)” ) op {=, <>, >, >=, <, <=} SottoSelect deve dare come risultato una tabella con un solo elemento o vuota (vedremo alcuni esempi) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
41
Uso degli Operatori di Confronto
SQL> SELECT ename, sal, comm 2 FROM emp 3 WHERE sal<=comm; ENAME SAL COMM MARTIN 13/10/2018 SQL, Definizione e interrogazione di basi di dati
42
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 13/10/2018 SQL, Definizione e interrogazione di basi di dati
43
Uso dell’operatore BETWEEN
BETWEEN consente la selezione di righe con attributi in un particolare range SQL> SELECT ename, sal 2 FROM emp 3 WHERE sal BETWEEN 1000 AND 1500; Limite inferiore Limite superiore ENAME SAL MARTIN TURNER WARD ADAMS MILLER 13/10/2018 SQL, Definizione e interrogazione di basi di dati
44
SQL, Definizione e interrogazione di basi di dati
Predicato BETWEEN Espr1 [NOT] BETWEEN Espr2 AND Espr3 Equivale a [NOT] Espr2 Espr1 AND Espr1Espr3 13/10/2018 SQL, Definizione e interrogazione di basi di dati
45
SQL, Definizione e interrogazione di basi di dati
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, mgr 2 FROM emp 3 WHERE mgr IN (7902, 7566, 7788); EMPNO ENAME SAL MGR 7902 FORD 7369 SMITH 7788 SCOTT 7876 ADAMS 13/10/2018 SQL, Definizione e interrogazione di basi di dati
46
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 ename 2 FROM emp 3 WHERE ename LIKE 'S%'; 13/10/2018 SQL, Definizione e interrogazione di basi di dati
47
Uso dell’operatore LIKE
Il pattern-matching di caratteri può essere combinato I’identificatore ESCAPE (\) deve essere usato per cercare "%" o "_". SQL> SELECT ename 2 FROM emp 3 WHERE ename LIKE '_A%'; ENAME MARTIN JAMES WARD 13/10/2018 SQL, Definizione e interrogazione di basi di dati
48
Gestione dei valori nulli
Impiegati Cognome Filiale Età Matricola Neri Milano 45 5998 Bruni NULL 9553 Neri Milano 45 5998 Rossi Roma 32 7309 Bruni NULL 9553 Neri Milano 45 5998 Bruni Milano NULL 9553 σ Età > 40 OR Età IS NULL (Impiegati) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
49
σ Età > 40 OR Età IS NULL (Impiegati)
Gli impiegati la cui età è o potrebbe essere maggiore di 40 σ Età > 40 OR Età IS NULL (Impiegati) SELECT * FROM impiegati WHERE eta > 40 OR eta is null 13/10/2018 SQL, Definizione e interrogazione di basi di dati
50
SQL e algebra relazionale
R1(A1,A2) R2(A3,A4) SELECT R1.A1, R2.A4 FROM R1, R2 WHERE R1.A2 = R2.A3 prodotto cartesiano (FROM) selezione (WHERE) proiezione (SELECT) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
51
SQL e algebra relazionale
R1(A1,A2) R2(A3,A4) SELECT R1.A1, R2.A4 FROM R1, R2 WHERE R1.A2 = R2.A3 πA1,A4 (σA2=A3 (R1 JOIN R2)) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
52
SQL, Definizione e interrogazione di basi di dati
possono essere necessarie ridenominazioni nel prodotto cartesiano nella target list SELECT X.A1 AS B1, ... FROM R1 X, R2 Y, R1 Z WHERE X.A2 = Y.A3 AND ... 13/10/2018 SQL, Definizione e interrogazione di basi di dati
53
SQL, Definizione e interrogazione di basi di dati
Self JOIN su R1 SELECT X.A1 AS B1, Y.A4 AS B2 FROM R1 X, R2 Y, R1 Z WHERE X.A2 = Y.A3 AND Y.A4 = Z.A1 δ B1,B2A1,A4 ( π A1,A4 (σ A2 = A3 AND A4 = C1( R1 JOIN R2 JOIN δ C1,C2 A1,A2 (R1)))) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
54
SQL, Definizione e interrogazione di basi di dati
cognome e filiale di tutti gli impiegati Cognome Filiale Stipendio Matricola Neri Milano 64 5998 Napoli 55 7309 Rossi Roma 5698 44 9553 π Cognome, Filiale (Impiegati) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
55
SQL, Definizione e interrogazione di basi di dati
SELECT cognome, filiale FROM impiegati SELECT distinct cognome, filiale FROM impiegati Cognome Filiale Neri Milano Napoli Rossi Roma Cognome Filiale Neri Milano Napoli Rossi Roma 13/10/2018 SQL, Definizione e interrogazione di basi di dati
56
SQL, Definizione e interrogazione di basi di dati
Nome Età Persone Reddito Madre Maternità Figlio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Andrea 27 Maria 55 Anna 50 Filippo 26 Luigi Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25 21 42 35 40 20 41 87 15 Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo 13/10/2018 SQL, Definizione e interrogazione di basi di dati
57
Selezione, proiezione e join
I padri di persone che guadagnano più di 20 πPadre(paternita JOIN Figlio=Nome (σReddito>20 (persone))) SELECT distinct padre FROM persone, paternita WHERE figlio = nome AND reddito > 20 13/10/2018 SQL, Definizione e interrogazione di basi di dati
58
Join naturale Padre e madre di ogni persona paternita JOIN maternita
SELECT paternita.figlio,padre, madre FROM maternita, paternita WHERE paternita.figlio = maternita.figlio 13/10/2018 SQL, Definizione e interrogazione di basi di dati
59
Necessita’ di ridenominazione
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.reddito FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito 13/10/2018 SQL, Definizione e interrogazione di basi di dati
60
SELECT, con ridenominazione del risultato
SELECT figlio, f.reddito AS reddito, p.reddito AS redditoPadre FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito O meglio SELECT x.figlio, f.reddito AS reddito, p.reddito AS redditoPadre FROM persone p, paternita x, persone f WHERE p.nome = x.padre AND x.figlio = f.nome AND f.reddito > p.reddito 13/10/2018 SQL, Definizione e interrogazione di basi di dati
61
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, madre FROM maternita, paternita WHERE paternita.figlio = maternita.figlio SELECT madre, paternita.figlio, padre FROM maternita JOIN paternita ON paternita.figlio = maternita.figlio 13/10/2018 SQL, Definizione e interrogazione di basi di dati
62
SQL, Definizione e interrogazione di basi di dati
Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre SELECT f.nome, f.reddito, p.reddito FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito SELECT f.nome, f.reddito, p.reddito FROM persone p JOIN paternita ON p.nome = padre JOIN persone f ON figlio = f.nome WHERE f.reddito > p.reddito 13/10/2018 SQL, Definizione e interrogazione di basi di dati
63
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 13/10/2018 SQL, Definizione e interrogazione di basi di dati
64
Join esterno: "outer join"
Padre e, se nota, madre di ogni persona SELECT paternita.figlio, padre, madre FROM paternita LEFT JOIN maternita ON paternita.figlio = maternita.figlio SELECT paternita.figlio, padre, madre FROM paternita LEFT OUTER JOIN maternita ON paternita.figlio = maternita.figlio `outer` e' opzionale 13/10/2018 SQL, Definizione e interrogazione di basi di dati
65
SQL, Definizione e interrogazione di basi di dati
Outer join SELECT paternita.figlio, padre, madre FROM maternita JOIN paternita ON maternita.figlio = paternita.figlio FROM maternita LEFT OUTER JOIN paternita FROM maternita FULL OUTER JOIN paternita 13/10/2018 SQL, Definizione e interrogazione di basi di dati
66
Ordinamento del risultato
Nome e reddito delle persone con meno di trenta anni in ordine alfabetico SELECT nome, reddito FROM persone WHERE eta < 30 ORDER BY nome 13/10/2018 SQL, Definizione e interrogazione di basi di dati
67
SQL, Definizione e interrogazione di basi di dati
SELECT nome, reddito FROM persone WHERE eta < 30 ORDER BY nome SELECT nome, reddito FROM persone WHERE eta < 30 Persone Nome Reddito Andrea 21 Aldo 15 Filippo 30 Persone Nome Reddito Andrea 21 Aldo 15 Filippo 30 13/10/2018 SQL, Definizione e interrogazione di basi di dati
68
SQL, Definizione e interrogazione di basi di dati
Operatori aggregati Nelle espressioni della target list possiamo avere anche espressioni che calcolano valori a partire da insiemi di ennuple SQL-2 prevede 5 possibili operatori di aggregamento: conteggio, minimo, massimo, media, somma Gli operatori di aggregamento NON sono rappresentabili in Algebra Relazionale 13/10/2018 SQL, Definizione e interrogazione di basi di dati
69
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 Paternita WHERE Padre = 'Franco' l’operatore aggregato (count) viene applicato al risultato dell’interrogazione: SELECT * 13/10/2018 SQL, Definizione e interrogazione di basi di dati
70
SQL, Definizione e interrogazione di basi di dati
Padre Paternità Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco Andrea Aldo NumFigliDiFranco 2 13/10/2018 SQL, Definizione e interrogazione di basi di dati
71
SQL, Definizione e interrogazione di basi di dati
COUNT e valori nulli Numero di tuple SELECT count(*) FROM persone Numero di volte il campo ‘reddito’ non e’ NULL SELECT count(reddito) FROM persone Numero di valori distinti del campo ‘reddito’ (senza i NULL) SELECT count(distinct reddito) FROM persone Nome Età Persone Reddito Andrea 27 Maria 55 Anna 50 Aldo 25 21 35 NULL 13/10/2018 SQL, Definizione e interrogazione di basi di dati
72
Altri operatori aggregati
SUM, AVG, MAX, MIN Media 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: 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) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
73
Operatori aggregati e valori nulli
SELECT avg(reddito) AS redditomedio FROM persone Nome Età Persone Reddito Andrea 27 Maria 55 Anna 50 Aldo 25 30 36 NULL 13/10/2018 SQL, Definizione e interrogazione di basi di dati
74
Operatori aggregati e target list
un’interrogazione scorretta: SELECT nome, max(reddito) FROM persone di chi sarebbe il nome? La target list deve essere omogenea SELECT min(eta), avg(reddito) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
75
Operatori aggregati e raggruppamenti
Le funzioni possono essere applicate a partizioni delle relazioni Clausola GROUP BY Syntax: GROUP BY listaAttributi Il numero di figli di ciascun padre SELECT padre, count(*) AS NumFigli FROM paternita GROUP BY Padre Padre paternita Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Padre NumFigli Luigi Sergio 2 Franco 1 13/10/2018 SQL, Definizione e interrogazione di basi di dati
76
SQL, Definizione e interrogazione di basi di dati
Esempio GROUP BY Per ogni dipartimento, restituire la somma degli stipendi di tutti gli impiegati (di quel dipartimento) Relazione: Employee(Name,Dept,Office,Salary,City) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
77
Semantica degli operatori di raggruppamento (1)
La query e’ innanzitutto eseguita senza operatori aggregati e senza GROUP BY: 13/10/2018 SQL, Definizione e interrogazione di basi di dati
78
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: 13/10/2018 SQL, Definizione e interrogazione di basi di dati
79
Raggruppamenti e target list
scorretta SELECT padre, avg(f.reddito), p.reddito FROM persone f JOIN paternita ON figlio = nome JOIN persone p ON padre =p.nome GROUP BY padre corretta SELECT padre, avg(f.reddito) FROM persone f JOIN paternita ON figlio = nome JOIN persone p ON padre =p.nome GROUP BY padre 13/10/2018 SQL, Definizione e interrogazione di basi di dati
80
Condizioni sui gruppi, clausola HAVING
Si possono applicare condizioni sul valore aggregato per ogni gruppo Esempio: I dipartimenti la cui somma dei salari e’ maggiore di 100 13/10/2018 SQL, Definizione e interrogazione di basi di dati
81
SQL, Definizione e interrogazione di basi di dati
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 = nome WHERE eta < 30 GROUP BY padre HAVING avg(f.reddito) > 25 13/10/2018 SQL, Definizione e interrogazione di basi di dati
82
SQL, Definizione e interrogazione di basi di dati
Sintassi, riassumiamo SelectSQL ::= select ListaAttributiOEspressioni from ListaTabelle [ where CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ] 13/10/2018 SQL, Definizione e interrogazione di basi di dati
83
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! 13/10/2018 SQL, Definizione e interrogazione di basi di dati
84
Notazione posizionale!
SELECT padre FROM paternita UNION SELECT madre FROM maternita quali nomi per gli attributi del risultato? nessuno quelli del primo operando … 13/10/2018 SQL, Definizione e interrogazione di basi di dati
85
SQL, Definizione e interrogazione di basi di dati
Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Figlio Franco Sergio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Padre Figlio Franco Sergio 13/10/2018 SQL, Definizione e interrogazione di basi di dati
86
Notazione posizionale, 2
SELECT padre, figlio FROM paternita UNION SELECT figlio, madre FROM maternita SELECT padre, figlio FROM paternita UNION SELECT madre, figlio FROM maternita 13/10/2018 SQL, Definizione e interrogazione di basi di dati
87
Notazione posizionale, 3
Anche con le ridenominazioni non cambia niente: SELECT padre as genitore, figlio FROM paternita UNION SELECT figlio, madre as genitore FROM maternita Corretta: SELECT padre as genitore, figlio FROM paternita UNION SELECT madre as genitore, figlio FROM maternita 13/10/2018 SQL, Definizione e interrogazione di basi di dati
88
SQL, Definizione e interrogazione di basi di dati
Differenza SELECT Nome FROM Impiegato EXCEPT SELECT Cognome as Nome FROM Impiegato vedremo che si può esprimere con SELECT nidificate 13/10/2018 SQL, Definizione e interrogazione di basi di dati
89
SQL, Definizione e interrogazione di basi di dati
Intersezione SELECT Nome FROM Impiegato INTERSECT SELECT Cognome as Nome FROM Impiegato equivale a SELECT I.Nome FROM Impiegato I, Impiegato J WHERE I.Nome = J.Cognome 13/10/2018 SQL, Definizione e interrogazione di basi di dati
90
Interrogazioni nidificate
le condizioni in SQL permettono anche il confronto fra un attributo e il risultato di una sottoquery Syntax: Scalare Operatore (ANY | ALL) SelectQuery ANY: il predicato e’ vero se almeno uno dei valori restituiti da Query soddisfano la condizione ALL: il predicato e’ vero se tutti i valori restituiti dalla Query soddisfano la condizione quantificatore esistenziale EXISTS SelectQuery Il predicato e’ vero se la SelectQuery restituisce almeno una tupla 13/10/2018 SQL, Definizione e interrogazione di basi di dati
91
Esempio di SELECT nidificate
nome e reddito del padre di Franco SELECT Nome, Reddito FROM Persone, Paternita WHERE Nome = Padre AND Figlio = 'Franco' SELECT Nome, Reddito FROM Persone WHERE Nome = ( SELECT Padre FROM Paternita WHERE Figlio = 'Franco') La query nella clausola WHERE e’ la query nidificata 13/10/2018 SQL, Definizione e interrogazione di basi di dati
92
Interrogazioni nidificate, commenti
La forma nidificata è “meno dichiarativa”, ma talvolta più leggibile (richiede meno variabili) La forma piana e quella nidificata possono essere combinate Le sottointerrogazioni non possono contenere operatori insiemistici (“l’unione si fa solo al livello esterno”); la limitazione non è significativa 13/10/2018 SQL, Definizione e interrogazione di basi di dati
93
SQL, Definizione e interrogazione di basi di dati
Nome e reddito dei padri di persone che guadagnano più di 20 milioni SELECT distinct P.Nome, P.Reddito FROM Persone P, Paternita, Persone F WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20 SELECT Nome, Reddito FROM Persone WHERE Nome in (SELECT Padre FROM Paternita WHERE Figlio = any (SELECT Nome FROM Persone WHERE Reddito > 20)) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
94
SQL, Definizione e interrogazione di basi di dati
Nome e reddito dei padri di persone che guadagnano più di 20 milioni SELECT distinct P.Nome, P.Reddito FROM Persone P, Paternita, Persone F WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20 SELECT Nome, Reddito FROM Persone WHERE Nome in (SELECT Padre FROM Paternita, Persone WHERE Figlio = Nome AND Reddito > 20) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
95
Negazione con le query nidificate
Trovare quei dipartimenti dove non c’e’ nessuno che si chiama ‘Brown’: Oppure: 13/10/2018 SQL, Definizione e interrogazione di basi di dati
96
SQL, Definizione e interrogazione di basi di dati
Operatori IN e NOT IN IN e’ sinonimo di: =ANY NOT IN e’ sinonimo di: <>ALL 13/10/2018 SQL, Definizione e interrogazione di basi di dati
97
MAX e MIN con le query nidificate
Esempio: Il dipartimento(i) dove lavora colui con lo stipendio piu’ alto di tutta l’azienda: Oppure: 13/10/2018 SQL, Definizione e interrogazione di basi di dati
98
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à è limitata non si possono includere nella target list attributi di relazioni nei blocchi interni 13/10/2018 SQL, Definizione e interrogazione di basi di dati
99
SQL, Definizione e interrogazione di basi di dati
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.Reddito FROM Persone P, Paternita, Persone F WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20 SELECT Nome, Reddito, ???? FROM Persone WHERE Nome in (SELECT Padre FROM Paternita WHERE Figlio = any (SELECT Nome FROM Persone WHERE Reddito > 20)) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
100
Interrogazioni nidificate, commenti, 3
regole di visibilità: non è possibile fare riferimenti a variabili definite in blocchi più interni se 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 13/10/2018 SQL, Definizione e interrogazione di basi di dati
101
Quantificazione esistenziale
Ulteriore tipo di condizione EXISTS ( Sottoespressione ) Le persone che hanno almeno un figlio SELECT * FROM Persone WHERE EXISTS ( SELECT * FROM Paternita WHERE Padre = Nome) OR EXISTS ( SELECT * FROM Maternita WHERE Madre = Nome) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
102
Quantificazione esistenziale, 2
I padri i cui figli guadagnano tutti più di venti milioni SELECT distinct Padre FROM Paternita Z WHERE NOT EXISTS ( SELECT * FROM Paternita W, Persone WHERE W.Padre = Z.Padre AND W.Figlio = Nome AND Reddito <= 20) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
103
Semantica delle espressioni “correlate”
La query piu’ interna puo’ usare variabili della query esterna L’interrogazione interna viene eseguita una volta per ciascuna ennupla dell’interrogazione esterna Esempio, trovare tutti gli studenti che hanno un omonimo: SELECT * FROM Student S WHERE EXISTS (SELECT * FROM Student S WHERE S2.Nome = S.Nome AND S2.Cognome = S.Cognome AND S2.Matricola <> S.Matricola) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
104
Semantica delle espressioni “correlate”, 2
Esempio, trovare tutti gli studenti che NON hanno un omonimo: SELECT * FROM Student S WHERE NOT EXISTS (SELECT * FROM Student S WHERE S2.Nome = S.Nome AND S2.Cognome = S.Cognome AND S2.Matricola <> S.Matricola) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
105
Confronto su piu’ attributi
Il confronto con il risultato di una query nidificata puo’ essere basato su piu’ attributi Stessa query di prima, trovare tutti gli studenti che hanno un omonimo: SELECT * FROM Student S WHERE (Nome, Cognome) IN (SELECT Nome, Cognome FROM Student S WHERE S2.Matricola <> S.Matricola) 13/10/2018 SQL, Definizione e interrogazione di basi di dati
106
SQL, Definizione e interrogazione di basi di dati
Visibilità scorretta: SELECT * FROM Impiegato WHERE Dipart in (SELECT Nome FROM Dipartimento D1 WHERE Nome = 'Produzione') OR Dipart in (SELECT Nome FROM Dipartimento D2 WHERE D2.Citta = D1.Citta) D1 non e’ visibile nella seconda query nidificata in quanto le due sottoquery sono allo stesso livello 13/10/2018 SQL, Definizione e interrogazione di basi di dati
107
Commenti finali sulle query nidificate
Query nidificate possono essere “meno dichiarative” in un certo senso ma spesso sono piu’ facilmente interpretabili Suddivisibili in blocchi piu’ semplici da interpretare L’utilizzo di variabili deve rispettare le regole di visibilita’ Cioe’, una variabile puo’ essere usata solo all’interno dello stesso blocco e in un blocco piu’ interno Comunque, query nidificate complesse possono essere di difficile comprensione Soprattutto quando si usano molte variabili comuni tra blocchi diversi 13/10/2018 SQL, Definizione e interrogazione di basi di dati
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.