Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
I predefiniti sono:
Per i caratteri o un singolo carattere:
o char (n) carattere di lunghezza n fissa, quindi occupa n byte anche la stringa è minore
o varchar(n) stringa di massimo n caratteri, occupa 1byte+ # caratteri della stringa
numerici
o int (o smallint, bigint ) [UNSIGNED] dove con unsigned si intende i soli valori interi positivi
(di default è signed. Si usa quando non ci interessa la parte frazionaria.
o Numeric (p,s) quando il numero rappresentato è costituito in totale da p numeri di cui s
dopo la virgola. ES: numeric(3,1) : numeri da -99.9 a +99.9
o Float (m,d) per i numeri in virgola mobile. M è il numero di cifre dedicate alla mantissa, dla
precisione dell’esponente (che è un numero intero)
o Bit (n) sequenza fissa di n bit (cioè valori 0,1)
Data, nel formato (‘aaaa-mm-gg’)
Time nel formato (‘hh:mm:ss’)
Timestamp (‘AAAAMMGGhhmmss’) per avere informazioni sul momento esatto in cui si è
sottoscritto un dato
Boolean, per valori booleani che assumono valore true o false
BLOB e CLOB per memorizzare dati di enormi dimensioni costituiti rispettivamente da valori binari
o caratteri. Possono solo essere memorizzati ma non usati nelle interrogazioni
I domini definiti dall’utente sono utili quando è necessario utilizzare un insieme di vincoli su più tabelle, così
in caso di modifica del dominio, tale cambiamento si propaga
su tutte le tabelle che utilizzano quel dominio. Nella sintassi
qui a fianco va specificato il nome del dominio e il tipo di dati
che contiene, facendo riferimento ai domini predefiniti (INT,
CHAR…); è inoltre possibile definire un valore di default e
l’insieme delle condizioni che devono soddisfare i dati. La parola
VALUE è la parola chiave usata per indicare il valore del dominio in
fase di definizione dello stesso.
Modifica/cancellazione di domini
Per modificare un dominio si utilizza la sintassi scritta di lato e
consiste nell’aggiungere/eliminare vincoli o valori di default. Bisogna
tuttavia osservare che in caso di modifica, essa viene accettata solo
se tutti i dati già presenti soddisfano il nuovo dominio, altrimenti non
viene accettato (riguarda anche il default se un dato è stato inserito
vuoto). Durante l’eliminazione è invece opportuno scegliere tra le
impostazioni restrict (utilizzata di default), che impedisce la
cancellazione in caso il dominio sia presente nella definizione di
qualche tabella, e cascade che sostituisce il dominio con uno
elementare, generando una reazione a cascata.
Vincoli
I vincoli di integrità sono quelli che devono essere soddisfatti da una tupla affinché essa sia legale e dunque
inseribile nella base di dati. Questi vincoli sono intrarelazionali se riguardano solo una relazione (vincoli di
dominio, not null,default,…) o interrelazionali se riguardano più relazioni
(foreign key).Considerando questa sintassi andiamo a vedere le varie
tipologie di vincoli.
I vincoli predefiniti sugli attributi sono:
[NOT NULL| NULL] se può assumere il valore nulla in caso di mancanza di informazione o no
[DEFAULT valore] usato per impostare il valore di default, in caso non sia specificato si usa NULL
[UNIQUE] se non possono esserci valori duplicati per quell’attributo (insomma se è una chiave)
[PRIMARY KEY] se oltre a non poterci essere duplicati nemmeno il valore NULL
[REFERENCES NomeTabella [(NomeAttributo)] ] per definire un vincolo di chiave esterna su
NomeAttributo verso la primary key di NomeTabella
I vincoli predefiniti sulla tabella sono:
[PRIMARY KEY (nome_attributo1, nome_attributo2, …)] identifica la chiave primaria come un
insieme di attributi. Se ne può avere una e una sola per tabella.
[UNIQUE (nome_attributo1, nome_attributo2,…)] identifica una chiave candidata sull’insieme di
attributi
[FOREIGN KEY (nome_attr1, nome_attr2, …) REFERENCES nome_tabella [(nome_attr1,
nome_attr2...)]] permette di definire vincoli di chiave esterna su più attributi
(la differenza con quelli di prima è che quelli riguardavano un solo attributo, qui quando riguardano
due o più attributi contemporaneamente)
Inserimento dati nella tabella Per inserire i dati all’interno di una tabella già creata si utilizza
questa sintassi. Bisogna prestare attenzione ad alcune
questioni. Innanzitutto, se vengono inseriti gli attributi che si
vuole compilare, non è necessario né metterli nell’ordine in
cui sono nella tabella creata, ne mettere tutti quelli che riguardano la tabella. Se sono tutti quelli possibili
verranno compilati correttamente a prescindere dall’ordine, se un attributo non compare gli verrà
assegnato il valore di default o il valore null, se ciò non viola i vincoli. Se nella clausola INSERT non vengono
specificati gli attributi, il DBMS considererà tutti quelli definiti e nello stesso ordine in cui si trovano nella
tabella che si sta compilando; in caso di assenza di un valore il dato non può essere inserito. Si ricorda
nuovamente che in SQL le tabelle non sono relazioni ma multi-insiemi, quindi è necessario porre chiave e
chiave primaria per evitare di avere tuple uguali.
Cancellazione dati nella tabella Serve per eliminare le righe di una tabella. Se la condizione where
non è messa il DBMS cancella tutte le righe, altrimenti solo quelle
che soddisfano una determinata condizione (per esempio hanno
un certo valore in un campo). La where può contenere
interrogazioni annidate.
Aggiornamento tuple Per modificare tuple già esistenti. Viene prima considerata la
where per capire quali tuple saranno modificate, poi il set per
conoscere la modifica da effettuare.
Garantire il vincolo di integrità
Quando vi è un vincolo di integrità referenziale, bisogna stabilire che cosa succede alle tuple referenzianti in
caso di modifica/cancellazione della tabella referenziata. In
generale è possibile: impedire tale evento (NO ACTION), mettere
le righe della referenziate ai valori di default o nulla (SET DEFAULT
| SET NULL), o aggiornare il valore della referenziante a partire
dalla modifica avvenuta sulla referenziala (CASCADE). Questa
decisione va presa al momento della creazione di tabella con le
clausole ON DELETE e ON UPDATE.
Creazione o cancellazione schema e cancellazione tabella
Nella cancellazione del database come durante quella della
tabella si può decidere se impedirla a meno che non sia vuota
(restrict) oppure cancellarla e propagare la cancellazione
(cascade).
Modifica tabelle
Interrogazioni nidificate
Fino a questo momento abbiamo visto che la clausola where conteneva espressioni semplici o al più
collegate attraverso connettivi logici come and, or e not. Tuttavia, SQL permette di confrontare il valore di
una riga con il risultato di un’interrogazione SQL completa, si parla di interrogazioni nidificate. Così facendo
però si confronta un valore con una tabella (il risultato di un’interrogazione SQL è un multi-insieme), allora
bisogna utilizzare uno tra i seguenti costrutti:
ANY significa che la riga soddisfa la condizione se risulta vero il confronto con almeno una delle
righe del risultato dell’interrogazione
ALL significa che la riga soddisfa la condizione se risulta vero il confronto con tutte le righe della
nidificata
IN
NOT IN
EXISTS, ammette come parametro un’interrogazione nidificata e restituisce come valore vero se il
risultato dell’interrogazione interna è non vuoto
NOT EXISTS
Se le variabili di range dell’interrogazione esterna non vengono utilizzate in quella interna è possibile
effettuare una considerazione “semplice” delle interrogazioni nidificate secondo cui prima si esegue quella
interna e si memorizzano i risultati in una tabella temporanea, successivamente si esegue quella esterna
accedendo a tale tabella. Talvolta invece un’interrogazione fa riferimento ad una variabile di range (tabella)
definita nell’interrogazione esterna, in tal caso si parla di interrogazioni con correlazione e la visione
semplice non è più corretta. L’interrogazione interna non è infatti eseguita una sola volta per l’intera
correlazione esterna ma una volta per ogni riga dell’esterna analizzata (questo perché dipende
dall’esterna). Una volta definita una variabile di range essa può essere utilizzata nell’interrogazione stessa o
in una qualsiasi di livello inferiore (interna).
Se si utilizza exists nella tabella esterna (e quindi finale) ci saranno tutte le tuple della tabella esterna che
hanno fatto assumere il valore true ad exists.
Check, asserzioni e viste
Il vincolo di check è un particolare tipo di vincolo che può essere aggiunto durante la creazione di una
tabella ed è volto alla verifica che una tupla soddisfi dei
requisiti. La particolarità sta nel fatto che tale verifica
viene effettuata dopo l’inserimento della tupla e se risulta
violato il vincolo di check, essa viene eliminata (quindi te la
fa inserire ma poi la cancella). Le condizioni utilizzabili
sono le stesse che possono esserci nella where, quindi
anche interrogazioni annidate. Si può anche assegnare un nome al vincolo di check mediante l’istruzione
constraint. Il problema è che a volte è possibile aggirare i vincoli di
check poiché essi riguardano una tabella o un attributo,
per evitare ciò si utilizzano le asserzioni che sono vincoli
validi per ogni tabella e ogni attributo.
Check e asserzioni sono vincoli immediati, ovvero che vengono verificati ogni qual volta viene effettuata
un’operazione di modifica di una delle tabelle che coinvolgono. In caso di violazione viene eliminata
l’operazione di modifica (Rollback parziale). I vincoli differiti al contrario sono quelli che vengono verificati
in seguito ad una serie di operazioni dette transazioni. In questo caso se la verifica porta ad una violazione
dei vincoli, non si può sapere quale operazione ha causato questa situazione e l’intera transazione è
eliminata (Rollback).
Una vista è una tabella virtuale che non contiene effettivamente tuple ma è possibile ottenerle attraverso
la risoluzione di un’interrogazione SQL, è dunque
memorizzato come ottenerla. L’interrogazione interna,
che può contenere altre viste, deve restituire un’insieme
di attributi pari a quelli contenuti nello schema della
vista e nello stesso ordine. Per evitare che vengano
inserite tuple che non possono essere messe nella vista si mette un controllo sull’inserimento con “with
check option”. La vista può anche essere utile poiché SQL
non permette di mettere