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 PostgreSQL SQL-3 SQL-2 SQL-89 SQL-1 Un DBMS tipico 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 Revoca dei diritti GRANT e REVOKE 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 numero Matricola Nome Età Stipendio 103 Paolo Bianchi 34 2.380 110 Gaia Belli 36 2.500 134 Luca Forti 27 2.500 149 Mario Mori 33 1.800 155 Filippo Mei 30 2.500 IMPIEGATI Lorenzo Sarti 2009 Basi di Dati 11 Il tipo carattere Rappresenta singoli caratteri alfanumerici oppure stringhe di lunghezza fissa o variabile 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 integer numeric(precisione) numeric(precisione,scala) decimal(precisione) decimal(precisione,scala) 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 una precisione maggiore del tipo dati SMALLINT 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 double precision float(precisione) Si definisce l attributo Massa nella relazione ASTEROIDI Massa real 0,17E16 = 1,7 10 15 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 OraDiConsegna time 18/09/99 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 ] Un prezzo in Euro opzionali 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 Dipartimento ( Nome CHAR(20) PRIMARY KEY, Indirizzo CHAR(50), Citta CHAR(20) ) Vincoli Nome degli attributi Tipo degli attributi (domini) Lorenzo Sarti 2009 Basi di Dati 22
Definizione di Tabella Esempio 2 Studenti 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 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 not null L attributo non può assumere il valore NULL unique Non possono esistere due righe che hanno gli stessi valori per l attributo o insieme di attributi specificati 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), Cod_Proprietario char(5),... Primary key (Targa,Cod_Proprietario) )... ) CREATE TABLE Veicoli ( Targa char(10) primary key, Cod_Proprietario char(5) primary key, )... 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