2. SQL
SQL (Structured Query Language)
Linguaggio dichiarativo standardizzato
Definizione di basi di dati
Manipolazione dei dati
Supportato da tutti i DBMS commerciali
Si distingue in due parti principali
DDL (Data Definition Language)
DML (Data Manipulation Language).
I DBMS aggiungono al linguaggio anche funzioni
SDL (Storage Definition Language)
Sicurezza e controllo degli accessi
Backup
Non sono parte dello standard.
22/04/2015
2
MatteoCeserani
3. DDL - COMANDI FONDAMENTALI
Creazione di una relazione (tabella) o di una base
di dati
CREATE
Modifica di una relazione
ALTER
Cancellazione di una relazione o di una base di dati
DROP
22/04/2015
3
MatteoCeserani
4. CREAZIONE DI UNA BASE DI DATI
Comando CREATE
CREATE DATABASE <Nome Base di
Dati>;
Creare una base di dati è come prendere un
contenitore vuoto per metterci dentro qualcosa: la
base di dati non contiene inizialmente nulla.
Inoltre MySQL prevede che per poter manipolare
una base di dati occorra prima selezionarla
USE <Nome Base di Dati>;
22/04/2015
4
MatteoCeserani
5. CREAZIONE DI UNA BASE DI DATI
Esercizio
Creiamo la base di dati per la gestione di un piccolo
albergo
Anche senza sapere nulla di come funziona il nostro
albergo possiamo scrivere senz’altro il codice seguente
CREATE DATABASE Albergo;
USE Albergo;
22/04/2015
5
MatteoCeserani
6. CREAZIONE DI UNA RELAZIONE
Sintassi del comando CREATE
CREATE TABLE <nome-relazione>
(<specifica-colonna>
[,<specifica-colonna>]*);
Le parentesi quadre indicano un’opzionalità
L’asterisco indica la possibilità di ripetere più volte
un elemento
Nel nostro caso è possibile inserire un numero arbitrario
di specifiche di colonna
22/04/2015
6
MatteoCeserani
7. CREAZIONE DI UNA RELAZIONE
La specifica della colonna è così strutturata
<nome-colonna> <dominio>
[DEFAULT <valore-di-default>]
Il dominio di una colonna indica sostanzialmente il
tipo di dato della colonna stessa
I tipi di dato dipendono dal particolare DBMS
utilizzato
Esiste però una sostanziale uniformità
22/04/2015
7
MatteoCeserani
8. TIPI DI DATI PREDEFINITI
MySQL 5.6 possiede diversi tipi di dati predefiniti
L’utente ha la possibilità di creare nuovi tipi di dato, ma
per ora tralasceremo questa possibilità
I tipi predefiniti si dividono in 3 categorie
fondamentali
Tipi di dati numerici
Tipi di dati carattere
Tipi di dati temporali
Si faccia riferimento alla documentazione on-line
http://dev.mysql.com/doc/refman/5.6/en/data-types.html
22/04/2015
8
MatteoCeserani
9. UN VALORE PARTICOLARE - NULL
I campi di una tabella possono assumere solo i
valori specifici del tipo di dato della colonna stessa
Eccezione: NULL
Il valore NULL è un valore speciale che può essere
assegnato a qualsiasi tipo di campo
Non è pari a 0 o a qualcosa di simile, è un valore a
parte
Se un campo non deve poter assumere valore nullo si
specifica la clausola NOT NULL
22/04/2015
9
MatteoCeserani
10. TIPI DI DATI NUMERICI
Tipi interi
TINYINT
SMALLINT
INTEGER, INT
MEDIUMINT
BIGINT
Tipi reali a virgola fissa
NUMERIC
DECIMAL
Tipi reali a virgola mobile
FLOAT
DOUBLE
22/04/2015
10
MatteoCeserani
11. TIPI INTERI
I tipi interi rappresentano i numeri interi utilizzando
una certa quantità di Byte
A seconda del numero di bit utilizzati si ottiene un range
diverso di valori ammissibili
Varia la quantità di memoria occupata dai record
I tipi interi possono riferirsi a
numeri interi senza segno (solo positivi)
numeri interi con il segno (positivi e negativi)
quando si dichiara un campo di una tabella occorre
specificare la natura dei numeri interi
SIGNED (default)
UNSIGNED
22/04/2015
11
MatteoCeserani
13. TIPI INTERI
Attributi particolari dei tipi interi
INT(N)
Visualizza il numero intero utilizzando N cifre
Il numero di bit memorizzati non cambia!
Se le cifre sono meno di N
Si inseriscono degli spazi
ZEROFILL Si inseriscono degli zero
AUTO_INCREMENT
Se si memorizza un valore 0 o un valore NULL dentro una
colonna AUTO_INCREMENT il campo assume il primo valore
non utilizzato
22/04/2015
13
MatteoCeserani
14. TIPI REALI A VIRGOLA MOBILE
Un numero a virgola mobile viene rappresentato
come composto da un segno, una mantissa e da un
esponente
In informatica si utilizza in genere questo standard
s = 0, 1
b = 2
M = (1.bnbn-1…b1b0)2
e = (bmbm-1…b1b0)2
22/04/2015
14
MatteoCeserani
es
bMa )1(
15. TIPI REALI A VIRGOLA MOBILE
FLOAT
32 bit
1 bit per il segno
23 bit per la mantissa
8 bit per l’esponente
DOUBLE
64 bit
1 bit per il segno
52 bit per la mantissa
11 bit per l’esponente
I tipi reali a virgola mobile devono essere usati per
rappresentare numeri molto grandi o molto piccoli
22/04/2015
15
MatteoCeserani
16. TIPI REALI A VIRGOLA FISSA
Per valori numerici non eccessivamente grandi o
piccoli si possono utilizzare i tipi reali a virgola fissa
NUMERIC
DECIMAL
MySQL implementa i tipi NUMERIC e DECIMAL nello
stesso identico modo
Possono essere utilizzati in maniera assolutamente
intercambiabile
Perché hanno fatto così?
Probabilmente perché gli standard SQL prevedono due tipi
22/04/2015
16
MatteoCeserani
17. TIPI REALI A VIRGOLA FISSA
Sintassi per la definizione di numeri a virgola fissa
NUMERIC(<Precisione>,<Scala>)
DECIMAL(<Precisione>,<Scala>)
Precisione
Numero di cifre significative
Scala
Numero di cifre dopo la virgola
22/04/2015
17
MatteoCeserani
18. TIPI REALI A VIRGOLA FISSA
Esempio
NUMERIC(7,3)
7 cifre totali
3 cifre dopo la virgola
Valore minimo: -9999.999
Valore massimo: 9999.999
Massimo numero di cifre per i tipi in virgola fissa in
MySQL 5.6
65
22/04/2015
18
MatteoCeserani
19. TIPI NUMERICI SPECIALI - BIT
MySQL possiede un tipo numerico generico
BIT
BIT(M)
Memorizza M valori binari
Massimo valore di M
64
Se si assegna a un campo BIT(M) un numero di
bit inferiore a M le posizioni più significative restanti
vengono poste a 0
22/04/2015
19
MatteoCeserani
20. TIPI NUMERICI SPECIALI - BOOLEAN
Il tipo BOOLEAN (o anche BOOL) permette di creare
campi di natura logica
Un campo BOOL può assumere solo due valori
TRUE
FALSE
In realtà BOOLEAN e BOOL sono semplici alias di
TINYINT(1)
Il valore 0 corrisponde a FALSE, qualsiasi altro valore
corrisponde a vero
In effetti FALSE è un alias di 0
In realtà come costante TRUE è un alias di 1
22/04/2015
20
MatteoCeserani
21. TIPI NUMERICI SPECIALI - BOOLEAN
I campi BOOLEAN sono legati agli operatori logici
Operatori fondamentali: AND, OR, NOT
Gli operatori logici si applicano a qualsiasi
espressione di cui si può valutare la verità
Es. (Numero > 0 AND Numero <= 10) OR
(Esiste = NULL)
22/04/2015
21
MatteoCeserani
A B T F
T T F
F F F
A B T F
T T T
F T F
A
T F
F T
A AND B A OR B NOT A
22. TIPI CARATTERE
CHAR(N)
Stringa di caratteri a lunghezza fissa
Valore massimo di N: 255
VARCHAR(N)
Stringa di caratteri a lunghezza variabile
Valore massimo di N: 65535
22/04/2015
22
MatteoCeserani
23. TIPI CARATTERE
VARCHAR utilizza la prima parte del campo per
specificare la lunghezza del valore che contiene
Da VARCHAR(1) a VARCHAR(255)
1 Byte per esprimere la lunghezza
Da VARCHAR(256) a VARCHAR(65535)
2 Byte per esprimere la lunghezza
22/04/2015
23
MatteoCeserani
24. TIPI CARATTERE
Quanti byte servono per memorizzare un carattere?
Dipende da CHARACTER SET che si utilizza
MySQL supporta una trentina di set di caratteri
Il più famoso è probabilmente UTF-8
UTF-8
Ogni carattere viene rappresentato con un numero di
byte che va da 1 a 4
1 Byte per i caratteri ASCII standard
Più Byte per tutti gli altri
Più un carattere è comune meno Byte vengono utilizzati
22/04/2015
24
MatteoCeserani
25. TIPI CARATTERE
Con la codifica UTF-8 si possono memorizzare tutti
i caratteri esistenti sul pianeta
In attesa che arrivino gli alieni
Come si setta la codifica UTF-8 in MySQL?
Per un singolo database
CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
Una COLLATION è un insieme di regole che stabilisce
i criteri con i quali vengono confrontati tra loro i
caratteri appartenenti a un particolare CHARACTER
SET
22/04/2015
25
MatteoCeserani
26. TIPI CARATTERE
BINARY(N) e VARBINARY(N)
Funzionano come CHAR e VARCHAR ma utilizzano un
byte per tutti i caratteri
Le differenze sono le seguenti
Non è definito un character set
Non è definita nessuna collation
I confronti vengono fatti sulla base del valore binario
22/04/2015
26
MatteoCeserani
27. TIPI CARATTERE
BLOB e TEXT
BLOB: Binary Large Object
Funziona come BINARY ma può assumere dimensioni
maggiori
TEXT
Funziona come VARCHAR ma può assumere dimensioni
maggiori
Esistono in 4 versioni
22/04/2015
27
MatteoCeserani
Dominio Dimensioni massime
TINYBLOB, TINYTEXT 256 B
BLOB, TEXT 64 kB
MEDIUMBLOB, MEDIUMTEXT 4 MB
LONGBLOB, LONGTEXT 4 GB
28. TIPI CARATTERE
Enumerazioni
ENUM(‘valore1’[, ‘valore2’]*)
Una enumerazione definisce un campo che può
assumere come valori un insieme di stringhe definite
dall’utente al momento della sua creazione
I valori letterali vengono convertiti in numeri quando
devono essere memorizzati e riconvertiti in stringhe
quando vengono recuperati attraverso query
Vengono utilizzati numeri interi a partire da 0
Lo 0 corrisponde alla stringa vuota
Una stringa vuota viene memorizzata quando si tenta di
inserire un valore non valido in un campo ENUM
22/04/2015
28
MatteoCeserani
29. TIPI CARATTERE
Enumerazioni
Se un campo stringa può assumere solo pochi valori
conviene usare ENUM per risparmiare memoria
Occorrono però alcune attenzioni, può nascere
confusione
Se i valori letterali contengono cifre
Quando le query devono restituire risultati ordinati
22/04/2015
29
MatteoCeserani
30. TIPI CARATTERE
Insiemi
SET(‘valore1’[, ‘valore2’]*)
Un SET definisce un campo che può assumere come
valori un insieme di stringhe definite dall’utente al
momento della sua creazione
In cosa differisce da un’enumerazione?
Un campo SET può assumere come valore un qualsiasi
sottoinsieme delle stringhe definite come elementi del SET
22/04/2015
30
MatteoCeserani
31. TIPI CARATTERE
Insiemi ed enumerazioni
Mezzo ENUM(‘Automobile’, ‘Motocicletta’, ‘Furgone’,
‘Bicicletta’)
Il campo Mezzo può assumere uno e uno solo dei valori
elencati
Può assumere anche il valore NULL oppure ‘’ (stringa vuota)
Mezzi SET(‘Automobile’, ‘Motocicletta’, ‘Furgone’,
‘Bicicletta’)
Il campo Mezzi può assumere qualsiasi sottoinsieme dei valori
elencati
Può assumere anche il valore NULL oppure ‘’ (stringa vuota)
22/04/2015
31
MatteoCeserani
32. TIPI CARATTERE
Insiemi ed enumerazioni
22/04/2015
32
MatteoCeserani
Nome Mezzo
Matteo Ceserani NULL
Mario Rossi Automobile
Giovanni Calanzone Automobile
Dante Alighieri Motocicletta
Bill Gates Furgone
Clint Eastwood Bicicletta
Mario Rossi Furgone
33. TIPI CARATTERE
Insiemi ed enumerazioni
22/04/2015
33
MatteoCeserani
Nome Mezzi
Matteo Ceserani Bicicletta, Automobile
Mario Rossi Automobile
Giovanni Calanzone Automobile, Furgone
Dante Alighieri Motocicletta
Bill Gates Furgone
Clint Eastwood Bicicletta, Furgone, Automobile
Achille Lauro NULL
34. TIPI TEMPORALI
I tipi temporali permettono di gestire date e orari
Tipi principali
DATE
DATETIME
TIMESTAMP
Tipi secondari
TIME
YEAR
22/04/2015
34
MatteoCeserani
35. TIPI TEMPORALI
Tipo di dato DATE
Il formato per le date è il formato standard
anglosassone
YYYY-MM-DD
Tipo di dato DATETIME
YYYY-MM-DD HH:mm:SS
Se si tenta di inserire una data non valida MySQL
memorizza la data nulla
0000-00-00
0000-00-00 00:00:00
22/04/2015
35
MatteoCeserani
36. TIPI TEMPORALI
Tipo di dato TIMESTAMP
Il tipo TIMESTAMP ha lo stesso formato di DATETIME ma si
riferisce alla data UTC
UTC: Universal Coordinated Time
In sostanza è l’ora media di Greenwich (GMT - Greenwich Mean
Time)
Quando si memorizza un valore in un campo
TIMESTAMP il valore viene convertito dalla time zone
locale a UTC
L’operazione inversa viene compiuta quando si recupera un
valore attraverso una query
Il tutto in maniera trasparente all’utente
Inoltre MySQL supporta l’inserimento e l’aggiornamento
automatico dei campi TIMESTAMP
Limitazione importante
Da 1970-01-01 00:00:00 a 2038-01-19 23:59:59
22/04/2015
36
MatteoCeserani
37. CREAZIONE DI UNA RELAZIONE
Per creare le relazioni della base di dati Albergo
occorre conoscere la realtà che la base di dati
stessa deve modellare.
Caratteristiche dell’albergo
Caratteristiche del processo di gestione delle
prenotazioni e dell’accoglienza
Più è approfondita tale conoscenza, maggiore sarà
la qualità del risultato della progettazione
In questo contesto utilizzeremo un modello fortemente
semplificato, per motivi didattici
22/04/2015
37
MatteoCeserani
38. CREAZIONE DI UNA RELAZIONE
Si tratta di un piccolo hotel in una località marittima, con le stanze
distribuite su quattro piani; ci sono due stanze singole, due doppie,
sette matrimoniali e due triple; tutte le stanze matrimoniali hanno la
possibilità di aggiungere un terzo letto, e tre di queste, più grandi,
possono ospitarne anche un quarto; anche le due stanze triple
hanno la possibilità di aggiungere il quarto letto. Prevediamo anche
alcune caratteristiche che diversificano le camere: alcune hanno un
televisore, alcune hanno la vista sul mare, alcune hanno l’aria
condizionata e, infine, alcune sono riservate ai fumatori. Tuttavia,
come abbiamo detto prima, vogliamo semplificare un po’ le cose,
per cui stabiliamo che queste caratteristiche non incidono sul prezzo
della camera, che dipende invece esclusivamente dal periodo e dal
numero di posti letto. Prevediamo anche un costo fisso,
indipendente dalla stagione, per i letti aggiunti e per altri
supplementi come la culla in camera; infine decidiamo che il
trattamento standard fornito dal nostro hotel è la mezza pensione,
per cui chiederemo un supplemento per la pensione completa e
concederemo una riduzione per chi vuole solo bed & breakfast;
anche queste differenze saranno indipendenti dal periodo
stagionale.
22/04/2015
38
MatteoCeserani
39. CREAZIONE DI UNA RELAZIONE
22/04/2015
39
MatteoCeserani
-- Primi esempi di SQL DDL
-- Creazione di un database
CREATE DATABASE Hotel
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
-- Selezione del database
USE Hotel;
Il doppio trattino indica un commento
Dal doppio trattino in poi è tutto commento fino alla
fine della riga
40. CREAZIONE DI UNA RELAZIONE
22/04/2015
40
MatteoCeserani
CREATE TABLE Camera(
Numero SMALLINT UNSIGNED NOT NULL,
Tipologia ENUM ('Doppia','Matrimoniale','Singola',
'Tripla') NOT NULL,
Caratteristiche SET ('VM','AC','TV','Sm','La1',
'La2'),
PRIMARY KEY (Numero)
);
Qui c’è una novità:
PRIMARY KEY
Chiave Primaria
41. CHIAVE PRIMARIA
Sottoinsieme degli attributi di una relazione che
permette l'individuazione univoca dei record della
relazione stessa.
In sostanza non possono esistere due record della
relazione che possiedano gli stessi valori di chiave
primaria.
Si intende che la chiave primaria può essere costituita
da più di un attributo, ma dovrebbe essere scelta come
un sottoinsieme MINIMO, cioè composto dal minor
numero possibile di attributi.
Se si può si utilizza un attributo solo.
In una relazione possono esistere più possibilità di
scelta della chiave primaria. In questo caso occorre fare
una scelta.
22/04/2015
41
MatteoCeserani
42. CHIAVE PRIMARIA
Esistono due sintassi per dichiarare una chiave
primaria
PRIMARY KEY (<Campo1> [, <Campo2>]*)
Può essere sempre utilizzata
In genere viene posta dopo la dichiarazione di tutti i campi
<Campo> <Tipo> PRIMARY KEY
Può essere utilizzata se la chiave primaria è composta da
un solo campo
22/04/2015
42
MatteoCeserani
43. CHIAVE PRIMARIA
Un campo appartenente a una chiave primaria può
assumere valori nulli
A rigor di logica però non è il caso di lasciare questa
possibilità
Di solito si specifica sui campi chiave primaria il vincolo
NOT NULL
Esiste inoltre la possibilità di specificare l’assenza
di duplicati su un campo che non appartiene alla
chiave primaria
Si utilizza l’attributo UNIQUE
Di fatto UNIQUE NOT NULL equivale a PRIMARY KEY
NOT NULL
22/04/2015
43
MatteoCeserani
44. CREAZIONE DI UNA RELAZIONE
22/04/2015
44
MatteoCeserani
CREATE TABLE Cliente(
Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL
AUTO_INCREMENT,
Nome VARCHAR(100),
Cognome VARCHAR(100) NOT NULL,
DataN DATE,
CF CHAR(16) UNIQUE,
TipoD ENUM ('CI','P') NOT NULL,
NumeroD VARCHAR(30) NOT NULL UNIQUE
);
45. INDICI
22/04/2015
45
MatteoCeserani
Insieme alle relazioni
MySQL crea
automaticamente alcuni
INDICI (INDEX) collegati alla
tabella
Di default crea un indice per
i campi della chiave primaria
e per tutti i campi per cui è
espresso il vincolo UNIQUE
46. INDICI
Quello degli indici è un meccanismo per rendere
più veloce la ricerca di informazioni nella relazione
Si dice che alcuni campi della relazione vengono
indicizzati
Quando un campo viene indicizzato il DBMS crea
una o più tabelle aggiuntive collegate alla tabella
principale e utilizzate dal DBMS in maniera
trasparente all'utente per rendere più veloci le
ricerche dei dati nel database
22/04/2015
46
MatteoCeserani
47. INDICI
Per saperne di più
Un approfondimento (in inglese, ovviamente…)
Un esempio
Indice non denso su chiave primaria
22/04/2015
47
MatteoCeserani
48. INDICI
Creazione di un indice
Sintassi
CREATE INDEX <NomeIndice> ON
<NomeRelazione> (<Campo1>[, <Campo2>]*);
Si possono creare indici composti con un massimo di 16
campi
22/04/2015
48
MatteoCeserani
CREATE INDEX CognomeC ON
Cliente (Cognome);
49. INDICI
Le tabelle indice occupano memoria
Le tabelle indice devono essere aggiornate ogni volta
che si inserisce o cancella un record in una relazione
Per questo motivo non si deve esagerare!
In linea di massima è bene indicizzare
Le chiavi primarie e i campi con vincolo UNIQUE
I campi sui quali si prevede di eseguire numerose
ricerche
Per esempio: il campo Cognome nella relazione
Cliente
22/04/2015
49
MatteoCeserani
50. VINCOLI INTRARELAZIONALI
In generale è possibile specificare dei vincoli
aggiuntivi per limitare l’insieme di valori che un
campo può assumere.
Vincoli di tipo CHECK
Esistono due modi per inserirli
Al momento della creazione della relazione
A posteriori dopo aver creato la relazione
22/04/2015
50
MatteoCeserani
ALTER TABLE Cliente ADD CONSTRAINT Nascita CHECK
(DataN <= CURDATE());
CREATE TABLE Cliente(
...
DataN DATE CHECK (DataN <= CURDATE()),
CF CHAR(16) UNIQUE,
...
CONSTRAINT Codice CHECK (CHAR_LENGHT(CF) = 16)
);
51. VINCOLI INTRARELAZIONALI
I vincoli CHECK sono comodissimi
Provandoli con MySQL però si ha una gradevole
sorpresa
MySQL esegue correttamente le istruzioni SQL che
contengono la parola chiave CHECK
Però poi non esegue i controlli sui vincoli stessi!
Dal manuale di MySQL
The CHECK clause is parsed but ignored by all storage
engines
Cioè: MySQL legge i comandi con clausola CHECK senza
segnalare errori ma poi ignora del tutto la clausola!
La domanda è: perché?
La risposta è un mistero
22/04/2015
51
MatteoCeserani
52. VINCOLI INTRARELAZIONALI
Ma allora in MySQL come faccio?
Esempio
Per ora non approfondiamo
Utilizziamo però questo codice all’occorrenza
22/04/2015
52
MatteoCeserani
DELIMITER //
CREATE TRIGGER Nascita BEFORE INSERT ON Cliente FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.DataN > CURDATE())
THEN
SET Messaggio = concat(‘Vincolo Nascita violato: DataN
non può essere nel futuro!', NEW.DataN);
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
53. VINCOLI INTRARELAZIONALI
Altro esempio
Non è difficile
Occorre modificare la condizione di errore e il
messaggio a seconda delle esigenze
22/04/2015
53
MatteoCeserani
DELIMITER //
CREATE TRIGGER Codice BEFORE INSERT ON Cliente FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF NOT (CHAR_LENGHT(NEW.CF) = 16)
THEN
SET Messaggio = concat(‘Vincolo Codice violato: il
codice fiscale deve avere lunghezza 16!');
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
54. VINCOLI INTRARELAZIONALI
Con i trigger possiamo specificare vincoli più
complessi
Per esempio vincoli che riguardano più campi nella
stessa relazione
Per la sintassi dei trigger in generale fare
riferimento al manuale di MySQL
http://dev.mysql.com/doc/refman/5.5/en/create-
trigger.html
22/04/2015
54
MatteoCeserani
55. CREAZIONE DI UNA RELAZIONE
In realtà per il vincolo CHECK dovrei usare un
trigger
22/04/2015
55
MatteoCeserani
CREATE TABLE Prenotazione(
Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
Cliente SMALLINT UNSIGNED NOT NULL,
Camera SMALLINT UNSIGNED NOT NULL,
DataA DATE NOT NULL,
DataP DATE NOT NULL,
CONSTRAINT DataAP CHECK (DataP > DataA),
CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA)
);
56. CREAZIONE DI UNA RELAZIONE
22/04/2015
56
MatteoCeserani
CREATE TABLE Prenotazione(
Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
Cliente SMALLINT UNSIGNED NOT NULL,
Camera SMALLINT UNSIGNED NOT NULL,
DataA DATE NOT NULL,
DataP DATE NOT NULL,
CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA)
);
DELIMITER //
CREATE TRIGGER CheckPren BEFORE INSERT ON Prenotazione FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.DataA >= NEW.DataP)
THEN
SET Messaggio = concat(‘Vincolo CheckPren violato!’);
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
57. CREAZIONE DI UNA RELAZIONE
Si noti come sia possibile definire il vincolo UNIQUE
su un insieme di attributi della relazione
Il campo Cliente e il campo Camera non possono
assumere valori qualsiasi
È ragionevole imporre che il numero identificativo del
cliente sia già presente nella relazione Cliente
Stesso discorso occorre fare per il campo Camera
Diciamo che Prenotazione.Cliente si riferisce a
Cliente.Id
Diciamo che Prenotazione.Camera si riferisce a
Camera.Numero
22/04/2015
57
MatteoCeserani
58. VINCOLI INTERRELAZIONALI
Quando un campo di una relazione deve riferirsi a
un campo di un’altra relazione siamo in presenza di
un vincolo interrelazionale
Questo tipo di vincolo prende il nome di chiave
esterna (FOREIGN KEY)
Sintassi
[CONSTRAINT <Nome>] FOREIGN KEY
<Referente> REFERENCES <Riferito>
[ON UPDATE <azione>]
[ON DELETE <azione>]
22/04/2015
58
MatteoCeserani
59. VINCOLI INTERRELAZIONALI
Inseriamo le chiavi esterne nella relazione
Prenotazione
22/04/2015
59
MatteoCeserani
CREATE TABLE Prenotazione(
Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
Cliente SMALLINT UNSIGNED NOT NULL,
Camera SMALLINT UNSIGNED NOT NULL,
DataA DATE NOT NULL,
DataP DATE NOT NULL,
CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA),
CONSTRAINT FK_Cliente FOREIGN KEY
Prenotazione (Cliente) REFERENCES Cliente (Id)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT FK_Camera FOREIGN KEY
Prenotazione (Camera) REFERENCES Camera (Numero)
ON UPDATE CASCADE
ON DELETE RESTRICT
);
60. VINCOLI INTERRELAZIONALI
Vincoli ON UPDATE e ON DELETE
Specificano quali azioni intraprendere sulla relazione
quando un valore nel campo riferito viene modificato o
cancellato
Valori possibili:
CASCADE
RESTRICT
SET NULL
NO ACTION
22/04/2015
60
MatteoCeserani
61. VINCOLI INTERRELAZIONALI
Azione Descrizione
CASCADE
Aggiorna o elimina tutti i record in cui è presente il
valore riferito
RESTRICT
Non permettere l’operazione di aggiornamento o
cancellazione nella relazione riferita
SET NULL
Assegna il valore null al campo referente in tutti i record
in cui è presente il valore riferito
NO ACTION Non fare nulla (in MySQL equivale a RESTRICT)
22/04/2015
61
MatteoCeserani
Se non si specifica alcuna clausola ON DELETE e/o
ON UPDATE MySQL utilizza di default il valore
RESTRICT
62. VINCOLI INTERRELAZIONALI
È ovviamente possibile inserire a posteriori una
chiave esterna in una relazione già creata
Si utilizza il comando ALTER
I campi coinvolti nelle chiavi esterne DEVONO
essere indicizzati in entrambe le relazioni
Se un indice non è presente MySQL lo crea
automaticamente
22/04/2015
62
MatteoCeserani
ALTER TABLE Prenotazione
ADD CONSTRAINT FK_Camera FOREIGN KEY
Prenotazione (Camera) REFERENCES Camera (Numero)
ON UPDATE CASCADE
ON DELETE RESTRICT;
63. MODIFICARE UNA RELAZIONE
Una tabella può essere modificata dopo essere
stata creata utilizzando il comando ALTER TABLE
Sintassi:
ALTER TABLE <Nome-Relazione>
<Specifica> [, <Specifica>]*
Le specifiche possono essere moltissime
Guardale tutte
MySQL 5.5 Reference Manual (Alter Table)
22/04/2015
63
MatteoCeserani
64. MODIFICARE UNA RELAZIONE
Un esempio relativo alle prenotazioni
Una prenotazione richiede che si specifichi:
Il tipo di servizio
I letti aggiuntivi
L’eventuale culla in camera
Aggiungiamo i campi necessari
22/04/2015
64
MatteoCeserani
ALTER TABLE Prenotazione
ADD COLUMN Servizio ENUM("MP","PC","BB") NOT
NULL DEFAULT "MP" AFTER DataP,
ADD COLUMN Supplementi SET('LAg1','LAg2','Cu')
AFTER Servizio;
65. MODIFICARE UNA RELAZIONE
Altre possibilità utilizzate spesso
ALTER TABLE <Nome-Relazione>
DROP COLUMN <Nome-Attributo>;
ALTER TABLE <Nome-Relazione>
MODIFY COLUMN <Nome-Attributo> <Tipo-
Attributo>;
ALTER TABLE <Nome-Relazione> RENAME TO
<Nuovo-Nome>;
ALTER TABLE <Nome-Relazione>
CHANGE COLUMN <Nome-Attributo> <Nuovo-Nome>
<Tipo-Attributo>;
22/04/2015
65
MatteoCeserani
66. MODIFICARE UNA RELAZIONE
Un altro esempio sulla relazione Cliente
Ci si può davvero sbizzarrire...
22/04/2015
66
MatteoCeserani
ALTER TABLE Cliente
ADD COLUMN Telefono VARCHAR(14),
ADD COLUMN Email VARCHAR(100);
67. ALTRE RELAZIONI DI SUPPORTO
22/04/2015
67
MatteoCeserani
CREATE TABLE Prezzi (
Tipologia ENUM ('Doppia', 'Matrimoniale',
'Singola', 'Tripla') NOT NULL PRIMARY KEY,
PrezzoA NUMERIC(6,2) NOT NULL,
PrezzoB NUMERIC(6,2) NOT NULL
);
CREATE TABLE Supplementi (
Tipo ENUM('LAg1','LAg2','Cu','P') NOT NULL
PRIMARY KEY,
Prezzo NUMERIC(6,2) NOT NULL
);
68. ALTRE RELAZIONI DI SUPPORTO
22/04/2015
68
MatteoCeserani
DELIMITER //
CREATE TRIGGER CheckPrezzi BEFORE INSERT ON Prezzi FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.PrezzoA <= 0 OR NEW.PrezzoB <= 0 OR NEW.PrezzoA <
NEW.PrezzoB) THEN
SET Messaggio = concat("Vincolo sui prezzi violato! Ricontrolla
i valori.");
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
CREATE TRIGGER CheckPrezziSup BEFORE INSERT ON Supplementi FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.Prezzo < 0) THEN
SET Messaggio = concat("Vincolo sui prezzi violato! Ricontrolla
i valori.");
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
69. INSERIRE VALORI IN UNA RELAZIONE
MySQL permette l’inserimento di valori in una
relazione in tre modi diversi
Di base si utilizza sempre l’istruzione INSERT in
tre varianti differenti
INSERT ... VALUES
INSERT ... SET
INSERT ... SELECT
22/04/2015
69
MatteoCeserani
71. INSERIRE VALORI IN UNA RELAZIONE
Qualche esempio può chiarire meglio
22/04/2015
71
MatteoCeserani
INSERT INTO Camera VALUES
(101,"Singola","TV,AC,Sm"),
(401,"Singola","VM,TV,AC"),
(102,"Doppia","VM,TV,AC"),
(402,"Doppia","TV,AC"),
(103,"Tripla","La1,VM,TV,AC"),
(203,"Tripla","La1,TV,AC"),
(201,"Matrimoniale","La1,VM,TV,AC"),
(202,"Matrimoniale","La1,TV,AC"),
(301,"Matrimoniale","La1,VM,TV,AC"),
(302,"Matrimoniale","La1,TV,AC"),
(303,"Matrimoniale","La1,La2,VM,TV,AC"),
(403,"Matrimoniale","La1,La2,VM,TV,AC"),
(404,"Matrimoniale","La1,La2,VM,TV,AC");
72. INSERIRE VALORI IN UNA RELAZIONE
I campi AUTO_INCREMENT supportano un
meccanismo di generazione automatica delle chiavi
Nella INSERT si specifica il valore NULL
Viene di fatto utilizzato il primo valore che non è mai
stato utilizzato in precedenza
Se invece si specifica un valore il sistema utilizza il
valore specificato
22/04/2015
72
MatteoCeserani
INSERT INTO Cliente VALUES
(NULL,"Matteo", "Ceserani", "1975-08-27",
"CSRMTT75M27F205C", "CI", "AN123456"),
(NULL,"Mattia", "Cipriani", "1996-01-07",
"CPRMTT96A07E202C", "CI", "FG654321");
73. INSERIRE VALORI IN UNA RELAZIONE
Una INSERT può determinare una violazione di un
vincolo PRIMARY KEY oppure FOREIGN KEY
In questi casi è utile ricorrere al costrutto ON
DUPLICATE KEY UPDATE
Se il sistema constata la violazione di un vincolo di
unicità aggiorna gli attributi necessari prima di eseguire
la INSERT
In generale però si consiglia di non usare questo
costrutto nel caso in cui una tabella contenga più campi
con vincolo UNIQUE
22/04/2015
73
MatteoCeserani
INSERT INTO Cliente VALUES
(1,"Matteo","Ceserani","1975-08-27",
"CSRMTT75M27F205C", "CI", "AN123456")
ON DUPLICATE KEY UPDATE Id = LAST_INSERT_ID() + 1;
74. INSERIRE VALORI IN UNA RELAZIONE
Attenzione però
La funzione LAST_INSERT_ID() restituisce l’ultimo
valore inserito attraverso una INSERT in un campo
AUTO_INCREMENT
Non si può però specificare la relazione in cui il record è
stato inserito!
Viene restituito sempre l’ultimo valore
AUTO_INCREMENT generato nella base di dati, a
prescindere dalla relazione
La INSERT della slide precedente funziona con
certezza solo se l’ultima INSERT eseguita si riferiva alla
relazione Cliente
22/04/2015
74
MatteoCeserani
75. INSERIRE VALORI IN UNA RELAZIONE
È possibile specificare nella INSERT solo un
sottoinsieme degli attributi della relazione
Es.
Per i campi non indicati tra le parentesi vengono
utilizzati i valori di DEFAULT, se indicati, oppure il
valore NULL
Nel caso di ENUM il valore di DEFAULT è il primo
riportato nella definizione della relazione
Nel caso di SET invece se non è indicato, il valore di
DEFAULT è NULL
22/04/2015
75
MatteoCeserani
INSERT INTO
Cliente(Nome,Cognome,TipoD,NumeroD) VALUES
("Massimiliano","Bianchi","CI","AB123456");
76. INSERIRE VALORI IN UNA RELAZIONE
INSERT ... SET
Questo tipo di INSERT può essere utilizzato in
alternativa al più comune INSERT … VALUES
Si tratta però di dialetto MySQL, non di SQL standard
Es.
equivale a
22/04/2015
76
MatteoCeserani
INSERT INTO Cliente(Nome,Cognome,NumeroD) VALUES
("Massimiliano","Bianchi","AB123457");
INSERT INTO Cliente SET
Nome = "Massimiliano", Cognome = "Bianchi",
NumeroD = "AB123457";
77. INSERIRE VALORI IN UNA RELAZIONE
INSERT ... SELECT
Il costrutto INSERT ... SELECT permette di inserire
in una tabella valori ottenuti da una o più altre tabelle
Es.
22/04/2015
77
MatteoCeserani
CREATE TABLE ClienteP(
Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
Nome VARCHAR(100),
Cognome VARCHAR(100) NOT NULL,
DataN DATE,
NumeroD VARCHAR(30) NOT NULL UNIQUE,
Telefono VARCHAR(14),
Email VARCHAR(100)
);
INSERT INTO ClienteP SELECT
Cliente.Id, Cliente.Nome, Cliente.Cognome, Cliente.DataN,
Cliente.NumeroD, Cliente.Telefono, Cliente.Email
FROM Cliente
WHERE Cliente.TipoD = "P";
78. ELIMINARE VALORI DA UNA RELAZIONE
DELETE
Sintassi
DELETE FROM <tbl_name>
[WHERE <where_condition>]
[LIMIT <row_count>];
Es.
22/04/2015
78
MatteoCeserani
DELETE FROM Cliente WHERE
Cognome = "Massimiliano" LIMIT 1;
79. ELIMINARE RELAZIONI, VINCOLI E DATABASE
DROP
DROP DATABASE
DROP TABLE
DROP INDEX
DROP TRIGGER
Da usare con grande attenzione!
22/04/2015
79
MatteoCeserani
80. STORAGE ENGINES
Uno storage engine è lo strato software che in un
DBMS si occupa di effettuare le operazioni CRUD
sui database
Create
Read
Update
Delete
Di per sé si può vivere bene senza preoccuparsi
troppo dello storage engine che un DBMS sta
utilizzando
22/04/2015
80
MatteoCeserani
81. STORAGE ENGINES
Molti DBMS supportano diversi tipi di storage
engines
MySQL
InnoDB
MyISAM
Memory
Merge
Archive
Federated
NDB
CSV
Blackhole
Example
22/04/2015
81
MatteoCeserani
82. STORAGE ENGINES
Confronto tra diversi storage engines
22/04/2015
82
MatteoCeserani
Feature MyISAM Memory InnoDB Archive NDB
Storage limits 256TB RAM 64TB None 384EB
Transactions No No Yes No Yes
Locking granularity Table Table Row Table Row
MVCC No No Yes No No
Geospatial data type support Yes No Yes Yes Yes
Geospatial indexing support Yes No No No No
B-tree indexes Yes Yes Yes No No
T-tree indexes No No No No Yes
Hash indexes No Yes No No Yes
Full-text search indexes Yes No Yes No No
Clustered indexes No No Yes No No
Data caches No N/A Yes No Yes
Index caches Yes N/A Yes No Yes
Compressed data Yes No Yes Yes No
Encrypted data Yes Yes Yes Yes Yes
Cluster database support No No No No Yes
Replication support Yes Yes Yes Yes Yes
Foreign key support No No Yes No No
Backup / point-in-time recovery Yes Yes Yes Yes Yes
Query cache support Yes Yes Yes Yes Yes
Update statistics for data dictionary Yes Yes Yes Yes Yes
83. STORAGE ENGINES
Come impostare uno storage engine
22/04/2015
83
MatteoCeserani
CREATE TABLE ClienteP(
Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL
AUTO_INCREMENT,
Nome VARCHAR(100),
Cognome VARCHAR(100) NOT NULL,
DataN DATE,
NumeroD VARCHAR(30) NOT NULL UNIQUE,
Telefono VARCHAR(14),
Email VARCHAR(100)
) Engine = InnoDB;