SQL 1 Basi
SQL 1 Basi
Dario Maio
http://bias.csr.unibo.it/maio/
[email protected]
modello relazionale
1
modello relazionale
2
Page 1
SQL: standard e dialetti
● Il processo di standardizzazione di SQL è iniziato nel 1986
modello relazionale
3
modello relazionale
4
Page 2
Creazione ed eliminazione di
tabelle
● Mediante l’istruzione CREATE TABLE si definisce lo schema di una
tabella e se ne crea un’istanza vuota
– Per ogni attributo va specificato il dominio, un eventuale valore di default e
eventuali vincoli
– Infine possono essere espressi altri vincoli a livello di tabella
CREATE TABLE Imp (
CodImp char(4) PRIMARY KEY, -- chiave primaria
CF char(16) NOT NULL UNIQUE, -- chiave
Cognome varchar(60) NOT NULL,
Nome varchar(30) NOT NULL,
Sede char(3) REFERENCES Sedi(Sede), -- FK
Ruolo char(20) DEFAULT ‘Programmatore’,
Stipendio int CHECK (Stipendio > 0),
UNIQUE (Cognome, Nome) -- chiave )
● Mediante l’istruzione DROP TABLE è possibile eliminare lo schema
di una tabella (e conseguentemente la corrispondente istanza)
DROP TABLE Imp
modello relazionale
5
Modifica di tabelle
● Mediante l’istruzione ALTER TABLE è possibile modificare lo schema
di una tabella, in particolare:
– Aggiungendo attributi
– Aggiungendo o rimuovendo vincoli
modello relazionale
6
Page 3
I domini
● In SQL sono utilizzabili 2 tipi di domini
– Domini elementari (predefiniti):
» Carattere: singoli caratteri o stringhe, anche di lunghezza variabile
» Bit: singoli booleani o stringhe
» Numerici, esatti e approssimati
» Data, ora, intervalli di tempo
modello relazionale
7
Vincoli (1)
● Valori di default e valori NULL
– Per vietare la presenza di valori nulli, è sufficiente imporre il vincolo NOT NULL
Cognome varchar(60) NOT NULL
– Per ogni attributo è inoltre possibile specificare un valore di default
Ruolo char(20) DEFAULT ‘Programmatore’,
● Chiavi
– La definizione di una chiave avviene esprimendo un vincolo UNIQUE,UNIQUE che si può
specificare in linea, se la chiave consiste di un singolo attributo
CF char(16) UNIQUE
– o dopo aver dichiarato tutti gli attributi, se la chiave consiste di uno o più attributi
UNIQUE(Cognome,Nome)
– PRIMARY KEY definisce la chiave primaria
CodImp char(4) PRIMARY KEY
» La specifica di una chiave primaria non è obbligatoria
» Si può specificare al massimo una chiave primaria per tabella
» Non è necessario specificare NOT NULL per gli attributi della primary key
modello relazionale
8
Page 4
Vincoli (2)
● Chiavi straniere (“foreign key”)
– La definizione di una foreign key avviene specificando un vincolo FOREIGN KEY,
KEY
e indicando quale chiave viene referenziata
– Le colonne di destinazione devono essere una chiave della tabella destinazione (non
necessariamente la chiave primaria)
FOREIGN KEY (Sede) REFERENCES Sedi(Sede)
Politiche di “reazione”
● Anziché lasciare al programmatore il compito di garantire che a
fronte di cancellazioni e modifiche i vincoli di integrità referenziale
siano rispettati, si possono specificare opportune politiche di
reazione in fase di definizione degli schemi
modello relazionale
10
Page 5
DB di riferimento per gli esempi
Imp Sedi
CodImp Nome Sede Ruolo Stipendio Sede Responsabile Citta
E001 Rossi S01 Analista 2000 S01 Biondi Milano
E002 Verdi S02 Sistemista 1500 S02 Mori Bologna
E003 Bianchi S01 Programmatore 1000 S03 Fulvi Milano
modello relazionale
11
L’istruzione SELECT
● È l’istruzione che permette di eseguire interrogazioni (query) sul DB
SELECT A1,A2,..,Am
FROM R1,R2,..,Rn
[WHERE <condizione>]
[GROUP BY <listaAttributi>]
[HAVING <condizione>]
[ORDER BY <listaAttributi>]
– ovvero:
» SELECT (o TARGET) list (cosa si vuole come risultato)
» clausola FROM (da dove si prende)
» clausola WHERE (che condizioni deve soddisfare)
» clausola GROUP BY (le colonne su cui raggruppare)
» clausola HAVING (condizione relative ai gruppi)
» clausola ORDER BY (ordinamento)
Il comando SELECT permette di realizzare le operazioni di selezione,
selezione, proiezione,
join, raggruppamento e ordinamento.
modello relazionale
12
Page 6
SELECT su singola tabella
Codice, nome e ruolo dei dipendenti della sede S01
● Equivale a πCodImp,Nome,Ruolo (σ
σSede = S01 (Imp))
modello relazionale
13
modello relazionale
14
Page 7
SELECT senza proiezione
● Se si vogliono tutti gli attributi:
SELECT *
FROM Imp
WHERE Sede = ‘S01’
modello relazionale
15
SELECT *
FROM Imp
modello relazionale
16
Page 8
Tabelle vs Relazioni: la clausola
DISTINCT
● Il risultato di una query SQL può contenere righe duplicate:
Ruolo
SELECT Ruolo Analista
FROM Imp Programmatore
WHERE Sede = ‘S01’ Sistemista
Programmatore
modello relazionale
17
Espressioni complesse
Nome Sede Ruolo
● All’interno di un comando select è Rossi S01 Analista
possibile inserire delle espressioni Verdi S02 Sistemista
espressioni booleane con operatori
Bianchi S01 Programmatore
AND e OR e NOT
Gialli S03 Programmatore
SELECT Nome
FROM Imp
WHERE Sede = ‘S01’ AND
Roulo = “Programmatore”
modello relazionale
18
Page 9
Operatore BETWEEN
● L’operatore BETWEEN permette di esprimere condizioni di appartenenza a
un intervallo
Nome e stipendio degli impiegati che hanno uno stipendio compreso tra 1300 e
2000 Euro (estremi inclusi)
Nome Stipendio
Rossi 2000
modello relazionale
19
Operatore IN
● L’operatore IN permette di esprimere condizioni di appartenenza
a un insieme
Codici e sedi degli impiegati delle sedi S02 e S03
SELECT CodImp, Sede CodImp Sede
FROM Imp E002 S02
WHERE Sede IN (‘S02’,‘S03’) E004 S03
E005 S02
modello relazionale
20
Page 10
Operatore LIKE
● L’operatore LIKE permette di esprimere dei “pattern” su stringhe
mediante le “wildcard”
Nomi degli impiegati che finiscono con una ‘i’ e hanno una ‘i’ in
seconda posizione
Nome
SELECT Nome Bianchi
FROM Imp
Gialli
WHERE Nome LIKE ‘_i%i’
Violetti
modello relazionale
21
modello relazionale
22
Page 11
Ridenominazione delle colonne
● Ad ogni elemento della SELECT list è possibile associare un nome
a piacere:
modello relazionale
23
Pseudonimi
● Per chiarezza, ogni nome di colonna può essere scritto prefissandolo
con il nome della tabella:
…e si può anche usare uno pseudonimo (alias) in luogo del nome della
tabella
Page 12
Valori nulli
● Il trattamento dei valori nulli si basa su quanto già visto in algebra
relazionale, quindi
Imp
SELECT CodImp CodImp Sede … Stipendio
FROM Imp E001 S01 2000
WHERE Stipendio > 1500
E002 S02 1500
OR Stipendio <= 1500
E003 S01 1000
E004 S03 NULL
restituisce solo CodImp
E001 E005 S02 2500
modello relazionale
25
Page 13
Ordinamento del risultato
● Per ordinare il risultato di una query secondo i valori di una o più
colonne si introduce la clausola ORDER BY,BY e per ogni colonna si
specifica se l’ordinamento è per valori “ascendenti” (ASC
ASC, il default)
o “discendenti” (DESC
DESC)
Nome Stipendio
Neri 2500
SELECT Nome, Stipendio Rossi 2000
FROM Imp Verdi 1500
ORDER BY Stipendio DESC, Nome Aranci 1200
Grigi 1100
Bianchi 1000
Gialli 1000
Violetti 1000
modello relazionale
27
modello relazionale
28
Page 14
Interrogazioni su più tabelle:
risultato
● Dopo avere applicato il predicato I.Sede = S.Sede:
SedeE001 AltraSede
S01 S02
S01 S03
modello relazionale
30
Page 15
Self Join
● L’uso di alias è forzato quando si deve eseguire un self-join
Genitori G1 Genitori G2
Chi sono i nonni di Anna?
Genitore Figlio Genitore Figlio
Luca Anna Luca Anna
Maria Anna Maria Anna
Giorgio Luca Giorgio Luca
Silvia Maria Silvia Maria
Enzo Maria Enzo Maria
Join espliciti
● Anziché scrivere i predicati di join nella clausola WHERE,
WHERE è possibile
“costruire” una joined table direttamente nella clausola FROM
modello relazionale
32
Page 16
Operatori insiemistici
● L’istruzione SELECT non permette di eseguire unione, intersezione e
differenza di tabelle
● Ciò che si può fare è combinare in modo opportuno i risultati di due
istruzioni SELECT, mediante gli operatori
● In tutti i casi gli elementi delle SELECT list devono avere tipi
compatibili e gli stessi nomi se si vogliono colonne con un’intestazione
definita
● L’ordine degli elementi è importante (notazione posizionale)
● Il risultato è in ogni caso privo di duplicati, per mantenerli occorre
aggiungere l’opzione ALL:
A
FROM R b
SELECT A
1
UNION a
FROM R
2 SELECT B,C AS A c
UNION
FROM S c
SELECT C AS A 3
d
FROM S 4 Non corretta!
modello relazionale
34
Page 17
Operatori insiemistici: esempi (2)
R A B
1 a SELECT B B SELECT B B
1 a FROM R a FROM S d
2 a INTERSECT b EXCEPT
2 b SELECT B c SELECT B
2 c FROM S FROM R
3 b
S C B B B
SELECT B SELECT B
1 a a a
FROM R FROM R
1 b a b
INTERSECT ALL EXCEPT ALL
2 a b
SELECT B SELECT B
2 c FROM S c FROM S
3 c
4 d
modello relazionale
35
modello relazionale
36
Page 18
Inserimento di tuple: caso singolo
● È possibile inserire una nuova tupla specificandone i valori
modello relazionale
37
modello relazionale
38
Page 19
Cancellazione e modifica di tuple
● L’istruzione DELETE può fare uso di una condizione per specificare
le tuple da cancellare
DELETE FROM Sedi -- elimina le sedi di Bologna
WHERE Citta = ‘Bologna’
UPDATE Imp
SET Stipendio = 1.1*Stipendio
WHERE Ruolo = ‘Programmatore’
modello relazionale
39
modello relazionale
40
Page 20
SQL in sintesi
● Il linguaggio SQL è lo standard de facto per interagire con DB
relazionali
● Si discosta dal modello relazionale in quanto permette la presenza di
tuple duplicate (tabelle anziché relazioni)
● La definizione delle tabelle permette di esprimere vincoli e anche di
specificare politiche di reazione a fronte di violazioni dell’integrità
referenziale
● L’istruzione SELECT consiste nella sua forma base di 3 parti: SELECT,
SELECT
FROM e WHERE
● A queste si aggiunge ORDER BY, BY per ordinare il risultato (e altre che
vedremo)
● Per trattare i valori nulli, SQL ricorre a una logica a 3 valori (vero, falso e
sconosciuto)
modello relazionale
41
Page 21