SQL come Data Manipulation Language (SELECT FROM WHERE ... · 2 SQL © Matteo Magnani, Danilo...

47
SQL © Matteo Magnani, Danilo Montesi – Università di Bologna SQL SQL come Data Manipulation Language - (SELECT FROM WHERE ORDER BY)

Transcript of SQL come Data Manipulation Language (SELECT FROM WHERE ... · 2 SQL © Matteo Magnani, Danilo...

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.

47

SQL© Matteo Magnani, Danilo Montesi – Università di Bologna

Ordinamento del risultato

select Cognome, Nome, Stipendio from Impiegatowhere Dipartimento LIKE ‘Amm%’ORDER BY Stipendio DESC, Cognome ASC

VerdiBorroniRossiCognome

40Paola40Giuseppe

45MarioStipendioNome

Default