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 |
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:
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:
Vediamo alcune peculiarità dell'istruzione SELECT in Transact-SQL
di SQL Server rispetto all'istruzione classica:
_________________________________________
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 |
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 |
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à |
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 |
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 |
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 |
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 |
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 |
__________________________________________________
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 |
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 |
L'istruzione CREATE INDEX serve per create indici sulle
tabelle. La sintassi è la seguente:
CREATE [UNIQUE] INDEX nome_indice |
________________________________________________
Vediamo un esempio comune a SQL di Oracle ed Transact-SQL di SQL
Server.
CREATE INDEX indice_anagrafica |
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 |
__________________________________________
Esempio.
CREATE VIEW conto |
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.
L'istruzione ALTER TABLE serve per modificare la definizione
di una tabella.
ALTER TABLE nome_tabella |
__________________________________________________
Alcune particolarità di SQL di Oracle sono:
... |
tale clausola consente di modificare la definizione di una o più
colonne esistenti.
Esempio.
ALTER TABLE anagrafica |
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.
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} |
Esempio
INSERT INTO anagrafica |
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.
L'istruzione UPDATE serve per cambiare valori esistenti in
una tabella o in una vista.
UPDATE {nome_tabella | nome_vista} |
Esempio.
UPDATE anagrafica |
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.
L'istruzione DELETE serve per cancellare righe da una
tabella o da una vista.
DELETE FROM {nome_tabella | nome_vista} |
Esempio
DELETE FROM anagrafica |
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] ] [, ...] } |
Esempio.
GRANT SELECT (cognome, nome) |
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} |
Esempio.
GRANT SELECT |
È l'istruzione analoga a quella vista per SQL di Oracle.
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] [,
...] } |
Esempio.
REVOKE
SELECT |
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} |
Esempio.
REVOKE SELECT |
Tale istruzione revoca il
privilegio di eseguire la SELECT sulle colonne cognome e nome della tabella
anagrafica a tutti gli utenti.