Lo standard SQL
SQL (Structured Query Language) è un linguaggio non procedurale e dichiarativo, usato
per creare, manipolare e interrogare database relazionali.
Dichiarativo (non-procedurale): si speci ca cosa si vuole ottenere, non come ottenerlo.
Esistono diversi dialetti di SQL aderenti agli standard ANSI (American National
Standards Institute) e ISO (International Organization for Standardization), basati sulle
versioni SQL-2 e SQL-92, adottate nel 1992.
SQL svolge diverse funzioni:
• DDL (Data De nition Language): de nisce la struttura del database (creazione di
tabelle e vincoli).=> CREAT, ALTER, DROP
• DML (Data Manipulation Language): manipola i dati presenti nelle tabelle
(inserimento, aggiornamento, cancellazione).=> INSERT, UPDATE, DELETE
• DCL (Data Control Language): gestisce il controllo degli accessi e i permessi degli
utenti.
• Query language: interrogazione dei dati.=> SELECT
SQL può essere usato:
• Standalone: come linguaggio indipendente.
• Embedded: come linguaggio ospite all’interno di altri programmi.
Origini
Nel 1974, Donald Chamberlin sviluppa SEQUEL, uno strumento per interrogare database
relazionali.
Sintassi: Forma normale di Backus (BNF)
Per descrivere la sintassi dei linguaggi si usa la Backus Naur Form (BNF):
• Parole chiave in grassetto
• Categorie sintattiche tra < >
• Opzionalità tra [ ]
• Ripetizioni tra { }
• Alternativa simbolo |
Versioni SQL importanti
fi
fi
fi
• La versione più importante è SQL-3, che introduce funzionalità per il trattamento
degli oggetti.
Identi catori e tipi di dati
• SQL non è case sensitive: comandi possono essere scritti in maiuscolo o minuscolo.
Alcune versioni possono invece distinguere maiuscole/minuscole nei nomi di tabelle
o variabili.
• Gli identi catori (nomi di tabelle o colonne) devono rispettare alcune regole:
◦ lunghezza massima: 18 caratteri
◦ iniziare con una lettera
◦ contenere al massimo un underscore _
• Relazioni tabelle
• Tuple righe/record
• Attributi colonne
Tipi di dati principali
Tipo Descrizione
CHAR(n) stringa di lunghezza fissa
SMALLINT intero 2 byte
INTEGER intero 4 byte
numeri con precisione definita (fino a 1000 cifre
NUMERIC
significative)
REAL numeri in virgola mobile
TIMESTAM
data e ora
P
BOOLEAN valori logici (TRUE/FALSE)
• Alcune versioni possono avere tipi leggermente diversi.
• Le costanti stringa si racchiudono tra ' ' o " ".
• Gli operatori possono essere aritmetici, relazionali o logici.
I confronti tra dati alfanumerici vengono effettuati basandosi sul codice ASCII dei
caratteri, da sinistra verso destra.
• Standard SQL-92:
◦ Non esiste BOOLEAN puro; esiste BIT (0 = FALSE, 1 = TRUE)
fi
fi
◦ Separatore decimale = punto .
Istruzioni DDL (Data De nition Language)
Creare un database
CREATE DATABASE <nomebasedati> [AUTHORIZATION <proprietario>];
• Crea un nuovo database.
• [AUTHORIZATION <proprietario>] speci ca l’utente proprietario. Se non
speci cato, si assume l’utente connesso.
Per selezionare il database su cui operare:
USE <nomebasedati>;
Creare una tabella e vincoli
CREATE TABLE <nometabella>(
<attributo1> <tipo1> [<vincoloattributo>],
<attributo2> <tipo2> [<vincoloattributo>],
...
);
Vincoli su singolo attributo (vincoli di dominio)
• NOT NULL il valore è obbligatorio
• DEFAULT <valore> valore prede nito
• CHECK(<condizione>) vincolo personalizzato
Esempi:
-- 1: stipendio deve essere uno tra i valori speci cati
CHECK(Stipendio IN (1500, 3000, 4500))
-- 2: stipendio deve essere compreso tra 1500 e 3000
CHECK(Stipendio BETWEEN 1500 AND 3000)
-- 3: codice articolo deve iniziare con "Codice"
CHECK(CodiceArticolo LIKE 'Codice%')
fi
fi
fi
fi
fi
Vincoli multi-attributo
PRIMARY KEY(<attributo1>, <attributo2>) -- chiave primaria, valori unici e NOT NULL
UNIQUE(<attributo1>, <attributo2>) -- chiave candidata
CHECK(<condizione>) -- condizione su più attributi
Vincolo di integrità referenziale
FOREIGN KEY(<attr1>, <attr2>)
REFERENCES <nometabella>(<attr1>, <attr2>)
ON DELETE <RESTRICT|CASCADE|SET NULL|SET DEFAULT|NO ACTION>
ON UPDATE <RESTRICT|CASCADE|SET NULL|SET DEFAULT|NO ACTION>
• CASCADE cancellazione/modi ca in tutte le tabelle collegate
• SET NULL imposta le righe collegate a NULL
• SET DEFAULT imposta al valore prede nito
• RESTRICT azione limitata alla riga corrente
• NO ACTION nessuna azione (default)
Indici
Gli indici accelerano le ricerche ma rallentano modi che e occupano memoria.
CREATE [UNIQUE] INDEX <nomeindice>
ON <nometabella>(<attr1>, <attr2>);
• UNIQUE crea indice su attributi chiave
Modi care una tabella
ALTER TABLE <nometabella>
ADD <nomecolonna> <tipo> [BEFORE <nomecolonna2>];
ALTER TABLE <nometabella>
DROP COLUMN <nomecolonna>;
ALTER TABLE <nometabella>
MODIFY <nomecolonna> <nuovotipo>;
fi
fi
fi
fi
Eliminare tabelle, indici e database
DROP TABLE <nometabella> [RESTRICT|CASCADE|SET NULL];
DROP INDEX <nomeindice> ON <nometabella>;
DROP DATABASE <nomedatabase>;
Istruzioni DML (Data Manipulation Language)
Inserire dati
INSERT INTO <nometabella> [(<attr1>, <attr2>, ...)]
VALUES (<val1>, <val2>, ...);
• Se non si speci cano gli attributi, i valori devono seguire l’ordine della tabella.
Aggiornare dati
UPDATE <nometabella>
SET <attr1> = <espr1>,
<attr2> = <espr2>,
...
WHERE <condizione>;
Cancellare righe
DELETE FROM <nometabella>
WHERE <condizione>;
Reperire dati: SELECT
SELECT [DISTINCT] <attr1>, <attr2>, ...
FROM <tabella1>, <tabella2>
[WHERE <condizione>];
• [DISTINCT] elimina righe duplicate
• * seleziona tutti gli attributi
• Alias colonne:
SELECT Nome, Citta AS "Numeroposti"
FROM Cinema;
fi
Valore NULL
• Indica dato mancante o sconosciuto
• Non è zero o stringa vuota.
• Comparazioni con NULL restituiscono UNKNOWN.
• Ignorato nelle funzioni di aggregazione.
Controllo NULL:
WHERE attr IS NULL
WHERE attr IS NOT NULL