Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni83 pagine

6 - SQL-DML

Il documento tratta del linguaggio SQL, il più diffuso per le basi di dati relazionali, nato nel 1973 e soggetto a vari standard nel tempo. Viene descritto il DML (Data Manipulation Language) e il DDL (Data Definition Language), con esempi di query SQL per interrogare e manipolare i dati. Inoltre, si evidenziano le differenze tra le implementazioni di SQL nei vari DBMS relazionali commerciali.

Caricato da

homida9916
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni83 pagine

6 - SQL-DML

Il documento tratta del linguaggio SQL, il più diffuso per le basi di dati relazionali, nato nel 1973 e soggetto a vari standard nel tempo. Viene descritto il DML (Data Manipulation Language) e il DDL (Data Definition Language), con esempi di query SQL per interrogare e manipolare i dati. Inoltre, si evidenziano le differenze tra le implementazioni di SQL nei vari DBMS relazionali commerciali.

Caricato da

homida9916
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

Basi di Dati - VI

Corso di Laurea in Informatica


Anno Accademico 2024/2025

Alessandra Raffaetà
raffaeta@[Link]

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il linguaggio SQL
Il linguaggio SQL 3

Linguaggio più diffuso per basi di dati relazionali

Nasce nel 1973, all’IBM per il sistema relazionale System/R


- SEQUEL (Structured English QUEry Language) -> SQL
Intorno agli anni ’80 inizia un processo di standardizzazione
- SQL-84, SQL-89, ..., SQL-99, SQL:2003, SQL:2006

Le implementazioni nei vari DBMS relazionali commerciali

includono funzionalità non previste dallo standard

non includono funzionalità previste dallo standard

implementano funzionalità previste dallo standard ma in modo diverso :-(

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il linguaggio SQL (cont.) 4

Linguaggio dichiarativo basato su Calcolo Relazionale su Ennuple e Algebra


Relazionale

relazioni -> tabelle

ennuple -> record/righe

attributi -> campi/colonne

Le tabelle possono avere righe duplicate (una tabella è un multinsieme), per

efficienza: eliminare i duplicati costa (n log(n))

flessibilità:
- può essere utile vedere i duplicati
- possono servire per le funzioni di aggregazione (es. media)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il linguaggio SQL (cont.) 5

Il linguaggio comprende

DML (Data Manipulation Language)


ricerche e/o modifiche interattive -> interrogazioni o query

DDL (Data Definition Language)


definizione (e amministrazione) della base di dati

uso di SQL in altri linguaggi di programmazione

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il DML di SQL
Un assaggio ... 7

Consideriamo lo schema relazionale

Tutor

Esami
Studenti
Codice: string <<PK>>
Nome: string
Candidato: string <<FK(Studenti)>> <<not null>>
Cognome: string Candidato
Materia: string
Matricola: string <<PK>>
CodDoc: string <<FK(Docenti)>> <<not null>>
Nascita: year
Data: date
Provincia: string
Voto: int
Tutor: string <<FK(Studenti)>>
Lode: bool

CodDoc

Docenti
CodDoc: string <<PK>>
Nome: string
Cognome: string

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Un assaggio ... 8

SELECT [Link], [Link], [Link]


FROM Studenti s JOIN Esami e ON [Link] = [Link]
WHERE [Link]='BD' AND [Link]=30

SELECT [Link] AS Nome,


EXTRACT(YEAR FROM CURRENT_DATE) - [Link] AS Età,
0 AS NumeroEsami
FROM Studenti s
WHERE NOT EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link])

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il comando SELECT 9

Il comando base dell’SQL:

SELECT [DISTINCT] Attributi


FROM Tabelle
[WHERE Condizione]

Tabelle ::= Tabella [Ide] {, Tabella [Ide] }

Condizione può essere una combinazione booleana (AND, OR, NOT) di


(dis)uguaglianze tra attributi (=, <, <=, ...) ... ma anche molto altro.

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il comando SELECT (cont.) 10

Semantica: prodotto + restrizione + proiezione.

SELECT *
FROM R1 JOIN R2 ON C2
o
n C2 R2 · · · o
n Cn Rn )
<latexit sha1_base64="0XzTOqb0t4hM9PKHjMFjzOlOUJw=">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</latexit>

… JOIN Rn ON Cn C (R1

WHERE C

SELECT DISTINCT A1, …, An


FROM R1 JOIN R2 ON C2
… JOIN Rn ON Cn
b
o
n C2 R2 · · · o
nCn Rn )))
<latexit sha1_base64="Qb8g2G32nwSBzsnJYwHNfGr7H8s=">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</latexit>

WHERE C (⇡A 1 ,··· ,An


( C (R1

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Esempi Elementari 11

SELECT *
FROM Studenti;

SELECT *
FROM Esami
WHERE Voto > 26;

SELECT DISTINCT Provincia


FROM Studenti;

SELECT *
FROM Studenti JOIN Esami ON Matricola = Candidato;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Esempi: Proiezione 12

Trovare il nome, la matricola e la provincia degli studenti:


SELECT Nome, Matricola, Provincia
FROM Studenti

Nome Matricola Provincia

Paolo 71523 VE

Anna 76366 PD

Chiara 71347 VE

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Esempi 13

Studenti Nome Cognome Matricola Provincia Nascita Tutor


Paolo Verdi 71523 VE 1986 NULL
Chiara Scuri 71346 VE 1987 71523
Paolo Poli 71576 PD 1985 76366
Anna Rossi 76366 PD 1987 NULL
Giorgio Zeri 71347 VE 1986 76366

Esami Codice Materia Candidato* Data Voto Lode CodDoc*


B112 BD 71523 08.07.06 27 N AM1
F31 FIS 76366 08.07.07 30 N GL1
B247 BD 76366 18.07.07 30 S AM1
A143 ALG 71523 28.12.06 25 N NG2
A213 ALG 71576 19.07.07 21 N NG2
F45 FIS 71576 29.07.07 22 N GL1

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Esempi: Restrizione 14

Trovare tutti i dati degli studenti di Venezia:

SELECT * Nome Cognome ... Provincia ...


FROM Studenti Paolo Verdi ... VE ...
WHERE Provincia = 'VE‘; Chiara Scuri ... VE ...

Trovare nome, matricola e anno di nascita degli studenti di Venezia


(Proiezione+Restrizione):

SELECT Nome, Matricola, Nascita


FROM Studenti
WHERE Provincia = 'VE'; Nome Matricola Nascita
Paolo 71523 1989

Chiara 71346 1987

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Prodotto e Giunzioni 15

Tutte le possibili coppie (Studente, Esame):

SELECT *
FROM Studenti, Esami
Tutte le possibili coppie (Studente, Esame sostenuto dallo studente):

SELECT *
FROM Studenti JOIN Esami ON Matricola = Candidato

Nome dello stuedente e data degli esami per studenti che hanno superato l’esame
di BD con 30:

SELECT Nome, Data


FROM Studenti JOIN Esami ON Matricola = Candidato
WHERE Materia='BD' AND Voto=30

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Qualificazione: notazione con il punto 16

Se si opera sul prodotto di tabelle con attributi omonimi occorre qualificarli, ovvero
identificare la tabella alla quale ciascun attributo si riferisce

Notazione con il Punto. Utile se si opera su tabelle diverse con attributi aventi lo
stesso nome
[Link]

Es. generare una tabella che riporti Codice, Nome, Cognome dei docenti e Codice
degli esami corrispondenti

SELECT [Link], [Link], [Link],


[Link]
FROM Esami JOIN Docenti ON [Link] = [Link]

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Qualificazione: notazione con il punto e alias 17

Alias

Si associa un identificatore alle relazioni in gioco

Essenziale se si opera su più copie della stessa relazione (-> associazioni


ricorsive!)

Es. generare una tabella che contenga cognomi e matricole degli studenti e dei
loro tutor

SELECT [Link], [Link], [Link], [Link]


FROM Studenti s JOIN Studenti t ON [Link] = [Link]

La qualificazione è sempre possibile e può rendere la query più leggibile

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Alias e query ricorsive 18

Gli alias permettono di avere 'ricorsività' a un numero arbitrario di livelli.


Esempio:
Persone (Id, Nome, Cognome, IdPadre, Lavoro)
PK(Id), IdPadre FK(Persone)

SELECT [Link], [Link],


Cognome e nome delle
[Link], [Link]
persone (e dei nonni) che
FROM Persone n, fanno lo stesso lavoro dei
nonni
Persone p,
Persone f
WHERE [Link] = [Link] AND
[Link] = [Link] AND
[Link] = [Link]

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Lista degli attributi 19

Attributi ::= *
| Expr [[AS] Nome] {, Expr [[AS] Nome] }

Expr AS Nome: dà il nome Nome alla colonna ottenuta come risultato


dell’espressione Expr

usato per rinominare attributi o più comunemente per dare un nome ad un attributo
calcolato

SELECT Nome, Cognome, EXTRACT(YEAR FROM CURRENT_DATE)-Nascita AS Età


FROM Studenti
WHERE Provincia=’VE’

Nota: Un attributo A di una tabella “R x” si denota come: A oppure R.A oppure


x.A

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Sintassi delle espressioni 20

Le espressioni possono includere operatori aritmetici (o altri operatori e funzioni sui


tipi degli attributi) o funzioni di aggregazione

Expr ::= [Ide.]Attributo | Const


| ( Expr ) | [-] Expr [Op Expr]
| COUNT(*)
| AggrFun ( [DISTINCT] [Ide.]Attributo)

AggrFun ::= SUM | COUNT | AVG | MAX | MIN

NB:si usano tutte funzioni di aggregazione (-> produce un’unica riga) o nessuna.

Le funzioni di aggregazione NON possono essere usate nella clausola WHERE

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


ESEMPI: funzioni di aggregazione 21

Numero di elementi della relazione Studenti


SELECT COUNT(*)
FROM Studenti

Anno di nascita minimo, massimo e medio degli studenti:


SELECT MIN(Nascita), MAX(Nascita), AVG(Nascita)
FROM Studenti

è diverso da
SELECT MIN(Nascita), MAX(Nascita), AVG(DISTINCT Nascita)
FROM Studenti

Nota: non ha senso ... (vedi GROUP BY)

SELECT Candidato, AVG(Voto)


FROM Esami

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


ESEMPI: funzioni di aggregazione 22

Numero di Studenti che hanno un Tutor

SELECT COUNT(Tutor)
FROM Studenti

Numero di studenti che fanno i Tutor

SELECT COUNT(DISTINCT Tutor)


FROM Studenti

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola FROM (reprise) 23

Le tabelle si possono combinare usando:

“,” (prodotto): FROM T1,T2

Giunzioni di vario genere

Tabelle ::= Tabella [Ide] {, Tabella [Ide] } |

Tabella Giunzione Tabella


[ USING (Attributi) | ON Condizione ]

Giunzione ::= [CROSS|NATURAL] [LEFT|RIGHT|FULL] JOIN

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola FROM: giunzioni 24

CROSS JOIN
realizza il prodotto
SELECT *
FROM Esami CROSS JOIN Docenti

NATURAL JOIN
è il join naturale
SELECT *
FROM Esami NATURAL JOIN Docenti;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola FROM: giunzioni 25

JOIN ... ON Condizione


effettua il join su di una condizione (es. indica quali valori devono essere uguali)
SELECT *
FROM Studenti s JOIN Studenti t ON [Link] = [Link];

JOIN ... USING Alcuni attributi comuni


come il natural join, ma solo sugli attributi comuni elencati

SELECT [Link] AS CognomeStud,[Link],[Link] AS CognomeDoc


FROM Studenti s JOIN Esami e ON [Link] = [Link]
JOIN Docenti d USING (CodDoc);

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola FROM: giunzioni 26

LEFT, RIGHT, FULL


se precedono JOIN, effettuano la corrispondente giunzione esterna

Esempio: Esami di tutti gli studenti, con nome e cognome relativo, elencando
anche gli studenti che non hanno fatto esami

SELECT Nome, Cognome, Matricola, Data, Materia


FROM Studenti s LEFT JOIN Esami e
ON [Link]=[Link];

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola FROM: giunzioni 27

Risultato

+---------+---------+-----------+------------+---------+
| Nome | Cognome | Matricola | Data | Materia |
+---------+---------+-----------+------------+---------+
| Chiara | Scuri | 71346 | NULL | NULL |
| Giorgio | Zeri | 71347 | NULL | NULL |
| Paolo | Verdi | 71523 | 2006-07-08 | BD |
| Paolo | Verdi | 71523 | 2006-12-28 | ALG |
| Paolo | Poli | 71576 | 2007-07-19 | ALG |
| Paolo | Poli | 71576 | 2007-07-29 | FIS |
| Anna | Rossi | 76366 | 2007-07-18 | BD |
| Anna | Rossi | 76366 | 2007-07-08 | FIS |
+---------+---------+-----------+------------+---------+

Nota: compaiono anche ennuple corrispondenti a studenti che non hanno fatto
esami, completate con valori nulli.

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola ORDER BY 28

Inserendo la clausola
ORDER BY Attributo [DESC|ASC] {, Attributo [DESC|ASC] }
si può far sì che la tabella risultante sia ordinata, secondo gli attributi indicati
(ordine lessicografico) in modo crescente (ASC) [default] o decrescente (DESC):
e.g.

SELECT Nome,Cognome
FROM Studenti
WHERE Provincia=’VE’
ORDER BY Cognome DESC, Nome DESC

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Operatori insiemistici 29

SQL comprende operatori insiemistici (UNION, INTERSECT ed EXCEPT) per


combinare i risultati di tabelle con lo stesso numero di colonne e con domini
compatibili.

Es: Nome, cognome e matricola degli studenti di Venezia e di quelli che hanno
preso più di 28 in qualche esame

SELECT Nome, Cognome, Matricola


FROM Studenti
WHERE Provincia='VE'
UNION
SELECT Nome, Cognome, Matricola
FROM Studenti JOIN Esami ON Matricola=Candidato
WHERE Voto>28;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Operatori insiemistici 30

A differenza dell’algebra relazionale che richiede schemi identici, per gli operatori
insiemistici in SQL si richiede solo che gli attributi siano in pari numero e che
abbiano domini compatibili.

Esempio: Le matricole degli studenti che non sono tutor

SELECT Matricola
FROM Studenti
EXCEPT
SELECT Tutor
FROM Studenti

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Operatori insiemistici 31

Effettuano la rimozione dei duplicati, a meno che non sia esplicitamente richiesto il
contrario con l’opzione ALL

Es: Nome e cognome degli studenti che hanno preso in un esame 18 e in un altro
esame 30

SELECT Nome, Cognome, Matricola


FROM Studenti JOIN Esami ON Matricola=Candidato
WHERE Voto = 18
INTERSECT ALL
SELECT Nome, Cognome, Matricola
FROM Studenti JOIN Esami ON Matricola=Candidato
WHERE Voto = 30;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il valore NULL 32

Il valore di un campo di un'ennupla può mancare per varie ragioni

attributo non applicabile

attributo non disponibile

...

SQL fornisce il valore speciale NULL per tali situazioni.

La presenza di NULL introduce dei problemi:

la condizione "Voto=28" è vera o falsa quando il Voto è NULL?


è vero NULL=NULL?
Cosa succede degli operatori AND, OR e NOT?

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il valore NULL 33

Dato che NULL può avere diversi significati


- NULL=0 non è né vero, né falso, ma unknown
- anche NULL=NULL è unknown
Occorre una logica a 3 valori (vero, falso e unknown).

p q p∧q p∨q
T T T T
T F F T
p ¬p T U U T
T F F T F T
F T F F F F
U U F U F U
U T U T
U F F U
U U U U

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il valore NULL 34

Va definita opportunamente la semantica dei costrutti. Ad es.


SELECT ... FROM ...
WHERE COND
restituisce solo le ennuple che rendono vera la condizione COND.

Necessario un predicato per il test di nullità


Expr IS [NOT] NULL
è vero se Expr (non) è NULL

Nota che NULL=NULL vale UNKNOWN!!

Nuovi operatori sono utili (es. giunzioni esterne)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Il valore NULL: Esempio 35

Gli studenti che non hanno Tutor


SELECT *
FROM Studenti
WHERE Tutor IS NULL

+---------+---------+-----------+---------+-----------+-------+
| Nome | Cognome | Matricola | Nascita | Provincia | Tutor |
+---------+---------+-----------+---------+-----------+-------+
| Anna | Rossi | 76366 | 1987 | PD | NULL |
| Paolo | Verdi | 71523 | 1986 | VE | NULL |
+---------+---------+-----------+---------+-----------+-------+
Cosa ritorna?
SELECT *
FROM Studenti
WHERE Tutor = NULL

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Altri operatori per i valori NULL 36

Expr1 IS [NOT] DISTINCT FROM Expr2


è vero se i due valori sono diversi, o uno solo dei due è NULL;
è falso quando i due valori sono uguali anche nel caso in cui sono entrambi
uguali a NULL.

COALESCE(Expr1, …, Exprn)
Viene usato per trasformare un valore NULL in un valore non nullo. Valuta le
espressioni in sequenza, da sinistra verso destra. Viene restituito il primo valore
trovato diverso da NULL. L’operatore ritorna NULL se tutte le espressioni hanno
valore NULL.

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Altre condizioni: between 37

Su valori numerici

WHERE Expr BETWEEN Expr AND Expr

SELECT *
FROM Studenti
WHERE Matricola BETWEEN 71000 AND 72000;

+---------+---------+-----------+---------+-----------+-------+
| Nome | Cognome | Matricola | Nascita | Provincia | Tutor |
+---------+---------+-----------+---------+-----------+-------+
| Chiara | Scuri | 71346 | 1987 | VE | 71523 |
| Giorgio | Zeri | 71347 | 1986 | VE | 76366 |
| Paolo | Verdi | 71523 | 1986 | VE | NULL |
| Paolo | Poli | 71576 | 1985 | PD | 76366 |
+---------+---------+-----------+---------+-----------+-------+

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Pattern Matching 38

Sulle stringhe

WHERE Expr LIKE pattern

Il pattern può contenere caratteri e i simboli speciali

% sequenza di 0 o più caratteri qualsiasi

_ un carattere qualsiasi

Studenti con il nome di almeno due caratteri che inizia per A

SELECT *
FROM Studenti
WHERE Nome LIKE 'A_ % '

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Pattern Matching 39

Studenti con il nome che inizia per ‘A’ e termina per ‘a’ oppure ‘i’

SELECT *
FROM Studenti
WHERE Nome LIKE 'A%a' OR Nome LIKE ‘A%i’

stessa query usando le espressioni regolari (sintassi Oracle)

SELECT *
FROM Studenti
WHERE REGEXP_LIKE (Nome,'^A.*(a|i)$’)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola WHERE 40

La clausola WHERE è piu complicata di come l’abbiamo vista finora.

Combinazione booleana (AND, OR, NOT) di predicati tra cui:

Expr Comp Expr

Expr Comp ( Sottoselect che torna esattamente un valore)

Expr [NOT] IN ( Sottoselect ) (oppure IN (v1,..,vn))

[NOT] EXISTS (Sottoselect)

Expr Comp (ANY | ALL) (Sottoselect)

Comp: <, =, >, <>, <=, >= (e altri)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Select annidate 41

Alcune interrogazioni richiedono di estrarre dati dalla BD e usarli in operazioni di


confronto

E` possibile specificare select annidate, inserendo nel campo WHERE una


condizione che usa una select (che a sua volta può contenere sottoselect ...)

Si può

eseguire confronti con l’insieme di valori ritornati dalla sottoselect (sia quando
questo è un singoletto, sia quando contiene più elementi)

verificare la presenza/assenza di valori dati nell’insieme ritornato dalla


sottoselect

verificare se l’insieme di valori ritornato dalla sottoselect è o meno vuoto

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Sottoselect con un solo valore 42

Nel campo WHERE

Expr Comp ( Sottoselect che torna esattamente un valore)

Studenti che vivono nella stessa provincia dello studente con matricola 71346,
escluso lo studente stesso

SELECT *
FROM Studenti
WHERE (Matricola <> ’71346’) AND
Provincia = (SELECT Provincia
FROM Studenti
WHERE Matricola=’71346’)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Sottoselect con un solo valore 43

E` indispensabile la sottoselect?

SELECT altri.*
FROM Studenti altri, Studenti s
WHERE [Link] <> '71346' AND
[Link] = '71346' AND [Link] = [Link]

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Sottoselect con un solo valore 44

... è un join

SELECT altri.*
FROM Studenti altri JOIN Studenti s USING (Provincia)
WHERE [Link] <> '71346' AND
[Link] = '71346’;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione 45

Le interrogazioni su di una associazione multivalore vanno quantificate

HaSostenuto Candidato
Studenti Esami Studenti Esami

Non: gli studenti che hanno preso 30 (ambiguo!)


ma:

Gli studenti che hanno preso sempre (solo, tutti) 30: universale

Gli studenti che hanno preso qualche (almeno un) 30: esistenziale

Gli studenti che non hanno preso mai 30 (senza alcun 30): universale

Gli studenti che non hanno preso sempre 30: esistenziale

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione 46

Universale negata = esistenziale:

Non tutti i voti sono =30 (universale) = esiste un voto ≠30 (esistenziale)

Più formalmente

¬⇥x.P (x) ⇤x.¬P (x)

Esistenziale negata = universale:

Non esiste un voto diverso da 30 (esistenziale) = Tutti i voti sono uguali a 30


(universale)

Più formalmente

¬9x.¬P (x) ⌘ 8x.P (x)


<latexit sha1_base64="Fd6YLVB2K2djuHrlXU773W1v+78=">AAAUJXic3Vhbb9vIFVbS21bbS3b92JdpvQGSgpFJWXbipgziTdyNgVxcJ052VxKM0XBEDTwcMjNDWwrDP9I/0L/R1xboW7FAnvpXeoakZA7NAJtkW+xWgGHqXL/vzJnDGU0SzpR23TeXLv/oxz/56c8++nn341/88le/vvLJp89VnEpCj0jMY/nlBCvKmaBHmmlOv0wkxdGE0xeTk3tG/+KUSsVi8UwvEjqOcCjYlBGsQXR8ZfDZSNAQjegccik076Hi+8G1+XUQvkzZKRpNY4k5Nzoj/gx1j6+suz23+KCLD171sN6pPgfHn3z6ZhTEJI2o0IRjpYaem+hxhqVmhNO8O0oVTTA5wSEdwqPAEVXjrKCXo6sgCRCggD+hUSG1PNRpWHnMS5fuKKBTqEjxLSNUppxikWckWpzkmdvbGThuz/Mc13EbtvexPDmkQZ7JcGIst7cqI0HPSBxFWATZCIchS4XG+dAbZyNN57rhvO7ledcO/GjxkIUz/RXlPD6rwi8rBWB2tm9t928OttydW+7mTh8ktwab3ubN/tZgx/V2tj0Lwu+zUSjpQr1MsaR5HcITiUVoRBMOxakMctSt1yvDkVKLaAKVjbCeqabOCNt0w1RPb40zJpJUU0HKhZmmHOkYmd5CAZOUaL6AB0wkg7VFZIYlJho60Mqi2ckra9UzlU6mLLRlET6hLJjnNvoknCY81qq0NZE4m0gsF5ma4YQqh2BO3qbshTSOqJaMOAGsjCy2gepFsHJMhC0xsZTxmbKMEyhMFMtkBh7OBFCFMk5FoJwkVsyYGPmU6VYMgYmmJQWcZegewME2b4IFobxBW+NJyrGc26aTOD4BjcoRapROnsawyLa1jhOCEwDWvVp90N6hZbFxpGCtNiSeTjHg2jDob1DZz1ce4NPtLgOgg71D9MXe4e69B/t76N7D3adP97sj46T0gtOMwuxZIBEHNPeHZvf6IxHLCHPFXtFxZUl1ZZcwolNJN3qFs59tpJpxtUHnlPjZSAGkiPFFbvZWPckpJbumlJCiCKNnjJw46HzJ/Gy5vo558LFGy6XqIuShM6ZnCLa1CVILMc7ihAoEzQJ7ilO040JqpxvEKUxX6HGlzTr5Xm+QaAepWSxhW6A7PtrqbRlJ10xiYrIgH2UVHAoRILmuKSQ+c8z8BhyBni3jWQPDCj8w4fNxaw28/1ERPoitwV71z5/2H++1NlFhgO7vg2z3cPfr/SeP99G9J4+O4N/9ffT02f7Dve55/wCDaGF21ap3QIJQ2VZmOhY9iBJ44awsinY0bZU7CHMWCp/A64lKgGx8qwJyiMFri92PIlAXNsWbjO5qLe2sZgiWxVLwCofSNAQFDOX3yzzF7ID3G9RLwNYrhSnXElcQ2mIWIdCUce6vXm+/9dxG11RM6uRKSdFyxdOqCOXeGk2msP8ZhUFokXwLQecCegt5mcfOfxF0hTJigkVphGbUEPA9EjlLdBdAqQS/YvEHgPJFLGgD2dV3gHb17dgm8bz/f9wPQG/zveht/lDoed+zZv82Q2zl1DLKKv+z+FvNQE6nuu42g6H6bo5YksbWLCtTey3d8cvFHWwtSSZww2Cizc+U0CFMwj3BUXC0o77bW7nBVeEVfkdn11t6G6QopHA0IzOGbfdztO3WxWFX67akFtHm23MZDdyZ1ritUMXR3bGTQ59pTeHegdt9ajkDKuA+CIdwrGY0aAsAZYtgWxHaFql0c1oK4P3B0+cd8McbdxxTkpUqqaleHx/b2qTmeHz8uuGbJLa26S7svA1dM7GtvpC5oW5JXbMQNmeLtLBJN1kLm3WTtrBpt/CObN428cgmfoF5ZDO/QD2yqbdxl8F5gDpyqeqrUbc/D9igIlWjzKWqa+449Zu1imFLKZivknJzehwOxqY3RySOZcAEiIYTCqPeX4eRieIpWu+PryXXbxsb077D1Tl4jEBubqbX1vs1fZkYlOubPbiJ6Nl19PpGYXrjNQLpYCm9jbp5CzY4CBZ3/+8Wmpmvw2qKjRGczI1Blr8v7BbcBOaQhMsVfn/c30lFW6CZ9wqD45z4gJr+10tqfssZmVvAQ7io4QM4E7PM7fW3cvNjmNf86eviw/N+z9vuDf7cX7/7efWz2Eed33R+17nW8To3O3c7DzoHnaMO6fyl87fO3zv/WPvr2j/X/rX2TWl6+VLls9axPmv//g/hB7U0</latexit>

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


EXISTS 47

Come condizione nel WHERE possiamo usare

SELECT ...

FROM ...

WHERE [NOT] EXISTS (Sottoselect)

Per ogni tupla (o combinazione di tuple) t della select esterna

calcola la sottoselect

verifica se ritorna una tabella [non] vuota e in questo caso seleziona t

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione esistenziale: EXISTS 48

La query studenti con almeno un voto > 27

SELECT *
FROM Studenti s
WHERE EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link]
AND [Link] > 27)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione esistenziale: Giunzione+Proiezione 49

Query con EXISTS:


SELECT *
FROM Studenti s
WHERE EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link]
AND [Link] > 27)

La stessa query, ovvero gli studenti con almeno un voto > 27, tramite giunzione:
SELECT DISTINCT s.*
FROM Studenti s JOIN Esami e ON [Link] = [Link]
WHERE [Link] > 27

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione esistenziale: ANY 50

Un altro costrutto che permette una quantificazione esistenziale

SELECT ...

FROM ...

WHERE Expr Comp ANY (Sottoselect)

Per ogni tupla (o combinazione di tuple) t della select esterna

calcola la sottoselect

verifica se Expr è in relazione Comp con almeno uno degli elementi ritornati
dalla select

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Esistenziale: ANY 51

La solita query
“Studenti che hanno preso almeno un voto > 27”
si può esprimere anche tramite ANY ...

SELECT *
FROM Studenti s
WHERE [Link] =ANY (SELECT [Link]
FROM Esami e
WHERE [Link] >27)

SELECT *
FROM Studenti s
WHERE 27 <ANY (SELECT [Link]
FROM Esami e
WHERE [Link] = [Link])

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Esistenziale: ANY 52

ANY non fa nulla in più di EXISTS


SELECT *
FROM Tab1
WHERE attr1 op ANY (SELECT attr2
FROM Tab2
WHERE C);

diventa
SELECT *
FROM Tab1
WHERE EXISTS (SELECT *
FROM Tab2
WHERE C AND attr1 op attr2);

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Esistenziale: IN 53

Forma ancora più blanda di quantificazione esistenziale:


SELECT ...

FROM ...

WHERE Expr IN (sottoselect)

Nota: abbreviazione di =ANY

La solita query si può esprimere anche tramite IN:

SELECT *
FROM Studenti s
WHERE [Link] IN (SELECT [Link]
FROM Esami e
WHERE [Link] >27)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Ancora su IN 54

Può essere utilizzato con ennuple di valori

Expr IN (val1, val2, ..., valn)

Gli studenti di Padova, Venezia e Belluno


SELECT *
FROM Studenti
WHERE Provincia IN ('PD','VE','BL');

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Riassumendo ... 55

La quantificazione esistenziale si fa con:

EXISTS

Giunzione

=ANY, >ANY, <ANY, …

IN

Il problema vero è: non confondere esistenziale con universale!

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Universale 56

Gli studenti che hanno preso solo 30

Errore comune (e grave):


SELECT s.*
FROM Studenti s, Esami e
WHERE [Link] = [Link] AND [Link] = 30

In stile OQL: FORALL e IN [Link]: [Link]=30

SELECT *
FROM Studenti s
WHERE FORALL e IN Esami WHERE [Link] = [Link]:
[Link] = 30

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Universale 57

In SQL non c’e` un operatore generale esplicito FOR ALL. Si usa l’equivalenza
logica

⇤e ⇥ E. P ¬(⌅e ⇥ E. ¬P )

Quindi da:

SELECT *
FROM Studenti s
WHERE FORALL e IN Esami WHERE [Link] = [Link]:
[Link] = 30

... si può passare a ...

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Universale 58

In SQL diventa:

SELECT * FROM Studenti s


WHERE NOT EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link]
AND [Link] <> 30)

dove NOT([Link] = 30) è diventato [Link] <> 30

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione universale: ALL 59

E` disponibile un operatore duale rispetto a ANY, che e` ALL:


WHERE Expr Comp ALL (Sottoselect)

Sostituendo EXISTS con =ANY, la solita query (studenti con tutti 30):
SELECT * FROM Studenti s
WHERE NOT EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link]
AND [Link] <> 30)

Diventa:
SELECT *
FROM Studenti s
WHERE NOT([Link] =ANY (SELECT [Link]
FROM Esami e
WHERE [Link] <> 30))

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione universale: ALL 60

...
SELECT *
FROM Studenti s
WHERE NOT([Link] =ANY (SELECT [Link]
FROM Esami e
WHERE [Link] <> 30))

Ovvero:
SELECT * FROM Studenti s
WHERE [Link] <>ALL (SELECT [Link]
FROM Esami e
WHERE [Link] <> 30)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Universale e insiemi vuoti 61

Supponiamo che la BD sia tale che la query

SELECT [Link], [Link], [Link], [Link]


FROM Studenti s LEFT JOIN Esami e ON [Link]=[Link];

ritorni

+---------+---------+---------+------+
| Nome | Cognome | Materia | Voto |
+---------+---------+---------+------+
| Chiara | Scuri | NULL | NULL |
| Giorgio | Zeri | NULL | NULL |
| Paolo | Verdi | BD | 27 |
| Paolo | Verdi | ALG | 25 |
| Paolo | Poli | ALG | 21 |
| Paolo | Poli | FIS | 22 |
| Anna | Rossi | BD | 30 |
| Anna | Rossi | FIS | 30 |
+---------+---------+---------+------+

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Universale e insiemi vuoti 62

Qual e` l’ouput della query ‘studenti che hanno preso solo trenta’?
SELECT [Link]
FROM Studenti s
WHERE NOT EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link]
AND [Link] <> 30)

+---------+
| Cognome |
+---------+
| Scuri |
| Zeri |
| Rossi |
+---------+

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Universale e insiemi vuoti 63

Se voglio gli studenti che hanno preso solo trenta, e hanno superato qualche
esame:

SELECT *
FROM Studenti s
WHERE NOT EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link]
AND [Link] <> 30)
AND EXISTS (SELECT *
FROM Esami e
WHERE [Link] = [Link])

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Quantificazione Universale e insiemi vuoti 64

Oppure:
SELECT [Link], [Link]
FROM Studenti s JOIN Esami e ON [Link] = [Link]
GROUP BY [Link], [Link]
HAVING MIN([Link]) = 30;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Raggruppamento 65

Per ogni materia, trovare nome della materia e voto medio degli esami in quella
materia [selezionando solo le materie per le quali sono stati sostenuti più di tre
esami]:

Per ogni materia vogliamo


- Il nome, che e` un attributo di Esami
- Una funzione aggregata sugli esami della materia

Soluzione:

SELECT [Link], AVG([Link])


FROM Esami e
GROUP BY [Link]
[HAVING COUNT(*)>3]

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Raggruppamento 66

Costrutto:

SELECT … FROM … WHERE …


GROUP BY A1,..,An
[HAVING condizione]

Semantica:

Esegue le clausole FROM - WHERE

Partiziona la tabella risultante rispetto all’uguaglianza su tutti i


campi A1, …, An (in questo caso, si assume NULL = NULL)

Elimina i gruppi che non rispettano la clausola HAVING

Da ogni gruppo estrae una riga usando la clausola SELECT

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Esecuzione di GROUP BY 67

SELECT Candidato, COUNT(*) AS NEsami,


MIN(Voto), MAX(Voto), AVG(Voto)

FROM Esami
GROUP BY Candidato
HAVING AVG(Voto) > 23;
+--------+---------+-----------+------------+------+------+--------+
| Codice | Materia | Candidato | Data | Voto | Lode | CodDoc |
+--------+---------+-----------+------------+------+------+--------+
| B112 | BD | 71523 | 2006-07-08 | 27 | N | AM1 |
| A143 | ALG | 71523 | 2006-12-28 | 25 | N | NG2 |
| B247 | BD | 76366 | 2007-07-18 | 30 | L | AM1 |
| A213 | ALG | 71576 | 2007-07-19 | 21 | N | NG2 |
| F31 | FIS | 76366 | 2007-07-08 | 30 | N | GL1 |
| F45 | FIS | 71576 | 2007-07-29 | 22 | N | GL1 |
+————+---------+-----------+------------+------+------+--------+

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Esecuzione di GROUP BY 68

+--------+---------+-----------+------------+------+------+--------+
| Codice | Materia | Candidato | Data | Voto | Lode | CodDoc |
+--------+---------+-----------+------------+------+------+--------+
| B112 | BD | 71523 | 2006-07-08 | 27 | N | AM1 |
| A143 | ALG | 71523 | 2006-12-28 | 25 | N | NG2 |
+--------+---------+-----------+------------+------+------+--------+
| A213 | ALG | 71576 | 2007-07-19 | 21 | N | NG2 |
| F45 | FIS | 71576 | 2007-07-29 | 22 | N | GL1 |
+--------+---------+-----------+------------+------+------+--------+
| B247 | BD | 76366 | 2007-07-18 | 30 | L | AM1 |
| F31 | FIS | 76366 | 2007-07-08 | 30 | N | GL1 |
+--------+---------+-----------+------------+------+------+--------+

+-----------+--------+-----------+-----------+-----------+
| Candidato | NEsami | min(Voto) | max(Voto) | avg(Voto) |
+-----------+--------+-----------+-----------+-----------+
| 71523 | 2 | 25 | 27 | 26.000 |
| 76366 | 2 | 30 | 30 | 30.000 |
+-----------+--------+-----------+-----------+-----------+

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


SQL ➔ ALGEBRA 69

SELECT DISTINCT X, F τZ
FROM R1,…,Rn
WHERE C1 πX,F
GROUP BY Y
HAVING C2 σC2
ORDER BY Z
YγG
X, Y, Z sono insiemi di attributi
σC1
F, G sono insiemi di espressioni
aggregate, tipo count(*) o sum(A)
×

X,Z ⊆ Y, F ⊆ G, C2 nomina solo attributi × Rn


in Y o espressioni in G
R1 R2

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Raggruppamento 70

Per ogni studente, cognome e voto medio:


SELECT [Link], AVG([Link])
FROM Studenti s, Esami e
WHERE [Link] = [Link]
GROUP BY [Link]

È necessario scrivere:

GROUP BY [Link], [Link]

Gli attributi espressi non aggregati nella select ([Link]) e in HAVING se


presenti ([Link]) devono essere inclusi tra quelli citati nella GROUP BY

Gli attributi aggregati (AVG([Link])) vanno scelti tra quelli non raggruppati

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Clausola HAVING: importante 71

Anche la clausola HAVING cita solo:


- espressioni su attributi di raggruppamento;
- funzioni di aggregazione applicate ad attributi non di raggruppamento.

Non va ...

SELECT [Link], AVG([Link])


FROM Studenti s JOIN Esami e ON [Link] = [Link]
GROUP BY [Link], [Link]
HAVING EXTRACT(YEAR FROM [Link]) > 2006;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Raggruppamento e NULL 72

Nel raggruppamento si assume (è uno dei pochi casi) NULL = NULL

Es: Matricole dei tutor e relativo numero di studenti di cui sono tutor

SELECT Tutor, COUNT(*) AS NStud


FROM Studenti
GROUP BY Tutor;

+-------+-------+
| Tutor | NStud |
+-------+-------+
| NULL | 2 |
| 71347 | 2 |
| 71523 | 1 |
+-------+-------+

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Espressione condizionale: CASE 73

CASE è un’espressione condizionale che può essere usata in qualsiasi contesto


dove un’espressione è valida.

CASE WHEN condizione THEN risultato


[WHEN …]
[ELSE risultatoDefault]
END
condizione è un’espressione che restituisce un valore booleano.
Se la condizione è vera, restituisce risultato e le altre condizioni non sono
valutate. Se la condizione non è vera, le successive clausole WHEN sono esaminate
in ordine. Se nessuna di queste è vera, allora restituisce il risultatoDefault
dell’[Link] l’ELSE non è presente, il risultato è NULL.

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Sintassi della select ... un po’ più completa 74

Sottoselect:
SELECT [DISTINCT] Attributi
FROM Tabelle
[WHERE Condizione]
[GROUP BY A1,..,An [HAVING Condizione]]

Select:
Sottoselect
{ (UNION [ALL] | INTERSECT [ALL] | EXCEPT [ALL])
Sottoselect }
[ ORDER BY Attributo [DESC] {, Attributo [DESC]} ]

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


SQL: Modifica dei dati 75

INSERT INTO Tabella [(A1,..,An)]


( VALUES (V1,..,Vn) | AS Select )

UPDATE Tabella
SET Attributo = Expr, …, Attributo = Expr
WHERE Condizione

DELETE FROM Tabella


WHERE Condizione

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


INSERT 76

La forma base del comando INSERT è la seguente:


INSERT INTO Tabella
VALUES (valoreA1,...,valoreAn),
(valoreB1,...,valoreBn),
...

dove (valoreX1,...,valoreXn) sono righe del tipo corrente di tabella (con


gli attributi nella sequenza corretta!) e.g.

INSERT INTO Studenti


VALUES ('Paolo','Poli','71576', ‘BL’, ‘1986', ‘76366’),
('Giorgio','Conte','71577', ‘AT’, ‘1941', NULL);

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


INSERT 77

Alternativamente si può usare la forma:


INSERT INTO Tabella(colonna1,...,colonnam)
VALUES (valoreA1,...,valoreAm),
(valoreB1,...,valoreBm),
...

m può essere < del numero di attributi n (le restanti colonne o prendono il valore di
default o NULL)

le colonne possono apparire in ordine diverso da quello in cui appaiono nella


definizione di Tabella

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


INSERT 78

Esempio

INSERT INTO Studenti (Matricola, Nome, Cognome)


VALUES (‘74324’,’Gino’,’Bartali’)

Tutti i valori dichiarati NOT NULL e senza un valore di default dichiarato devono
essere specificati

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


Insert e select 79

E` possibile aggiungere le righe prodotte da una select ...

INSERT INTO Tabella Select

Esempio: se StNomeCognome(Nome, Cognome) è una tabella con due campi di


tipo adeguato ...

INSERT INTO StNomeCognome


SELECT Nome, Cognome FROM Studenti;

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


DELETE 80

La forma base del comando DELETE è la seguente:


DELETE FROM Tabella
WHERE condizione

Cancella da Tabella le righe che soddisfano la condizione in WHERE: e.g.


DELETE FROM Esami
WHERE Voto<18;

Senza la clausola WHERE


DELETE FROM Esami;
cancella tutte le righe (ma non la tabella)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


DELETE 81

La selezione delle righe da cancellare può essere basata anche su di una select.
Es. Cancella gli studenti che non hanno sostenuto esami

DELETE FROM Studenti


WHERE Matricola NOT IN (SELECT Candidato FROM Esami);

Strutturalmente simile alla SELECT (ma cancella intere righe)

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


UPDATE 82

La forma base del comando UPDATE è:


UPDATE Tabella
SET attr1=exp1, ..,
attrn=expn
WHERE condizione
dove attri ed expi devono avere il medesimo tipo; e.g.

Esempio:
UPDATE Studenti
SET Tutor=’71523’
WHERE Matricola=’76366’ OR Matricola=’76367’

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati


UPDATE 83

Aumenta di 1 punto il voto a tutti gli esami con voto > 23


UPDATE Esami
SET Voto=Voto+1
WHERE Voto>23 AND Voto<30;

Anche in questo caso si possono usare condizioni che coinvolgono SELECT

6. SQL per l’uso interattivo di basi di dati Corso di Basi di Dati

Potrebbero piacerti anche