Il linguaggio SQL: DDL |
|
SQL: caratteristiche generali |
- SQL (Structured Query Language) è il linguaggio standard de facto per DBMS relazionali, che riunisce in sé funzionalità di DDL, DML e DCL
- SQL è un linguaggio dichiarativo (non-procedurale), ovvero non specifica la sequenza di operazioni da compiere per ottenere il risultato
- SQL è “relazionalmente completo”, nel senso che ogni espressione dell’algebra relazionale può essere tradotta in SQL
…inoltre SQL fa molte altre cose…
- Il modello dei dati di SQL è basato su tabelle anziché relazioni:
- Possono essere presenti righe (tuple) duplicate
- In alcuni casi l’ordine delle colonne (attributi) ha rilevanza
- …il motivo è pragmatico (ossia legato a considerazioni sull’efficienza)
- SQL adotta la logica a 3 valori introdotta con l’Algebra Relazionale
|
SQL: standard e dialetti |
- Il processo di standardizzazione di SQL è iniziato nel 1986
- Nel 1992 è stato definito lo standard SQL-2 (o SQL-92) da parte dell’ISO (International Standards Organization), e dell’ANSI (American National Standards Institute), rispettivamente descritti nei documenti ISO/IEC 9075:1992 e ANSI X3.135-1992 (identici!)
- Del 1999 è lo standard SQL:1999, che rende SQL un linguaggio computazionalmente completo (e quindi con istruzioni di controllo!) per il supporto di oggetti persistenti…
- Allo stato attuale ogni sistema ha ancora un suo dialetto:
- supporta (in larga parte) SQL-2
- ha già elementi di SQL:1999
- ha anche costrutti non standard
- Quello che vediamo è la parte più “diffusa”
|
Data Definition Language (DDL) |
- Il DDL di SQL permette di definire schemi di relazioni (o “table”, tabelle), modificarli ed eliminarli
- Permette di inoltre di specificare vincoli, sia a livello di tupla (o “riga”) che a livello di tabella
- Permette di definire nuovi domini, oltre a quelli predefiniti
- Per vincoli e domini si può anche fare uso del DML (quindi inizialmente non si trattano completamente)
- Inoltre si possono definire viste (“view”), ovvero tabelle virtuali, e indici, per accedere efficientemente ai dati (questi ultimi li vedremo in SI L-B)
|
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
- Mediante l’istruzione DROP TABLE è possibile eliminare lo schema di una tabella (e conseguentemente la corrispondente istanza)
DROP TABLE Imp |
Definizione di tabelle: esempio |
 |
Valori nulli e valori di default |
- Per vietare la presenza di valori nulli, è sufficiente imporre il vincolo NOT NULL
CF chr(16) NOT NULL
- Per ogni attributo è inoltre possibile specificare un valore di default, che verrà usato se all’atto dell’inserimento di una tupla non viene fornito esplicitamente un valore per l’attributo relativo
Ruolo char(20) Default "Programmatore"
|
Chiavi |
- La definizione di una chiave avviene esprimendo un vincolo UNIQUE, che si può specificare in linea, se la chiave consiste di un singolo attributo
CF chr(16) UNIQUE
o dopo aver dichiarato tutti gli attributi, se la chiave consiste di uno o più attributi:
UNIQUE(Cognome, Nome)
UNIQUE(Cognome)
UNIQUE(Nome)
sarebbe molto più restrittivo
|
Chiavi primarie |
- La definizione della chiave primaria di una tabella avviene specificando un vincolo PRIMARY KEY, o in linea o come vincolo di tabella
CodImp chr(4) Primary Key
Primary Key(Codprog, Citta)
- Va osservato che:
- 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
In DB2 è necessario specificare il vincolo NOT NULL sia per definire chiavi sia per definire chiavi primarie! |
Chiavi esterne (“foreign key”) |
- La definizione di una foreign key avviene specificando un vincolo FOREIGN KEY, e indicando quale chiave viene referenziata
Sede chr(3) References Sedi(SEDE)
Foreign Key (Sede) References Sedi(SEDE)
- Nell’esempio, Imp è detta tabella di riferimento e Sedi tabella di destinazione (analoga terminologia per gli attributi coinvolti)
- Le colonne di destinazione devono essere una chiave della tabella destinazione (non necessariamente la chiave primaria)
- Se si omettono gli attributi destinazione, vengono assunti quelli della chiave primaria
Sede chr(3) References Sedi |
Vincoli generici (“check constraint”) |
- Mediante la clausola CHECK è possibile esprimere vincoli di tupla arbitrari, sfruttando tutto il potere espressivo di SQL
- La sintassi è: CHECK (<condizione>)
- Il vincolo è violato se esiste almeno una tupla che rende falsa la <condizione>. Pertanto
Stipendio int CHECKT(Stipendio > 0)
non permette tuple con stipendio negativo, ma ammette valori nulli per l’attributo Stipendio
- Se CHECK viene espresso a livello di tabella (anziché nella definizione dell’attributo) è possibile fare riferimento a più attributi della tabella stessa
CHECK(ImportoLordo = netto + Ritenute)
In DB2 il CHECK può usare solo condizioni valutabili sulla singola tupla |
Vincoli con nomi |
- A fini diagnostici (e di documentazione) è spesso utile sapere quale vincolo è stato violato a seguito di un’azione sul DB
- A tale scopo è possibile associare dei nomi ai vincoli, ad esempio:
Stipendio int CONSTRAINT StipendioPositivo
CHECK(Stipendio>0)
CONSTRAINT ForeignKeySedi
Foreign Key(Sedi) REFERENCEST Sedi |
Modifica di tabelle |
- Mediante l’istruzione ALTER TABLE è possibile modificare lo schema di una tabella, in particolare:
- Aggiungendo attributi
- Aggiungendo o rimuovendo vincoli
Alter Table Imp
ADD Column Sesso chr(1) CHECK(Sesso in ('M', 'F'))
ADD Constraint StipendioMax CHECK(Stipendio < 4000)
DROP Constraint StipendioPositivo
DROP UNIQUE(Cognome, Nome);
- Se si aggiunge un attributo con vincolo NOT NULL, bisogna prevedere un valore di default, che il sistema assegnerà automaticamente a tutte le tuple già presenti
ADD ColumnT Istruzione chr(10) NOT NULL Default 'Laurea'
|
tratto da DIPLOMA UNIVERSITARIO A DISTANZA IN INGEGNERIA
LOGISTICA E DELLA PRODUZIONE -
Sistemi Informativi Aziendali |