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:

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
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]
   [ ... ]
)

__________________________________________________

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)

________________________________________________

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

__________________________________________

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]

__________________________________________________

Alcune particolarità di SQL di Oracle sono:

...
[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}

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]

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]

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]

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}

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}

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}

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.