Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from...

20
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= ‘Rossi’ estrae una lista di città in cui una città può comparire più volte. Per evitare i duplicati SQL prevede la parola chiave distinct da inserire subito dopo select. select distinct Città from Persona where Cognome= ‘Rossi’

Transcript of Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from...

Page 1: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Duplicati

L’algebra relazionale non ammette duplicati, SQL li ammette.

Quindi

select Città

from Persona

where Cognome= ‘Rossi’

estrae una lista di città in cui una città può comparire più volte.

Per evitare i duplicati SQL prevede la parola chiave distinct

da inserire subito dopo select.

select distinct Città

from Persona

where Cognome= ‘Rossi’

Page 2: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Join

In SQL-2 è stata introdotta la seguente sintassi per esprimere il join ed estenderlo ai join esterni

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

from Tabella [[as] Alias]

{[ TipoJoin ] join Tabella [[as] Alias]on CondizioneJoin}

[ where AltraCondizione ]

TipoJoin può assumere i valori

inner, right [outer], left [outer], full [outer]

inner è il default.

C’è anche l’estensione natural che implica la condizione di uguaglianza sugli attributi con lo stesso nome.

Page 3: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Join implicito ed esplicito

Padre e madre di ogni persona

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

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

paternita.figlio = maternita.figlio

Page 4: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Alias e variabiliL’uso degli alias consente di:• compattare il codice• fare riferimento a più esemplari della stessa tabella• creare interrogazioni nidificate

Se una tabella compare una sola volta non c’è differenza fra variabile ed alias.Se compare più volte si parla più propriamente di variabile.

Es. (impiegati il cui nome è anche il cognome di un altro impiegato)

select I1.Cognome, I1.Nomefrom Impiegato I1, Impiegato I2where I1.Nome = I2.Cognome andI1.Nome <> I2.Nome andI2.Dipart = ‘Produzione’

Page 5: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Ordinamento

E’ possibile anche ordinare le righe del risultato di una interrogazione attraverso la clausola order by, a chiusura di una interrogazione.

order by AttrdiOrdinamento [asc | desc]

{, AttrdiOrdinamento [asc | desc]}asc (default) indica ordinamento ascendente, desc discendente.

Il primo attributo ha priorità, a parità di valore si usa il secondo ecc.

select *

from Persona

order by Cognome, Nome

Page 6: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Operatori aggregatiIn algebra relazionale le espressioni vengono valutate sulle singole tuple in successione. Talvolta però possono essere necessarie informazioni derivabili dall’esame di tutte le tuple o di più tuple contemporaneamente.

SQL prevede una serie di operatori aggregati:

count, sum, max, min, avg

con sintassi

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

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

Es. Determinare il numero degli impiegati che si chiamano Rossi

select count(*)

from Impiegato

where nome= ‘Rossi’

Page 7: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Interrogazioni con raggruppamentoGli operatori aggregati vengono applicati a tutte le righe che vengono prodotte come risultato dell’operazione.

Può essere necessario applicare l’operatore solo ad un sottoinsieme delle righe.

SQL non ammette che nella stessa target list compaiano funzioni aggregate ed espressioni a livello di riga, come il nome di un attributo.

L’operatore group by specifica come suddividere le tabelle in sottoinsiemi.

Es.

select Dipart, sum(Stipendio)

from Impiegato

group by Dipart

Page 8: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

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)from persone

Page 9: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

• Il numero di figli di ciascun padre

select padre, count(*) AS NumFigli

from paternita

group by Padre

Operatori aggregati e raggruppamenti

Padrepaternita Figlio

LuigiLuigi

SergioOlga

FilippoFrancoFranco

AndreaAldo

Franco Padre NumFigli

LuigiSergio

2Franco 2

1

Page 10: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Interrogazioni con raggruppamento

In ogni interrogazione che usa group by, argomento della select (escludendo l’operatore aggregato) può essere solo un sottoinsieme degli attributi usati nella clausola group by

Es. di interrogazione scorretta

select Ufficio

from Impiegato

group by Dipart

Poiché deve venire prodotta una sola riga per ogni valore di Dipart, e, a parità di tale valore, possono aversi diversi valori di Ufficio, il risultato dell’interrogazione è indeterminato.

In alcuni casi (es. se l’attributo non compreso nella clausola group by è chiave) la query potrebbe fornire un risultato corretto, ma per semplicità SQL lo vieta comunque.

Page 11: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Raggruppamenti e target list

scorretta

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), p.redditofrom persone f join paternita on figlio = nome join

persone p on padre =p.nomegroup by padre, p.reddito

Page 12: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Condizioni sui gruppi

Può essere anche necessario restringere i gruppi attraverso l’applicazione di condizioni.

Se le condizioni sono verificabili a livello delle singole righe, basta utilizzare la clausola where, altrimenti si aggiunge una condizione alla group by attraverso l’estensione having

select Dipart, sum(Stipendio) as SommaStipendi

from Impiegati

group by Dipart

having sum(Stipendio) > 100

Se non si specifica group by e si usa having da solo la condizione è applicata a tutte le righe. Il problema è che se la condizione non è verificata, il risultato sarà vuoto.

Page 13: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Condizioni sui gruppi

• I padri i cui figli hanno un reddito medio maggiore di 25

select padre, avg(f.reddito)

from persone f join paternita on

figlio = nome

group by padre

having avg(f.reddito) > 25

Page 14: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

WHERE o HAVING?

• I padri i cui figli sotto i 30 anni hanno un reddito medio maggiore di 20

select padre, avg(f.reddito)

from persone f join paternita on

figlio = nome

where eta < 30

group by padre

having avg(f.reddito) > 25

Page 15: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Select

La forma di select cui siamo arrivati dopo le estensioni viste è quindi:

SelectSQL ::= select ListaAttributiOEspressioni

from ListaTabelle

[ where CondizioniSemplici ]

[group by ListaAttributiDiRaggruppamento]

[ having CondizioniAggregate]

[ order by ListaAttributiDiOrdinamento]

Page 16: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Interrogazioni di tipo insiemistico

SQL fornisce anche gli operatori di tipo insiemistico

union, intersect, except (minus)

con la seguente sintassi:

SelectSQL

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

NB • intersect e except potrebbero anche essere derivati attraverso opportune query• gli operatori insiemistici eseguono per default una eliminazione dei duplicati; all specifica di non farla• gli schemi su cui si opera non devono essere identici ma avere uguale numero di attributi, con domini compatibili. La corrispondenza è per posizione.

Page 17: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Interrogazioni di tipo insiemistico

Es. Estrarre nomi e cognomi degli impiegati

select Nome

from Impiegato

union

select Cognome

from Impiegato

Estrarre i cognomi degli impiegati che sono anche nomi

select Nome

from Impiegato

intersect

select Cognome

from Impiegato

Page 18: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Interrogazioni nidificate

E’ possibile anche realizzare clausole where in cui il confronto non avviene fra predicati semplici o fra valori, ma fra valori e risultati di interrogazioni.

Tipicamente, il risultato dell’interrogazione è un attributo.

Sorge il problema di confrontare un valore con un insieme di valori (il risultato della interrogazione).

SQL offre 2 possibilità per estendere i normali operatori di confronto:

all specifica che il confronto è vero se è vero per tutte le righe del risultato dell’interrogazione.

any specifica che il confronto è vero se è vero per una qualunque delle righe del risultato dell’interrogazione.

Page 19: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Interrogazioni NidificateEs.

select *

from Impiegato

where Dipart = any (select Nome

from Dipartimento

where Città=‘Firenze’)

Il risultato è una tabella che comprende tutte le righe di IMPIEGATO per cui il valore Dipart è uguale ad almeno uno dei valori di Nome in DIPARTIMENTO, limitatamente alle tuple per cui Citta’=‘Firenze’.

Lo stesso risultato si poteva ottenere con un join, ma così, specialmente per interrogazioni complesse, è più leggibile.

Page 20: Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.

Nome e reddito del padre di Franco

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

select Nome, Redditofrom Personewhere Nome = (select Padre

from Paternita where Figlio = 'Franco')