LINGUAGGIO SQL
Il linguaggio Sql è un linguaggio di tipo dichiarativo, o meglio non procedurale, che ha il compito
di creare, manipolare e interrogare database relazionali. Questo linguaggio, che al tempo si
chiamava Sequel, è nato nel 1974 e si basava su due standard particolari, ovvero ANSI e ISO
(standard internazionali). In generale, il linguaggio Sql, assolve alle funzioni di:
- DDL (Data Definition Language) che contiene le istruzioni per definire la struttura delle
relazioni della base di dati. (creazione di tabelle o di vincoli)
- DML (Data Manipulation Language) che contiene le istruzioni per manipolare i dati
appartenenti alle diverse tabelle. In particolar modo, il DML, permette inserimenti,
cancellazioni e modifiche delle righe delle tabelle.
- DCL (Data Control Language) che contiene le istruzioni per controllare il modo in cui le
operazioni vengono eseguite. In particolar modo, il DCL, consente di gestire il controllo
degli accessi per più utenti e i permessi per gli utenti autorizzati.
Inoltre, Sql, può essere usato in:
- Modalità stand-alone: il linguaggio può essere classificato come un linguaggio di
interrogazione interattivo, in cui i comandi vengono inviati al sistema operativo in modo
interattivo o batch. Per quanto riguarda il modo interattivo, viene usata un’interfaccia grafica
con menù, finestre e icone, per guidare l’utente nella scelta dell’operazione da effettuare sui
dati. In modo batch, invece, è possibile creare file di istruzioni pronte per essere eseguite. In
entrambe le modalità, per eseguire ogni istruzione, viene invocato l’interprete Sql.
- Modalità embedded: vengono utilizzate delle clausole Sql inserite in un linguaggio di
programmazione procedurale. In sintesi, è possibile trattare i comandi Sql come linguaggi
ospite, che hanno la caratteristica di essere precompilati ovvero subire un primo processo di
precompilazione e successivamente, essere compilati.
Inoltre, Sql, non è un linguaggio case-sensitive e quindi le istruzioni possono essere scritte
utilizzando indifferentemente caratteri maiuscoli o minuscoli. Le istruzioni, vengono generalmente
separate dal punto e virgola, mentre gli identificatori, utilizzati per i nomi delle tabelle e degli
attributi, devono:
- Avere una lunghezza massima di 18 caratteri
- Iniziare con una lettera
- Contenere come unico carattere speciale l’underscore “_”
Per riferirsi ad un attributo di una tabella, bisogna scrivere  NomeTabella  .  NomeAttrib uto  .
Nella terminologia Sql:
- Le relazioni vengono chiamate tabelle
- Le tuple vengono chiamate righe o registrazioni
- Gli attributi sono le colonne delle tabelle
Nelle espressioni, gli operatori che possono essere usati, sono operatori:
- Aritmetici, ovvero  ,-, /, 
- Relazionali, ovvero , , (minore o uguale),  (maggiore o uguale),  (diverso)
- Logici, ovvero AND,OR, NOT
Infine, nel linguaggio Sql, i tipi di dato maggiormente usati,sono:
- CHARN  , che indica una stringa di caratteri di lunghezza fissa pari a N
- BIT N  , che indica una stringa di bit di lunghezza fissa pari a N
- INT N  , che indica un numero intero con precisione pari a N
- REAL o FLOAT , che indicano numeri reali
- DATE , che indica la data nel formato " AAAA/MM/GG "
- TIME , che indica l’ora nel formato ora,minuti, secondi, millisecon di
ISTRUZIONI DEL DDL DI SQL
Creare un nuovo database: Per creare un nuovo database, si utilizza la sintassi
CREATE DATABASE  NomeDatabase  AUTHORIZATION  Proprietar io  ;
La clausola AUTHORIZATION può anche essere omessa e specifica solamente il nome dell’utente
che possiede i privilegi di accesso al database.
Selezionare un nuovo database: Per iniziare ad usa il database, occorre utilizzare la sintassi
USE  NomeDatabase  ; dove  NomeDatabase  è il nome del database precedentemente creato.
Creare una tabella: Per creare una nuova tabella, si utilizza la sintassi
CREATE TABLE  NomeTabell a  (
 Attributo1   Tipo1   VincoloAtt ributo1 ,
 AttributoN   TipoN   VincoloAtt ributoN ,
 VincoloTab ella );
Creare i vincoli per un singolo attributo: possono essere:
- NOT NULL : richiede che l’attributo corrispondente debba necessariamente avere un valore
- DEFAULT  ValoreDiDefault  : assegna all’attributo corrispondente il valore di default
- CHECK  Condizione  : specifica una condizione sull’attributo corrispondente
La clausola  Condizione  , può essere espressa con la sintassi:
-  Attributo  IN  Valore1 , ValoreN  : richiede che il valore dell’attributo sia tra
quelli specificati all’interno della parentesi.
-  Attributo  BETWEEN  Min  AND  Max  : richiede che il valore dell’attributo sia
compreso tra il valore minimo e il valore massimo.
-  Attributo  NOT BETWEEN  Min  AND  Max  : richiede che il valore dell’attributo
non sia compreso tra il valore minimo e il valore massimo.
-  Attributo  LIKE  Espressione  : richiede che il valore dell’attributo assuma il formato
specificato dall’espressione.
-  Attributo  NOT LIKE  Espressione  : richiede che il valore dell’attributo non assuma
il formato specificato dall’espressione.
Creare i vincoli per un gruppo di attributi (vincoli di ennupla): possono essere:
- PRIMARY KEY  Attributo1 , AttributoN  : specifica le colonne che fanno parte della
chiave primaria.
- UNIQUE Attributo1 , AttributoN  : indica che i valori degli attributi specificati
devono essere necessariamente distinti all’interno della tabella. Ad esempio, scrivendo
UNIQUECognome, Nome, DataAssunzione  , si impone che nella tabella, non ci siano due
persone che abbiano lo stesso nome e cognome e che siano state assunte lo stesso giorno.
- CHECK  Condizione  : Specifica un qualsiasi vincolo che riguarda il valore di più
attributi della tabella, come ad esempio CHECK DataNascita  DataAssunzione  .
Creare i vincoli di integrità referenziale: bisogna utilizzare la sintassi
FOREIGN KEY  Attributo1  , AttributoN  
REFERENCES  NomeTabella   Attr1  , AttrN  
 ON DELETE | ON UPDATE CASCADE | SET NULL | SET DEFAULT | NOACTION

Le colonne degli attributi, rappresentano la chiave esterna e corrispondono alle colonne degli attr
che formano la chiave primaria della tabella  NomeTabella  .
Politiche di violazione dei vincoli di integrità referenziale al momento della cancellazione: si
specificano tramite la clausola ON DELETE con l’aggiunta di:
- RESTRICT : l’azione si limita alla riga corrispondente
- CASCADE : vengono cancellate le righe corrispondenti in tutte le tabelle correlate
- SET NULL : vengono impostate al valore null tutte le righe corrispondenti
- SET DEFAULT : vengono impostate al valore di default tutte le righe corrispondenti
- NO ACTION : non viene eseguita alcuna azione
Politiche di violazione dei vincoli di integrità referenziale al momento della modifica: si specificano
tramite la clausola ON UPDATE con l’aggiunta di:
- RESTRICT : l’azione si limita alla riga corrispondente
- CASCADE : vengono impostate con lo stesso nuovo valore tutte le righe corrispondenti
- SET NULL : vengono impostate al valore null tutte le righe corrispondenti
- SET DEFAULT : vengono impostate al valore di default tutte le righe corrispondenti
- NO ACTION : non viene eseguita alcuna azione
Creare l’indice di una tabella: gli indici, sono delle tabelle speciali che contengono le chiavi delle
tabelle alle quali sono associati. Per creare un indice per una tabella, si utilizza la sintassi
CREATE UNIQUE INDEX  NomeIndice  ON  NomeTabella   Attributo1 , AttributoN ;
dove la clausola UNIQUE crea un indice su attributi chiave. Se essa, non è specificata, viene creato
un indice su attributi non chiave.
Aggiungere una nuova colonna in una tabella: si utilizza la sintassi
ALTER TABLE  NomeTabella  ADD  NomeColonna1   NomeTipo  BEFORE  NomeColonna2 ;
Con la clausola BEFORE, si può specificare la posizione in cui inserire la colonna nella tabella.
Cancellare una colonna in una tabella: si utilizza la sintassi
ALTER TABLE  NomeTabella  DROP COLUMN  NomeColonna1 ;
Modificare il tipo di una colonna in una tabella: si utilizza la sintassi
ALTER TABLE  NomeTabella  MODIFY  NomeColonna , NuovoTipoColonna 
Eliminare una tabella: si utilizza la sintassi
DROP TABLE  NomeTabella  RESTRICT, CASCADE, SET NULL;
La cancellazione di una tabella, può provocare inconsistenze, dovute al fatto che possono esistere
tabelle collegate tramite vincoli di integrità. Per far fronte a tali situazioni, si utilizzano le clausole:
- RESTRICT : non viene permessa la cancellazione se la tabella da cancellare è legata tramite
vincoli ad altre tabelle
- CASCADE : vengono cancellate in cascata tutte le tabelle collegate
- SET NULL : viene posto il valore null a tutti i valori delle chiavi interessate
Eliminare un indice: si utilizza la sintassi DROP INDEX  NomeIndice  ON  NomeTabella ;
Eliminare un database: si utilizza la sintassi DROP DATABASE  NomeDatabase ;
ISTRUZIONI DEL DML DI SQL
Inserire i valori in una tabella: si utilizza la sintassi
INSERT INTO  NomeTabella   Attributo1  , AttributoN 
.
VALUES Valore1 , ValoreN ;
I valori degli attributi, devono rispettare l’ordine con cui sono stati inseriti all’interno della parentesi
e soprattutto si assume che il valore per gli attributi omessi sia Null.
Modificare i valori delle righe di una tabella: si utilizza la sintassi
UPDATE  NomeTabell a 
SET  Attributo1    Espressione1 
 AttributoN    EspressioneN 
WHERE
 Condizione ;
Con questa sintassi, tutti gli attributi di  NomeTabella  , vengono aggiornati con i valori delle
corrispondenti espressioni in tutte le righe che soddisfano la condizione.
DELETE FROM  NomeTabella 
.
WHERE  Condizione ;
Con questa sintassi, si eliminano tutte le righe di  NomeTabella  che soddisfano la condizione.
Cancellare le righe di una tabella: si utilizza la sintassi
Comando Select: ha la funzione di estrarre dei dati dal database e quindi effettuare una query o
un’interrogazione sulla base di dati. La sintassi del comando Select, è
SELECT DISTINCT   Attributo1  ,  AttributoN 
FROM  Tabella1  ,  TabellaK 
WHERE  Condizione ;
In questo caso, se è assente la clausola WHERE, la condizione si assume sempre vera, mentre se è
presente l’opzione DISTINCT, il risultato è privo di righe duplicate. Se si vogliono visualizzare tutti
gli attributi presenti nelle varie tabelle, è possibile utilizzare il simbolo “*”.
Comando As: ha la funzione di assegnare un nome diverso ad ogni colonna che si ottiene dal
risultato della Query e quindi dal risultato dell’operazione select. La sua sintassi, è
SELECT DISTINCT   Attributo1  AS  NomeColonna1  ,  AttributoN  AS  NomeColonnaN  
FROM  Tabella1  ,  TabellaK 
WHERE  Condizione ;
Comando Null: innanzitutto:
- Il valore Null non è una costante e soprattutto fornisce un valore diverso da zero e diverso
dalla stringa vuota.
- Se un operando ha il valore Null, il risultato di un’espressione aritmetica è sconosciuto
(UNKNOWN), così come il confronto tra un valore Null e un qualsiasi altro valore.
- Se il risultato del predicato della clausola WHERE è il valore UNKNOWN, la tupla non
viene considerata.
La sintassi per controllare se il valore di un attributo è presente oppure è uguale a Null, è
SELECT DISTINCT   Attributo1  AS  NomeColonna1  ,  AttributoN  AS  NomeColonnaN  
FROM  Tabella1  ,  TabellaK 
WHERE  AttributoX  IS NULL | IS NOT NULL;
Funzioni di aggregazione: la sintassi generale per le funzioni di aggregazione, è
SELECT  FunzioneDiAggregazione  DISTINCT   Attributo  
Le principali funzioni di aggregazione, sono:
- COUNT: conta il numero di righe della colonna  Attributo 
- COUNT (*): conta il numero totale delle righe della tabella, comprese quelle con il valore
Null. In questo caso, la funzione DISTINCT, non può essere usata.
- MIN: restituisce il valore minimo della colonna  Attributo 
- MAX: restituisce il valore massimo della colonna  Attributo 
- SUM: restituisce la somma degli elementi della colonna  Attributo 
- AVG: restituisce la media aritmetica degli elementi della colonna  Attributo 
Ordinamento: la sintassi per l’ordinamento delle righe di una tabella, è
ORDER BY  Attributo1  ASC | DESC  ,  AttributoN  ASC | DESC  , dove ASC sta per ordine
crescente e DESC sta per decrescente. Questa sintassi, si inserisce alla fine del comando SELECT.
Raggruppamento: la sintassi, viene inserita alla fine del comando SELECT ed è
GROUP BY  Attributo1 ,  AttributoN  HAVING  CondizioneGruppo . Con questa sintassi:
- Viene eseguito il prodotto delle tabelle presenti nella clausola FROM
- Su tale prodotto si fa una restrizione in base alla clausola WHERE
- La tabella risultante, viene partizionata in gruppi di righe appartenenti agli stessi valori
- Tutti i gruppi che non soddisfano la clausola HAVING vengono eliminati.
Query e subquery annidate: per eseguire query complesse, è possibile strutturare opportunamente
più comandi di SELECT e ciò consente di costruire un’interrogazione al cui interno sono presenti
altre interrogazioni, dette sottointerrogazioni o subquery. In generale, possiamo distinguere tra:
- Query principale o query esterna, che rappresenta la query individuata dalla prima parola
SELECT incontrata.
- Query secondaria o subquery o query interna, che rappresenta la query individuata dalla
seconda parola SELECT incontrata.
La subquery, genera una tabella, detta tabella derivata, che può essere composta da:
- Un solo valore, ovvero una tabella formata da una sola riga ed una sola colonna (tabella
scalare).
- Una sola riga e più colonne
- Più righe e più colonne
In generale, una subquery, può essere composta da altre query e quindi si può creare una struttura di
query annidate. Per eseguire sottointerrogazioni annidate, si deve eseguire prima l’interrogazione
più annidata fino a giungere alla query principale.
Subquery che producono valori appartenenti a un insieme con predicati ANY, ALL, IN, NOT IN:
la sintassi generale, è
SELECT DISTINCT   Attributo1  ,  AttributoN 
FROM  Tabella1  ,  TabellaK 
WHERE  AttributoX  OperatoreRelazionale  ANY | ALL | IN | NOT IN  Sottoquery  ;
I predicati principali, sono:
- ANY: la condizione della clausola WHERE è vera se il valore dell’attributo compare in
almeno uno dei valori forniti dalla subquery.
- ALL: la condizione della clausola WHERE è vera se il valore dell’attributo compare in tutti
i valori forniti dalla subquery.
- IN: la condizione della clausola WHERE è vera se il valore dell’attributo appartiene
all’insieme dei valori fornito dalla subquery.
- NOT IN: la condizione della clausola WHERE è vera se il valore dell’attributo non
appartiene all’insieme dei valori fornito dalla subquery.
Subquery che producono valori appartenenti a un insieme con predicati EXISTS, NOT EXISTS:
SELECT DISTINCT   Attributo1  ,  AttributoN 
la sintassi generale, è FROM  Tabella1  ,  TabellaK 
WHERE EXISTS | NOT EXISTS  Sottoquery  ;
I predicati principali, sono:
- EXISTS: la condizione della clausola WHERE è vera se la subquery produce una tabella
non vuota.
- NOT EXISTS: la condizione della clausola WHERE è vera se la subquery produce una
tabella vuota.