breve presentazione curata da
Aldo Pappalepore
linguaggio sql: DDL
1
I comandi del linguaggio SQL si dividono nei seguenti
sottoinsiemi:
- D M L Data Manipulation Language
- D D L Data Description Language
- D C L Data Control Language
Il Data Description Language e’ quella parte del
linguaggio SQL, che contiene tutti i comandi per la
definizione di un database.
Analizzeremo in questa fase i principali comandi che
ci permetteranno di costruire un database.
linguaggio sql: DDL
2
Per descrivere il formato dei comandi verranno utilizzati i seguenti simboli:
<> delimitano i nomi degli elementi del linguaggio;
[ ] denotano un elememnto opzionale;
… indicano che l’elem. prec. può essere ripetuto;
{ } raggruppano più elementi di una definizione;
a|b indica che gli elementi a e b sono in alternativa.
Le parole chiave verranno scritte in maiuscolo.
Un comando SQL è normalmente costituito da una
operazione seguita da una o più clausole che la
specificano.
linguaggio sql: DDL
3
Il comando CREATE SCHEMA, si limita a creare
una cartella col nome specificato nel comando.
La sintassi e’ la seguente :
CREATE SCHEMA <nome_schema>
Vedi esempio 1
linguaggio sql: DDL
4
La tabella e’ la struttura dati fondamentale di Sql; essa si
caratterizza come un insieme di record (righe), ciascuno
dei quali contiene un certo numero di campi (colonne).
La sua sintassi e’ la seguente:
CREATE TABLE <nome tabella>
(Nome CHAR(15),
Cognome CHAR(20))
Una tabella deve avere almeno un campo.
Vedi esempio 2
linguaggio sql: DDL
5
Nella sintassi della creazione di una tabella la definizione
di una colonna ha il seguente formato:
<nome colonna> <tipo dati>
[<clausola_default>]
[<definizione_vincolo_di_colonna>]
La <clausola di_default> specifica opzionalmente,
facendolo precedere dalla parola chiave DEFAULT, il
valore di default da assegnare agli elementi della colonna;
possono essere delle costanti o delle espressioni dello
stesso tipo della colonna cui si riferiscono.Gli altri tre
elementi che compongono la definizione della colonna
sono il nome, il tipo dei dati e i vincoli di integrita’
linguaggio sql: DDL
6
Numeric,Decimal,Integer e Smallint sono anche definiti ‘Tipi
numerici esatti’ e rappresentano i numeri decimali positivi e
negativi con o senza la virgola.
Float,Real e Double sono anche definiti ‘Tipi Numerici
Approssimati’ o Floating Point (Virgola Mobile) e
implementano, nei limiti della precisione ottenibile, i numeri
reali.
linguaggio sql: DDL
7
I principali tipi di dati supportati dal linguaggio SQL, sono i
seguenti:
- CHARACTER
- NUMERIC
- DECIMAL
- INTEGER
- SMALLINT
- FLOAT
- REAL
- DOUBLE PRECISION
- DATE
linguaggio sql: DDL
8
La sintassi e’:
CHARACTER [VARYNG] [<lunghezza>]
Il tipo CHARACTER, puo’ essere di lunghezza fissa o variabile; nel
primo caso il numero dei caratteri e’ sempre uguale al numero
definito da <lunghezza>, nel secondo caso, specificato mediante
l’opzione VARYNG, il numero di caratteri di ciascun valore inserito
puo’ variare da zero fino a un numero massimo di caratteri pari a
<lunghezza>.Una lunghezza non definita e’ per default uguale a 1.
CHARACTER
CHARACTER(20)
CHARACTER VARYNG (100)
CHARACTER puo’ essere abbreviato con CHAR e CHARACTER
VARYNG con VARCHAR.
linguaggio sql: DDL
9
Sintassi :
NUMERIC [(<precisione> [,<scala>])]
DECIMAL [(<precisione> [,<scala>])]
INTEGER
SMALLINT
La parola chiave INTEGER puo’ essere abbreviata con INT, la parola
chiave DECIMAL con DEC.
La <precisione> nei tipi NUMERIC e DECIMAL, indica il numero
massimo di cifre,comprendendo quelle a destra e a sinistra della virgola
escluso il segno; la <scala> specifica il numero di cifre a destra della
virgola. La precisione deve essere maggiore o uguale a 1, la scala
maggiore o uguale a 0.
INTEGER e SMALLINT sono tipi numerici esatti con scala uguale a
0, cioe’ senza virgola.Spesso NUMERIC e DECIMAL sono sinonimi.
Vedi esempio 3
linguaggio sql: DDL
10
La rappresentazione dei numerici approssimati avviene
tramite le due componenti mantissa ed esponente:
mEn
e’ la sua rappresentazione;
m*10 n è il suo valore.
La mantissa puo’ essere un numero decimale positivo o
negativo con o senza virgola, l’esponente e’ un numero
intero positivo o negativo.
Sintassi :
FLOAT [(<precisione>)]
REAL
DOUBLE PRECISION
Nel tipo Float la precisione si riferisce alla lunghezza massima della
mantissa
linguaggio sql: DDL
11
Esempi di specifica di tipi numerici approssimati sono:
FLOAT(20)
REAL
FLOAT
Esempi di costanti di tipo numerico approssimato sono:
150E5
+18E3
-18E3
-25E-10
-23.5E4
linguaggio sql: DDL
12
Il tipo DATE nel linguaggio SQL rappresenta le date come sequenze
di tre valori, riferiti all’anno, al mese, al giorno.
Le costanti di tipo DATE sono espresse nel seguente formato:
DATE ‘AAAA-MM-GG’
Esempio:
DATE ‘2002-06-21’
La funzione Current_date, senza parametri, restituisce la data
corrente, derivandola dalla data del sistema.
linguaggio sql: DDL
13
La definizione di vincoli di integrita’ consente di limitare i valori
ammissibili per una determinata colonna della tabella in base a
specifici criteri.
I vincoli d’integrita’ forniscono forme di controllo che si riferiscono
non solo al singolo valore da inserire, ma anche alle relazioni di tale
valore con altri valori all’interno della stessa colonna della tabella e
con colonne di altre tabelle.
La sintassi del vincolo di integrita’ di colonna e’ la seguente:
<vincolo_di_colonna> ::=
[CONSTRAINT <nome_vincolo>]
{<vincolo_NOT_NULL> |
<vincolo_di_univocita’> |
<vincolo_di_chiave_esterna> |
<vincolo_di_controllo>}
[<attributi_del_vincolo>] linguaggio sql: DDL
14
La specifica [CONSTRAINT <nome_vincolo>] e’ opzionale, dare
un nome al vincolo puo’ essere utile per individuare, durante una
operazione di DML, quale vincolo e’ stato violato.
{<vincolo_NOT_NULL> | <vincolo_di_univocita’> |
<vincolo_di_chiave_esterna> | <vincolo_di_controllo>} sono i
possibili tipi di vincoli.
Le opzioni <attributi del vincolo> si riferiscono alla modalita’ di
applicazione del vincolo.
linguaggio sql: DDL
15
Sintassi:
<vincolo_not_null> ::= NOT NULL
Tale vincolo stabilisce che la colonna NON puo’ contenere valori
nulli: i valori della colonna sono obbligatori.
Per esempio nella creazione della tabella Veicoli, volendo specificare
che il codice modello del veicolo e’ un dato obbligatorio,
scriveremo:
CREATE TABLE Veicoli
(…
Cod_Modello CHARACTER (3) NOT NULL,
…)
Oppure dando il nome V_Cod_Modello al vincolo:
Cod_Modello CHARACTER (3)
Vedi esempio 4
CONSTRAINT V_Cod_Modello NOT NULL,
linguaggio sql: DDL
16
Ci sono due vincoli di unicita’: UNIQUE e PRIMARY KEY
La sintassi e’:
<vincolo_UNIQUE> ::= UNIQUE
<vincolo_PRIMARY_KEY> ::= PRIMARY KEY
Ad esempio se volessimo specificare che i nomi dei modelli sono
unici, scriveremo:
CREATE TABLE Modelli
(…
Nome_Modello CHARACTER (30) UNIQUE,
…)
Il vincolo UNIQUE permette l’esistenza di piu’ valori NULL della o
delle colonne specificate.
Vedi esempio 5
linguaggio sql: DDL
17
PRIMARY KEY e’ invece una combinazione dei vincoli UNIQUE
e NOT NULL e serve a specificare la chiave primaria in una tabella,
essa e’ unica per ogni tabella.
Nel caso in cui la chiave PRIMARY KEY sia composta da una sola
colonna, il vincolo puo’ essere specificato come vincolo di colonna:
CREATE TABLE Veicoli
(Targa CHAR (10) PRIMARY KEY ,
……)
Vedi esempio 6
linguaggio sql: DDL
18
Nel caso in cui la chiave PRIMARY KEY sia composta da piu’
colonne, il vincolo puo’ essere specificato solo come vincolo di
tabella:
CREATE TABLE Proprieta’
(Targa CHAR (10),
Cod_Proprietario CHAR (5),
…
PRIMARY KEY (Targa, Cod_Proprietario),
…)
Vedi esempio 7
linguaggio sql: DDL
19
Date due Tabelle T1 e T2 che rappresentino insiemi di entita’ legati
da una relazione, il vincolo di chiave esterna rappresenta in maniera
esplicita il fatto che un attributo di T1 e’ utilizzato come chiave
esterna legata alla chiave primaria della tabella T2. Si crea quindi un
vincolo di integrita’ referenziale, il quale impone che ad ogni valore
non nullo della tabella T1 corrisponde uno e un solo valore nella
tabella T2.
T1 e’ detta tabella referente e T2 tabella riferita.
La sintassi e’ la seguente:
<vincolo_di_chiave_esterna_di_colonna> ::=
REFERENCES <tabella_riferita>
[<colonna_riferita>[{,<colonna_riferita>}…]
[MATCH {FULL ! PARTIAL}]
[<azione_innescata>]
linguaggio sql: DDL
20
Per esempio nella tabella Veicoli (T1) la colonna Cod_Categoria è
chiave esterna legata alla colonna Cod_Categoria della tabella Categorie (T2): si specifica così che ogni veicolo appartiene ad una categoria e che questa è unica per quel veicolo.
Veicolo (T1)
Categorie (T2)
Cod_Categoria
Nome_Categoria
1
N
Targa
Cod_Modello
Cod_Categoria
Cilindrata
Combustibile
Cavalli_Fiscali
Velocità
Posti
Immatricolazione
linguaggio sql: DDL
21
La sintassi del vincolo di chiave esterna, quando specificato come
vincolo di colonna, è la seguente:
CREATE TABLE Veicoli
(…
Cod_Categoria CHARACTER(2) REFERENCES
Categorie (Cod_Categoria),
…)
.
Vedi esempio 8
linguaggio sql: DDL
22
È possibile utilizzare anche un vincolo di tabella ad esempio:
CREATE TABLE Veicoli
(…
Cod_Categoria CHARACTER(2),
…
FOREIGN KEY(Cod_Categoria) REFERENCES
Categorie(Cod_Categoria),
…)
Le clausole MATCH PARTIAL e MATCH FULL sono alternative;
la seconda specifica un’ulteriore condizione di vincolo,imponendo
che i valori delle colonne referenti siano tutti NULL o contengano
tutti valori non nulli.
linguaggio sql: DDL
23
La <azione_innescata>,che indica al DBMS l’azione da intraprendere qualora venga violata una delle condizioni del vincolo di chiave
esterna in seguito a una operazione di aggiornamento o di cancellazione, ha la seguente sintassi:
<azione_innescata> ::=
ON UPDATE [{<azione}] [ON DELETE [{<azione}]] |
ON DELETE[{<azione}] [ON UPDATE [{<azione}]]
dove <azione> è così definita:
<azione> ::=
CASCADE | SET NULL | SET DEFAULT | NO ACTION
Può essere specificata prima la clausola ON UPDATE e poi la
clausola ON DELETE o viceversa.
linguaggio sql: DDL
24
Nel caso ON DELETE l’azione, che viene attivata dalla cancellazione di righe nella tabella riferita, è eseguita sulle righe corrispondenti della tabella referente e ha il seguente effetto:
CASCADE
le righe della tabella referente vengono anch’esse cancellate
SET NULL
i valori della colonna referente vengono imposti a NULL
SET DEFAULT
i valori nella colonna referente vengono impostati al valore di
default definito per la colonna
NO ACTION il sistema non innesca alcuna azione speciale:
questo è il valore di default
linguaggio sql: DDL
25
Nel caso ON UPDATE l’azione, che viene attivata dall’aggiornamento di righe nella tabella riferita, è eseguita sulle righe corrispondenti della tabella referente e ha il seguente effetto:
CASCADE
i valori nella colonna referente vengono impostati agli stessi valori
assegnati alla colonna riferita
SET NULL
i valori della colonna referente vengono imposti a NULL
SET DEFAULT
i valori nella colonna referente vengono impostati al valore di
default definito per la colonna
NO ACTION il sistema non innesca alcuna azione speciale:
questo è il valore di default
Vedi esempio 9
linguaggio sql: DDL
26
Il vincolo di controllo è utilizzato per verificare generiche condizioni
sui valori di una colonna.
La sintassi è la seguente:
<vincolo_di_controllo>::= CHECK(<condizione>)
in cui <condizione> viene espressa con gli operatori di confronto, i
connettori logici, gli operatori BETWEEN, IN e LIKE dove:
Operatori di confronto: =
<
>
<=
>= <>
Connettori logici:
AND
OR
NOT
Between: <argomento> between <valore1> AND <valore2>
In:
<argomento> in (‘valore1’,’valore2’,’valore3’)
Like: <argomento> like ‘al_3b%’ dove _ indica un carattere
qualsiasi e % una sequenza di caratteri qualsiasi
linguaggio sql: DDL
27
Ad esempio:
CREATE TABLE Veicoli
(…
Cilindrata NUMERIC (4) CHECK (Cilindrata < 3000),
…)
Oppure:
CREATE TABLE Veicoli
(…
Cilindrata NUMERIC (4) CHECK (Cilindrata between 1500 and
3000),
…)
Vedi esempio 9bis
linguaggio sql: DDL
28
Tramite il comando DROP SCHEMA viene eliminato uno schema
logico, cioè vengono cancellate tutte le definizioni in esso contenute e
i dati corrispondenti; tale azione è definitiva e lo schema non sarà più
accessibile.
La sintassi è:
DROP SCHEMA <nome_schema> {RESTRICT | CASCADE}
Le opzioni RESTRICT e CASCADE sono alternative ed è
obbligatorio specificare l’una o l’altra: con RESTRICT lo schema
viene eliminato solo se vuoto, con CASCADE in ogni caso.
Ad esempio:
DROP SCHEMA Registro_Automobilistico RESTRICT
non ha effetto se il database non è vuoto
DROP SCHEMA Registro_Automobilistico CASCADE
vengono cancellati sia i dati sia le definizioni del database Registro_Automobilistico
Vedi esempio 10
linguaggio sql: DDL
29
Il comando DROP TABLE elimina la definizione e il contenuto di una
tabella. La sintassi è:
DROP TABLE <nome_tabella> {RESTRICT | CASCADE}
Le opzioni RESTRICT e CASCADE sono alternative ed è
obbligatorio specificare l’una o l’altra.
Specificando la prima opzione la tabella viene eliminata solo se non è
utilizzata nella definizione di altri oggetti dello schema. Nel caso in
cui la colonna, ad esempio Cod_Categoria, sia usata in un vincolo di
chiave esterna della tabella Veicoli, il comando
DROP TABLE Categorie RESTRICT
fallisce
linguaggio sql: DDL
30
Quando usiamo CASCADE invece, oltre ad essere eliminata la tabella
specifica, vengono eliminate tutte le dipendenze di tale tabella nelle
altre definizioni dello schema.
Ad esempio:
DROP TABLE Categorie CASCADE
ha l’effetto di eliminare la definizione e i dati della tabella Categorie,
nonché l’eventuale definizione del vincolo di chiave esterna nella
tabella Veicoli.
Vedi esempio 11
linguaggio sql: DDL
31
La modifica di una tabella in SQL viene realizzata con il comando
ALTER TABLE.
Tale comando permette di modificare alcune delle caratteristiche di
una tabella; in particolare è possibile aggiungere ed eliminare colonne, aggiungere ed eliminare vincoli di tabella, assegnare ed eliminare
valori di default.
Il comando ha forme sintattiche diverse per ciascuna funzione svolta.
La forma:
ALTER TABLE <nome_tabella>
ADD [column] <definizione_di_colonna>
permette di aggiungere una nuova colonna a una tabella, la colonna
aggiunta risulterà l’ultima nella numerazione delle colonne.
linguaggio sql: DDL
32
La forma:
ALTER TABLE <nome_tabella>
DROP [column] <nome_colonna>{RESTRICT | CASCADE}
permette di eliminare la definizione e i dati di una colonna da una
tabella.
Le opzioni RESTRICT e CASCADE sono alternative ed è
obbligatorio specificare o l’una o l’altra; per il loro significato fare
riferimento ai comandi precedenti.
Vedi esempio 12
linguaggio sql: DDL
33
La forma:
ALTER TABLE <nome_tabella> ADD <vincolo_di_tabella>
permette di aggiungere un nuovo vincolo di tabella a quelli già
esistenti.
Per aggiungere alla tabella Veicoli la verifica che la cilindrata sia
inferiore a 3000 scriveremo:
ALTER TABLE Veicoli
ADD CONSTRAINT Controlla_Cilindrata
CHECK (Cilindrata < 3000)
Vedi esempio 13
linguaggio sql: DDL
34
La forma:
ALTER TABLE <nome_tabella>
ALTER [COLUNM] <nome_colonna>
SET <clausola_default>
permette di aggiungere l’assegnazione di un valore di default a una
colonna. Per esempio, per aggiungere il valore di default 0 alla
colonna Cilindrata scriveremo:
ALTER TABLE Veicoli ALTER Cilindrata
SET DEFAULT 0
infine la forma:
ALTER TABLE <nome_tabella>
ALTER [COLUNM] <nome_colonna> DROP DEFAULT
permette di eliminare il valore di default per una colonna,ad esempio:
ALTER TABLE Veicoli ALTER Cilindrata DROP DEFAULT
Vedi esempio 14
linguaggio sql: DDL
35
Il DML (Data Manipulation Language), è il sottinsieme dei comandi
del linguaggio SQL per le operazioni di interrogazione, e di aggiornamento dei dati, quali inserimento,modifica, cancellazione.
Nelle prossime slide, ci occuperemo dell’aspetto aggiornamento dei
dati di un database.
Vedremo i comandi che consentono di inserire nuovi dati in una
tabella precedentemente definita, di modificare i dati contenuti in una
tabella e di effettuarne la cancellazione.
linguaggio sql: DML
36
Il comando INSERT è utilizzato per l’inserimento dei dati in una
tabella. La sua sintassi è:
<comando insert> ::= INSERT INTO <nome_tabella>
[(lista_di_colonne)] <origine>
dove: <nome_tabella> identifica la tabella di destinazione
<lista_di_colonne> identifica tutte o alcune colonne in cui i dati
vanno inserirti
<origine> identifica i valori o la tabella di provenienza dei dati
da inserire
linguaggio sql: DML
37
Nel caso in cui i valori da inserire vengono indicati esplicitamente
<origine> ::= VALUES <lista_di_valori>
Come nell’esempio:
INSERT INTO Veicoli
VALUES (‘A123456X’,’01’,’85’,’195’,’5’, DATE ’1998-1230’,’1796’,’004’,’01’)
I valori elencati devono rispettare l’ordine che le colonne presentano
nella tabella e corrispondere ai tipi di dato in esse specificate.
Vedi esempio 15
linguaggio sql: DML
38
Nel caso in cui i valori da inserire sono contenuti in una tabella questa
deve avere la stessa struttura della tabella di destinazione (ordine e
domini delle colonne)
Per inserire allora i dati contenuti in Veicoli1 nella tabella Veicoli la
prima tabella deve avere la stessa struttura della seconda ed il comando sarà:
INSERT INTO Veicoli
SELECT *
FROM Veicoli1
{WHERE Cilindrata not null}
Tutte {solo quelle con cilindrata non nulla} le righe della tabella
Veicoli1 vengono così aggiunte alla tabella Veicoli
linguaggio sql: DML
39
Se la <lista_di_colonne> manca viene considerata composta da tutte le
colonne della tabella; va invece sempre utilizzata quando <origine>
specifica almeno una delle seguenti condizioni:
• non specifica tutte le colonne della tabella di destinazione
• specifica le colonne in ordine diverso da cole le stesse si trovano
nella tabella
INSERT INTO Veicoli
(Targa, Cod_Modello)
VALUES (‘D238765W’,’002’)
le colonne non inserite vengono poste a null e quindi devono ammettere tale valore: vanno quindi sempre specificate le colonne che costituiscono la chiave primaria
Vedi esempio 16
linguaggio sql: DML
40
Il comando UPDATE è utilizzato per la modifica dei dati in una
tabella. La sua sintassi è:
<comando update> ::= UPDATE <nome_tabella>
SET <nome_colonna>=<espressione>
[, <nome_colonna>=<espressione>…]
[WHERE <condizione>]
dove:
<nome_tabella>
identifica la tabella da aggiornare
SET <nome_colonna>=<espressione>
[, <nome_colonna>=<espressione>…]
identifica le colonne e i valori con cui vanno aggiornate
[WHERE <condizione>]
identifica le righe a cui l’aggiornamento va limitato
linguaggio sql: DML
Vedi esempio 17
41
Il comando DELETE permette di effettuare la cancellazione di righe
dati da una tabella. La sua sintassi è:
<comando_delete> ::= DELETE FROM <nome_tabella>
[WHERE <condizione>]
dove:
<nome_tabella> indica la tabella da cui cancellare le righe
[WHERE <condizione>] specifica le righe da cancellare
se la <condizione> non viene specificata la tabella viene
completamente svuotata
linguaggio sql: DML
Vedi esempio 18
42
Occupiamoci ora di quella parte del DML che analizza tutti i comandi
finalizzati allo svolgimento delle operazioni di ricerca su dati già esistenti e tabelle già definite.
Nelle prossime slide, ci occuperemo dell’aspetto interrogazione di un
database. I comandi di interrogazione -query- permettono di effettuare
operazioni di ricerca sui dati contenuti nelle tabelle del database, impostando le condizioni che tali dati devono soddisfare.
Tutte le interrogazioni sul database vengono effettuate utilizzando in
maniera diretta o indiretta il comando di selezione specificato
mediante l’operazione SELECT
linguaggio sql: DML
43
Le selezioni operano su tabelle e restituiscono come risultato una
tabella. La sintassi del comando di selezione è la seguente:
<comando_select> ::=
SELECT [ALL | DISTINCT] <lista_di_selezione>
<espressione_di_tabella>
[<clausola_di_ordinamento>]
dove <espressione_di_tabella> è così definita:
<espressione_di_tabella> ::=
<clausola_FROM>
[<clausola_WHERE>]
[<clausola_GROUP_BY>]
[<clausola_HAVING>]
linguaggio sql: DML
44
Nel comando è obbligatorio specificare, oltre alla <lista_di_selezione>,
la clausola FROM.
La clausola FROM indica la tabella o le tabelle su cui eseguire la selezione.
La forma più semplice della lista di selezione è quella costituita da uno o
più nomi di colonna della stessa tabella.
Questa forma del comando di selezione realizza direttamente l’operazione di proiezione definita nell’algebra relazionale.
Ad esempio:
SELECT Cod_Modello, Nome_Modello FROM Modelli
E’ da notare che l’ordine in cui viene chiesta la restituzione delle colonne
è indipendente dall’ordine utilizzato al momento della costruzione della
tabella.
Vedi esempio 19
linguaggio sql: DML
45
E’ possibile ridenominare le colonne della tabella risultante nel modo
seguente:
SELECT <nome_colonna> ‘<nome>’FROM <nome_tabella>
Ad esempio:
SELECT Cod_Modello ‘Codice’ FROM Modelli
Qualora sia necessario selezionare tutte le colonne di una tabella, è
possibile realizzare ciò, attraverso la seguente forma:
SELECT * FROM <nome_tabella>
Ad esempio:
SELECT * FROM Modelli
Vedi esempio 20
linguaggio sql: DML
46
Col comando:
SELECT Cod_Modello ‘Modelli presenti’ FROM Veicoli
si ottiene una tabella con tante righe quante sono le righe di Veicoli,
alcune delle quali contengono lo stesso codice modello.
Per eliminare i valori duplicati esiste la specifica di interrogazione
DISTINCT
Ad esempio:
SELECT DISTINCT Cod_Modello ‘Modelli presenti’ FROM Veicoli
Il risultato è una tabella dove i valori di Cod_Modello non vengono
ripetuti.
Vedi esempio 21
linguaggio sql: DML
47
La clausola WHERE permette di specificare delle condizioni nella
selezione. La sua sintassi è:
<clausola_where> ::= WHERE <condizione>
L’uso della clausola WHERE nel comando di selezione realizza
l’operazione di selezione o restrizione definita nell’algebra relazionale:
data una tabella e una condizione logica definita sugli attributi, la
selezione restituisce una tabella con gli stessi attributi di quella di
partenza, ma con le sole righe che soddisfano la condizione
Le condizioni della clausola where sono specificate mediante gli
operatori di confronto, i connettori logici e gli operatori BETWEEN, IN,
LIKE, IS NULL.
Negli esempi che seguono, mostreremo l’uso della clausola WHERE con
i vari tipi di operatori.
linguaggio sql: DML
48
Operatori di confronto: = ,<>,>,<,>=,<=
SELECT *
FROM Veicoli
WHERE Cilindrata>1000
Connettori logici: AND, OR, NOT
SELECT *
FROM Veicoli
WHERE Cod_Combustibile=‘01’
AND Cilindrata>1000
Vedi esempio 22
linguaggio sql: DML
49
Le espressioni finora esaminate operano sulle righe della tabella e
restituiscono sempre una tabella. Esistono però delle funzioni che
calcolano espressioni su insiemi di righe e restituiscono un caso molto
particolare di tabella, ovvero un singolo valore scalare.
Le funzioni disponibili sono le seguenti:
MAX
MIN
SUM
AVG
COUNT
valore massimo
valore minimo
somma di valori
media di valori
conteggio di valori
Di seguito mostreremo alcuni esempi di utilizzo di queste funzioni:
linguaggio sql: DML
50
SELECT MAX(Cilindrata) ‘Cilindrata massima’
FROM Veicoli
SELECT AVG(Cilindrata) ‘Cilindrata media’
FROM Veicoli
SELECT COUNT(*) ‘Numero Veicoli’
FROM Veicoli
SELECT MIN(Cilindrata) ‘Cilindrata minima’
FROM Veicoli
WHERE Cod_Combustibile=‘01’
Vedi esempio 23
linguaggio sql: DML
51
L’ordinamento può essere effettuato in base a una o più colonne e per
ciascuna colonna può essere crescente o decrescente. La clausola ha il
seguente formato:
<clausola_di_ordinamento> :: =
ORDER BY <ordine> [{,<ordine>} …]
dove
<ordine> ::=
<nome_colonna>|<numero_colonna> [ASC|DESC]
le specifiche ASC e DESC indicano se l’ordinamento deve essere
crescente (default) o decrescente
Vedi esempio 24
linguaggio sql: DML
52
Vediamo ora come si effettua la ricerca di informazioni mettendo in relazione i dati presenti in tabelle diverse.Utilizzeremo a questo scopo la tecnica delle join (congiunzioni) che realizza tali operazioni definite dalla
algebra relazionale.
Consideriamo due tabelle che abbiano colonne contenenti dati in comune, tale condizione permette di definire una operazione di join. I nomi
delle due colonne spesso sono uguali, ma ciò non è strettamente necessario; le due colonne devono in ogni caso avere lo stesso significato,
ovvero i valori delle due colonne devono appartenere allo stesso dominio.
Un caso molto comune e significativo di colonne comuni a due tabelle è
quello in cui l’appartenenza allo stesso dominio deriva dalla presenza di
relazioni tra le due entità rappresentate dalle due tabelle, e quindi dalla
presenza di chiavi esterne.
linguaggio sql: DML
53
La Equi-Join realizza l’operazione di giunzione naturale definita
nell’algebra relazionale: restituisce infatti una terza tabella le cui righe
sono tutte e sole quelle ottenute dalle righe delle due tabelle di partenza
in cui i valori delle colonne in comune sono uguali.
L’operazione di equi-join è implementata in SQL come una forma
particolare del comando di selezione:
- nella clausola FROM vanno indicate le due tabelle correlate su cui va
effettuata la join;
- nella clausola WHERE va espresso il collegamento tra le due tabelle,
mediante un’apposita condizione detta condizione di join.
Per evitare ambiguità nella clausola WHERE e nella lista_di_selezione>
è possibile indicare i nomi delle colonne qualificandoli mediante il nome
della tabella cui appartengono nel seguente modo:
nome_tabella.nome_colonna
linguaggio sql: DML
54
Ad esempio, utilizziamo la equi-join per visualizzare per ciascun veicolo
la descrizione della relativa categoria; in questo caso la ricerca coinvolge
le due tabelle Veicoli e Categorie, poiché l’informazione relativa al nome
della categoria, Nome_Categoria, non è presente nella tabella Veicoli.
Il comando SELECT che realizza l’equi-join è il seguente:
SELECT Targa, Categorie.Cod_Categoria, Nome_Categoria
FROM Veicoli, Categorie
WHERE Veicoli.Cod_Categoria = Categorie.Cod_Categoria
Nella clausola WHERE possono essere aggiunte altre condizioni combinandole in AND con la condizione di JOIN per restringere l’insieme delle righe restituite o combinandole in OR con la condizione di join per
estendere l’insieme delle righe restituite.
linguaggio sql: DML
55
Se volessimo restringere l’esempio precedente ai soli veicoli con cilindrata maggiore di 1600 e ordinare le righe per valori di targa crescenti,
avremo:
SELECT Targa, Categorie.Cod_Categorie, Nome_Categoria
FROM Veicoli, Categorie
WHERE Veicoli.Cod_Categoria = Categorie.Cod_Categoria
AND Cilindrata > 1600
ORDER BY Targa
Per evitare di specificare i nomi di tutte le colonne di una determinata
tabella è definita la seguente notazione abbreviata:
<nome_tabella>.*
Vedi esempio 25
linguaggio sql: DML
56
La equi-join è un caso particolare di inner-join: per la inner-join la
condizione di join non deve essere necessariamente una condizione di
uguaglianza.
Nelle ultime revisioni allo standard sono stati introdotti, per specificare il
tipo di join, dei costrutti ad hoc che però, alcune volte, non sono supportati da DBMS commerciali.
Per realizzare la inner-join, e quindi anche, come caso particolare, per la
equi-join, è stato introdotto il comando INNER-JOIN, il cui formato è il
seguente:
<comando_INNER_JOIN> ::=
<riferimento_a_tabella> [NATURAL] INNER JOIN
<riferimento_a_tabella>
[ON <condizione_di_join>
| USING <lista_colonne_di_join>]
linguaggio sql: DML
57
Le clausole ON e USING sono alternative e servono entrambe a
specificare la condizione di join. Utilizzando la prima clausola la
condizione deve essere espressa esplicitamente e può contenere operatori
diversi da quello di uguaglianza; la seconda è una forma abbreviata che
esprime una equi-join effettuata in base alla lista di colonne che seguono
la parola chiave USING. L’opzione NATURAL è un’ulteriore
abbreviazione che indica una equi-join effettuata in base a tutte le
colonne che nelle due tabelle sono identificate dallo stesso nome.
Il seguente comando:
SELECT *
FROM Veicoli,Categorie
WHERE Veicoli.Cod_Categoria = Categorie.Cod_Categoria
usando il comando INNER JOIN diventa:
linguaggio sql: DML
58
Categorie INNER JOIN Veicoli
ON Categorie.Cod_Categorie = Veicoli.Cod_Categoria
oppure
Categorie INNER JOIN Veicoli
USING Cod_Categoria
oppure
Categorie NATURAL INNER JOIN Veicoli
Vedi esempio 26
linguaggio sql: DML
59
L’operazione di prodotto tra due tabelle , definita nell’algebra relazionale, si ottiene mediante una operazione di join espressa in maniera
tradizionale in cui non venga specificata la condizione di join. Se le due
tabelle sono composte da n e da m righe, la nuova tabella conterrà n*m
righe, ottenute accodando ciascuna riga della prima tabella con ciascuna
riga della seconda tabella, quindi:
SELECT Categorie.*,Fabbriche.*
FROM Categorie, Fabbriche
Questo caso è previsto esplicitamente dalle nuove revisioni dello
standard; è stato infatti definito il comando CROSS JOIN con la
seguente sintassi:
<riferimento_a_tabella> CROSS JOIN <riferimento_a_tabella>
il comando precedente diventa:
Categorie CROSS JOIN Fabbriche (comando non presente in mysql)
linguaggio sql: DML
60
Le viste logiche, dette anche viste o view, possono essere definite come
tabelle virtuali.
Le viste, a differenza delle tabelle usate finora dette tabelle base, non
contengono dati propri ma sono costituite dalla riaggregazione dei dati
contenuti nelle tabelle base.
Anche le viste hanno una loro struttura che però è basata su quella delle
tabelle base. Le view insomma non contengono dati ma forniscono una
diversa visione dei dati delle tabelle.
La definizione di una vista può essere basata su una o su più tabelle (o su
una o più viste).
La vista appare all’utente come una nornale tabella e può essere utilizzata per eseguire operazioni sul database quali la ricerca e l’aggiornamento dei dati.
I dati che vengono modificati operando su una vista risulteranno
modoficati anche nelle tabelle in base alle quali la lista è definita.
linguaggio sql: DML
61
La sintassi del comando del DDL che consente di creare una vista è la
seguente:
CREATE VIEW <nome_view>
[(<nome_colonna> {,<nome_colonna>}…..)]
AS <comando_select> [WITH [LOCAL | CASCADED]
CHECK OPTION]
dove:
<nome_view> è il nome della vista
<nome_colonna> indicano i nomi assegnati alle colonne della vista
<comando_select> seleziona con condizioni le colonne e le tabelle con
cui riempire le colonne della vista
[WITH CHECK OPTION] assicura che le modifiche attraverso la vista
soddisfano la clausola WHERE della selezione
LOCAL | CASCADED sono opzioni alternative; CASCADE, specificata
in V2, non permette di modificare dati tramite V1 che violano le condilinguaggio sql: DML
zioni di V2
Vedi esempio 27 62
Il comando del DDL che elimina la definizione di una vista è il seguente:
DROP VIEW <nome_view> {RESTRICT | CASCADE}
le opzioni RESTRICT | CASCADE sono alternative:
• con RESTRICT la vista viene eliminata solo se non è riferita nella definizione di altre viste: se la vista V1 è stata usata nella definizione della
vista V2 il comando
DROP VIEW V1 RESTRICT non ha effetti sul database
• con CASCADE invece oltre ad essere eliminata la vista V1 viene
eliminata anche quella V2 che da essa dipende
linguaggio sql: DML
63
In generale per la selezione dei dati è possibile utilizzare una vista al
posto di una tabella; il DBMS in effetti traduce i riferimenti ad una vista
in riferimenti alle tabelle che la definiscono.
Per esempio il comando seguente:
SELECT A1_Targa
FROM A1
WHERE A1_Cilindrata>1000
Viene tradotto in:
SELECT Targa
FROM Veicoli
WHERE Cilindrata<1500 AND Cilindrata>1000
linguaggio sql: DML
64
Scarica

Cenni sul linguaggio SQL