SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL...

69
SQL SQL

Transcript of SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL...

Page 1: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

SQL

SQL

Page 2: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

2

SQL

SQL

• Structured Query Language• è un linguaggio con varie funzionalità:

– contiene sia il DDL sia il DML;• esistono varie versioni dell’SQL;• vediamo gli aspetti essenziali, non i dettagli • “storia”:

– prima proposta SEQUEL (IBM Research, 1974); – prima implementazione in SQL/DS (IBM, 1981);– dal 1983 ca., “standard di fatto” – standard (1986, poi 1989 e infine 1992) recepito in parte; – standard SQL:2003 (SQL3) approvato recentemente

Page 3: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

3

SQL

Domini

• Domini elementari (predefiniti)

• Domini definiti dall‘utente (semplici, ma riutilizzabili)

Page 4: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

4

SQL

Domini elementari

• Carattere: singoli caratteri o stringhe, anche di lunghezza variabile

character [ varying ] [ ( Lunghezza ) ]

[ character set NomeFamigliaCaratteri ]

• Bit: singoli booleani o stringhe

bit [ varying ] [ ( Lunghezza ) ]• Numerici, esatti e approssimati:

numeric [( Precisione [ , Scala ) ] ]

integer

float [( Precisione )]

double precision

Page 5: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

5

SQL

Domini elementari, 2

• Data, ora, intervalli:

date

time [( Precisione )] [ with time zone ]

timestamp [( Precisione )] [ with time zone ]

interval UnitàDiTempo [ to UnitàDiTempo ]

Page 6: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

6

SQL

Definizione di schemi

• In un database non ci sono solo tabelle:• create schema [NomeSchema] [ [authorization]

autorizzazione]{elemento schema}

• ‘elemento schema’ può essere: dominio, tabella, indice, asserzione, vista, privilegio

• ‘autorizzazione’ è il nome dell’utente proprietario dello schema

• non è necessario definire tutto all’inizio

Page 7: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

7

SQL

Definizione di tabelle

• create table NomeTabella (NomeAttributo Dominio

[Default] [Vincoli]

{, NomeAttributo Dominio

[Default] [Vincoli] }

AltriVincoli)

•Default (utilizzabili anche nella create domain)

default < Valore | user | null >

Page 8: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

8

SQL

Esempio

• create table Dipartimento

(

nome char(20) primary key,

indirizzo char(50),

città char(20)

)

Page 9: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

9

SQL

Definizione di domini

• Istruzione CREATE DOMAIN: – definisce un dominio (semplice), utilizzabile in definizioni di

relazioni• Sintassi

create domain NomeDominio as Tipo

[ Default ]

[ Vincoli ]• Esempio

create domain Voto as smallint default null

check ( value >=18 and value <= 30 )

Page 10: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

10

SQL

Vincoli intrarelazionali

• not null (su singoli attributi)• unique: permette di definire chiavi; sintassi:

– per singoli attributi:

unique dopo il dominio– chiavi formate da più attributi:

unique ( Attributo { , Attributo } ) • primary key: definizione della chiave primaria (una sola,

implica not null); sintassi, come per unique • check, vedremo più avanti

Page 11: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

11

SQL

Vincoli intrarelazionali, esempi

Nome character(20) not null, Cognome character(20) not null,

unique (Cognome,Nome)

• è diverso da:

Nome character(20) not null unique, Cognome character(20) not null unique

Page 12: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

12

SQL

Vincoli interrelazionali

• references e foreign key (chiave esterna) permettono di definire vincoli di integrità referenziale; sintassi:– per singoli attributi:

references dopo il dominio– riferimenti su più attributi:

foreign key( Attributo { , Attributo } )references ...

• è possibile associare politiche di reazione alla violazione dei vincoli (causate da modifiche sulla tabella esterna, cioè quella cui si fa riferimento)

Page 13: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

13

SQL

Richiamo: base di dati con vincoli di integrità referenziale

infrazioni Codice Data Vigile Prov Numero65524 3/9/1997 343 MI 3K988687635 4/12/1997 476 MI 6D556382236 4/12/1997 343 RM 7C556735632 6/1/1998 476 RM 7C556776543 5/3/1998 548 MI 6D5563

vigili Matricola Cognome Nome343 Rossi Luca476 Neri Pino548 Nicolosi Gino

automobili Prov Numero Proprietario …MI 3K9886 Nestore …MI 6D5563 Nestore …RM 7C5567 Menconi …RM 1A6673 Mussone …MI 5E7653 Marchi …

Page 14: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

14

SQL

Vincoli interrelazionali, esempio

create table Infrazioni( Codice character(6) primary key, Data date not null, Vigile integer not null references Vigile(Matricola), Provincia character(2), Numero character(6) , foreign key(Provincia, Numero) references Automobili(Provincia, Numero) )

Infrazioni e’ una tabella interna, Vigile e Automobili sonoesterne

Page 15: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

15

SQL

Violazione dei vincoli

• per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento, il comando di aggiornamento venga rifiutato segnalando l’errore all’utente.

• per i vincoli di integrità referenziale, SQL permette di scegliere altre reazioni da adottare quando viene rilevata una violazione

• la reazione è possibile solo per le operazioni sulla tabella esterna che si propagano secondo una certa politica verso la tabella interna

• le violazioni possibili sono causate da modifiche del valore dell’attributo riferito e dalla cancellazione di righe (es. modifiche dell’attributo Provincia e cancellazione di righe da Vigile)

Page 16: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

16

SQL

Politiche di reazione

• Specificata immediatamente dopo il vincolo di integrità consente di associare politiche diverse ai diversi eventi (delete, update) secondo la seguente sintassi:

on < delete | update >

< cascade | set null | set default |

no action >

Page 17: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

17

SQL

Reazioni per delete

• cascade: si propagano le cancellazioni• set null: all’attributo referente viene assegnato il valore nullo

al posto del valore cancellato nella tabella• set default: all’attributo referente viene assegnato il valore

di default al posto del valore cancellato nella tabella esterna• no action: la cancellazione non viene consentita

Page 18: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

18

SQL

Reazioni per update

• cascade: il nuovo valore valore viene propagato nell’altra tabella

• set null: all’attributo referente viene assegnato il valore nullo al posto del valore modificato nella tabella

• set default: all’attributo referente viene assegnato il valore di default al posto del valore modificato nella tabella esterna

• no action: l’azione di modifica non viene consentita

Page 19: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

19

SQL

Modifiche degli schemi

Fornisce primitive per la manipolazione di schemi che

permettono di modificare gli schemi:

• alter domain• alter table• drop domain• drop table• ...

Page 20: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

20

SQL

Dizionario dei Dati

• Tutti i DBMS relazionali gestiscono le descrizioni delle tabelle presenti nella basi di dati mediante una struttura relazionale, cioè mediante tabelle.

• La base di dati contiene due tipi di tabelle: – quelle contente i dati, e– quelle contenente i metadati (dati che descrivono dati), dette

il catalogo della base di dati oppure il dizionario dei dati

• I comandi di definizione e modifica dello schema manipolano il dizionario dei dati

Page 21: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

21

SQL

SELECT, sintassi

select AttrExpr [ [as] Alias ] { , AttrExpr [ [as] Alias ] }from Tabella [ [as] Alias ] { , Tabella [ [as] Alias ] }[ where Condizione ]

• le tre parti vengono di solito chiamate

– target list

– clausola from– clausola where

• seleziona tra le righe che appartengono al prodotto cartesiano delle tabelle elencate nella clausola from quelle che soddisfano la condizione espressa nell‘argomento della clausola where

Page 22: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

22

SQL

persone Nome Eta RedditoAndrea 27 21

Aldo 25 15Maria 55 42Anna 50 35

Filippo 26 30Luigi 50 40

Franco 60 20Olga 30 41

Sergio 85 35Luisa 75 87

maternita Madre FiglioLuisa MariaLuisa LuigiAnna OlgaAnna FilippoMaria AndreaMaria Aldo

paternita Padre FiglioSergio FrancoLuigi OlgaLuigi Filippo

Franco AndreaFranco Aldo

Page 23: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

23

SQL

Selezione e proiezione

“Nome e reddito delle persone con meno di trenta anni”

select nome, redditofrom personewhere eta < 30

Page 24: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

24

SQL

SELECT, abbreviazioni

• data una relazione R su A e B

select *from R

• equivale (intutivamente) a

select X.A AS A, X.B AS Bfrom R Xwhere true

Page 25: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

25

SQL

Impiegato Nome Cognome Dipart Ufficio Stipendio Mario Rossi Amministrazione 10 45 Carlo Bianchi Produzione 20 36 Giuseppe Verdi Amministrazione 20 40 Franco Neri Distribuzione 16 45 Carlo Rossi Direzione 14 80 Lorenzo Lanzi Direzione 7 73 Paola Borroni Amministrazione 75 40 Marco Franco Produzione 20 46

Dipartimento Nome Indirizzo CittaAmministrazione Via Tito Livio Milano

Produzione P.zza Lavater TorinoDistribuzione Via Segre Roma

Direzione Via Tito Livio MilanoRicerca Via Morone Milano

Page 26: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

26

SQL

Selezione, senza proiezione

select *

from Impiegato

where Cognome = 'Rossi’

Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Rossi Direzione 14 80

Page 27: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

27

SQL

Espressioni nella target list

select Stipendio/12 as StipendioMensile

from Impiegato

where Cognome = 'Bianchi'

StipendioMensile3.00

Page 28: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

28

SQL

Disgiunzione

select Nome, Cognome

from Impiegato

where Dipart = 'Amministrazione' or

Dipart = 'Produzione'

Nome CognomeMario Rossi

Carlo Bianchi

Giuseppe Verdi

Paola Borroni

Marco Franco

Page 29: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

29

SQL

Condizione complessa

select Nome

from Impiegato

where Cognome = 'Rossi' and

(Dipart = 'Amministrazione' or

Dipart = 'Produzione')

NomeMario

Page 30: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

30

SQL

Condizione “LIKE”

“Gli impiegati che hanno un cognome che ha una 'o' in seconda posizione e finisce per 'i'.”

select *

from Impiegato

where Cognome like '_o%i'

Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Rossi Direzione 14 80Paola Borroni Amministrazione 75 40

Page 31: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

31

SQL

Gestione dei valori nulli

“Gli impiegati che hanno o potrebbero avere uno stipendio minore di 50 milioni”

select *

from Impiegato

where Stipendio < 50 or Stipendio is null

Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Rossi Direzione 14 80Paola Borroni Amministrazione 75 NULL

Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Paola Borroni Amministrazione 75 NULL

Page 32: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

32

SQL

Selezione, proiezione e join

“I padri di persone che guadagnano più di venti milioni”

select distinct padrefrom persone, paternitawhere figlio = nome and

reddito > 20

Page 33: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

33

SQL

Proiezione, senza selezione

select Nome, Cognome

from Impiegato

Nome Cognome Mario Rossi Carlo Bianchi Giuseppe Verdi Franco Neri Carlo Rossi Lorenzo Lanzi Paola Borroni Marco Franco

Page 34: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

34

SQL

Proiezione: duplicati

select Cognome

from Impiegato

CognomeRossi

BianchiVerdiNeri

RossiLanzi

BorroniFranco

select distinct Cognome

from Impiegato

CognomeRossi

BianchiVerdiNeri

LanziBorroniFranco

Page 35: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

35

SQL

Join naturale“Padre e madre di ogni persona”

select paternita.figlio, padre, madrefrom maternita, paternitawhere paternita.figlio = maternita.figlio

Page 36: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

36

SQL

Join di una relazione con se stessa

“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 fwhere p.nome = padre and

figlio = f.nome andf.reddito > p.reddito

Page 37: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

37

SQL

Ridenominazione del risultato

“Le persone che guadagnano più dei rispettivi padri;

mostrare nome, reddito e reddito del padre”

select figlio, f.reddito as reddito, p.reddito as redditoPadre

from persone p, paternita, persone fwhere p.nome = padre and

figlio = f.nome andf.reddito > p.reddito

Page 38: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

38

SQL

SELECT, con join esplicito, sintassi

select AttrExpr [ [as] Alias ] {,AttrExpr [ [as] Alias ] }

from Tabella [ [ as ] Alias ]

{[ TipoJoin ] join Tabella [ [ as ] Alias ] on CondDiJoin }, ...

[ where AltraCondizione ]

Page 39: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

39

SQL

Join esplicito

“Padre e madre di ogni persona”

select madre, paternita.figlio, padre from maternita join paternita on

paternita.figlio = maternita.figlio

Page 40: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

40

SQL

Ulteriore estensione: join naturale

“Padre e madre di ogni persona”

select madre, paternita.figlio, padre

from maternita natural join paternita

select madre, paternita.figlio, padre from maternita join paternita on

paternita.figlio = maternita.figlio

Page 41: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

41

SQL

Join

maternita Madre FiglioLuisa MariaLuisa LuigiAnna OlgaAnna FilippoMaria AndreaMaria Aldo

paternita Padre FiglioSergio FrancoLuigi OlgaLuigi Filippo

Franco AndreaFranco Aldo

Madre Figlio PadreAnna Olga LuigiAnna Filippo LuigiMaria Andrea FrancoMaria Aldo Franco

Page 42: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

42

SQL

Join esplicito

select I.Nome, Cognome, Citta

from Impiegato I join Dipartimento D

on Dipart = D.Nome

Nome Cognome DipartMario Rossi Milano

Carlo Bianchi Torino

Giuseppe Verdi Milano

Franco Neri Roma

Carlo Rossi Milano

Lorenzo Lanzi Milano

Paola Borroni Milano

Marco Franco Torino

Page 43: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

43

SQL

Ordinamento del risultato

order by AttrDiOrdinamento [ asc | desc ]

{, AttrDiOrdinamento [ asc | desc ] }

select Cognome, Nome, Stipendio

from Impiegato

where Dipart like 'Amm%'

order by Stipendio desc, Cognome

Cognome Nome StipendioRossi Mario 45

Borroni Paola 40Verdi Giuseppe 40

Page 44: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

44

SQL

Necessità di operatori su tuple

• tutte le condizioni dell’algebra vengono valutate su una tupla alla volta

• la condizione è sempre un predicato che viene valutato su ciascuna tupla indipedentemente da tutte le altre

• se volessi contare il numero di impiegati di un certo dipartimento a partire da una relazione Impiegato come si fa?

• occorre introdurre degli operatori che consentono di valutare proprietà che dipendono da insiemi di tuple

• questi operatori sono detti operatori aggregati

Page 45: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

45

SQL

Operatori aggregati

select count(*) AS NumeroImpiegatifrom Impiegatowhere Dipart = 'Produzione'

• l’operatore aggregato (count) viene applicato al risultato dell’interrogazione:

select *from Impiegatowhere Dipart = 'Produzione'

NumeroImpiegati2

Page 46: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

46

SQL

COUNT: sintassi

count ( < * | [ distinct | all ] ListaAttributi > )

select count(Stipendio) as NumeroStipendi

from Impiegato

select count(distinct Stipendio)

as StipendiDiversi

from Impiegato

NumeroStipendi8

StipendiDiversi6

Page 47: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

47

SQL

COUNT e valori nulli

select count(*) as NumeroImpiegati

from Impiegato

select count(Stipendio) as NumeroStipendi

from Impiegato

NumeroImpiegati3

NumeroStipendi2

Impiegato Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Bianchi Produzione 20 45

Giuseppe Verdi Amministrazione 20 NULL

Page 48: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

48

SQL

Somma, media, massimo, minimo

< sum | max | min | avg > ( [ distinct | all ] AttrEspr )

Totale degli stipendi del dipartimento amministrazione

select sum(Stipendio) as TotaleStipendifrom Impiegatowhere Dipart = 'Amministrazione'

• escludono opportunamente i valori nulli

TotaleStipendi125

Page 49: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

49

SQL

Join e operatore aggregato

“Il massimo stipendio tra quelli degli impiegati che lavorano in un dipartimento con sede a Milano”

select max(Stipendio)

from Impiegato, Dipartimento D

where Dipart = D.Nome and

Citta = 'Milano'

• Nota: non abbiamo usato la as e l’attributo nel risultato non ha nome

80

Page 50: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

50

SQL

Operatori aggregati e target list

• un’interrogazione scorretta:

select Cognome, Nome, max(Stipendio)

from Impiegato, Dipartimento

where Dipart = NomeDip and

Citta = 'Milano’

• di chi sarebbe il cognome? La target list deve essere omogenea

Page 51: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

51

SQL

Interrogazioni con raggruppamento

• gli operatori aggregati vengono applicati ad un insieme di righe• gli esempi visti operano su tutte le righe• spesso esiste l’esigenza di applicare operatori aggregati a

distintamente ad insiemi di tuple• in SQL l’operatore group by ci consente di fare questo

Page 52: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

52

SQL

Operatori aggregati e raggruppamenti

“Per ogni dipartimento, la somma degli stipendi”

select Dipart, sum(Stipendio) as SommaStipendi

from Impiegato

group by Dipart

Dipart SommaStipendiAmministrazione 125

Produzione 82Distribuzione 45

Direzione 153

Page 53: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

53

SQL

Semantica di interrogazioni con operatori aggregati e raggruppamenti

• interrogazione senza group by e senza operatori aggregati:

select Dipart, Stipendio

from Impiegato

Dipart StipendioAmministrazione 45

Produzione 36Amministrazione 40

Distribuzione 45Direzione 80Direzione 73

Amministrazione 40Produzione 46

Page 54: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

54

SQL

Semantica …, 2

• poi si raggruppa e si applica l’operatore aggregato a ciascun gruppo

dopo group by dopo sum()as

Dipart StipendioAmministrazione 45Amministrazione 40Amministrazione 40

Distribuzione 45Direzione 80Direzione 73

Produzione 36Produzione 46

Dipart SommaStipendiAmministrazione 125

Distribuzione 45Direzione 153

Produzione 82

Page 55: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

55

SQL

Raggruppamento sbagliato

select ufficio

from impiegato

group by dipart

Ad ogni valore ( e quindi gruppo) di dipart possono corrispondere

più valori di ufficio. Quale scegliere?

Page 56: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

56

SQL

importante!

• nella clausola select può comparire solo un sottoinsieme S degli attributi utilizzati nella clausola group by

• in questo modo, ciascuna tupla sugli attributi in S è associata ad un unico valore del gruppo

• E’ una condizione molto restrittiva.

interrogazione scorretta:select dipart, count (*), d.cittàfrom impiegato i join dipartimento d on i.dipart=d.nomegroup by dipart

corretta:select dipart, count (*), d.cittàfrom impiegato i join dipartimento d on i.dipart=d.nomegroup by dipart, città

Page 57: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

57

SQL

Condizioni sui gruppi

“I dipartimenti che spendono più di 100 milioni in stipendi”

select Dipart,

sum(Stipendio) as SommaStipendi

from Impiegati

group by Dipart

having sum(Stipendio) > 100Dipart SommaStipendi

Amministrazione 125Direzione 153

Page 58: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

58

SQL

WHERE o HAVING?

“I dipartimenti per cui la media degli stipendi degli impiegati che lavorano nell'ufficio 20 è superiore a 25 milioni”

select Dipart

from Impiegato

where Ufficio = 20

group by Dipart

having avg(Stipendio) > 25

Page 59: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

59

SQL

Sintassi, riassumiamo

SelectSQL ::=

select ListaAttributiOEspressioni

from ListaTabelle

[ where CondizioniSemplici ]

[ group by ListaAttributiDiRaggruppamento ]

[ having CondizioniAggregate ]

[ order by ListaAttributiDiOrdinamento ]

Page 60: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

60

SQL

Unione, intersezione e differenza

• la sintassi select-from-where da sola non permette di fare unioni; serve un costrutto esplicito:

SelectSQL { < union | intersect | except > [ all ] SelectSQL }

select Nomefrom Impiegatounionselect Cognome as Nomefrom Impiegato

• i duplicati vengono eliminati (a meno che si usi all) (anche dalle proiezioni)

Page 61: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

61

SQL

Interrogazioni nidificate

• le condizioni atomiche esprimibili nella clausola WHERE permettono anche – il confronto fra un attributo (o più, vedremo poi) e il risultato

di una sottointerrogazione– quantificazioni esistenziali

Page 62: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

62

SQL

Interrogazioni nidificate, sintassi

ConfrontoConNidificazione :: =

Scalare OpConfronto [ any | all ]

( SelectAttributoSingolo)|

exists ( SelectStar )• senza any o all , il risultato della SelectAttributoSingolo deve

essere un solo valore• v.A any Select... (risp. all) è vero se v.A è in relazione

con almeno uno (risp. con tutti) dei valori del risultato della Select

• = any puo essere abbreviato con in• exists( SelectStar ) è vero se il risultato della

sottoespressione non è vuoto.

Page 63: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

63

SQL

Interrogazioni nidificate

“Gli impiegati che lavorano in dipartimenti di Roma”

select *

from Impiegato

where Dipart = any (select Nome

from Dipartimento

where Citta = 'Roma')

Page 64: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

64

SQL

“Nome e reddito del padre di Mario”

select Nome, Redditofrom Personewhere Nome = (select Padre from Paternita where Figlio = 'Mario')

select Nome, Redditofrom Persone, Paternitawhere Nome = Padre and Figlio = 'Mario'

Page 65: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

65

SQL

Interrogazioni nidificate, commenti

• 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• 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

Page 66: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

66

SQL

“Nome e reddito dei padri di persone che guadagnano più di 20 milioni"

select Nome, Redditofrom Personewhere Nome in (select Padre from Paternita where Figlio =any (select Nome from Persone where Reddito > 20))

select distinct P.Nome, P.Redditofrom Persone P, Paternita, Persone Fwhere P.Nome = Padre and Figlio = F.Nome and F.Reddito > 20

Page 67: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

67

SQL

Interrogazioni piatte o nidificate?

select I1.Nomefrom Impiegato I1, Impiegato I2where I1.Nome = I2.Nome andI2.Dipart = 'Produzione'

select Nomefrom Impiegatowhere Nome = any (select Nome

from Impiegato where Dipart =

'Produzione')

Page 68: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

68

SQL

“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)

Page 69: SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

69

SQL

Interrogazioni nidificate, commenti, 2

• 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”• nota: in un blocco si può fare riferimento a variabili definite in

blocchi più esterni; la semantica (prodotto cartesiano, selezione, proiezione) non funziona più, ne serve una più sofisticata:– l’interrogazione interna va ripetuta una volta per ciascun

valore della variabile