Structured Query Language - Dipartimento di Informatica e

Tipi di linguaggi
per basi di dati
Si distinguono due categorie:
DDL
Linguaggi di definizione dei
dati o data definition
languages: utilizzati per
definire gli schemi logici,
esterni e fisici e le
autorizzazioni degli utenti
DML
Linguaggi di manipolazione
dei dati o data
manipulation languages:
utilizzati per l’interrogazione
e l’aggiornamento delle
istanze di basi di dati
L’algebra relazionale è un DML
Structured Query Language
1
Structured Query Language
pron: “esse-qu-elle”, “es-que-el” o “sequel”
Letteralmente: “Linguaggio Strutturato
di Interrogazione”
E’ sia un DDL che un DML
Ne esistono varie versioni
Fu proposto (come SEQUEL)
dall’IBM Research nel 1974
La prima implementazione risale al
1981 (IBM SQL/DS)
Dal 1983 circa è uno standard di fatto
E’ standard ANSI 1986, 1989, 1992
(quest’ultimo denominato SQL-2)
Structured Query Language
2
Convenzioni di specifica
della sintassi
“courier”
esattamente i caratteri
specificati dalla stringa
Es.: “where” indica la
sequenza “w”, “h”, “e”,
“r”, “e”
neretto
un valore non specificato,
ma il cui tipo (stringa,
intero, booleano, ecc) è
evidente dal contesto
Es.: NomeRelazione può
rappresentare la stringa
“Impiegati”
Structured Query Language
3
Convenzioni di specifica
della sintassi (2)
[ ... ]
tutto ciò che è tra parentesi
quadre è opzionale
Es.: [ “abc” ] può indicare
tanto “abc” quanto “” (la
stringa vuota)
{ ... }
tutto ciò che è tra parentesi
graffe può essere ripetuto
zero o più volte
Es.: [ “abc” ] può indicare
“”, “abc”, “abc abc”, ...
< ... | ... >
tutto ciò che è tra parentesi
angolate e separato da barre
verticali è alternativo
Es.: < “a” | “b” | “c” > può
indicare “a”, “b” o “c”
Structured Query Language
4
Scopo
Definisce uno schema di relazione e
ne crea un’istanza vuota
Sintassi
“create table” NomeTabella
“(” NomeAttributo Dominio
[ Default ] [ Vincoli ]
{ “,” NomeAttributo Dominio
[ Default ] [ Vincoli ] }
[ “,” AltriVincoli ]
“)”
Esempio
create table
create
createtable
tableDipartimento
Dipartimento
((
Nome
Nome char
char(20)
(20)primary
primarykey,
key,
Indirizzo
Indirizzo char
char(50),
(50),
Citta
char
Citta
char(20)
(20)
))
Structured Query Language
5
Esempio di
create table
create
createtable
tableImpiegato
Impiegato((
Matricola
Matricola
Nome
Nome
Cognome
Cognome
Dipart
Dipart
Stipendio
Stipendio
Citta
Citta
char
char(6)
(6)primary
primarykey,
key,
char
char(20)
(20)not
notnull,
null,
char
char(20)
(20)not
notnull,
null,
char
char(15),
(15),
numeric
numeric(9)
(9)default
default0,
0,
char
char(15),
(15),
foreign
foreignkey
key(Dipart)
(Dipart)
refereces
refereces Dipartimento
Dipartimento (NomeDip)
(NomeDip)
on
ondelete
deleteset
setnull
null
on
onupdate
updatecascade,
cascade,
unique
unique(Cognome,
(Cognome,Nome)
Nome)
))
Structured Query Language
6
Altro esempio di
create table
Incidenti
codice
00001
00002
prov1
RM
BO
num1 prov2
034524 PG
823507 MI
num2
982453
827283
create
createtable
tableIncidenti
Incidenti((
codice
codice
prov1
prov1
num1
num1
prov2
prov2
num2
num2
))
numeric
numeric(5)
(5)primary
primarykey,
key,
char
char(2),
(2),
numeric
numeric (6),
(6),
char
char(2),
(2),
numeric
numeric (6)
(6)
Structured Query Language
7
Tipi di domini
Esistono due tipi di domini
1) domini elementari: sono quelli
predefiniti e presenti in tutte le
implementazioni di SQL
2) domini definiti dall’utente:
• solo domini semplici (derivati cioè
da un altro dominio già esistente)
• vengono dichiarati prima del loro
utilizzo
• possono essere riutilizzati in più
punti
Structured Query Language
8
Scopo
Definisce stringhe e singoli caratteri
Sintassi
Domino character
“character” [ “varying” ]
[ “(” Lunghezza “)” ]
[ “character set”
NomeFamigliaCaratteri ]
Es.
character
character (20)
(20)
stringa di 20 caratteri
Es.
char = character
varchar = character varying
varchar
varchar(1000)
(1000)
character
characterset
setGreek
Greek
stringa di caratteri dell’alfabeto
greco a lunghezza variabile di
lunghezza massima 1000
Structured Query Language
9
Scopo
Es.
“bit” [ “varying” ]
[ “(” Lunghezza “)” ]
bit
bit(5)
(5)
sequenza di 5 valori binari
Es.
Definisce sequenze di valori binari
che vengono generalmente utilizzati
come flag
Sintassi
Dominio bit (SQL-2)
bit
bitvarying
varying(100)
(100)
sequenza di valori binari di
lunghezza variabile e lunghezza
massima 100
Structured Query Language
10
Scopo
Domini numerici esatti
Rappresentano valori interi, decimali,
o in virgola fissa.
Sintassi
“numeric” [ “(” NumCifre
[ “,” NumDecimali ] “)” ]
“decimal” [ “(” NumCifre
[ “,” NumDecimali ] “)” ]
“integer”
Es.
“smallint”
numeric
numeric (6,3)
(6,3)
rappresenta valori compresi tra
-999,999 e +999,999
con decimal vengono definiti requisiti
minimi, con numeric i valori di
precisione esatti
Structured Query Language
11
Scopo
Domini numerici
approssimati
Rappresentano valori approssimati
Sintassi
“real”
“double precision”
“float” [ “(” CifreMantissa “)” ]
0.1756 × 10 15
mantissa
esponente
Per real e double precision il numero
di cifre della mantissa e dell’esponente
dipendono dall’implementazione
Structured Query Language
12
Scopo
Definiscono rispettivamente una data
e un’ora
Es. Sin.
Data e ora (SQL-2)
“date”
Sin.
“time” [ “(” NumDecimali “)”]
[ “with time zone” ]
Es.
date
date
definisce una data con i campi anno,
mese e giorno
(Es.: ‘2000-10-18’)
time
time(2)
(2)with
withtime
timezone
zone
definisce una stringa con ore, minuti,
secondi, e fuso orario (Es.:
‘21:03:04,98+1:00’)
Structured Query Language
13
Scopo
Sintassi
“timestamp”
[ “(” NumDecimali “)”]
[ “with time zone” ]
timestamp
timestamp(1)
(1)
definisce un’etichettatura temporale
(Es.: ‘2000-10-18 15:30:45,3’)
Es.
Definisce un etichettatura temporale
(timestamp)
Es.
timestamp (SQL-2)
timestamp
timestampwith
withtime
timezone
zone
definisce un’etichettatura temporale.
Un valore può essere il seguente:
‘2000-10-18 15:30:45+5:30’
Structured Query Language
14
Scopo
Es.
“interval” UnitàDiTempo
[ “to” UnitàDiTempo ]
interval
intervalyear
yearto
tomonth
month
definisce un intervallo in anni e mesi
(Es.: ‘2-3’ = due anni e tre mesi)
Es.
Definisce un intervallo temporale
Sintassi
interval (SQL-2)
interval
intervalday
dayto
tosecond
second
definisce un intervallo in giorni, ore,
minuti e secondi
(Es.: ‘3 20:43:21’ = tre giorni,
20 ore, 43 minuti e 21 secondi)
Non è possibile abbracciare nello
stesso intervallo i mesi e i giorni
Structured Query Language
15
Scopo
Definisce un domino (semplice)
utilizzabile nelle definizioni delle
ralazioni che seguiranno
Sintassi
“create domain” NomeDominio
“as” TipoDiDato
[ ValoreDiDefault ]
[ Vincoli ]
Esempio
create domain
create
createdomain
domainVoto
Votoas
assmallint
smallint
default
default null
null
check
check((value
value>=
>=18
18and
and
value
value<=
<=30
30))
L’istruzione create domain aggiunge un
alias, un valore di default ed un insieme
di vincoli ad un dominio esistente
Structured Query Language
16
Scopo
Definisce un valore di default per un
dominio
Sintassi
“default”
< Valore | “user” | “null” >
Esempio
create
createtable
tablePersona
Persona((
Figli
Figli smallint
smallintdefault
default0,
0,
...
...
Esempio
create
createtable
tableVoceElenco
VoceElenco((
InseritaDa
InseritaDa char
char(20)
(20)
default
defaultuser,
user,
...
...
Esempio
Valori di default
create
createdomain
domainVoto
Votoas
assmallint
smallint
default
defaultnull
null
...
...
Structured Query Language
17
Sintassi
Vincoli
“create table” NomeTabella
“(” NomeAttributo Dominio
[ Default ] [ Vincoli ]
{ “,” NomeAttributo Dominio
[ Default ] [ Vincoli ] }
[ “,” AltriVincoli ]
“)”
i Vincoli compaiono in più punti nella
sintassi di create table
create
createtable
tableDipartimento
Dipartimento((
Nome
Nome char
char(20)
(20)primary
primarykey,
key,
Indirizzo
Indirizzo char
char(50),
(50),
primary
primarykey
key(Nome)
(Nome)
))
è equivalente specificare un vincolo
dopo l’attributo cui si riferisce o in
coda alla definizione
Structured Query Language
18
Esempio uno
Attenzione!
create
createtable
tablePersona
Persona((
Matricola
Matricola integer
integerprimary
primarykey,
key,
Nome
char
Nome
char(20),
(20),
Cognome
Cognomechar
char(20),
(20),
Indirizzo
Indirizzo char
char(50),
(50),
unique
unique(Cognome,Nome)
(Cognome,Nome)
))
Esempio due
è diverso da...
create
createtable
tablePersona
Persona((
Matricola
Matricola integer
integerprimary
primarykey,
key,
Nome
char
Nome
char(20),
(20),
Cognome
Cognomechar
char(20),
(20),
Indirizzo
Indirizzo char
char(50),
(50),
unique
unique(Cognome),
(Cognome),
unique
unique(Nome)
(Nome)
))
Quando sono interessati più attributi è
d’obbligo specificarli assieme (e dunque
necessariamente in coda alla definizione)
Structured Query Language
19
Vincoli intrarelazionali
primary key elegge l’attributo
specificato (o gli attributi
specificati) come chiave
primaria per la relazione
not null impone che l’attributo
abbia sempre un valore
definito
unique impone che non esistano due
tuple della relazione con lo
stesso valore sull’attributo (o
sugli attributi). Gli attributi che
sono unique sono anche
superchiavi per la relazione
primary key implica il not null
e l’unique sugli attributi interessati
Structured Query Language
20
Vincoli interrelazionali
Esempio
Esempio
Vincoli di integrità referenziali:
• references dopo l’attributo
create
createtable
tableImpiegato
Impiegato((
CF
CF char(16)
char(16)
references
referencesPersona(CF),
Persona(CF),
...
...
• foreign key ... references
per insiemi di attributi (in coda alla
create table)
...
...
foreign
foreign key
key(Nome,Cognome)
(Nome,Cognome)
references
references
Anagrafe(Nome,Cognome)
Anagrafe(Nome,Cognome)
))
SQL richiede che gli attributi della
tabella riferita siano dichiarati unique
Structured Query Language
21
Violazione dei
vincoli interrelazionali
vincolo di integrità
referenziale
tabella
tabella
interna
interna
tabela
tabela
esterna
esterna
Il vincolo può essere violato:
• inserendo o modificando una
tupla della tabella interna
• cancellando o modificando
una tupla della tabella esterna
Nel primo caso si assume che sia
l’applicazione o l’utente a verificare
la non violazione del vincolo. Nel
secondo caso SQL offre costrutti
opportuni
Structured Query Language
22
Strategie di reazione
cascade: la cancellazione o la modifica
nella tupla della tabella esterna si
riflette in una analoga
cancellazione o modifica nelle
tuple corrispondenti della tabella
interna
set null: le corrispondenti tuple della
tabella interna assumono il valore
null sugli attributi interessati
set default: le corrispondenti tuple
della tabella interna assumono il
valore di default sugli attributi
interessati
no action: non viene presa nessuna
particolare precauzione
Structured Query Language
23
Sintassi
Esempio
Sintassi
La strategia di reazione alla violazione viene
specificata immediatamente dopo il vincolo
con la sintassi seguente
“on” < “delete” | “update” >
< “cascade”
| “set null”
| “set default”
| “no action” >
create
createtable
tableImpiegato
Impiegato((
Nome
Nomechar(20)
char(20)not
notnull,
null,
Cognome
Cognomechar(20)
char(20)not
notnull,
null,
Dipart
Dipartchar(15),
char(15),
Stipendio
Stipendionumeric(9)
numeric(9)default
default0,
0,
primary
primarykey
key(Cognome,
(Cognome,Nome),
Nome),
foreign
foreignkey
key(Dipart)
(Dipart)references
references
Dipartimento(Nome)
Dipartimento(Nome)
on
ondelete
deleteset
setnull
null
on
on update
update cascade
cascade
))
Structured Query Language
24
Scopo
“create schema”
[ NomeSchema ]
[ [ “autorization” ]
UtenteProprietario ]
{ Definizioni }
Esempio
Definisce uno schema in SQL
Sintassi
create schema
create
create schema
schema NuovoSchema
NuovoSchema
create
createtable
tableImpiegato
Impiegato((
...
...
))
create
createtable
tableDipartimento
Dipartimento((
...
...
))
...
...
Structured Query Language
25
Esercizio 1
Si definisca in SQL la seguente base di dati
Partenze(Numero, Ora,
Destinazione,Categoria)
Scali(Treno, Stazione, Ora)
• Tra l’attributo Treno di Scali e la
relazione Partenze c’è un vincolo di
integrità referenziale
• Non si ammette nessun valore nullo
• Non ci sono due treni con lo stesso
orario, stessa destinazione e stessa
categoria
Structured Query Language
26
Esercizio 2
Si definisca in SQL la seguente base di dati
Pazienti(Codice, Cognome, Nome)
Ricoveri(Paziente, Inizio, Fine, Reparto)
Medici(Matr., Cognome, Nome, Reparto)
Reparti(Sigla, Nome, Primario)
Vincoli di integrità referenziale sono:
• tra l’attributo Paziente di Ricoveri
e la relazione Pazienti
• tra Reparto di Ricoveri e Reparti
• tra Primario di Reparti e Medici
• tra Reparto di Medici e Reparti
Valori nulli sono ammessi per gli attributi:
• Cognome e Nome di Pazienti
• Fine di Ricoveri
• Cognome e Nome di Medici
• Nome di Reparti
Structured Query Language
27
Sintassi
Interrogazioni: select
“select” ListaAttributi
“from” ListaTabelle
[ “where” Condizione ]
Sintassi dettagliata
le tre parti vengono chiamate:
• target list
• clausola from
• clausola where
“select” AttrExpr [ “as” Alias ]
{ AttrExpr [ “as” Alias ] }
“from” Tabella [ “as” Alias ]
{ Tabella [ “as” Alias ] }
[ “where” Condizione ]
Se la calusola where è assente
vengono selezionate tutte le righe
delle tabelle
Structured Query Language
28
Nome
Mario
Carlo
Giuseppe
Franco
Carlo
Lorenzo
Paola
Marco
Impiegato
Structured Query Language
29
Cognome
Rossi
Bianchi
Verdi
Neri
Rossi
Lanzi
Borroni
Franchi
Dipartimento
Amministrazione
Produzione
Amministrazione
Distribuzione
Direzione
Direzione
Amministrazione
Produzione
Ufficio
10
20
20
16
14
7
75
20
Relazione Impiegato
Stipendio
45
36
40
45
80
73
40
46
Domanda
Algebra
ρρSalario←Stipendio
(
Salario←Stipendio (
ππStipendio
(
Stipendio (
σσCognome=‘Rossi’
(Impiegato)))
Cognome=‘Rossi’ (Impiegato)))
select
selectStipendio
Stipendioas
asSalario
Salario
from
fromImpiegato
Impiegato
where
whereCognome
Cognome==‘Rossi’
‘Rossi’
Risultato
Individuare
Individuareililsalario
salariodi
ditutti
tuttigli
gli
impiegati
impiegatidi
dicognome
cognome‘Rossi’
‘Rossi’
SQL
Esempio #1
Salario
45
80
Structured Query Language
30
Algebra
Recuperare
Recuperare tutte
tutte le
le informazioni
informazioni
degli
degliimpiegati
impiegatidi
dinome
nome‘Rossi’
‘Rossi’
σσCognome=‘Rossi’ (Impiegato)
Cognome=‘Rossi’ (Impiegato)
SQL
Domanda
Esempio #2
select
select**
from
fromImpiegato
Impiegato
where
whereCognome
Cognome==‘Rossi’
‘Rossi’
Risultato
Il carattere speciale * (asterisco)
rappresenta tutti gli attributi delle
tabelle elencate nella clausola from
Nome Cognome Dip. Ufficio Stip.
Mario Rossi
Amm. 10
45
Carlo Rossi
Dir.
14
80
Structured Query Language
31
SQL
Domanda
Esempio #3
Trovare
Trovarelo
lostipendio
stipendiomensile
mensiledi
di
‘Bianchi’
‘Bianchi’
select
selectStipendio/12
Stipendio/12as
asMensile
Mensile
from
fromImpiegato
Impiegato
where
whereCognome
Cognome==‘Bianchi’
‘Bianchi’
Risultato
Nella target list possono comparire
generiche espressioni sui valori
degli attributi
Mensile
3,00
Structured Query Language
32
Structured Query Language
33
Nome
Amministrazione
Produzione
Distribuzione
Direzione
Ricerca
Dipartimento
Indirizzo
Via Tito Livio, 27
P.le Lavater, 3
Via Segre, 9
Via Tito Livio, 27
Via Morone, 6
Citta
Milano
Torino
Roma
Milano
Milano
Relazione Dipartimento
Domanda
ππNome,Cognome,Citta
(
Nome,Cognome,Citta (
Impiegato
Impiegato
Dipartimento
Dipartimento==NN
(ρ
(Dipartimento)))
(ρN←Nome
N←Nome (Dipartimento)))
SQL
Trovare
Trovareiinomi
nomieecognomi
cognomidegli
degli
impiegati
impiegatieele
lecittà
cittàin
incui
cuilavorano
lavorano
Algebra
Esempio #4
select
select Impiegato.Nome,
Impiegato.Nome,
Impiegato.Cognome,
Impiegato.Cognome,
Dipartimento.Citta
Dipartimento.Citta
from
fromImpiegato,
Impiegato,Dipartimento
Dipartimento
where
where Impiegato.Dipartimento
Impiegato.Dipartimento ==
Dipartimento.Nome
Dipartimento.Nome
Structured Query Language
34
Impiegato.Nome
Mario
Carlo
Giuseppe
Franco
Carlo
Lorenzo
Paola
Marco
Impiegato.Cognome
Rossi
Bianchi
Verdi
Neri
Rossi
Lanzi
Borroni
Franchi
Dipartimento.Citta
Milano
Milano
Milano
Roma
Milano
Milano
Milano
Milano
Risultato esempio #4
Structured Query Language
35
Risultato
SQL
Domanda
Esempio #5
Trovare
Trovareiinomi
nomieecognomi
cognomidegli
degli
impiegati
impiegatieele
lecittà
cittàin
incui
cuilavorano
lavorano
select
select I.Nome,
I.Nome,
Cognome,
Cognome,
Citta
Citta
from
from Impiegato
Impiegatoas
asI,I,
Dipartimento
Dipartimentoas
asDD
where
where I.Dipartimento
I.Dipartimento == D.Nome
D.Nome
I.Nome
Mario
Carlo
Giuseppe
Franco
Carlo
Lorenzo
Paola
Marco
I.Cognome D.Citta
Rossi
Milano
Bianchi
Milano
Verdi
Milano
Neri
Roma
Rossi
Milano
Lanzi
Milano
Borroni
Milano
Franchi
Milano
Structured Query Language
36
Domanda
Trovare
Trovareiinomi
nomieecognomi
cognomidegli
degli
impiegati
impiegati che
che lavorano
lavorano nell’ufficio
nell’ufficio
20
20 dell’Amministrazione
dell’Amministrazione
Algebra
ππNome,Cognome
(
Nome,Cognome (
σσUfficio=20
Ufficio=20∧∧Dipartimento
Dipartimento== ‘Amministrazione’
‘Amministrazione’
(Impiegato))
(Impiegato))
SQL
Esempio #6
select
select Nome,
Nome,Cognome
Cognome
from
from Impiegato
Impiegato
where
whereUfficio
Ufficio==20
20and
and
Dipartimento
Dipartimento==
‘Amministrazione’
‘Amministrazione’
Risultato
La clausola where può contenere
espressioni booleane con confronti
Nome
Cognome
Giuseppe Verdi
Structured Query Language
37
Risultato
SQL
Algebra
Domanda
Esempio #7
Trovare
Trovareiinomi
nomieecognomi
cognomidegli
degli
impiegati
impiegati dell’Amminstrazione
dell’Amminstrazione ee
della
della Distribuzione
Distribuzione
ππNome,Cognome
(
Nome,Cognome (
σσDipartimento
Dipartimento==‘Amministrazione’∨
‘Amministrazione’∨
Dipartimento
Dipartimento==‘Distribuzione’
‘Distribuzione’
(Impiegato))
(Impiegato))
select
select Nome,
Nome,Cognome
Cognome
from
from Impiegato
Impiegato
where
where Dipartimento
Dipartimento ==
‘Amministrazione’
‘Amministrazione’or
or
Dipartimento=‘Distribuzione’
Dipartimento=‘Distribuzione’
Nome
Cognome
Mario
Rossi
Giuseppe Verdi
Franco
Neri
Paola
Borroni
Structured Query Language
38
Algebra
Domanda
Esempio #8
Trovare
Trovareiinomi
nomidegli
degliimpiegati
impiegatidi
di
cognome
cognome‘Rossi’
‘Rossi’che
chelavorano
lavorano
nell’Amminstrazione
nell’Amminstrazioneeenella
nella
Distribuzione
Distribuzione
ππNome
(
Nome(
σσ(Dipartimento
(Dipartimento==‘Amministrazione’∨
‘Amministrazione’∨
Dipartimento
Dipartimento==‘Distribuzione’)
‘Distribuzione’)∧∧
Cognome=‘Rossi’
Cognome=‘Rossi’
Risultato
SQL
(Impiegato))
(Impiegato))
select
select Nome
Nome
from
from Impiegato
Impiegato
where
whereCognome
Cognome==‘Rossi’
‘Rossi’and
and
(Dipartimento
(Dipartimento ==
‘Amministrazione’
‘Amministrazione’or
or
Dipartimento=‘Distribuzione’)
Dipartimento=‘Distribuzione’)
Nome
Mario
Structured Query Language
39
Operatore like
Nella clausola where, oltre ai normali
operatori di confronto (=, <>, <, >, <=,
>=) si può usare anche l’operatore like,
con i due caratteri speciali:
_ rappresenta un carattere qualsiasi
Es.
% rappresenta una stringa di caratteri
arbitrari (anche la stringa vuota)
Nome
Nome like
like ‘ab%ba_’
‘ab%ba_’
è verificato sia dalla stringa
‘abcdedcbac’ che dalla stringa ‘abbaf’
Structured Query Language
40
Domanda
SQL
select
select **
from
from Impiegato
Impiegato
where
whereCognome
Cognomelike
like‘_o%i’
‘_o%i’
Trovare
Trovaregli
gliimpiegati
impiegatiililcui
cuinome
nome
contiene
contienedue
due‘a’
‘a’oppure
oppuredue
due‘e’
‘e’
SQL
Trovare
Trovaregli
gliimpiegati
impiegatiche
chehanno
hannoilil
cognome
cognomecon
conuna
una‘o’
‘o’in
inseconda
seconda
posizione
posizioneeeterminano
terminanoper
per‘i’‘i’
Domanda
Esempio #9
select
select **
from
from Impiegato
Impiegato
where
where (Nome
(Nome like
like ‘%a%a%’)
‘%a%a%’) or
or
(Nome
(Nomelike
like‘%e%e%’)
‘%e%e%’)
Structured Query Language
41
Cognome
Rossi
Rossi
Borroni
Cognome
Verdi
Borroni
Nome
Giuseppe
Paola
Dipartimento
Amministrazione
Amministrazione
Dipartimento
Amministrazione
Direzione
Amministrazione
Ufficio
20
75
Ufficio
10
14
75
Risultati esempio #9
Nome
Mario
Carlo
Paola
Structured Query Language
42
Stipendio
40
40
Stipendio
45
80
40
SQL
Interpretazione algebrica
select
select TT11.Attributo
.Attributo11,,...
...
TThh.Attributo
.Attributohh
from
fromTT11,,...,
...,TThh
where
where Condizione
Condizione
Algebra
Una interrogazione SQL può essere
tradotta in una espressione
dell’algrebra relazionale come segue
ππT1.Attributo1, ..., Th.Attributoh ((
T1.Attributo1, ..., Th.Attributoh
σσCondizione
(
Condizione (
TT11
TT22
...
...TThh))))
dove
simboleggia un prodotto
cartesiano (eventuali rinominazioni
che si rendessero necessarie sono
state omesse)
Structured Query Language
43
Gestione dei duplicati
Cognome
Rossi
Bianchi
Verdi
Neri
Rossi
Lanzi
Borroni
Franchi
Risultato 2
select
select distinct
distinct Cognome
Cognome
from
fromImpiegato
Impiegato
Risultato 1
SQL 1
select
select Cognome
Cognome
from
fromImpiegato
Impiegato
SQL 2
Devono essere eliminati esplicitamente
Cognome
Rossi
Bianchi
Verdi
Neri
Lanzi
Borroni
Franchi
Structured Query Language
44
Esempio #10
Con riferimento allo schema:
SQL
Algebra
Domanda
Persone(Nome, Età, Reddito)
Paternità(Padre, Figlio)
Maternità(Madre, Figlio)
Trovare
Trovareiipadri
padridi
dipersone
personeche
che
guadagnano
guadagnanopiù
piùdi
di20
20milioni
milioni
ππPadre
(Paternità
Padre(Paternità
Figlio=Nome
Figlio=Nome
(σ
(Persone)))
(σReddito>20
Reddito>20(Persone)))
select
selectdistinct
distinctPadre
Padre
from
from Persone
Persone Paternità
Paternità
where
whereFiglio
Figlio==Nome
Nomeand
and
Reddito
Reddito>>20
20
Structured Query Language
45
SQL
Algebra
Domanda
Esempio #11
Trovare
Trovarepadre
padreeemadre
madredi
diogni
ogni
persona
persona
ππFiglio,Padre,Madre
(Paternità
Figlio,Padre,Madre(Paternità
Figlio=Nome
Figlio=Nome
(ρ
(Maternità)))
(ρFiglio←Nome
Figlio←Nome(Maternità)))
select
select Paternita.Figlio,
Paternita.Figlio,
Padre,
Padre,Madre
Madre
from
fromMaternita
MaternitaPaternità
Paternità
where
where Paternita.Figlio
Paternita.Figlio ==
Maternita.Figlio
Maternita.Figlio
Structured Query Language
46
Domanda
Esempio #12
Trovare
Trovarele
lepersone
personeche
che
guadagnano
guadagnanopiù
piùdei
deirispettivi
rispettivipadri,
padri,
mostrandone
mostrandonenomi,
nomi,redditi,
redditi,eenomi
nomi
dei
deipadri
padri
Algebra
ππNome,Reddito,Padre(σ
(
Nome,Reddito,Padre(σReddito>RP
Reddito>RP(
Persone
Persone
Nome=Figlio
Nome=Figlio
Paternità
Paternità
P=NP
P=NP
SQL
ρρNP,EP,RP←Nome,Eta,Reddito(Persone)))
NP,EP,RP←Nome,Eta,Reddito(Persone)))
select
selectf.Nome,
f.Nome,f.Reddito,
f.Reddito,p.Reddito
p.Reddito
from
fromPersone
Personep,
p,Paternita,
Paternita,
Persone
Personeff
where
wherep.Nome
p.Nome==Padre
Padreand
and
Figlio
Figlio==f.Nome
f.Nomeand
and
f.Reddito
f.Reddito >> p.Reddito
p.Reddito
Structured Query Language
47