Laboratorio di Basi di Dati Introduzione a SQL Pierluigi Pierini Technolabs S.p.a. Pierluigi.Pierini@technolabs.it
evoluzione e standards 1970 - E.F. Codd, A Relational Model of Data for Large Shared Data Banks. 1974 - Donald D. Chamberlin and Raymond F. Boyce of IBM created the Structured English Query Language (SEQUEL) 1979 - Relational Software Inc. (ora Oracle Corp.) lancia Oracle_v2 1983 - IBM rilascia DB2 1986 - ANSI rilascia il primo standard SQL-87 1999 - esce SQL:1999 (SQL3) con significativi aggiornamenti rispetto a SQL-87 2003 - esce SQL:2003, introduce XML 2006 - SQL:2006 estende i criteri di interazione tra XML e SQL 2008 - SQL:2008 (ISO/IEC 9075:2008)
introduzione SQL non è un linguaggio di programmazione paradigma dichiarativo: si specifica la descrizione dell obiettivo e non il modo con cui ottenerlo (a differenza dell algebra relazionale, che è procedurale) l interrogazione in SQL viene tradotta dai DBMS in linguaggio procedurale, quindi viene ottimizzata sulla traduzione si fanno ottimizzazioni algebriche (ecco a cosa serve l algebra!!!) e non (queste ultime dipendono dalle strutture sottostanti al DBMS in questione)
introduzione permette di definire lo schema di un database, popolarne le tabelle, aggiornarne i dati, eseguire query, definire vincoli ed autorizzazioni. le implementazioni SQL in genere non rispettano pienamente standard (vari dialetti)
introduzione Data Definition Language (DDL): definizione dello schema del DB Data Manipulation Language (DML): utilizzo dei dati del DB Data Control Language (DCL): gestione degli utenti gestione dei diritti ottimizzazione
DDL (Data Definition Language) E il primo dei linguaggi di SQL ed è dedicato alla definizione della parte intensionale del database: creazione del database tabelle, campi e domini indici eventuali modifiche allo schema (vincoli, autorizzazioni) DDL schema del DB
creazione di database sintassi: create database <database> [create-specs] se non vi sono create-specs, il DBMS alloca un insieme di risorse predefinite per il nuovo database (e.g. character set, page size, etc..). Esempio: CREATE DATABASE Biblioteca
modifica di database sintassi: alter database <database> <alterspecs> Modifica le impostazioni relative alle risorse fisiche impegnate dal database indicato Esempio: ALTER DATABASE Biblioteca ADD FILE bib2.gdb
cancellazione di database sintassi: drop database <database> Cancella tutte le tabelle e libera le risorse fisiche impegnate dal database indicato Esempio: DROP DATABASE Biblioteca
creazione di schema Per passare alla definizione dello schema delle singole tabelle, SQL richiede l ulteriore comando CREATE SCHEMA (in molte implementazioni è sinonimo di create database) Sintassi: CREATE SCHEMA [AUTHORIZATION owner] [schema elements] AUTHORIZATION specifica il proprietario dello schema che si va definendo schema elements comprende la definizione dello schema delle singole tabelle (CREATE TABLE), i diritti di accesso (GRANT) e le viste (CREATE VIEW).
esempio CREATE DATABASE DBlibri CREATE SCHEMA AUTHORIZATION db35 CREATE TABLE libri (isbn INT.) GRANT SELECT on libri to public...
definizione di dominio un dominio è un insieme di valori ammissibili per un attributo (concetto simile a quello di tipo ) SQL offre 6 famiglie di domini predefiniti: Carattere Bit Tipi numerici esatti Tipi numerici approssimati Data e ora Intervalli temporali si possono creare/manipolare domini nuovi a partire da quelli di base ( tipi composti ) con i costrutti: create/alter/drop domain
character per rappresentare caratteri singoli e stringhe a lunghezza fissa o variabile si puo` scegliere tra diversi alfabeti character [varying varying][(lunghmax)] [character set Fam] forme abbreviate: char char, varchar Es char, char(20), varchar(50)
bit per rappresentare bit (0,1) e stringhe di bit a lunghezza fissa o variabile utili per rappresentare in modo compatto insiemi di valori booleani bit [varying varying][(lunghmax)] forme abbreviate: varbit Es varbit(20), stringhe di bit lunghe al max 20
tipi numerici esatti per rappresentare valori esatti, interi o con parte decimale di lungh. prefissata numeric [(precision [, scale])] prec. esatta decimal [(precision [, scale])] prec. minima precision = numero di cifre significative (se non si indica, si usa quella di default del DBMS) scale = numero di cifre dopo la virgola (default=0) x = n x 10 -s n è intero e -10 p n < 10 p integer (intero a 32 bit) integer smallint (intero a 16 bit) Es decimal(4) tra 10000 e +9999 Es numeric(6,3) tra 1000,000 e +999,999
tipi numerici approssimati per rappresentare valori reali float[(precision)] double precision real Rappresentazione <mantissa>e<esponente> (precision indica le cifre della mantissa) Es 0.17E16 = 0.17 * 10 16
tipi temporali data e ora date contiene: year, month, day time contiene: hour, minute, second timestamp contiene: year, month, day, hour, minute, second intervalli temporali year-month per intervalli di anni e mesi; day-time time: per intervalli di giorni, ore, minuti e secondi interval due forme: year
tipi booleani non sono implementati in tutti i DBMS and T T T F F N N eventualmente sono sostituiti da un dominio definito dall utente F N F N F F F N boolean or T F N T T T T Può assumere valori: true, false e null F N not T T F N N N T F F T N N
valori di default per domini e attributi di tabelle valore che viene assegnato se non ne viene specificato un altro default <val null user > val: valore o espressione con tipo compatibile user: identificativo utente (per domini di tipo character ) null: valore costante che rappresenta assenza di informazione (i.e valore non noto o non applicabile); è compatibile con ogni tipo
operatori e funzioni funzioni aritmetiche di base + - * /, NULL=0 operatori di confronto <, =, >, <=, >=, <> operatori logici AND, OR, NOT funzioni scalari ABS(n), MOD(n,m), SQRT(n),... funzioni per stringhe LENGTH(s), SUBSTR(s,m[,n]), CONCAT(s1,s2,..) espressioni regolari e operatori di confronto per stringhe (LIKE) Test su valori null o diversi da null IS [NOT] NULL
creazione di un dominio composto Un dominio composto si costruisce come un sottoinsieme di un dominio predefinito che soddisfi specifiche condizioni e vincoli: create domain nome-dom as tipo [default value][not NULL][check vincoli] Es create domain annocorso as smallint default 1 not null check (value between 1 and 5)
definizione di vincoli Un vincolo è definibile tramite un espressione costruita sulla base delle funzioni e degli operatori del linguaggio. sintassi: check [VALUE <val>] <condition> <condition> = <operator> <val> [NOT] LIKE <val> [NOT] BETWEEN <val> AND <val> IS [NOT] NULL [NOT] IN (<val> [, <val> ] ) [NOT] CONTAINING <val> [NOT] STARTING [WITH] <val> (<condition>) NOT <condition> <condition> OR <condition> <condition> AND <condition> <val> = { :variable <constant> <expr> <function> NULL USER } <constant> = num 'string' <function> = COUNT (<val>) SUM (<val>) AVG (<val>) MAX (<val>) MIN (<val>) UPPER (<val>) CAST (<val> AS <datatype>)..
modifica/cancellazione di un dominio modifica di un dominio composto: alter domain nome-dom set [default value][not NULL][check vincoli] cancellazione di un dominio composto: drop domain nome-dom Es alter domain annocorso set type int Es drop domain annocorso
creazione di tabella (relazione) una tabella è una collezione di attributi (i.e.colonne) e può avere vincoli ciascun attributo può, a sua volta, avere dei vincoli create table nome-tab (col-spec [,col-spec tab-constraint ]) col-spec: nomeattr dominio [default-value] [vincoli] Inizialmente la tabella è vuota e il proprietario ha tutti i privilegi Es create table Persona (Nome char(20) not null unique, Cognome char(20) primary key, NumFigli smallint default 0)
vincoli intrarelazionali su tabelle e domini: specificano proprietà che ogni istanza del DB deve verificare vincoli predefiniti: not null: non può assumere valore nullo unique: attributo (insieme di attributi unique(attr {,attr})) è superchiave primary key: attributi come chiave primaria (implica il primary key not null) vincoli non predefiniti: check...
vincoli interrelazionali (I) foreign key: chiave esterna, impone che su ogni riga della tabella corrente (interna) il valore degli attributi specificati, se div. da null, sia presente nelle tuple della tabella esterna tra i valori dei corrisp. attributi. La sintassi impone che l insieme di attributi della tab. esterna sia unique, cioe` superchiave (vincolo di integrita` referenziale) references: foreign key su singolo attributo Es1 create table Impiegato ( Dip char(15) references ) Impiegato(Matr,Nome, Cogn,Dip,Stip) Dipartimento(NomeDip, ) Dipartimento(NomeDip)
vincoli interrelazionali (II) Es2 create table Impiegati (Matr character(6) primary key, Cogn character(20) not null, Nome character(20) not null, Dip character(15) references Dipartimento(NomeDip), Stip numeric(6) default 0, unique(nome,cogn) foreign key(nome,cogn) references Anagrafica(Nome,Cognome)) NB Conta l ordine degli attributi nella foreign key
gestione vincoli Vincoli intrarelazionali: il DBMS verifica che per ogni istanza (inserimento/modifica) i vincoli non siano violati. In caso di violazione, l aggiunta/modifica viene rifiutata con un messaggio di errore Vincoli interrelazionali: non tutte le violazioni vengono trattate nello stesso modo politiche di reazione alle violazioni
gestione vincoli integrità referenziale (I) violazione su tabella interna (inserimento/modifica riga) DBMS rifiuta l operazione violazione su tabella esterna (cancellazione/modifica riga a cui fa riferimento tabella interna) l esterna e` la tabella principale politiche specifiche
gestione vincoli integrità referenziale (II): modifica cascade: valore di tab esterna riportato su tutte tab interne cascade set null: inserisce null come valore degli attributi corrispondenti nelle tab interne set null set default: inserisce il valore di default set default no action: non si permette la modifica alla tab esterna no action
gestione vincoli integrità referenziale (III): cancellazione cascade: cancellazione delle righe corrispondenti anche dalle tab interne cascade set null: inserisce null come valore degli attributi nelle tab interne corrispondenti ai valori delle righe cancellate nella tab esterna set null set default: inserisce il valore di default set default no action: non si permette la cancellazione nella tab esterna no action
gestione vincoli integrità referenziale (IV) cascade prevede una stretta dipendenza tra le tabelle esterna ed interna si possono adottare politiche diverse si possono innescare reazioni a catena!
specifica di politica di reazione on <delete update> <cascade set null set default no action> Es2 create table Impiegati (Matr character(6) primary key, Cogn character(20) not null, Nome character(20) not null, Dip character(15), Stip numeric(6) default 0, unique(cogn,nome) foreign key(dip) references Dipartimento(NomeDip) on delete set null on update cascade)
modifica di una tabella modifica di una tabella: alter table nome-tab <operation>[, <operation> ]; <operation> = { ADD [COLUMN] nome-col <col_def> ADD <constraint> ALTER [COLUMN] column_name <alt_col> DROP col DROP CONSTRAINT constraint} <alt_col> = {TO new_col_name TYPE new_col_datatype POSITION new_col_position} Es: alter table Dipartimento ADD NUff int
cancellazione di una tabella cancellazione di una tabella: drop table nome-tab Es drop table Dipartimento
Inserire (I) query insert into nome-tab [(lista-attr)] <values (lista-valori) SelectSQL> Es1 insert into Dipart (Nome,Citta) values ( produzione, Torino ) Es2 insert into Prodotti-Milanesi (select Cod,Descr from Prodotto where Luogo = Milano )
Inserire (II) Conta l ordine con cui si elencano gli attributi (anche nella query) e i valori Se i valori non sono specificati: o null o valore di default (a seconda di come e` stata creata la tabella) Di solito vengono fornite delle form che nascondono le insert
Delete (I) delete from nome-tab [where condizione] Es1 delete from Dipart where Nome = produzione Es2 delete from Dipart where Nome not in (select Dip from Impiegato)
Delete (II) Se non c e` nessuna condizione, cancella tutta la nome-tab (attenzione ai cascade!!!) (1) delete from Dipart diverso da (2) drop table Dipart cascade diverso da (3) drop table Dipart restrict (1) cancella le righe della tabella (se c era cascade, cancella righe di altre tab. legate da vincoli integr. ref.) (2) rimuove la tabella (3) non cancella la tabella se ha tuple
Update (I) update nome-tab set attributo = <espressione SelectSQL null default> {,attributo = < >} [where condizione] Es1 update Dipendente set Stip = StipBase + 5 where matr = 666 Senza condizione, si modificano tutte le tuple
Update (II) 10% 15% Es2 1) update Impiegato set Stip = Stip*1.1 where Stip <= 30 2) update Impiegato set Stip = Stip*1.15 where Stip > 30 Il risultato è diverso se eseguite nell'ordine indicato o viceversa. SQL e` set-oriented e non tuple-oriented (come alternativa paraziale uso dei cursori )
Viste (tabelle virtuali) (I) create view nome-vista[(lista-attr)] as SelectSQL [with with[local cascade] check option] es1 Create view ImpAmm(Matr,Nome,Cogn,Stip) as select Matr,Nome,Cogn,Stip from Impiegato where Dip = Amm and Stip > 10
Viste (II) Utili per interrogazioni complesse Le viste possono usare altre viste, ma non possono esserci dipendenze ricorsive immediate (es. V1 usa V1) o transitive (es. V1 usa V2 che usa V3 che usa V1)
Viste (III) Su certe viste possibile fare modifiche che si ripercuotono sulle tabelle di base ( reali ) In generale, problemi se ci sono join molto complessi Regola: 1 tupla vista = 1 tupla tabella di base Nei sistemi commerciali viste definite su una sola tabella reale + ins. attr della vista contengono key prim. della tabella
Controllo dell accesso (I) Utente identificato in modo univoco (es. il system administrator, predefinito e molto potente) Si da il controllo e l accesso a risorse tramite privilegi grant e revoke privilegi revoke per dare e revocare i
Controllo dell accesso (II) I privilegi sono: insert ( es. tabelle, viste, asserzioni), update (es. tabelle, viste, attributi), delete (es. tabelle, viste, asserzioni), select (es. tabelle, viste, attributi nelle interrogazioni), reference (es. tabelle usate per vincoli di integrita` referenziali), usage (es. domini nella def. di schemi di rel.), drop/alter (solo il creatore puo` usarli)
Controllo (III) grant privilegi on risorse to utenti [with grant option] revoke privilegi on risorse from utenti [restrict cascade]