Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
SQL
SQL come Data Manipulation Language-
(SELECT FROM WHERE ORDER BY)
2
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Persone8775Luisa3585Sergio
3550Anna3026Filippo4050Luigi2060Franco4130Olga
4255Maria1525Aldo2127AndreaRedditoEtaNome
Maternita
FilippoAnnaAndreaMariaAldoMaria
OlgaAnnaLuigiLuisaMariaLuisaFiglioMadre
Paternita
AndreaFrancoAldoFranco
FilippoLuigiOlgaLuigiFrancoSergioFiglioPadre
Esempio 1
3
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Persone8775Luisa3585Sergio
3550Anna3026Filippo4050Luigi2060Franco4130Olga
4255Maria1525Aldo2127AndreaRedditoEtaNome
Interrogazione semplice
Nome e Reddito delle persone con meno di 30 anni.
4
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Persone8775Luisa3585Sergio
3550Anna3026Filippo4050Luigi2060Franco4130Olga
4255Maria1525Aldo2127AndreaRedditoEtaNome
Interrogazione semplice
Nome e Reddito delle persone con meno di 30 anni.
Attributi su cuiproiettare il risultato
Tabella/e da utilizzare
Condizione
5
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Interrogazione semplice (SQL e algebra)
SELECT Nome, Reddito FROM PersoneWHERE Eta < 30
Target list
Clausola WhereClausola From
π Nome, Reddito (σEta < 30 (Persone))
6
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Interrogazione semplice (SQL e algebra)
• Si esegue il prodotto cartesiano delle tabelle coinvolte (in questo caso, essendoci solo una tabella, il p.c. non viene effettuato).
• Si selezionano le righe (tuple) sulla base del predicato della clausola Where.
• Si proietta sugli attributi della target list.
SELECT Nome, Reddito FROM PersoneWHERE Eta < 30
Target list
Clausola WhereClausola From
7
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Persone8775Luisa3585Sergio
3550Anna3026Filippo4050Luigi2060Franco4130Olga
4255Maria1525Aldo2127AndreaRedditoEtaNome
Prodotto cartesiano
SELECT Nome, Reddito FROM PersoneWHERE Eta < 30
8
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Persone8775Luisa3585Sergio
3550Anna3026Filippo4050Luigi2060Franco4130Olga
4255Maria1525Aldo2127AndreaRedditoEtaNome
Selezione
SELECT Nome, Reddito FROM PersoneWHERE Eta < 30
9
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Persone8775Luisa3585Sergio
3550Anna3026Filippo4050Luigi2060Franco4130Olga
4255Maria1525Aldo2127AndreaRedditoEtaNome
Proiezione
SELECT Nome, RedditoFROM PersoneWHERE Eta < 30
10
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Risultato
SELECT Nome, Reddito FROM PersoneWHERE Eta < 30 30Filippo
15Aldo21AndreaRedditoNome
11
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
SELECT: abbreviazioni
SELECT *FROM Persone
Tutti gli attributi
Se manca il WHERE,equivalente a: WHERE true
12
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Impiegato
4516DistribuzioneNeriFranco8014DirezioneRossiCarlo737DirezioneLanziLorenzo4075AmministrazioneBorroniPaola4620ProduzioneFrancoMarco
4020AmministrazioneVerdiGiuseppe3620ProduzioneBianchiCarlo4510AmministrazioneRossiMarioStipendioUfficioDipartCognomeNome
MilanoVia Tito LivioDirezioneMilanoVia MoroneRicerca
RomaVia SegreDistribuzioneTorinoPiazza LavaterProduzioneMilanoVia Tito LivioAmministrazioneCittaIndirizzoNome
Dipartimento
13
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Target list: selezione senza proiezione
select *from Impiegatowhere Cognome = 'Rossi’• (σCognome=Rossi(Impiegato))
8014DirezioneRossiCarlo4510AmministrazioneRossiMarioStipendioUfficioDipartCognomeNome
14
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Target List: selezione con proiezione
select Nome, Cognome, Stipendiofrom Impiegatowhere Cognome = 'Rossi’• π Nome, Cognome, Stipendio(σCognome=Rossi(Impiegato))
80RossiCarlo45RossiMarioStipendioCognomeNome
15
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Target List: proiezione senza selezione
select Nome, Cognomefrom Impiegato• π Nome, Cognome (Impiegato))
NeriFrancoRossiCarloLanziLorenzoBorroniPaolaFrancoMarco
VerdiGiuseppeBianchiCarloRossiMarioCognomeNome
16
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Target List: proiezione con/senza duplicati
select Cognomefrom Impiegato
select distinct Cognomefrom Impiegato
NeriRossiLanziBorroniFranco
VerdiBianchiRossiCognome
NeriLanziBorroniFranco
VerdiBianchiRossiCognome
17
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Target List: espressioni
select Stipendio/12 AS StipendioMensilefrom Impiegatowhere Cognome = ‘Bianchi’
3.00StipendioMensile
18
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Clausola Where: disgiunzione
select Nome, Cognomefrom Impiegatowhere Dipart = ‘Amministrazione’ OR
Dipart = ‘Produzione’
BorroniPaolaFrancoMarco
VerdiGiuseppeBianchiCarloRossiMarioCognomeNome
19
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Clausola Where: condizione complessa
select Nomefrom Impiegatowhere Cognome= ‘Rossi’ AND
(Dipart = ‘Amministrazione’ ORDipart = ‘Produzione’)
MarioNome
20
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Clausola Where: operatore IN
select *from Impiegatowhere Cognome = ‘Rossi’ AND
Dipart IN (‘Amministrazione’, ‘Produzione’)
MarioNome
21
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Clausola Where: operatore LIKE
select *from Impiegatowhere Cognome LIKE ‘_o%i’
8014DirezioneRossiCarlo4075AmministrazioneBorroniPaola
4510AmministrazioneRossiMarioStipendioUfficioDipartCognomeNome
un carattere qualsiasi
stringa qualsiasi
22
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Clausola Where: operatore BETWEEN
select *from Impiegatowhere Stipendio BETWEEN 40 AND 45
4516DistribuzioneNeriFranco4075AmministrazioneBorroniPaola
4020AmministrazioneVerdiGiuseppe4510AmministrazioneRossiMarioStipendioUfficioDipartCognomeNome
23
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Clausola Where: valori nulli
“Impiegati che hanno o potrebbero avere uno stipendio minore di 50 milioni”
8014DirezioneRossiCarlonull75AmministrazioneBorroniPaola
4510AmministrazioneRossiMarioStipendioUfficioDipartCognomeNome
Imp
24
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Clausola Where: valori nulli
select *from Impwhere Stipendio < 50 or Stipendio IS NULL
null75AmministrazioneBorroniPaola4510AmministrazioneRossiMarioStipendioUfficioDipartCognomeNome
25
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join
• Il Join e’ un operatore fondamentale, in quanto permette di utilizzare congiuntamente le informazioni contenute in piu’ tabelle.
• In SQL un join si puo’ formulare utilizzando i costrutti visti finora (From – Where), che permettono di compiere prodotti cartesiani e selezioni.
• Esistono anche operatori specifici.• Ripassiamo la semantica del join.
26
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join naturale
FilippoAnnaAndreaMariaAldoMaria
OlgaAnnaLuigiLuisaMariaLuisaFiglioMadre
AndreaFrancoAldoFranco
FilippoLuigiOlgaLuigiFrancoSergioFiglioPadre
AldoAndreaFilippoOlgaFiglio
MariaMariaAnnaAnnaMadre
FrancoFranco
LuigiLuigiPadre
27
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Left Outer Join
nullFrancoSergio
AldoAndreaFilippoOlga
Figlio
MariaMariaAnnaAnna
Madre
FrancoFranco
LuigiLuigi
Padre
FilippoAnnaAndreaMariaAldoMaria
OlgaAnnaLuigiLuisaMariaLuisaFiglioMadre
AndreaFrancoAldoFranco
FilippoLuigiOlgaLuigiFrancoSergioFiglioPadre
28
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Full Outer Join
MariaAldoFrancoLuisaMarianullLuisaLuiginull
nullFrancoSergio
AndreaFilippoOlga
Figlio
MariaAnnaAnna
Madre
FrancoLuigiLuigi
Padre
FilippoAnnaAndreaMariaAldoMaria
OlgaAnnaLuigiLuisaMariaLuisaFiglioMadre
AndreaFrancoAldoFranco
FilippoLuigiOlgaLuigiFrancoSergioFiglioPadre
29
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join naturale
• “Padre e Madre di ogni persona”• Paternita Maternitaselect Paternita.Figlio, Padre, Madrefrom Paternita, Maternitawhere Paternita.Figlio = Maternita.Figlio
30
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Selezione, Proiezione e Join
“I padri di persone che guadagnano più diventi milioni”• πPadre(Paternita (σReddito>20 (Persone)))
select distinct Padrefrom Paternita, Personewhere Figlio = Nome AND Reddito > 20
Figlio = Nome
31
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join di una relazione con se stessa (algebra)
“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)
(paternita persone)))Figlio = Nome
NP=Padre
32
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join di una relazione con se stessa (algebra)
πNome, Reddito, RP (σReddito>RP
(ρNP,EP,RP ← Nome,Eta,Reddito(persone)
(paternita persone)))Figlio = Nome
NP=Padre
AldoAndreaFilippoOlgaFrancoNome
2527263060Eta
AldoAndreaFilippoOlgaFrancoFiglio
1521304120Reddito
FrancoFranco
LuigiLuigiSergioPadre
33
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join di una relazione con se stessa (algebra)
πNome, Reddito, RP (σReddito>RP
(ρNP,EP,RP ← Nome,Eta,Reddito(persone)
(paternita persone)))Figlio = Nome
NP=Padre
FrancoFrancoLuigiLuigiSergioNP
6060505085EP
2020404035RP
AldoAndreaFilippoOlgaFrancoNome
2527263060Eta
AldoAndreaFilippoOlgaFrancoFiglio
1521304120Reddito
FrancoFranco
LuigiLuigiSergioPadre
34
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join di una relazione con se stessa (algebra)
πNome, Reddito, RP (σReddito>RP
(ρNP,EP,RP ← Nome,Eta,Reddito(persone)
(paternita persone)))Figlio = Nome
NP=Padre
FrancoFrancoLuigiLuigiSergioNP
6060505085EP
2020404035RP
AldoAndreaFilippoOlgaFrancoNome
2527263060Eta
AldoAndreaFilippoOlgaFrancoFiglio
1521304120Reddito
FrancoFranco
LuigiLuigiSergioPadre
35
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join di una relazione con se stessa (algebra)
πNome, Reddito, RP (σReddito>RP
(ρNP,EP,RP ← Nome,Eta,Reddito(persone)
(paternita persone)))Figlio = Nome
NP=Padre
2141Reddito
2040RP
AndreaOlgaNome
36
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join di una relazione con se stessa (SQL)
“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)
(paternita persone)))
select F.Nome, F.Reddito, P.Redditofrom Paternita, Persone P, Persone Fwhere Figlio = F.Nome AND P.Nome=Padre
AND F.Reddito > P.Reddito
Figlio = Nome
NP=Padre
37
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Stessa cosa, con ridenominazione risultato
“Le persone che guadagnano più dei rispettivi padri. Mostrare nome, reddito e reddito delpadre”select Figlio,
F.Reddito AS Reddito, P.Reddito AS RedditoPadre
from Paternita, Persone P, Persone Fwhere Figlio = F.Nome AND P.Nome=Padre
AND F.Reddito > P.Reddito
38
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join
• Vediamo ora una sintassi specifica per il join.• E’ possibile specificare il join interamente
all’interno della clausola From.• Vari tipi di join possono essere formulati:
– Naturale (esplicito o implicito).– Right outer join.– Left outer join.– Full outer join.
39
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join esplicito
• “Padre e Madre di ogni persona”• Paternita Maternita
select Paternita.Figlio, Padre, Madrefrom Paternita join Maternita
on Paternita.Figlio = Maternita.Figlio
40
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join naturale implicito
• “Padre e Madre di ogni persona”• Paternita Maternita
select Paternita.Figlio, Padre, Madrefrom Paternita natural join Maternita
41
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Left Outer Join esplicito
• “Padre e, se nota, Madre di ogni persona”• Paternita Maternita
select Paternita.Figlio, Padre, Madrefrom Paternita left join Maternita
on Paternita.Figlio = Maternita.Figlio
Figlio = NomeLEFT
42
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Left Outer Join implicito
• “Padre e, se nota, Madre di ogni persona”• Paternita Maternita
select Paternita.Figlio, Padre, Madrefrom Paternita left natural join Maternita
LEFT
43
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Full Outer Join
• “Padre e, se nota, Madre di ogni persona”• Paternita Maternita
select Paternita.Figlio, Padre, Madrefrom Paternita full join Maternita
on Paternita.Figlio = Maternita.Figlio
Figlio = NomeFULL
44
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join esplicito con alias
• “Nome cognome e città lavorativa di ogni impiegato”
select I.Nome, Cognome, Cittafrom Impiegato I join Dipartimento D
on Dipart = D.Nome
45
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Join esplicito con alias: risultato
RomaNeriFrancoMilanoRossiCarloMilanoLanziLorenzoMilanoBorroniPaolaTorinoFrancoMarco
MilanoVerdiGiuseppeTorinoBianchiCarloMilanoRossiMarioCittaCognomeNome
46
SQL© Matteo Magnani, Danilo Montesi – Università di Bologna
Ordinamento del risultato
• A differenza del modello relazionale, in cui le tuple non sono ordinate, le righe di una tabella possono esserlo.
• Talvolta la possibilità di ordinare il risultato di un’interrogazione è importante. Ad esempio, se si vogliono gli stipendi in ordine dal minore al maggiore.
• SQL mette a disposizione la clausola ORDER BY.