SQL
Interrogazioni
Interrogazioni in SQL
Non esiste un SQL standard (vari
dialetti)
Formulazione di interrogazioni (query) è
parte del Data Manipulation Language,
DML
Anche usato nel Data Declaration
Language, DDL (per esempio, per
dichiarare vincoli di integrità)
2
Interrogazioni in SQL
Paradigma dichiarativo: si specifica la
descrizione dell’obiettivo e non il
modo con cui ottenerlo

A differenza dell’algebra relazionale, che è
procedurale
3
Cenni sull’implementazione
Interrogazione in SQL viene tradotta in
linguaggio procedurale
Sulla traduzione si fanno ottimizzazioni
algebriche (ecco a cosa serve
l’algebra…) …
… e non (queste ultime dipendono dalle
strutture sottostanti al DBMS in
questione)
4
Sintassi
Esistono, in generale, più modi per effettuare
un’interrogazione: scelte basate sulla
leggibilità (più che sull’efficienza…)
Struttura essenziale (introdurremo le
variazioni di volta in volta):
select ListaAttributi (target list)
from ListaTabelle (clausola “from”)
[where Condizione] (clausola “where”)
5
Notazione
Le parentesi angolari <,>: permettono
di isolare un termine della sintassi
Le parentesi quadre [,]: indicano che il
termine all’interno è opzionale

Può non comparire o comparire una sola
volta
6
Notazione
Le parentesi graffe {,}: indicano che il
termine racchiuso può non comparire o
essere ripetuto un numero arbitrario di
volte
Le barre verticali |: indicano che deve
essere scelto uno tra i termini separati
dalle barre
7
Significato dell’interrogazione
Si considera il prodotto cartesiano fra le
tabelle della clausola “from”
Si selezionano quelle tuple che
soddisfano la condizione della clausola
“where” (opzionale)
Si danno in ouput i valori di quegli
attributi che sono elencati nella target
list (“select”)
8
Tabella “Impiegato”
Impiegato
Nome
Cognome Dipart
Ufficio Stipendio Città
Mario
Rossi
Amministr 10
15
Milano
Carlo
Bianchi
Prod
20
12
Torino
Giuseppe Verdi
Amministr 20
13
Roma
Franco
Neri
Distrib
16
15
Napoli
Carlo
Rossi
Direzione
14
27
Milano
Lorenzo
Lanzi
Direzione
7
21
Genova
Paola
Burroni
Ammistr
75
13
Venezia
Marco
Franco
Prod
20
14
Roma
9
Interrogazione 1
select Stipendio as Salario
from Impiegato
where Cognome = ‘Rossi’
Salario
15
27
10
Interrogazione 1
select Stipendio as Salario
from Impiegato
where Cognome = ‘Rossi’
alia
s
Salario
15
27
11
Interrogazione 2
select *
from Impiegato
where Cognome =
‘Rossi’
Nome Cognome Dipart
Ufficio Stipendio Città
Mario Rossi
Amministr 10
15
Milan
o
Carlo Rossi
Direzione 14
27
Milan
o
12
Interrogazione 2
select *
from Impiegato
where Cognome =
‘Rossi’
tutti
Nome Cognome Dipart
Ufficio Stipendio Città
Mario Rossi
Amministr 10
15
Milan
o
Carlo Rossi
Direzione 14
27
Milan
o
13
Interrogazione 3
select Stipendio/12 as StipMens
from Impiegato
where Cognome = ‘Bianchi’
StipMens
1
14
Interrogazione 3
select Stipendio/12 as StipMens
from Impiegato
where Cognome = ‘Bianchi’
espressioni
StipMens
1
15
Join in SQL (primo modo)
Per formulare interrogazioni che
coinvolgono più tabelle occorre fare un
join
In SQL un modo è:


elencare le tabelle di interesse nella “from”
mettere nella “where” le condizioni
necessarie per mettere in relazione fra loro
gli attributi di interesse
16
Tabella “Dipartimento”
Dipartimento
Nome
Indirizzo
Città
Amministr Via Tito Livio
27
Milan
o
Prod
P.le Lavater 3
Torino
Distrib
Via Segre 9
Roma
Direzione
Via Tito Livio
27
Milan
o
Ricerca
Via Morone 6
Milan
o
17
Interrogazione 4
Restituire nome e cognome degli impiegati e delle
città in cui lavorano
select
Impiegato.Nome,Cognome,
Dipartimento.Città
from
Impiegato,Dipartimento
where
Dipart = Dipartimento.Nome
18
Interrogazione 4
Restituire nome e cognome degli impiegati e delle
città in cui lavorano
La notazione punto ( )
select
Impiegato.Nome,Cognome, serve per disambiguare
Dipartimento.Città
Suggerimento: “from”,
from
“where”, target list
Impiegato,Dipartimento
where
Dipart = Dipartimento.Nome
19
Risultato interrogazione 4
Impiegato.Nome
Cognome Dipartimento.Città
Mario
Rossi
Milano
Carlo
Bianchi
Torino
Giuseppe
Verdi
Milano
Franco
Neri
Roma
Carlo
Rossi
Milano
Lorenzo
Lanzi
Milano
Paola
Burroni
Milano
Marco
Franco
Torino
20
Interrogazione 5
select
I.Nome, Cognome, D.Città
from
Impiegato [as] I, Dipartimento [as] D
where
Dipart = D.Nome
Impiegato [as] I : esempio di aliasing di una tabella
L’aliasing per le tabelle serve a abbreviare e disambiguare
i riferimenti alle tabelle
21
Sulla clausola “where”
Ammette come argomento un’espressione
booleana
Predicati semplici combinati con not, and,
or (not ha la precedenza, consigliato l’uso
di parantesi(,))
Ciascun predicato usa operatori: =, <>, <, >,
<=, >=
Confronto tra valori di attributi, costanti,
espressioni
22
Interrogazione 6
select Nome,Cognome
from
Nome
Cognome
Impiegato
Giuseppe Verdi
where
Ufficio = 20 and
Dipart =‘Amministr’
23
Interrogazione 7 e 8
1
2
select Nome, Cognome
from Impiegato
where
Dipart=‘Prod’ or
Dipart=‘Amministr’
select Nome, Cognome
from Impiegato
where
Cognome=‘Rossi’ and
(Dipart=‘Prod’ or
Dipart=‘Amministr’)
Nome
Cognome
Mario
Carlo
Paola
Marco
Rossi
Bianchi
Burroni
Franco
1
Giuseppe Verdi
Nome
Mario
2
24
Operatore like
_ = carattere arbitrario
% = stringa di lunghezza arbitraria
(anche 0) di caratteri arbitrari
Esempi:

like ab%ba_ = tutte le stringhe che
cominciano con “ab” e che hanno “ba”
come coppia di caratteri prima dell’ultima
posizione (es. abjjhhdhdbak,abbap)
25
Interrogazione 9
select *
from Impiegato
where Cognome like ‘_o%i’
or Cognome like ‘_u%i’
Nome Cognome Dipart
Ufficio Stipendio Città
Mario Rossi
Amministr 10
45
Milano
Carlo Rossi
Direzioni 14
80
Milano
Paola
Burroni
Amministr 75
40
Venezia
26
Gestione dei valori nulli
Attributo con valore nullo = non
applicabile a una certa tupla, o valore
sconosciuto, o non si sa nulla
SQL offre il predicato “is null”:
Attributo is [not] null
27
Gestione dei valori nulli
Stipendio>13: cosa succede se l’attributo
Stipendio è nullo? Scelte:

Logica a 2 valori e controllo esplicito. Per esempio:
(Stipendio > 13) or (Stipendio <= 13)
or (Stipendio is null)

Usare un terzo valore di verità unknown: soluzione
che crea problemi nei casi complessi (valutazione
“globale” delle formule logiche)
28
Uso delle variabili di alias
Non solo per disambiguare la notazione
Ci sono casi in cui una stessa tabella
serve più di una volta
Caso speciale: quando si deve
confrontare una tabella con se stessa
(il modello relazionale è relationoriented, non tuple-oriented )
29
Interrogazione 10
• Estrarre nome e cognome degli impiegati che
hanno lo stesso cognome (ma nome diverso)
di impiegati che lavorano nel dipartimento
Produzione
30
Interrogazione 10
• Estrarre nome e cognome degli impiegati che
hanno lo stesso cognome (ma nome diverso)
di impiegati che lavorano nel dipartimento
Produzione
select I1.Cognome, I1.Nome
from Impiegato I1, Impiegato I2
where I1.Cognome = I2.Cognome
and I1.Nome <> I2.Nome
and I2.Dipart = ‘Prod’
31
Interrogazione 10
• Estrarre nome e cognome degli impiegati che
I2 usata
per cognome (maper
evitarediverso)
hanno lo
stesso
nome
trovare tuple
output di
di impiegati
assoc. ache lavorano nel dipartimento
tupla con
‘Prod’
se stessa
Produzione
select I1.Cognome, I1.Nome
from Impiegato I1, Impiegato I2
where I1.Cognome = I2.Cognome
and I1.Nome <> I2.Nome
and I2.Dipart = ‘Prod’
32
Interrogazione 11
• Estrarre il nome e lo stipendio dei capi degli
impiegati che guadagnano più dei loro capi,
date:
Impiegati(Matricola, Nome, Età, Stipendio)
Supervisione(Capo, Impiegato)
dove Capo e Impiegato sono chiavi esterne di
Impiegati (e.g., sono dei numeri di matricola)
33
Interrogazione 11 (sol.)
select
I1.Nome, I1.Stipendio
from
Impiegato I1, Impiegato I2,
Supervisione
where
I1.Matricola = Capo
and I2.Matricola = Impiegato
and I2.Stipendio > I1.Stipendio
34
Interrogazione 11 (sol.)
select
I1.Nome, I1.Stipendio
from
Impiegato I1, Impiegato I2,
Supervisione
where
I1.Matricola = Capo
and I2.Matricola = Impiegato
and I2.Stipendio > I1.Stipendio
I1 per i capi,
I2 per gli
impiegati
35
Interpretazione algebrica delle
interrogazioni SQL
select T1.Attrib_11,…,Th.Attrib_hm
from Tabella1 as T1,…,Tabellan as Tn
where condizione
T1.Attrib_11,…,Th.Attrib_hm(
condizione(Tabella1 x … x Tabellan))
Per semplicità, omettiamo le ridenominazioni che ci permettono
di considerare tutti i join come prodotto cartesiano
36
Algebra->calcolo, SQL->linguaggio
SQL gestisce i duplicati (select e select
distinct), algebra no (basata su insiemi)
select *
from Impiegati
ordered by [asc|desc] Matricola
Operatori aggregati
Interrogazioni nidificate
per
ordinare
le tuple
37
Operatori aggregati
Algebra relazionale: tutte le condizioni
sono valutate su una tupla alla volta, in
modo indipendente
SQL offre degli operatori che lavorano
su più di una tupla alla volta:
count,sum,max,min,avg
38
Interrogazione 12
select count(*)
from Impiegato
where Dipart = ‘Prod’
count(<*|[distinct|all]ListaAttributi>)
valori diversi tra
loro
non null
39
Interrogazioni 13, 14
Gli operatori aggregati si applicano sulle tuple selezionate
dalla clausola “where” (se c’è)
count(<*|[distinct|all]ListaAttributi>)
Numero di stipendi diversi
select count(distinct Stipendio)
from Impiegato
Numero di righe che hanno nome non nullo
select count(all Nome)
from Impiegato
40
sum, max, min, avg
Prendono solo espressioni
rappresentanti valori numerici o
intervalli di tempo
distinct e all stesso significato di
prima
Altri operatori a seconda delle versioni
di SQL (solitamente operatori statistici)
41
Interrogazioni 15, 16
Somma stipendi di Amministrazione
select sum(Stipendio)
from Impiegato
where Dipart = ‘Amministr’
Stipendi min, max, medio degli Impiegati
select
min(Stipendio),max(Stipendio),avg(Stipendio)
from Impiegato
42
Interrogazione 17
Max stipendio tra impiegati che lavorano in dip
a Milano
Equijoin
select max(Stipendio)
from Impiegato, Dipartimento
where Dipart = Dipartimento.Nome and
Dipartimento.Citta = ‘Milano’
43
Scarica

Lezione 7 - parte teorica (formato ppt)