SQL
Lorenzo Sarti – 2009 – Basi di Dati
1
Storia e standard
Lorenzo Sarti – 2009 – Basi di Dati
2
SQL-2
• È ricco e complesso e nessun sistema commerciale lo
implementa in maniera completa
• Sono definiti 3 livelli di complessità che individuano dei
sotto-standard che possono essere realizzati in un dato
DBMS:
– Entry - molto simile a SQL - 89,
– Intermediate,
– Full
• I sistemi commerciali spesso offrono funzionalità
aggiuntive che non sono specificate nello standard e
sono quindi dipendenti dal sistema usato
Lorenzo Sarti – 2009 – Basi di Dati
3
Implementazioni
Alcuni DBMS commerciali
• ORACLE
• DB2 (IBM)
• Access (Microsoft)
• MSSQL server (Microsoft)
• Informix
• Mysql
•
Un DBMS
tipico
SQL-3
SQL-2
PostgreSQL
SQL-89
SQL-1
Lorenzo Sarti – 2009 – Basi di Dati
4
Definizione di un database
• La definizione di un database avviene
attraverso la definizione dello schema, ovvero
dell’insieme di domini, tabelle, indici, viste,
privilegi che lo costituiscono
• SQL mette a disposizione un apposito
comando, CREATE SCHEMA, che consente
di specificare quali sono i diritti degli utente sul
DB e quali siano i suoi elementi componenti
Lorenzo Sarti – 2009 – Basi di Dati
5
Creazione di un database
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] dbowner ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ TABLESPACE [=] tablespace ]
[ CONNECTION LIMIT [=] connlimit ] ]
CREATE DATABASE studente
CREATE DATABASE anagrafica WITH OWNER sarti
CREATE DATABASE biblioteca WITH OWNER universita
Lorenzo Sarti – 2009 – Basi di Dati
6
Diritti di accesso
• All’atto della creazione di un database l’utente
creatore ne diventa il proprietario. Gli altri utenti
possono leggere le informazioni ma non
modificare il DB
• Per modificare i diritti di accesso è possibile
utilizzare i comandi GRANT e REVOKE
Lorenzo Sarti – 2009 – Basi di Dati
7
GRANT e REVOKE
• Revoca dei diritti
REVOKE [CREATE | CONNECT] ON
DATABASE nomedatabase FROM [nome utente|
public]
• Attribuzione diritti
GRANT [CREATE | CONNECT] ON DATABASE
nomedatabase TO [nome utente|public] <WITH
GRANT OPTION>
Lorenzo Sarti – 2009 – Basi di Dati
8
Creazione di tabelle
<comando_di_creazione_tabella>::=
CREATE TABLE <nome_tabella>
(<definizione_elemento_tabella>,
…,<definizione_elemento_tabella>)
Dove:
<definizione_elemento_tabella>::=
<definizione_colonna>|<definizione_vincolo_di_tabella>
Quindi la creazione di una tabella avviene attraverso l’enumerazione
delle colonne che la compongono.
Lorenzo Sarti – 2009 – Basi di Dati
9
Definizione dei dati – 1/2
<definizione_colonna> ::=
<nome_colonna> <tipo_di_dati>
[clausola_default]
[definizione_vincolo_di_colonna]
Lorenzo Sarti – 2009 – Basi di Dati
10
Definizione dei dati – 2/2
Sequenza di caratteri alfabetici (stringa)
numero
numero
Matricola
103
110
134
149
155
Nome
Paolo Bianchi
Gaia Belli
Luca Forti
Mario Mori
Filippo Mei
Età
34
36
27
33
30
Stipendio
2.380
2.500
2.500
1.800
2.500
numero
IMPIEGATI
Lorenzo Sarti – 2009 – Basi di Dati
11
Il tipo carattere
• Rappresenta singoli caratteri alfanumerici
stringhe di lunghezza fissa o variabile
oppure
char
char(lunghezza)
varchar(lunghezza)
char varying (lunghezza)
Si definisce l’attributo Nome della relazione IMPIEGATI come sequenza di
caratteri di lunghezza massima 20
Nome char(20)
Nome varchar(20)
Lorenzo Sarti – 2009 – Basi di Dati
12
Il tipo bit
bit
bit(lunghezza)
bit varying (lunghezza)
Si definisce l’attributo Lavoratore nella relazione STUDENTI per indicare se
si lo studente è o meno lavoratore
Lavoratore bit
Lorenzo Sarti – 2009 – Basi di Dati
13
Tipi numerici esatti
• Rappresentano numeri interi o numeri decimali in
virgola fissa (con un numero prefissato di decimali)
numeric
decimal
smallint
numeric(precisione) numeric(precisione,scala)
decimal(precisione) decimal(precisione,scala)
integer
Si definisce l’attributo Eta nella relazione IMPIEGATI
Eta decimal(2) Rappresenta tutti i numeri fra -99 e +99
Si definisce l’attributo Cambio nella relazione PAGAMENTO per indicare
il valore del cambio del dollaro preciso al centesimo di Euro
Cambio numeric(5,4) Rappresenta tutti i numeri fra -9,9999 e +9,9999
Lorenzo Sarti – 2009 – Basi di Dati
14
Tipi numerici esatti e precisione
• La precisione dei tipi numerici esatti (il numero
massimo e minimo rappresentabili) dipende dal DBMS
• Il tipo dati DECIMAL consente, in generale, una
precisione maggiore del tipo dati NUMERIC
• Il tipo dati INTEGER consente
maggiore del tipo dati SMALLINT
una
precisione
Lorenzo Sarti – 2009 – Basi di Dati
15
Tipi numerici approssimati
• Sono utili per rappresentare ad esempio grandezze
fisiche (rappresentazione in virgola mobile)
• Il parametro precisione definisce la lunghezza della
mantissa
float
real
float(precisione)
double precision
Si definisce l’attributo Massa nella relazione ASTEROIDI
Massa real
0,17E16
= 1,7 1015
Precisione (double precision) > Precisione (real) > Precisione (float)
Lorenzo Sarti – 2009 – Basi di Dati
16
Date
• Permettono di rappresentare istanti di tempo
date
time
time(precisione)
timestamp timestamp(precisione)
• Ciascuno di questi domini è decomponibile in un
insieme di campi (anno,mese,giorno,ora,minuti,secondi)
DataDiNascita date
18/09/99
OraDiConsegna time
19.24.16
Arrivo timestamp
18/09/00 21.15.20
year(Arrivo) = 2000
minute(Arrivo) = 15
Lorenzo Sarti – 2009 – Basi di Dati
17
Intervalli temporali
• Permette di rappresentare intervalli di tempo come durate di
eventi
interval PrimaUnitàDiTempo
interval PrimaUnitàDiTempo to UltimaUnitàDitempo
Esempi
Anzianità di servizio in anni e mesi
AnzianitaServizio interval year to month
Tempo di consegna in giorni ed ore
TempoConsegna interval day to hour
Lorenzo Sarti – 2009 – Basi di Dati
18
BLOB e CLOB
Una tabella con figure e documenti
CREATE TABLE quadri {
nome VARCHAR(50),
nomeAuthore VARCHAR(30),
fotografia BLOB(10M),
descrizione CLOB(100k)
}
Lorenzo Sarti – 2009 – Basi di Dati
19
Tipi definiti dall’utente
• Simile alla definizione di tipi nei linguaggi di
programmazione ma non permette tipi strutturati
• Semplifica la scrittura del codice SQL e rende più
semplice la modifica
CREATE DOMAIN NomeDominio AS DominioElementare
[ Volore di default ] [ Vincoli ]
opzionali
Un prezzo in Euro
CREATE DOMAIN prezzo AS decimal(9,2) DEFAULT 0.00
Lorenzo Sarti – 2009 – Basi di Dati
20
Valori di default
• I valori di default specificano cosa deve essere
assegnato all’attributo quando non si indica un valore
esplicitamente
Default (valoreGenerico | user | null)
oppure
costoColazione NUMERIC(5) DEFAULT 3000
DatoInseritoDa
VARCHAR(8) DEFAULT null
Alcuni DBMS ammettono espressioni più complesse
lordo
NUMERIC(9) DEFAULT (netto+iva)
Lorenzo Sarti – 2009 – Basi di Dati
21
Definizione di tabella – Esempio 1
• Una tabella è costituita da un insieme ordinato di
attributi e di vincoli
Nome della relazione
CREATE TABLE
Nome
Indirizzo
Citta
)
Nome degli attributi
Dipartimento (
CHAR(20) PRIMARY KEY,
CHAR(50),
CHAR(20)
Vincoli
Tipo degli attributi (domini)
Lorenzo Sarti – 2009 – Basi di Dati
22
Definizione di Tabella – Esempio 2
CREATE TABLE Studenti (
Matricola
CHAR(9) PRIMARY KEY,
Cognome
VARCHAR(50),
Nome
VARCHAR(50),
DataDiNascita DATE,
Lavoratore
BIT DEFAULT NULL
)
Se non si specifica un valore si inserisce
per default il valore NULL
Studenti
Matricola Cognome Nome
Data di nascita Lavoratore
Lorenzo Sarti – 2009 – Basi di Dati
23
Definizione di Tabella – Esempio 3
CREATE TABLE Veicoli
(Targa CHAR(10),
Cod_Modello CHAR(3),
Cod_Categoria CHAR(2),
Cilindrata NUMERIC(4),
Cod_Combustibile CHAR(2),
Cavalli_Fiscali NUMERIC(3),
Velocita NUMERIC(3),
Posti NUMERIC(2) DEFAULT 5,
Immatricolazione DATE)
Lorenzo Sarti – 2009 – Basi di Dati
24
Vincoli intrarelazionali semplici
• Operano su un solo attributo della relazione
L’attributo non può assumere il valore NULL
not null
Non possono esistere due righe che hanno gli stessi valori
per l’attributo o insieme di attributi specificati
unique
primary key
Identifica la chiave primaria. Può essere specificato per una
sola colonna oppure come vincolo di tabella
Lorenzo Sarti – 2009 – Basi di Dati
25
Esempi di vincoli - 1
CREATE TABLE Impiegato (
Cognome
varchar(50) not null unique,
Nome
varchar(50) not null unique,
Dipartimento integer,
Stipendio
integer default 0
)
create table Impiegato (
Cognome
varchar(50) not null,
Nome
varchar(50) not null,
Dipartimento integer,
Stipendio
integer default 0,
unique(Cognome,Nome)
)
Lorenzo Sarti – 2009 – Basi di Dati
26
Esempi di vincoli - 2
CREATE TABLE Veicoli (
Targa char(10) primary key,
...
)
CREATE TABLE Veicoli (
Targa char(10) primary key,
Cod_Proprietario char(5) primary key,
...
CREATE TABLE Veicoli (
)
Targa char(10),
Cod_Proprietario char(5),
...
Primary key (Targa,Cod_Proprietario)
)
Lorenzo Sarti – 2009 – Basi di Dati
27
Vincoli di integrità referenziale
Lorenzo Sarti – 2009 – Basi di Dati
28
references
create table Impiegato (
Matricola
char(6) primary key,
Cognome
varchar(50) not null,
Nome
varchar(50) not null,
Diparti
char(15)
references Dipartimento(NomeDip),
Stipendio
integer default 0,
unique(Cognome,Nome)
)
Il campo Dipart può assumere solo i valori che compaiono nel campo
NomeDip della tabella Dipartimento. References permette di
specificare vincoli di colonna
Lorenzo Sarti – 2009 – Basi di Dati
29
foreign key () references()
create table Impiegato (
Matricola
char(6) primary key,
Cognome
varchar(50) not null,
Nome
varchar(50) not null,
Diparti
char(15)
references Dipartimento(NomeDip),
Stipendio
integer default 0,
unique(Cognome,Nome),
foreign key (Nome,Cognome)
references Anagrafica(Nome,Cognome)
)
La coppia di campi (Nome,Cognome) può assumere solo le coppie di
valori che compaiono nei campi (Nome,Cognome) della tabella
Anagrafica. Foreign key() references() permette di specificare un
vincolo di tabella
Lorenzo Sarti – 2009 – Basi di Dati
30
Cosa accade quando si viola un vincolo
Lorenzo Sarti – 2009 – Basi di Dati
31
Come si specificano le operazioni da effettuare
dopo la violazione di un vincolo?
• Le azioni che possono causare una violazione sono:
– Update
– Delete
create table Impiegato (
Matricola
char(6) primary key,
Cognome
varchar(50) not null,
Nome
varchar(50) not null,
Diparti
char(15)
references Dipartimento(NomeDip),
Stipendio
integer default 0,
unique(Cognome,Nome),
foreign key (Nome,Cognome)
references Anagrafica(Nome,Cognome)
on delete cascade, on update no action
)
Lorenzo Sarti – 2009 – Basi di Dati
32
Vincoli di controllo
• I vincoli di controllo sono utilizzati per verificare
generiche condizioni sui valori di una colonna
• La parola chiave che permette di specificare un vincolo
di controllo è CHECK
CREATE TABLE Veicoli
(Targa CHAR(10) PRIMARY KEY,
...
Cilindrata NUMERIC(4)
CHECK (Cilindrata < 4000),
...)
Lorenzo Sarti – 2009 – Basi di Dati
33
Indici
Crea un indice per effettuare ricerche più veloci utilizzando gli attributi
Nome e Cognome della tabella Studenti
create index NomeCognome on Studenti(Cognome,Nome)
Crea un indice secondo un ordine discendente
create index NomeCognome on Studenti(Cognome DESC,Nome
DESC)
Lorenzo Sarti – 2009 – Basi di Dati
34
Modifica dello schema
Elimina la tabella dipendenti, il suo contenuto e le viste connesse
drop table dipendenti cascade
Elimina la tabella dipendenti solo se è vuota e non ci sono oggetti connessi
drop table dipendenti restrict
Lorenzo Sarti – 2009 – Basi di Dati
35
Modifica dello schema
• Il comando alter permette di modificare le componenti:
inserimento/ rimozione colonne delle tabelle,
inserimento/rimozione vincoli ….
• Le modifiche possono generare errori
Elimina/inserisci colonne
alter table dipendenti add column stipendio numeric(9)
alter table dipendenti drop column stipendio
Alcuni database permettono modifiche agli attributi
alter table dipendenti alter colum stipendio
numeric(10) not null
Lorenzo Sarti – 2009 – Basi di Dati
36