Microsoft's Internet Explorer browser has no built-in vector graphics machinery required for "loss-free" gradient background themes.
Please upgrade to a better browser such as Firefox, Opera, Safari or others with built-in vector graphics machinery and much more. (Learn more or post questions or comments at the Slide Show (S9) project site. Thanks!)
Come già visto, la metodologia per la progettazione di una banca dati prevede tre fasi indipendenti:
L’SQL (Structured Query Language) nasce nel 1974 nei laboratori dell’IBM, come strumento per interagire con i database basati sul modello relazionale. Si tratta di un linguaggio di tipo dichiarativo, molto simile alla lingua parlata inglese.
Dopo il 1983, data di rilascio di DB2 (un famoso DBMS relazionale ancora largamente in uso), l’SQL diventa uno standard de facto in ambito industriale.
L’SQL ha subito negli anni un processo di standardizzazione, sia ad opera dell’ANSI (1986, 1992, 1999, 2003, 2006) che della ISO (1987), che mirava alla creazione di un linguaggio comune a tutti i DBMS relazionali; tuttavia questo obiettivo non è stato mai raggiunto.
Attualmente ne esistono diverse implementazioni, che incorporano almeno in parte le operazioni standard (o almeno il sottoinsieme SQL-87), e ne incrementano le funzionalità attraverso estensioni procedurali (PL/SQL, PL/PgSQL, SQL PL…)
L’SQL è caratterizzato da tre sottolinguaggi, ciascuno avente obiettivi differenti:
Il DDL è il linguaggio che permette di creare, modificare o eliminare gli oggetti in un database. In particolare è possibile operare su:
Come visto in precedenza, un DBMS è un software che permette l’organizzazione e la gestione di uno o più database. In quest’ottica l’SQL deve prevedere delle istruzioni per la creazione, modifica e rimozione di questi ultimi:
CREAZIONE:
CREATE DATABASE db_name [create_specification [, create_specification] …]
MODIFICA:
ALTER DATABASE db_name [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
CANCELLAZIONE:
DROP DATABASE nome_db
Per dominio si intende un tipo di dato personalizzato, definito a partire da un tipo primitivo, da cui ne eredita tutte le caratteristiche, ma sottoposto a vincoli sui possibili valori che un tale attributo può assumere. Non tutti i DBMS implementano questa funzionalità
CREAZIONE DI UN DOMINIO:
CREATE DOMAIN nome_dominio AS tipo_primitivo [DEFAULT default_value] [constraint […]]
ELIMINAZIONE DI UN DOMINIO:
DROP DOMAIN nome_dominio [CASCADE | RESTRICT]
MODIFICA DI UN DOMINIO:
ALTER DOMAIN nome_dominio {SET DEFAULT default_value | DROP DEFAULT}
ALTER DOMAIN nome_dominio { SET | DROP } NOT NULL
ALTER DOMAIN nome_dominio ADD nome_vincolo
ALTER DOMAIN nome_dominio DROP CONSTRAINT nome_vincolo [ RESTRICT | CASCADE ]
Uno schema è una sorta di collezione di oggetti all’interno di un database. Questi oggetti possono essere tabelle, domini, viste, procedure...
L’introduzione di queste strutture all’interno di un DBMS nasce da due esigenze:
AGGIUNTA DI UNO SCHEMA:
CREATE SCHEMA nome_schema [ AUTHORIZATION username ] [ schema_element [ … ] ]
MODIFICA DI UNO SCHEMA:
ALTER SCHEMA nome RENAME TO nuovo_nome ALTER SCHEMA nome OWNER TO nuovo_propietario
CANCELLAZIONE DI UNO SCHEMA:
DROP SCHEMA [ IF EXISTS ] nome_schema [, …] [ CASCADE | RESTRICT ]
Il comando create table ha la funzione di creare una nuova tabella (o relazione). Il nome della tabella può essere scritto indifferentemente in MAIUSCOLO o in minuscolo (in alcuni ambienti il DBMS farà distinzione a seconda dei casi). È necessario che IL NOME DI UNA TABELLA rispetti le seguenti regole:
Oltre a definire gli attributi di una tabella è possibile definire dei vincoli.
La tabella può essere creata vuota oppure può essere creata e riempita di dati (create table mediante select); nel secondo caso la struttura della tabella è definita implicitamente dal numero di colonne (o campi) estratti dalla select
SINTASSI
CREATE TABLE nome_tabella( nome_colonna1 tipo_dato [vincolo (…)], nome_colonna2 tipo_dato [vincolo (…)], nome_colonna3 tipo_dato [vincolo (…)], … nome_colonnaN tipo di dato constraint (opzionale) );
CREATE TABLE nome_tabella AS SELECT …;
Il comando alter table ha la funzione di modificare la struttura della tabella. Supporta tre operatori:
Es.:
ALTER TABLE esame ADD COLUMN voto int not null default 18;
Per eliminare una tabella da un database (cancellando di conseguenza tutti i dati in essa contenuti) si utilizza il comando:
DROP TABLE nome_tabella [CASCADE | RESTRICT]
Utilizzando l’opzione CASCADE il DBMS eliminerà anche tutte le foreign keys che si riferiscono a dati della tabella cancellata.
Gli indici sono particolari strutture messe a disposizione dal DBMS per ottimizzare le operazioni di ricerca e ordinamento. È definire indici semplici (su un’unica colonna) o composti (su gruppi di colonne, per miglirare le operazioni di filtering miltiplo).
Nota: la definizione di una chiave primaria (vincolo PRIMARY KEY nella CREATE TABLE) presuppone la creazione automatica di un indice di unicità su tale colonna.
Sintassi:
CREATE [UNIQUE] INDEX nome_indice ON nome_tabella (nome_colonna [ASC|DESC])
DROP INDEX nome_indice
In aggiunta alle direttive di definizione della struttura e dei vincoli di un database, il modello relazionale prevede un sottoinsieme di operazioni per la manipolazione dei dati detto algebra relazionale
Queste operazioni hanno sempre come operandi una o più relazioni, e come risultato producono una nuova relazione, che può essere successivamente manipolata con la stessa algebra relazionale.
In genere si suddivide l’algebra relazionale in due sottoinsiemi:
Nota: selezione, proiezione, ridenominazione, prodotto cartesiano, unione e differenza sono operatori fondamentali, in quanto nessuno di essi può essere omesso senza togliere espressività al linguaggio.
Per operatore unario si intende una funzione di R→R, prende cioè come argomento un’unica relazione, e restituisce in output un’unica nuova relazione contenente le tuple risultato. L’algebra relazionale prevede i seguenti operatori unari:
Gli operatori binari dell’algebra relazionale sono funzioni di RxR→R, prendono come argomento due relazioni e ne restituiscono una nuova con le tuple rosultato.
Le funzioni di aggregazione eseguono un calcolo su un set di valori e restituiscono un valore singolo. Ad eccezione della funzione COUNT, le funzioni di aggregazione ignorano i valori Null.
Nota: Tutte le funzioni di aggregazione sono deterministiche. Ciò significa che le funzioni di aggregazione restituiscono lo stesso valore ogni volta che vengono chiamate con un set specifico di valori di input. Per ulteriori informazioni sulle funzioni deterministiche.
Tra le più comuni funzioni di aggregazione si devono annoverare:
avg, min, max, sum, count
Un DML è il sottoinsieme di un linguaggio di livello fisico fornito dal DBMS per la manipolazione dei dati.
L’SQL prevede una serie di direttive per il supporto alle seguenti operazioni:
Il comando ha la funzione di inserire i dati nelle tabelle.
Le colonne (o campi) di destinazione dei valori possono essere o meno dichiarate nel comando. Se non vengono dichiarate, è necessario passare al comando un valore per ogni colonna della tabella, rispettando rigorosamente l’ordine delle colonne stesse. Se, invece, le colonne di destinazione vengono dichiarate, è possibile indicare le sole colonne per le quali vengono passati dei valori, purché vengano inseriti comunque i valori per tutte le colonne not null
Sintassi:
INSERT INTO nome_tabella [(elenco dei campi interessati dall’inserimento)] VALUES (elenco valori);
Il comando update ha la tripla funzione di modificare i dati delle tabelle.
Il nome di ogni campo che deve essere modificato va dichiarato dopo la parola chiave SET e deve essere seguito dal simbolo " = " (uguale) e dal nuovo valore che deve assumere.
È possibile modificare più campi della stessa riga in un unico comando update, separandoli l’uno dall’altro con il simbolo " , " (virgola).
Il comando generico aggiorna tutte le righe della tabella. È possibile restringerne il numero applicando la parola chiave aggiuntiva WHERE.
Sintassi:
UPDATE nome_tabella SET nome_campo1 = ‘valore1_nuovo’, nome_campo2 = ‘valore2_nuovo’ [WHERE nome_campo3 = ‘valore’];
Il comando delete ha la funzione di cancellare i dati dalle tabelle.
Come il comando update anche delete può operare in modo generico cancellando tutte le righe della tabella oppure può identificare le righe da cancellare mediante la parola chiave aggiuntiva WHERE e la condizione (o le condizioni) ad essa associata.
Sintassi:
DELETE FROM nome_tabella [WHERE nome_campo = ‘valore’];
Nota: alcuni DBMS implementano la direttiva TRUNCATE (non standard) per la cancellazione incondizionata, che ottimizza l’operazione agendo direttamente sul file system.
La sintassi generica di un comando di manipolazione in SQL è nella forma:
SELECT … FROM … WHERE
In particolare, l’operazione unaria di selezione si ottiene mediante la dichiarazione:
SELECT * FROM tabella WHERE espressione_condizionale
Ogni condizione di selezione deve essere nella forma: colonna operatore valore, dove operatore può valere:
È possibile concatenare più condizioni di selezione attraverso gli operatori logici:
L’operazione di proiezione dell’algebra relazionale può essere ottenuta in SQL in modo molto semplice, specificando gli attributi da selezionare subito dopo la clausola SELECT:
SELECT lista_attributi FROM tabella
Nota: è possibile combinare operazioni di proiezione e selezione (per la loro commutatività), specificando contemporaneamente la lista degli attributi da proiettare e le condizioni di selezione
Es.
SELECT nome, cognome, età FROM impiegato WHERE età < 50 and salario > 3000
Il prodotto cartesiano tra due relazioni è un’operazione teoricamente corretta ma di scarsa utilità. Èsso è definito dalla seguente direttiva SQL:
SELECT * FROM tabella1, tabella2
Il natural join tra due relazioni è implementato in SQL attraverso due sintassi differenti:
SELECT * FROM tabella1, tabella2 WHERE condizione_di_join
SELECT * FROM tabella1 JOIN tabella2 USING (condizione_di_join)
La seconda sintassi è preferibile perché più leggibile (nella prima forma, deprecata nell’SQL-99, vengono utilizzati gli operatori di selezione e proiezione per effettuare una join)
Nota: quando le colonne della condizione di join hanno nomi differenti, si utilizza la clausola ON (colonna1=colonna2) al posto della USING
Segue la sintassi base per le operazioni di outer join:
SELECT * FROM tabella1 [LEFT | RIGHT] OUTER JOIN tabella2 [USING (condizione_di_join) | ON (condizione_di_join)]
Nota: le operazioni di outer join (normale, sinistro e destro NON possono essere definite mediante operatori di selezione e proiezione)
Per come è definito il modello relazionale (logica e teoria degli insiemi), data una relazione non esiste una relazione d’ordine preferenziale sulla stessa.
Questo presuppone che un qualsiasi DML deve permettere la definizione di un qualche ordinamento sulle tuple. In SQL per tale scopo si utilizza la clausola ORDER BY:
SELECT attributi_di_proiezione FROM nome_tabella WHERE condizione_di_selezione ORDER BY colonna1 [ASC | DESC] [, colonna2 [ASC | DESC] ...]