SQL Linguaggio di interrogazione per basi di dati relazionali
SQL Structured Query Language Linguaggio di interrogazione per basi di dati relazionali. Permette di comunicare con diversi sistemi tramite un unico linguaggio (limitatamente all utilizzo di semplici istruzioni). Comprende funzionalita sia di Data Definition Language (DDL), per modificare lo schema di un database, sia di Data Manipulation Language (DML), per modificarne le istanze. 2
SQL Prima proposta: SEQUEL (IBM Research, 1974, System R); Standard: 1986: prima versione (ANSI) 1989: SQL-89 1992: SQL-2 1999: SQL-3 (ISO) Livelli di aderenza: Entry SQL Intermediate SQL Full SQL 3
SQL SQL come Data Definition Language
Creazione di tabelle relazionali Il processo di progettazione di una base di dati relazionale porta alla definizione di tabelle (schema logico). Ad esempio: DIPARTIMENTO(Codice, Nome, Indirizzo) In SQL, questa tabella puo essere create nel seguente modo: CREATE TABLE DIPARTIMENTO( Codice CHAR(4) PRIMARY KEY, Nome VARCHAR(40), Indirizzo VARCHAR(80) ) 5
Creazione di tabelle Istruzione per la creazione della tabella Nome della tabella CREATE TABLE DIPARTIMENTO( Codice CHAR(4) PRIMARY KEY, Nome VARCHAR(40), Indirizzo VARCHAR(80) ) Nomi degli attributi Domini, cioe insieme dei valori ammissibili per il corrispondente attributo 6
Creazione di tabelle Otteniamo una tabella come la seguente, momentaneamente vuota. Per ogni attributo, abbiamo specificato un dominio, cioè l insieme di valori ammissibili per quell attributo. Codice Nome Indirizzo 7
Domini I domini possono essere elementari, cioè messi direttamente a disposizione dal linguaggio SQL. Inoltre, un utente può definire propri domini a partire da quelli semplici. Inizieremo con il vedere i domini elementari. 8
Domini elementari: Caratteri Stringa di caratteri di lunghezza predefinita: character(4) Esattamente 4 caratteri char(4) character(4) character set Greek Stringa di caratteri di lunghezza variabile: character varying (4) varchar(4) varchar(4) character set Greek Al massimo 4 caratteri 9
Domini elementari: Bit Bit: utile per rappresentare flag, cioè possesso o meno di una proprietà. Stringa di bit di lunghezza predefinita: bit(1) Esattamente 1 bit bit(5) Stringa di bit di lunghezza variabile: bit varying (4) varbit(4) Al massimo 4 bit 10
Domini elementari: numerici esatti Interi: integer smallint Decimali numeric(3) numeric(5,2) decimal(5,2) 3 cifre significative [-999, +999] [-999.99, +999.99] 5 cifre significative, di cui 2 dopo la virgola [-999.99???, +999.99???] Almeno 5 cifre significative, di cui almeno 2 dopo la virgola 11
Domini elementari: numerici approssimati Dichiarazioni: float float(5) real double precision Esempi: 0,467E12 0,24E-3-0,4E-7 0.467x10 12 Numero di cifre per rappresentare la mantissa mantissa esponente 12
Domini elementari: temporali Date (anno, mese, giorno) date 2003-10-1 Orario (ora, minuti, secondi) time 10:59:05 time(3) 10:59:05.000 time with time zone 10:59:05+1:00 Istante (anno, mese, giorno, ora, minuti, secondi) timestamp 2003-10-1 10:59:05.000000 timestamp(3) 2003-10-1 10:59:05.000 timestamp with time zone 2003-10-1 10:59:05+1:00 13
Domini elementari: intervalli di tempo Rappresenta la durata di un evento interval year(2) interval year(3) to month interval day fino a 99 anni interval day(4) to second(5) fino a 999 anni e 11 mesi fino a 9999 giorni, 23 ore, 59 minuti e 59.99999 secondi 14
Domini elementari Ricapitolando, si possono utilizzare i seguenti domini elementari: Stringhe di caratteri. Stringhe di bit. Numerici precisi e approssimati. Tempi e intervalli temporali. 15
Esempi di domini CREATE TABLE DIPARTIMENTO( Codice CHAR(4) PRIMARY KEY, Nome VARCHAR(40), Indirizzo VARCHAR(80)) Codice INFO MATE Nome Scienze dell informazione Matematica Indirizzo Via Mura A. Zamboni, 7 null 16
Esempi di domini CREATE TABLE DOCENTI( ID CHAR(5) PRIMARY KEY, Nome VARCHAR(40), Cognome VARCHAR(80), Stipendio INTEGER) ID Nome Cognome Stipendio 00232 Mario Rossi 4000 17
Esempi di domini CREATE TABLE DOCENTI( ID CHAR(5) PRIMARY KEY, Nome VARCHAR(40), Cognome VARCHAR(80), Licenziato DATE) ID Nome Cognome Licenziato 00233 Mario Neri 2004-01-01 18
Domini personalizzati E possibile creare nuovi domini, a partire da quelli presentati finora. Per creare un dominio, si può modificare un tipo elementare: Definendo un valore di default. Aggiungendo vincoli (restrizioni). Un dominio può essere utile per non ripetere più volte gli stessi vincoli. 19
Domini personalizzati Momentaneamente ne vedremo solo un esempio: CREATE DOMAIN VOTO DEFAULT null CHECK (value>=18 AND value<=30) 20
Domini personalizzati Istruzione per la creazione del dominio Nome del dominio CREATE DOMAIN VOTO DEFAULT null CHECK (value>=18 AND value<=30) Comportamento di default Vincolo. Vedremo più avanti come definire vincoli complessi. 21
Vincoli I domini permettono di vincolare i valori che popoleranno la base di dati. Ci sono però altri tipi di vincoli che è bene potere esplicitare. Ad esempio, potremmo desiderare che non ci siano due docenti differenti con lo stesso codice docente, oppure che per ogni docente venga riportato almeno il cognome. 22
Vincoli Vedremo due classi di vincoli. I vincoli intrarelazionali riguardano una tabella. I vincoli interrelazionali riguardano più tabelle contemporaneamente. 23
Vincoli intrarelazionali Partiamo da una tabella senza vincoli: CREATE TABLE DOCENTI( ID CHAR(5), Nome VARCHAR(40), Cognome VARCHAR(80), Stipendio INTEGER ) 24
Vincoli intrarelazionali Se desideriamo che il cognome di un docente venga sempre specificato: CREATE TABLE DOCENTI( ID CHAR(5), Nome VARCHAR(40), Cognome VARCHAR(80) not null, Stipendio INTEGER ) 25
Vincoli intrarelazionali Se vogliamo che non ci siano due ID uguali: CREATE TABLE DOCENTI( ID CHAR(5) unique, Nome VARCHAR(40), Cognome VARCHAR(80) not null, Stipendio INTEGER ) 26
Vincoli intrarelazionali Se non vogliamo due docenti che si chiamano allo stesso modo: CREATE TABLE DOCENTI( ID CHAR(5) unique, Nome VARCHAR(40), Cognome VARCHAR(80) not null, Stipendio INTEGER, unique(nome, Cognome) ) 27
Vincoli intrarelazionali Attenzione: Nome VARCHAR(40) not null, Cognome VARCHAR(80) not null, unique(nome, Cognome) E diverso da: Nome VARCHAR(40) not null unique, Cognome VARCHAR(80) not null unique, 28
Vincoli intrarelazionali ID può ancora presentare valori nulli. Vorremmo che diventasse chiave primaria: CREATE TABLE DOCENTI( ID CHAR(5) primary key, Nome VARCHAR(40), Cognome VARCHAR(80) not null, Stipendio INTEGER, unique(nome, Cognome) ) 29
Vincoli intrarelazionali Se volessimo utilizzare l accoppiata Nome- Cognome come chiave primaria: CREATE TABLE DOCENTI( ID CHAR(5) not null unique, Nome VARCHAR(40), Cognome VARCHAR(80) not null, Stipendio INTEGER, primary key (Nome, Cognome) ) 30
Vincoli intrarelazionali Ricapitolando: not null, unique, primary key. La sintassi di unique e primary key cambia se ci si riferisce a piu attributi contemporaneamente. Esiste infine un costrutto particolarmente potente: check. Per comprenderne a pieno l utilizzo è però necessario introdurre altri aspetti di SQL. Lo vedremo quindi in seguito più in dettaglio. 31
Vincoli intrarelazionali CREATE TABLE DOCENTI( ID CHAR(5) not null unique, Nome VARCHAR(40), Cognome VARCHAR(80) not null, Stipendio INTEGER check (Stipendio>=3000), primary key (Nome, Cognome) ) 32
Vincoli interrelazionali I vincoli interrelazionali più importanti consistono nelle chiavi importate (foreign key). E anche possibile definire vincoli interrelazionali tramite il comando check, ma vedremo come in seguito. Ripassiamo brevemente il significato di chiave importata. 33
Vincoli interrelazionali Codice Data Vigile Prov Numero Infrazioni 65524 3/9/1997 343 MI 3K9886 87635 4/12/1997 476 MI 6D5563 82236 4/12/1997 343 RM 7C5567 35632 6/1/1998 476 RM 7C5567 Automobili Matricola 343 476 548 Vigili Cognome Nome Rossi Luca Neri Pino Nicolosi Gino Prov MI MI RM RM MI Numero 3K9886 6D5563 7C5567 1A6673 5E7653 Prop Nestore Nestore Polluce Mussone Marchi 34..................
Vincoli interrelazionali create table Infrazioni( Codice character(6) primary key, Data date not null, Vigile integer not null references Vigile(Matricola), Provincia character(2), Numero character(6), foreign key(provincia, Numero) references Automobili(Provincia, Numero)) 35
Vincoli interrelazionali Infrazioni è detta tabella interna, mentre Vigili e Automobili sono dette tabelle esterne. Una chiave importata ha come unico vincolo unique sull attributo/i della tabella esterna. references può essere utilizzato su un singolo attributo, mentre foreign key(...) references su un numero qualsiasi di attributi. 36
Vincoli interrelazionali: politiche di reazione Codice Data Vigile Prov Numero Infrazioni 65524 3/9/1997 343 MI 3K9886 87635 4/12/1997 476 MI 6D5563 82236 4/12/1997 343 RM 7C5567 35632 6/1/1998 476 RM 7C5567 Matricola 343 476 548 Vigili Cognome Nome Rossi Luca Neri Pino Nicolosi Gino Cancellazione in una tabella interna: NESSUNA REAZIONE 37
Vincoli interrelazionali: politiche di reazione Codice Data Vigile Prov Numero Infrazioni 65524 3/9/1997 343 MI 3K9886 87635 4/12/1997 476 MI 6D5563 82236 4/12/1997 343 RM 7C5567 35632 6/1/1998 477 RM 7C5567 Matricola 343 476 548 Vigili Vincolo non Cognome Nome soddisfatto nella tabella interna: Rossi Luca PROIBITO Neri Pino Nicolosi Gino 38
Vincoli interrelazionali: politiche di reazione Codice Data Vigile Prov Numero Infrazioni 65524 3/9/1997 343 MI 3K9886 87635 4/12/1997 476 MI 6D5563 82236 4/12/1997 343 RM 7C5567 35632 6/1/1998 476 RM 7C5567 Matricola 343 476 548 Vigili Cognome Nome Rossi Luca Neri Pino Nicolosi Gino Modifica in una tabella esterna: otteniamo valori non ammissibili, dobbiamo ripristinare il vincolo. COME? 39
Vincoli interrelazionali: politiche di reazione Codice Data Vigile Prov Numero Infrazioni 65524 3/9/1997 343 MI 3K9886 87635 4/12/1997 476 MI 6D5563 82236 4/12/1997 343 RM 7C5567 35632 6/1/1998 476 RM 7C5567 Matricola 343 476 548 Vigili Cognome Nome Rossi Luca Neri Pino Nicolosi Gino SOLUZIONE 1: PROPAGAZIONE DELLA CANCELLAZIONE 40
Vincoli interrelazionali: politiche di reazione Codice Data Vigile Prov Numero Infrazioni 65524 3/9/1997 null MI 3K9886 87635 4/12/1997 476 MI 6D5563 82236 4/12/1997 null RM 7C5567 35632 6/1/1998 476 RM 7C5567 Matricola 343 476 548 Vigili Cognome Nome Rossi Luca Neri Pino Nicolosi Gino SOLUZIONE 2: ANNULLAMENTO DEI VALORI NON AMMISSIBILI 41
Vincoli interrelazionali: politiche di reazione Codice Data Vigile Prov Numero Infrazioni 65524 3/9/1997 343 MI 3K9886 87635 4/12/1997 476 MI 6D5563 82236 4/12/1997 343 RM 7C5567 35632 6/1/1998 476 RM 7C5567 Matricola 666 476 548 Vigili Cognome Nome Rossi Luca Neri Pino Nicolosi Gino Problema simile se vengono modificati valori di una chiave importata. 42
Violazione dei vincoli Per tutti i vincoli intrarelazionali, si assume che se violati a causa di un aggiornamento, il comando di aggiornamento venga rifiutato segnalando l errore all utente. Per i vincoli di integrità referenziale, SQL permette di scegliere altre reazioni da adottare quando viene rilevata una violazione La reazione è possibile solo per le operazioni sulla tabella esterna, che si possono propagare secondo una certa politica verso la tabella interna. Le violazioni possibili sono causate da modifiche di attributi o cancellazione di righe. 43
Politiche di reazione Specificata immediatamente dopo il vincolo di integrità consente di associare politiche diverse ai diversi eventi (delete, update) secondo la seguente sintassi: on delete < cascade set null set default no action > on update < cascade set null set default no action > 44
Reazioni per delete cascade: si propagano le cancellazioni. set null: all attributo referente viene assegnato il valore nullo al posto del valore cancellato nella tabella. set default: all attributo referente viene assegnato il valore di default al posto del valore cancellato nella tabella esterna. no action: la cancellazione non viene consentita. 45
Reazioni per update cascade: il nuovo valore valore viene propagato nell altra tabella. set null: all attributo referente viene assegnato il valore nullo al posto del valore modificato nella tabella. set default: all attributo referente viene assegnato il valore di default al posto del valore modificato nella tabella esterna. no action: l azione di modifica non viene consentita. 46
Vincoli interrelazionali: politiche di reazione create table Infrazioni( Codice character(6) primary key, Data date not null, Vigile integer not null references Vigile(Matricola), Provincia character(2), Numero character(6), foreign key(provincia, Numero) references Automobili(Provincia, Numero) on update cascade on delete set null ) 47
Modifiche degli schemi Abbiamo visto come creare tabelle, e in parte come definire domini personalizzati. Uno schema di un database può essere costituito da questi e da altri elementi, che impareremo a dichiarare in seguito. Come possiamo fare se abbiamo la necessità di modificare una tabella o un dominio successivamente alla loro creazione? 48
Modifiche degli schemi E possibile manipolare schemi a posteriori tramite i seguenti comandi: ALTER DROP 49
Cancellazione di tabelle Istruzione per la cancellazione della tabella Nome della tabella DROP TABLE DIPARTIMENTO Solo se la tabella non e vuota. DROP TABLE DIPARTIMENTO RESTRICT DROP TABLE DIPARTIMENTO CASCADE Indipendentemente dal contenuto 50
Cancellazione di domini Istruzione per la cancellazione del dominio Nome del dominio DROP DOMAIN VOTO DROP DOMAIN VOTO RESTRICT Solo se il dominio non e utilizzato da nessun attributo. DROP DOMAIN VOTO CASCADE Indipendentemente dall utilizzo. Gli attributi che lo utilizzavano mantengono la definizione di tipo. 51
Comando DROP DROP... CASCADE ATTENZIONE AGLI EFFETTI INDESIDERATI. Ne parleremo quando avremo introdotto altri elementi dello schema. 52
Alterazione di tabelle (Colonne) ALTER TABLE DIPARTIMENTO ADD COLUMN NASCITA DATE ALTER TABLE DIPARTIMENTO DROP COLUMN NASCITA 53
Alterazione di tabelle (Default) ALTER TABLE DIPARTIMENTO ALTER COLUMN NASCITA DROP DEFAULT ALTER TABLE DIPARTIMENTO ALTER COLUMN NASCITA SET DEFAULT 1940-01-01 54
Alterazione di tabelle (Vincoli) ALTER TABLE DIPARTIMENTO ADD CONSTRAINT DefNuovoVincolo ALTER TABLE DIPARTIMENTO DROP CONSTRAINT NomeVincolo 55
Dizionario dei Dati Tutti i DBMS relazionali gestiscono le descrizioni delle tabelle presenti nella basi di dati mediante una struttura relazionale, cioè mediante tabelle. La base di dati contiene due tipi di tabelle: Quelle contente i dati. Quelle contenente i metadati (dati che descrivono dati), dette il catalogo della base di dati oppure il dizionario dei dati. I comandi di definizione e modifica dello schema manipolano il dizionario dei dati. 56