Sei sulla pagina 1di 12

Il linguaggio SQL

Clicca qui ------->

Esempi di SQL(necessita di Acrobat Reader)

Il linguaggio SQL (Structured Query Language) un linguaggio di tipo non procedurale che
consente di operare sui dati di un database tramite frasi che non fanno uso di simboli
matematici ed algebrici, ma solo di parole chiave prese dal linguaggio corrente; questo,
insieme alla sintassi che riprende forme usuali, fa s che le frasi abbiano una struttura lineare ed
espressiva.
In particolare il termine Structured (strutturato) di SQL riferito al fatto che si pu inserire
un'interrogazione all'interno di un'altra interrogazione; pi in generale si parla di query innestate.
Vediamo ora alcune istruzioni di SQL standard seguite da clausole specifiche di SQL di Oracle
e di Transact-SQL di SQL Server.
Le istruzioni in SQL di Oracle devono terminare con un punto e virgola (;), cosa che non
richiesta da Transact-SQL di SQL Server.
____________________________________________

Per quanto riguarda il linguaggio per la definizione dei dati si hanno tre istruzioni: CREATE,
ALTER, DROP.

Per quanto riguarda il linguaggio per la manipolazione dei dati si hanno tre istruzioni:
SELECT (presentata all'inizio), INSERT, UPDATE, DELETE.

Per quanto riguarda il linguaggio il controllo dei dati si hanno tre istruzioni: GRANT,
REVOKE.

L'istruzione SELECT serve per estrarre informazioni dal database.


La sua sintassi la seguente:
SELECT [ ALL | DISTINCT ] lista_scelte
FROM lista_tabelle
[ WHERE condizioni ]
[ GROUP BY lista_attributi ]
[ HAVING condizioni ]

[ ORDER BY lista_attributi ]
Si osservi che la clausola SELECT realizza l'operatore di proiezione dell'algebra relazionale,
non quello di selezione; quest'ultimo realizzato dalla clausola WHERE.
ALL significa che vengono restituite tutte le tuple ottenute dall'interrogazione; in genere, ALL
di default.
DISTINCT significa che restituisce solo le tuple che sono uniche nel risultato, cio produce una
"relazione" e non solamente una "tabella".
Nella lista_scelte sono contenute quali informazioni devono essere fornite in uscita che
possono essere:
Asterisco (*) che rappresenta tutte le colonne di ogni tabella presente nella clausola
FROM, nell'ordine in cui sono state definite nelle tabelle e secondo l'ordine in cui sono
listate le tabelle nella clausola FROM.
Una lista di nomi di colonne, specificate nell'ordine in cui si vogliono vedere; se la
lista_scelte contiene nomi di colonne multiple, esse devono essere separate da virgole.
Una o pi espressioni che possono essere: nomi di colonna (o campo), costanti, funzioni
o combinazioni di nomi di colonne, costanti, e funzioni connesse tra loro attraverso
operatori, o subquery (query innestate).
La clausola FROM seguita dalla lista di tabelle, separate da virgole, che vengono usate
nell'istruzione SELECT. In pi, possibile dare un alias alle tabelle. Tali alias, in genere,
vengono usati nei riferimenti relativi a nomi di colonne che possono essere ambigui in quanto
pi tabelle possono avere colonne con stessi nomi colonne.
WHERE serve per specificare le restrizioni o condizioni che devono essere soddisfatte dalle
tuple per far parte della tabella risultate.
Con la clausola GROUP BY si possono raggruppare le tuple per valori omogenei degli attributi
specificati nella lista_attributi.
HAVING l'equivalente del WHERE applicata ai gruppi di tuple, quindi, deve far riferimento
agli attributi di GROUP BY.
ORDER BY serve per ordinare le tuple risultati dall'interrogazione in base alla lista_attributi
che pu contenere solo attributi che compaiono nella lista_scelte (anche implicitamente se si
usa *).
Alcune particolarit di SQL di Oracle sono:
nella lista_scelte possibile cambiare il nome di una colonna nel seguente modo:
espressione AS nome_nuova_colonna
espressione pu essere anche solo il nome della colonna nella tabella, o una funzione od
una vera e propria espressione utilizzando i campi delle tabelle elencate nella clausola
FROM;
la clausola FROM, oltre all'elenco delle tabelle e delle viste, pu contenere delle subquery
(delle altre istruzioni SELECT);
Vediamo alcune peculiarit dell'istruzione SELECT in Transact-SQL di SQL Server rispetto
all'istruzione classica:

nella lista_scelte possibile cambiare il nome di una colonna nel seguente modo:
nome_nuova_colonna = espressione,
espressione pu essere anche solo il nome di una colonna, o una funzione, o addirittura
una subquery;
[INTO nuovo_nome_tabella]
tale clausola, posta tra la lista_scelte e la clausola FROM, utile per creare una nuova
tabella basandosi sulle colonne specificate nella lista_scelte e per inserire in tale tabella
le righe risultati dalla SELECT;
la clausola FROM non pi obbligatoria perch l'istruzione SELECT viene anche usata
per attribuire valori a variabili, es. SELECT @variabile=espressione; in pi nella
lista_tabelle possono essere elencate non solo tabelle, ma anche view e per le tabelle
possibile indicare il nome dell'indice da usare su tale tabella.
_________________________________________
Vediamo qualche esempio.
Consideriamo la tabella "anagrafica", costituita dalle colonne e contenente le tuple presentate
nello schema.
cognome
nome
tessera
et
peso
sport
Lotti

Daniela

X1X23AB

23

54.5

nuoto

Ferrari

Claudia

XX12T54

24

56

tennis

Feltri

Guglielmo

AA32X67

45

72

squash

Feltri

Daniela

ER58GH4

19

48

pallavolo

Ed anche una tabella "corsi" cos fatta:


tessera

corso

data_iscrizione

quota_iscrizione

data_ scadenza

X1X23AB

nuoto

01/09/96

240.000

01/03/96

XX12T54

tennis

12/10/96

200.000

12/01/96

AA32X67

squash

05/11/96

100.000

05/01/96

ER58GH4

pallavolo

11/11/96

150.000

11/02/96

XX12T54

nuoto

01/12/96

120.000

01/03/96

X1X23AB

scherma

15/12/96

175.000

15/03/96

Vediamo qualche esempio di SELECT su queste tabelle.


SELECT cognome, nome, tessera
FROM anagrafica
Tale SELECT restituisce una riga(o tupla) per ogni tupla della tabella anagrafica prendendo
solo il contenuto delle colonne cognome, nome, tessera.
cognome

nome

tessera

Lotti

Daniela

X1X23AB

Ferrari

Claudia

XX12T54

Feltri

Guglielmo

AA32X67

Feltri

Daniela

ER58GH4

SELECT DISTINCT nome


FROM anagrafica
Tale SELECT restituisce tutti i nomi delle persone che sono contenute nella tabella anagrafica

e presentando una volta sola i nomi che sono presenti anche pi volte nella colonna nome della
tabella anagrafica.
nome
Daniela
Claudia
Guglielmo
SELECT cognome, nome, et
FROM anagrafica
ORDER BY et DESC
Tale SELECT restituisce una riga per ogni tupla della tabella anagrafica prendendo solo il
contenuto delle colonne cognome, nome, et ed ordinando le tuple risultati in ordine
decrescente di et.
cognome
nome
et
Feltri

Guglielmo

45

Ferrari

Claudia

24

Lotti

Daniela

23

Feltri

Daniela

19

SELECT cognome, nome


FROM anagrafica
WHERE et > 23
Tale SELECT restituisce le tuple, costruite a partire dalla tabella anagrafica prendendo le
colonne cognome e nome, che soddisfano la condizione posta sull'et.
cognome

nome

Ferrari

Claudia

Feltri

Guglielmo

SELECT cognome, nome, corso, data_iscrizione


FROM anagrafica a, corsi c
WHERE a.tessera = c.tessera
ORDER BY cognome, nome
In SQL il join viene espresso semplicemente elencando le relazioni interessati e specificando,
nella clausola WHERE, gli opportuni predicati di join. Tale SELECT estrae dalla tabella
anagrafica cognome e nome, mentre dalla tabella corsi viene estratto il nome del corso e la
data di iscrizione al corso. Tra tutte le tuple del prodotto cartesiano delle due tabelle si
considerano solo quelle che hanno il valore del campo tessera, contenuto nella tabella
anagrafica, uguale al valore del campo tessera, contenuto nella tabella corsi. Per poter fare
riferimento ai due campi con lo stesso nome, ma in tabelle diverse, si usano gli alias: la tabella
anagrafica viene chiamata a ed il corrispondente campo tessera viene individuato con
a.tessera ed, analogamente, la tabella corsi ha un alias che c ed il campo tessera di tale
tabella individuato con c.tessera. Le tuple risultati vengono ordinate per cognome e nome.
cognome
nome
corso
data_iscrizione
Feltri

Daniela

pallavolo

11/11/96

Feltri

Guglielmo

squash

05/11/96

Ferrari

Claudia

tennis

12/10/96

Ferrari

Claudia

nuoto

01/12/96

Lotti

Daniela

nuoto

01/09/96

Lotti

Daniela

scherma

15/12/96

SELECT cognome, nome, tessera


FROM anagrafica
WHERE tessera in
(SELECT DISTINCT tessera FROM corsi WHERE quota_iscrizione BETWEEN 150000 AND 300000)
Questo un esempio di query innestata (o subquery), cio quando nella clausola WHERE
presente un'altra istruzione SELECT. Anche questo una forma di join. Prima di tutto viene
eseguita la SELECT che si trova all'interno delle parentesi. Tale SELECT ha come risultato una
tabella, costituita da un'unica colonna, che contiene i codici delle tessere di coloro che hanno
pagato una quota di iscrizione compresa tra 150.000 e 300.000.
tessera
X1X23AB
XX12T54
ER58GH4
Dopo di che viene eseguita la query esterna, la quale ora diventata la seguente:
SELECT cognome, nome, tessera
FROM anagrafica
WHERE tessera in ('X1X23AB', 'XX12T54', 'ER58GH4')
Tale SELECT prende dalle tuple della tabella anagrafica le colonne cognome, nome e tessera
se tali tuple hanno, come valore del campo tessera, uno dei valori contenuti tra parentesi.
cognome

nome

tessera

Lotti

Daniela

X1X23AB

Ferrari

Claudia

XX12T54

Feltri

Daniela

ER58GH4

L'istruzione CREATE TABLE serve per create tabelle.


CRETE TABLE nome_tabella
(
nome_colonna tipo_colonna costrizioni_colonna
[, nome_colonna tipo_colonna costrizioni_colonna]
[ ... ]
)
nome_tabella in nome che viene dato alla tabella;
nome_colonna il nome di una colonna della tabella;
tipo_colonna il tipo della colonna specificata col nome_colonna e, se necessario,
seguito dalla dimensione;
costrizioni_colonna consentono di specificare alcune caratteristiche della colonna
considerata:
NOT NULL

significa che la colonna considerata non pu assumere valore nullo,


CONSTRAINT nome_constraint_colonna UNIQUE (nome_colonna)
significa che la costrizione nome_constraint_colonna identifica la colonna
nome_colonna in cui i dati contenuti devono essere unici, cio non ci possono
essere due tuple della tabella con lo stesso valore nella colonna nome_colonna,
CONSTRAINT nome_primary_key_colonna PRIMARY KEY (nome_colonna)
significa che la costrizione nome_primary_key_colonna identifica la colonna
nome_colonna come una chiave primaria,
CONSTRAINT nome_foreign_key_colonna FOREIGN KEY (nome_colonna)
significa che la costrizione nome_foreign_key_colonna identifica la colonna
nome_colonna come una foreign key.
__________________________________________________
La definizione di ogni colonna viene separata dalle altre usando le virgole.
Una peculiarit dell'istruzione CREATE TABLE in SQL di Oracle :
[ AS subquery ]
che consente di inserire righe ottenute da una subquery nella tabella appena creata; tale
clausola va posta alla fine dell'istruzione vista sopra.
__________________________________________________
Vediamo un esempio in SQL di Oracle.
CREATE TABLE anagrafica
(
cognome varchar2(25),
nome varchar2(25),
tessera varchar2(10) CONSTRAINT id_unico UNIQUE,
et number(3),
peso number(5,2),
sport varchar2(35)
)
Viene creta la tabella anagrafica con i campi elencati sopra (il campo cognome di tipo
carattere di lunghezza 25, il campo nome ...) ed il campo tessera deve essere un campo unica,
cio non ci possono essere due persone con la stessa tessera.
___________________________________________
Vediamo l'esempio analogo al precedente in Transact-SQL di SQL Server.
CREATE TABLE anagrafica
(
cognome varchar(25),
nome varchar(25),
tessera varchar(10) CONSTRAINT id_unico UNIQUE,
et numeric(3),
peso numeric(5,2),
sport varchar(35)
)
L'istruzione CREATE INDEX serve per create indici sulle tabelle. La sintassi la seguente:
CREATE [UNIQUE] INDEX nome_indice
ON nome_tabella (lista_colonne)
UNIQUE significa che l'indice creato unico,

nome_indice il nome che viene attribuito all'indice,


nome_tabella il nome della tabella su cui si vuole costruire l'indice,
lista_colonne la lista delle colonne, separate da virgole, che costituiscono l'indice.
________________________________________________
Vediamo un esempio comune a SQL di Oracle ed Transact-SQL di SQL Server.
CREATE INDEX indice_anagrafica
ON anagrafica (cognome, nome)
Viene creato l'indice indice_anagrafica sulla tabella anagrafica basato su campi cognome e
nome.
________________________________________________
L'istruzione CREATE VIEW serve per create viste sulle tabelle, cio tabelle logiche che
consente di presentare, in un modo alternativo, le informazioni contenute in una o pi tabelle o
viste.
CRETE VIEW nome_view
[ lista_nomi_colonne ]
AS subquery
nome_view il nome che viene attribuito alla vista,
lista_nomi_colonne la lista dei nomi delle colonne, separate da virgole, che
costruiscono la vista,
AS consente di costruire una subquery che estrae i dati da mettere nella vista.
__________________________________________
Esempio.
CREATE VIEW conto
(cognome, nome, numero_iscrizioni)
AS
SELECT cognome, nome, count(b.tessera) FROM anagrafica a, corsi b WHERE a.tessera=b.tessera
Viene creata la vista conto che contiene tre campi ottenuti lavorando su due tabelle. Dalla
tabella anagrafica vengono presi i campi cognome e nome e per ogni persona vengono
contate il numero di iscrizioni a dei corsi contenuti nella tabella corsi.

Istruzione ALTER
L'istruzione ALTER TABLE serve per modificare la definizione di una tabella.
ALTER TABLE nome_tabella
[ ADD nome_colonna tipo_colonna [costrizioni_colonna]
[, nome_colonna tipo_colonna [costrizioni_colonna] ] [, ...] ]
[ DROP clausole_drop]
nome_tabella in nome che viene dato alla tabella;
ADD serve per aggiungere colonne alla tabella:
nome_colonna il nome di una colonna della tabella;
tipo_colonna il tipo della colonna specificata col nome_colonna e, se

necessario, seguito dalla dimensione;


costrizioni_colonna consentono di specificare alcune caratteristiche della colonna
viste durante la creazione delle tabelle;
DROP consente di cancellare una colonna od delle costrizioni su una colonna a seconda
di ci che contenuto nella clausole_drop.
__________________________________________________
Alcune particolarit di SQL di Oracle sono:
la clausola DROP consente di eliminare solo le costrizioni di integrit su una colonna;
si ha a disposizione un'altra clausola:
...
[MODIFY nome_colonna [tipo_colonna] [costrizioni_colonna]
[, nome_colonna [tipo_colonna] [costrizioni_colonna] ] [, ...] ]
...
tale clausola consente di modificare la definizione di una o pi colonne esistenti.
Esempio.
ALTER TABLE anagrafica
ADD lavoro varchar2(25)
DROP UNIQUE (id_unico)
In questo modo viene aggiunto alla tabella anagrafica la colonna lavoro (campo alfanumerico di
lunghezza 25) ed si elimina la costrizione id_unico sul campo tessera.

Istruzione DROP
L'istruzione DROP TABLE serve per cancellare una tabella esistente. L'istruzione :
DROP TABLE nome_tabella
L'istruzione DROP INDEX serve per cancellare un indice su una tabella. L'istruzione :
DROP INDEX nome_indice
L'istruzione DROP VIEW serve per cancellare una vista esistente. L'istruzione :
DROP VIEW nome_view
Una caratteristica di Transact-SQL che consente di cancellare pi di un oggetto alla volta,
cio si possono, ad esempio, cancellare pi tabelle indicando al posto di nome_tabella una
lista di tabelle separate da virgole.
DROP TABLE anagrafica
In questo modo si elimina la tabella anagrafica dal database.

L'istruzione INSERT serve per aggiungere nuove righe in una tabella o in una vista basata su
tabelle. L'istruzione :

INSERT INTO {nome_tabella | nome_vista}


[(lista_colonne)]
{ VALUES (lista_valori) | subquery}
necessario mettere il nome della tabella od il nome della vista in cui fare l'inserimento;
lista_colonne la lista delle colonne in cui dovranno essere inseriti i nuovi valori,
importante l'ordine; se non viene messa tale lista, i valori inseriti vengono messi nelle
colonne nell'ordine in cui queste ultime sono state definite durante la creazione della
tabella;
i valori inseriti possono essere elencati esplicitamente nella lista_valori o attraverso una
subquery.
Esempio
INSERT INTO anagrafica
VALUES ('Fontana', 'Giorgio', 'XYZ826K', null, null, 'taichi')
In questo modo si inserisce nella tabella anagrafica una nuova riga attribuendo ai campi,
nell'ordine in cui sono stati definiti, i valori elencati nella clausola VALUE.

Istruzione UPDATE
L'istruzione UPDATE serve per cambiare valori esistenti in una tabella o in una vista.
UPDATE {nome_tabella | nome_vista}
SET
nome_colonna = {espressione | subquery}
[, nome_colonna = {espressione | subquery}]
[, ...]
[WHERE condizione]
necessario mettere il nome della tabella od il nome della vista in cui aggiornare i dati;
nome_colonna il nome della colonna a cui si associa un nuovo valore ottenuto come
risultato di un'espressione o di una subquery posta a destra del segno di uguaglianza;
possibile mettere condizioni sulle tuple da aggiornare usando la clausola WHERE.
Esempio.
UPDATE anagrafica
SET
et=25,
sport='pattinaggio'
WHERE cognome='Feltri' and nome='Daniela'
Tale istruzione consente di modificare informazioni gi presenti nella tabella anagrafica; in
particolare, le tuple che soddisfano la condizione vengono aggiornate ponendo 25 come et e
pattinaggio come sport.

Istruzione DELETE

L'istruzione DELETE serve per cancellare righe da una tabella o da una vista.
DELETE FROM {nome_tabella | nome_vista}
[WHERE condizione]
necessario mettere il nome di una tabella od il nome di una vista;
si usa la clausola WHERE se si vogliono cancellare solo righe che soddisfano certe
condizioni.
Esempio
DELETE FROM anagrafica
WHERE cognome='Feltri'
Con tale istruzione si eliminano dalla tabella anagrafica tutte le tuple che hanno 'Feltri' come
valore del campo cognome

Il proprietario di un oggetto pu accordare privilegi su di esso ad altri utenti tramite l'istruzione


GRANT.
La sintassi del comando per SQL di Oracle la seguente:
GRANT {ALL | privilegio [lista_colonne] [, privilegio [lista_colonne] ] [, ...] }
ON oggetto
TO {lista_utenti | PUBLIC}
[WITH GRANT OPTION]
ALL concede tutti i privilegi sull'oggetto all'utente.
Privilegio il privilegio sull'oggetto che viene concesso e pu essere: ALTER, DELETE,
INDEX, INSERT, SELECT, UPDATE. Tale privilegio, se seguito dalla lista delle
colonne dell'oggetto, viene concesso solo sulle colonne listate, altrimenti viene concesso
su tutto l'oggetto.
Oggetto l'oggetto su cui si danno i privilegi.
TO seguito da PUBLIC, se si vogliono concedere i privilegi sull'oggetto a tutti gli utenti,
altrimenti da lista_utenti, che l'elenco di utenti a cui si vogliono concedere i privilegi.
La clausola WITH GRANT OPTION permette agli utenti che ricevono i privilegi di
concederli a loro volta ad altri.
Esempio.
GRANT SELECT (cognome, nome)
ON anagrafica
TO PUBLIC
In questo modo si concede a tutti gli utenti di poter eseguire sulla tabella anagrafica delle
SELECT solo sui campi cognome e nome.
______________________________________
La sintassi del comando per Transact-SQL di SQL Server :

GRANT {ALL | lista_privilegi}


ON { nome_tabella [lista_colonne] | nome_vista [lista_colonne] }
TO {lista_utenti | PUBLIC}
ALL concede tutti i privilegi sull'oggetto all'utente.
Lista_privilegi l'elenco dei privilegi concessi ad una tabella od ad una vista e possono
essere: SELECT, INSERT, DELETE, UPDATE.
ON seguito dal nome della tabella o della vista su cui si concedono i privilegi. Dopo di
che, se segue la lista delle colonne dell'oggetto, il privilegio viene concesso solo su tali
colonne, altrimenti viene dato su tutto l'oggetto.
TO seguito da PUBLIC, se si vogliono concedere i privilegi sull'oggetto a tutti gli utenti,
altrimenti da lista_utenti, che l'elenco di utenti a cui si vogliono concedere i privilegi.
Esempio.
GRANT SELECT
ON anagrafica (cognome, nome)
TO PUBLIC
l'istruzione analoga a quella vista per SQL di Oracle.

Istruzione REVOKE
L'istruzione REVOKE serve per revocare i privilegi sugli oggetti agli utenti.
La sintassi del comando per SQL di Oracle la seguente:
REVOKE {ALL | privilegio [, privilegio] [, ...] }
ON oggetto
FROM {lista_utenti | PUBLIC}
ALL revoca tutti i privilegi sull'oggetto all'utente.
Privilegio il privilegio sull'oggetto che viene revocato su tutto l'oggetto e pu essere:
ALTER, DELETE, INDEX, INSERT, SELECT, UPDATE.
Oggetto l'oggetto su cui si tolgono i privilegi.
FROM seguito da PUBLIC, se si vogliono revocare i privilegi sull'oggetto a tutti gli
utenti, altrimenti da lista_utenti, che l'elenco di utenti a cui si revocano i privilegi.
Esempio.
REVOKE SELECT
ON anagrafica
FROM PUBLIC
In questo modo si revoca a tutti gli utenti il privilegio di poter eseguire sulla tabella anagrafica
delle SELECT solo sui campi cognome e nome.
__________________________________________
La sintassi del comando per Transact-SQL di SQL Server :
REVOKE {ALL | lista_privilegi}
ON { nome_tabella [lista_colonne] | nome_vista [lista_colonne] }
FROM {lista_utenti | PUBLIC}

ALL revoca tutti i privilegi sull'oggetto all'utente.


Lista_privilegi l'elenco dei privilegi revocati su una tabella o su una vista e possono
essere: SELECT, INSERT, DELETE, UPDATE.
ON seguito dal nome della tabella o della vista su cui si revocano i privilegi. Dopo di
che, se segue la lista delle colonne dell'oggetto, il privilegio viene revocato solo su tali
colonne, altrimenti viene revocato su tutto l'oggetto.
FROM seguito da PUBLIC, se si vogliono revocare i privilegi sull'oggetto a tutti gli
utenti, altrimenti da lista_utenti, che l'elenco di utenti a cui si vogliono revocare i
privilegi.
Esempio.
REVOKE SELECT
ON anagrafica (cognome, nome)
TO PUBLIC
Tale istruzione revoca il privilegio di eseguire la SELECT sulle colonne cognome e nome della
tabella anagrafica a tutti gli utenti.