Sei sulla pagina 1di 31

BD AREA TEMATICA

Basi di dati

CAPITOLO

7 Linguaggio SQL
Competenze
• Individuare le caratteristiche di un linguaggio per basi di dati.
• Utilizzare correttamente la sintassi del linguaggio per costruire comandi di
interrogazione e di manipolazione dei dati.

Conoscenze Abilità
• Linguaggio per basi di dati • Applicare i principi del modello
• Parole chiave e sintassi del relazionale
linguaggio SQL • Utilizzare i comandi del
• Codiica delle operazioni sui linguaggio SQL per la deinizione
database relazionali delle tabelle, le operazioni di
manipolazione dei dati e le
interrogazioni
• Utilizzare funzioni e clausole
per calcoli, raggruppamenti,
ordinamenti e ricerche
• Utilizzare i comandi per la
sicurezza

Contenuti
• Caratteristiche generali del linguaggio
• Identiicatori e tipi di dati
• Deinizione delle tabelle
• Comandi per la manipolazione dei dati
• Comando Select
• Operazioni relazionali
• Funzioni di aggregazione
• Ordinamenti e raggruppamenti
• Condizioni di ricerca
• Comandi per la sicurezza
1 Linguaggio per basi di dati
Il linguaggio SQL (Structured Query Language) è nato con lo scopo di poter
eseguire con facilità:
• la deinizione e la creazione di un database relazionale;
• le diverse operazioni di gestione dei dati, quali l’inserimento, la cancellazione e
la variazione dei record di un archivio;
• l’interrogazione del database a scopo informativo.
Il linguaggio è basato su costrutti semplici e facili da imparare. Le sue caratteri-
stiche, inine, sono standardizzate in modo che un utente, cambiando DBMS, non
debba apprendere un nuovo linguaggio per usare la base di dati.
Le interrogazioni che si costruiscono con SQL sono un’estensione di quelle che si
realizzano con sequenze di operazioni relazionali, in quanto con SQL è possibile,
come nelle query di Access, effettuare calcoli, raggruppamenti e ordinamenti.

Come abbiamo visto nel precedente capitolo, Access permette di costruire una
query in modalità QBE (cioè attraverso l’interfaccia graica) e di visualizzarne il
corrispondente codice SQL. È anche possibile costruire l’interrogazione in SQL e,
passando alla Visualizzazione Struttura, esaminare la versione QBE della query.
Per imparare il linguaggio è molto utile passare da una modalità all’altra e osser-
vare come una frase di SQL viene rappresentata in QBE, oppure, viceversa, come
una query QBE, di cui si conoscono gli effetti, viene tradotta in SQL.
La conoscenza di SQL è di grande importanza anche nello sviluppo di applicazioni
direttamente con Access in modalità QBE per le seguenti ragioni:
• ci sono interrogazioni che non si riescono a sviluppare con le QBE di Access;
• per scrivere interrogazioni annidate in modalità QBE bisogna inserire un comando
SQL nella riga dei criteri;
• per inserire in una maschera una casella combinata che permetta la scelta da
un elenco di dati estratti da una tabella, bisogna scrivere un’interrogazione SQL
da inserire tra le proprietà della casella;
• dopo aver creato un’interrogazione in modalità QBE e dovendola modiicare, è
spesso più facile e rapido modiicare il codice SQL dell’interrogazione, anziché
la versione QBE originale.

Nel seguito del capitolo faremo riferimento al seguente database di esempio.

ESEMPIO 1: Sistema periodico degli elementi

Progettare un database per organizzare le informazioni sugli elementi della tavola periodica.

Assegniamo al database il nome SistemaPeriodico.


Ogni elemento è identiicato dal numero atomico, oltre che dal simbolo atomico; per esempio
l’idrogeno ha numero atomico 1 e simbolo atomico H.
Gli attributi dell’elemento sono le proprietà descrittive, quali il periodo e il gruppo di apparte-
nenza, il nome per esteso, e le proprietà isiche e chimiche.
Per semplicità prenderemo in considerazione solo alcune proprietà:
- Gruppo (da 1 a 18, oltre ai gruppi dei Lantanoidi e degli Attinoidi)
- Periodo (da 1 a 7)
- Nome in italiano
- Nome in inglese
- Massa atomica (misurata in unità IUPAC)
- Punto di fusione (temperatura in °C)

406 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


- Punto di ebollizione (temperatura in °C)
- Densità (misurata in g/mL)
- Elettronegatività (misurata secondo la scala di Pauling)
- Afinità elettronica (misurata in eV).

Gli elementi possono poi essere classiicati nelle serie chimiche, che sono:
- Metalli alcalini
- Metalli alcalino terrosi
- Lantanoidi
- Attinoidi
- Metalli di transizione
- Metalli di post-transizione
- Metalloidi
- Non metalli
- Alogeni
- Gas nobili.
La serie chimica può essere identiicata con un numero progressivo e caratterizzata da un nome
per esteso ed eventualmente da una descrizione alternativa.
Quindi il modello concettuale dei dati contiene due entità principali: elemento e serie chimica.
Tra serie chimica ed elemento esiste un’associazione uno a molti, perché ad ogni serie chimica
possono corrispondere più elementi, mentre ogni elemento è classiicato in una sola serie chimica.
Il database SistemaPeriodico comprende le tabelle corrispondenti alle entità che caratterizzano
la gestione dei dati:
• Tabella SerieChimiche con le informazioni sulle serie: ID (codice identiicativo e chiave primaria),
nome e descrizione alternativa.
• Tabella Elementi con le informazioni sugli elementi del sistema periodico: numero atomico (chiave
primaria), simbolo atomico, gruppo, periodo, e tutte le altre proprietà elencate in precedenza.
La rappresentazione delle informazioni con due tabelle separate, come abbiamo visto nel capi-
tolo precedente, risponde all’esigenza di mantenere distinti i dati ed evitare anomalie durante le
operazioni su un database. Inoltre consente di deinire attributi aggiuntivi per le serie chimiche.
La igura seguente illustra il modello dei dati con alcune righe di esempio (per rendere più facile
la lettura, sono stati riportati solo alcuni tra gli attributi dell’elemento).
SerieChimiche

ID Nome Descrizione alternativa


1 Metalli alcalini
2 Metalli alcalino terrosi
5 Metalli di transizione Elementi del blocco d
8 Non metalli
10 Gas nobili

Elementi
Numero Simbolo Gruppo Periodo Nome Nome Massa Punto Serie
Atomico Atomico Italiano Inglese Atomica Fusione Chimica
1 H 1 1 idrogeno hydrogen 1,00794 -259,1 8
2 He 18 1 elio helium 4,0026.2 -272,2 10
3 Li 1 2 litio lithium 6,941 180,5 1
4 Be 2 2 berillio beryllium 10,811 1278 2

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 407


Le tabelle hanno un campo chiave primaria (ID e NumeroAtomico), costituito da un numero
intero per distinguere ciascuna riga all’interno della tabella.
Per stabilire poi il collegamento tra le tabelle occorre aggiungere la chiave esterna: la tabella
degli Elementi deve contenere un campo aggiuntivo che rappresenta il collegamento al codice
della serie chimica (ID).

Possiamo quindi deinire il modello logico del database con le seguenti tabelle:
SerieChimiche (ID, Nome, DescrizioneAlternativa)
Elementi (NumeroAtomico, SimboloAtomico, Gruppo, Periodo, NomeItaliano, NomeInglese,
MassaAtomica, PuntoFusione, PuntoEbollizione, Densità, Elettronegatività, AfinitàElettronica,
SerieChimica)

Le chiavi primarie sono sottolineate e la chiave esterna è in corsivo.

Fine esempio

2 Caratteristiche generali del linguaggio


SQL
Il linguaggio SQL è un linguaggio non procedurale che è diventato uno standard
tra i linguaggi per la gestione di database relazionali.
Non-procedurale (o dichiarativo) signiica che con SQL l’interrogazione al data-
base si esegue precisando solamente dove stanno i dati e cosa si vuole ottenere,
cioè deinendo solo quali sono l’input e l’output desiderato.
Dopo una prima versione introdotta da IBM alla ine degli anni ’70 per un pro-
totipo di ricerca denominato System R, negli anni ’80 fu adottato con il nome
attuale come linguaggio per i software DBMS prodotti dalla IBM (DB2 e SQL/DS).
Nel 1986 l’ANSI (American National Standards Institute) pubblicò il primo standard
del linguaggio SQL, al quale seguì lo standard dell’ISO (International Standards
Organization) pubblicato nel 1987. Successivamente le speciiche del linguaggio
vennero precisate e ampliate: gli aggiornamenti degli standard portarono alla
versione, detta SQL2, pubblicata nel 1992 da ISO (ISO 9075) e alla successiva,
indicata come SQL3, pubblicata nel 1999 da ISO come ISO 9075-2.

Oggi il linguaggio SQL viene usato in tutti i prodotti DBMS (Oracle, MySQL,
SQLServer, Access) come linguaggio di comandi per l’utente della base di dati.
Le diverse versioni del linguaggio SQL sono in genere aderenti agli standard inter-
nazionali, ma ci sono sicuramente delle differenze che possono essere individuate
attraverso la documentazione fornita con gli speciici software.
Le parole chiave che costituiscono i comandi del linguaggio SQL possono essere
usate in modo interattivo, scrivendole direttamente sulla tastiera nel momento in
cui si vogliono attivare. Tuttavia in molti ambienti i comandi possono essere inviati
al sistema attraverso un’interfaccia graica, che utilizza menu, inestre e icone per
guidare l’utente nella costruzione dell’istruzione SQL.
La terminologia del linguaggio SQL è analoga a quella di Access: un database è
costituito da tabelle, gli attributi sono le colonne della tabella e i record sono le
righe della tabella.

408 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


Il linguaggio SQL consente all’utente di:
• Deinire il database, la struttura delle tabelle che lo compongono, gli indici e
le associazioni tra le tabelle. I comandi per queste funzionalità formano il Data
Deinition Language (DDL) di SQL.
• Modiicare i dati contenuti nel database, con le operazioni di inserimento, varia-
zione e cancellazione, ed effettuare le interrogazioni. I comandi Insert, Update,
Delete e Select appartengono al Data Manipulation Language (DML) di SQL.
• Deinire gli utenti e controllare gli accessi al database. I comandi Grant e Revoke
appartengono alle funzioni di Data Control Language (DCL) di SQL.

Il linguaggio SQL fornisce inoltre gli opportuni comandi per deinire in modo
facile i tabulati di uscita dei risultati (report), per recuperare i dati quando accade
un’interruzione del programma, un guasto nei supporti magnetici o un malfun-
zionamento del sistema, per deinire le viste parziali degli utenti sul database, per
garantire la sicurezza dei dati nei confronti degli accessi di più utenti.

3 Identificatori e tipi di dati


Il linguaggio SQL utilizza i caratteri alfabetici, le cifre decimali, gli operatori arit-
metici e di confronto (+ - / * = < >), più altri caratteri che assumono particolari
signiicati nella sintassi delle istruzioni e che verranno descritti nel seguito.
Gli identiicatori (nomi di tabelle e di attributi) sono costituiti da sequenze di
caratteri di lunghezza massima uguale a 18 caratteri: devono iniziare con una
lettera e possono anche contenere il carattere _.
Il nome di un attributo, ovvero di una colonna di una tabella, è identiicato per
mezzo della notazione abituale:
NomeTabella.NomeAttributo
nella quale il nome della tabella e il nome dell’attributo vengono separati da
un punto. Il nome della tabella può essere omesso se non ci sono ambiguità
nell’identiicazione dell’attributo.
Nella dichiarazione della struttura di una tabella occorre speciicare il tipo dei dati
scelto per gli attributi.

I tipi standard del linguaggio SQL sono:

BOOLEAN Valore logico True, False


CHARACTER(n) Stringa di lunghezza n n da 1 a 15000
DATE Data nella forma MM/GG/AA
TIME Ora nella forma HH:MM
INTEGER(p) Numero intero con precisione p p da 1 a 45
SMALLINT Numero intero con precisione 5 da -32768 a 32767
INTEGER Numero intero con precisione 10 da -2.147.483.648 a 2.147.483.647
DECIMAL(p,s) Numero decimale con precisione p da 1 a 45 e s da 0 a p
p e s cifre decimali
REAL Numero reale con mantissa di valore 0 oppure valore assoluto da
precisione 7 1E-38 a 1E+38
FLOAT (o DOUBLE Numero reale con mantissa di valore 0 oppure valore assoluto da
PRECISION) precisione 15 1E-308 a 1E+308
FLOAT(p) Numero reale con mantissa di p da 1 a 45
precisione p

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 409


Per i dati numerici la precisione p indica il numero massimo di cifre che il numero
può contenere, esclusi il segno e il punto decimale.
Per i numeri decimali il valore s indica il numero di cifre che seguono il punto
decimale.
I dati numerici loating point sono memorizzati in forma esponenziale; la precisione
riguarda solo le cifre della mantissa e indica il numero di cifre signiicative del dato.
La parola NUMERIC può essere usata al posto di DECIMAL.
La parola CHARACTER è equivalente a CHARACTER(1), e può essere abbreviata
con CHAR.
DECIMAL è equivalente a DECIMAL(15,0).
Altre abbreviazioni sono:
• CHAR(n) invece di CHARACTER(n);
• INT(p) invece di INTEGER(p);
• DEC(p,s) invece di DECIMAL(p,s).
Occorre osservare che alcune versioni di SQL in speciici ambienti DBMS diffe-
riscono dallo standard nell’indicazione dei tipi di dati. Le stesse considerazioni
valgono anche per le successive istruzioni del linguaggio: in diverse versioni del
linguaggio SQL ci possono essere varianti nella sintassi e nei termini utilizzati. Per
risolvere questi problemi è opportuno sempre controllare gli esempi presentati
nei manuali per l’utente o nell’help in linea del linguaggio.
Le costanti stringa sono delimitate dai caratteri ˈ o ̎ . Il delimitatore standard è
l’apice ˈ.
Nelle colonne della tabella gli attributi che hanno un valore non disponibile, o
non deinito, assumono il valore Null. Il valore Null non è mai uguale a nessun
altro valore: è diverso dal valore zero per i dati numerici e dalla stringa vuota (")
per i dati alfanumerici.
Negli ordinamenti il valore Null compare, di norma, all’inizio delle sequenze cre-
scenti e alla ine delle sequenze decrescenti.
Le costanti numeriche possono avere o non avere il segno + oppure –. Nei nu-
meri decimali la parte intera è separata dalle cifre decimali attraverso il punto. I
numeri in loating point possono essere rappresentati in forma esponenziale, per
esempio –1.2E+7.
Nelle operazioni di confronto i numeri sono controllati in accordo con il loro valore
algebrico, mentre le stringhe sono confrontate carattere per carattere a partire da
sinistra secondo il loro valore lessicale, cioè secondo il codice ASCII e ignorando
la differenza tra caratteri maiuscoli e minuscoli (non case-sensitive). Nella scrittura
delle condizioni possono essere usati gli operatori NOT, AND e OR.
Tutti i risultati di confronti numerici o stringa che riguardano attributi con valore
Null sono considerati sconosciuti, perché Null non è uguale, maggiore o minore
di nessun altro valore.
Il linguaggio SQL può solo controllare la presenza o l’assenza di Null in una colonna.

Comandi SQL in Access

Per scrivere un comando SQL nell’ambiente di Access, bisogna creare una


Access SQL nuova query accedendo alla Visualizzazione Struttura (scheda Crea, pulsante
Struttura query), e chiudere la inestra di dialogo Mostra tabella senza sce-
gliere alcuna tabella. Poi si deve fare clic sulla scelta SQL che è diventata la
proposta del pulsante Visualizza.
Appare una inestra come quella in igura che permette di scrivere il codice
in linguaggio SQL.

410 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


Le istruzioni del linguaggio SQL sono a formato libero e terminano con il
carattere punto e virgola: un comando SQL può essere scritto liberamente
su una o più righe e le parole chiave del linguaggio possono essere scritte
indifferentemente a caratteri maiuscoli o minuscoli.
Per eseguire il comando in fase di collaudo: clic sul pulsante Esegui della
scheda Progettazione.
Il comando può essere salvato assegnando un nome signiicativo: viene inserito
nel gruppo Query degli oggetti di Access.
Per eseguire il comando salvato: doppio clic sul suo nome.

4 Comandi DDL di SQL: definizione


delle tabelle
Le tabelle vengono deinite con il comando CREATE TABLE, con il nome della
tabella seguito, tra parentesi, dall’elenco degli attributi. Per ogni attributo occorre
speciicare il nome e il tipo di dato. Gli attributi possono essere qualiicati me-
diante diverse clausole che permettono di deinire: la chiave primaria, le chiavi
esterne o l’obbligatorietà.

ESEMPIO 2: Creazione delle tabelle


Creare le tabelle per le serie chimiche e per gli elementi.

Il primo comando Create Table crea la tabella SerieChimiche.

CREATE TABLE SerieChimiche(


ID smallint primary key,
Nome char(40) not null,
DescrizioneAlternativa char(50)
);

Ogni comando SQL termina con il punto e virgola.


ID è chiave primaria della tabella (primary key).
Il campo Nome è obbligatorio: non sono ammessi valori nulli (not null) per il nome della serie chimica.

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 411


Il seguente comando crea la tabella Elementi.

CREATE TABLE Elementi(


NumeroAtomico smallint primary key,
SimboloAtomico char(5) not null,
Gruppo char(15) not null,
Periodo smallint not null,
NomeItaliano char(20) not null,
NomeInglese char (20),
MassaAtomica decimal(10,5),
PuntoFusione decimal(5,1),
PuntoEbollizione decimal(5,1),
Densità decimal(10,7),
Elettronegatività decimal(5,2),
AffinitàElettronica char(10),
SerieChimica smallint references SerieChimiche(ID),
Unique(SimboloAtomico)
);

La clausola Unique vieta la presenza di valori duplicati in una colonna o in un insieme di colonne:
non ci possono essere due elementi con lo stesso simbolo atomico.
La parola references deinisce il riferimento di un campo al campo di un’altra tabella.

Le clausole Primary Key e la deinizione della chiave esterna (Foreign Key) possono essere
inserite, come la clausola Unique, in righe isolate.
Per esempio nel comando di creazione della tabella Elementi:

Primary Key (NumeroAtomico),


Unique (SimboloAtomico),
Foreign Key (SerieChimica) references SerieChimiche(ID)

La struttura di una tabella può essere modiicata in un secondo tempo con il comando ALTER
TABLE, per aggiungere una nuova colonna (ADD) a quelle già esistenti, oppure per togliere
una colonna (DROP).

Per esempio, il seguente comando aggiunge un nuovo campo RaggioAtomico alla struttura
della tabella Elementi:

ALTER TABLE Elementi


ADD RaggioAtomico decimal(4,2);

Il seguente comando rimuove il campo RaggioAtomico dalla struttura della tabella Elementi:

ALTER TABLE Elementi


DROP RaggioAtomico;

L’istruzione CREATE INDEX viene utilizzata per creare un nuovo indice su una tabella esistente,
indicando il nome della tabella e il nome dell’attributo o degli attributi ai quali associare l’indice.
Se non si vuole che ci siano valori duplicati per l’attributo associato all’indice, occorre usare la
clausola Unique.
Per esempio, il seguente comando crea l’indice IndiceSimboli sul campo SimboloAtomico della
tabella Elementi: non ci possono essere elementi con lo stesso simbolo.

CREATE UNIQUE INDEX IndiceSimboli


ON Elementi(SimboloAtomico);

412 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


Una tabella o un indice possono essere eliminati con il comando DROP, seguito dal nome della
tabella o dell’indice.
Per esempio:

DROP INDEX IndiceSimboli ON Elementi;

cancella l’indice IndiceSimboli sulla tabella Elementi.

DROP TABLE Elementi;

elimina struttura e dati della tabella Elementi.

ine esempio
I comandi illustrati rappresentano la parte del linguaggio SQL che fa riferimento
alla categoria dei comandi deiniti con la sigla DDL (Data Deinition Language),
cioè il linguaggio che consente di implementare il modello logico dei dati sulle
memorie di massa del computer.
Occorre osservare che nelle versioni moderne dei prodotti DBMS le operazioni di
creazione di tabelle, oltre che di modiica alla struttura della tabella o di cancel-
lazione di tabelle, vengono effettuate, come in Access, attraverso un’interfaccia
interattiva che facilita il lavoro dell’utente, il quale può anche non conoscere la
sintassi dei comandi sopra illustrati.

5 Comandi per la manipolazione dei dati


I valori degli attributi nelle righe della tabella possono essere inseriti, aggiornati
o cancellati rispettivamente con i comandi INSERT, UPDATE e DELETE.
È importante notare che nei comandi Update e Delete compare la clausola WHERE,
per effetto della quale è possibile operare su molte righe, anziché su una sola riga
per volta: basta indicare dopo Where una condizione che deve essere veriicata
dalle righe che si vogliono modiicare o cancellare.

ESEMPIO 3: Operazioni di inserimento, modiica e cancellazione

Il seguente comando INSERT INTO inserisce una nuova riga nella tabella Elementi:

INSERT INTO Elementi (NumeroAtomico, SimboloAtomico, Gruppo, Periodo,


NomeItaliano, NomeInglese, MassaAtomica, PuntoFusione, PuntoEbollizione, Densità,
Elettronegatività, AffinitàElettronica, SerieChimica)
VALUES (1, "H", 1, "01", "idrogeno", "hydrogen", 1.00794, -259.1, -252.9,
0.0000699, 2.2, "0,75", 8);

Si noti l’uso del punto decimale nella rappresentazione dei valori numerici non interi.

Il comando UPDATE aggiorna il contenuto di un campo: la clausola SET imposta il nuovo valore,
la clausola WHERE stabilisce il criterio di scelta della riga (o delle righe) da aggiornare.

UPDATE Elementi
SET MassaAtomica = 44.956
WHERE NumeroAtomico = 21;

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 413


La clausola Set può contenere anche un’espressione di calcolo. Per esempio, il seguente comando
trasforma il valore del punto di ebollizione da gradi Celsius a Kelvin per tutti gli elementi non
metalli (aventi il codice della serie chimica uguale a 8).

UPDATE Elementi
SET PuntoEbollizione = PuntoEbollizione + 273.15
WHERE SerieChimica = 8;

Il comando DELETE FROM cancella una riga (o più righe) di una tabella secondo un criterio
stabilito con la clausola WHERE.

DELETE FROM Elementi


WHERE NumeroAtomico = 21;

Il comando DELETE FROM senza la clausola WHERE elimina tutti i dati della tabella, ma ne
mantiene la struttura. Per esempio:

DELETE FROM Elementi;

Come già detto a proposito della creazione delle tabelle, nell’uso pratico del
linguaggio, le operazioni di inserimento, così come quelle di modiica e di cancel-
lazione, vengono facilitate mediante l’uso di maschere video che guidano l’utente
nelle operazioni di trattamento dei dati, all’interno di un ambiente software basato
sull’uso di interfacce graiche amichevoli.
Si pensi, nel caso di Access, all’uso delle maschere e alla possibilità di manipolare
dati agendo direttamente sulla Visualizzazione Foglio dati di una tabella.
Quindi i comandi di tipo DML (Data Manipulation Language) del linguaggio SQL
rimangono nascosti all’utente che può effettuare le operazioni di manipolazione
senza conoscere la sintassi delle istruzioni.

6 Interrogazioni con SQL: il comando Select


Un’importante caratteristica del linguaggio SQL è la sua capacità di estrarre le
informazioni desiderate dal database mediante interrogazioni. Queste funzionalità
sono fornite dal comando SELECT che è semplice da usare e allo stesso tempo
molto potente.
Con il comando Select le interrogazioni sulle tabelle del database sono eseguite
speciicando solo cosa si vuole ottenere, senza doversi preoccupare di problemi
quali le modalità di rappresentazione dei dati e i percorsi per ritrovarli nelle me-
morie di massa.

La struttura base del comando Select è descritta nel seguente schema:

SELECT Elenco di espressioni


FROM Tabelle
WHERE Condizioni;

Vicino a Select compare un elenco di campi o di espressioni che coinvolgono le


colonne da mostrare.
Il simbolo * (all) indica la visualizzazione di tutte le colonne.
Dopo FROM occorre scrivere il nome della tabella, o delle tabelle, usate nell’in-
terrogazione.

414 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


Dopo WHERE si scrive un’espressione logica che speciica quali righe considerare.
L’espressione può anche essere ottenuta componendo condizioni con gli operatori
AND, OR e NOT.

ESEMPIO 4: Interrogazioni su una sola tabella

Simbolo atomico, nome in italiano e massa atomica degli elementi aventi periodo 2.

SELECT SimboloAtomico, NomeItaliano, MassaAtomica


FROM Elementi
WHERE Periodo = 2;

Numero atomico, simbolo atomico, nome in italiano e massa atomica dell’elemento di periodo
5 e gruppo 18.

SELECT NumeroAtomico, SimboloAtomico, NomeItaliano, MassaAtomica


FROM Elementi
WHERE Periodo = 5 AND Gruppo = "18";

Tutti i dati degli elementi della serie chimica avente codice identiicativo uguale a 5 (metalli di
transizione).

SELECT *
FROM Elementi
WHERE SerieChimica = 5;

Se viene speciicato il predicato DISTINCT le righe duplicate nella tabella risultante sono ridotte a
una. Per esempio, se si desidera ottenere l’elenco di tutti i gruppi degli elementi, senza duplicati,
si deve usare il predicato Distinct prima dell’indicazione dell’attributo.
La presenza del predicato Distinct
SELECT DISTINCT Gruppo
in un comando Select impone che
FROM Elementi;
una riga sia inclusa nella tabella
risultante solo se non c’è un’altra
riga con gli stessi valori.

La tabella che si ottiene come risultato dell’interrogazione ha di norma un’intestazione delle


colonne che riporta i nomi degli attributi; se si vuole modiicare tale intestazione, occorre rino-
minare la colonna usando la clausola AS.

Elenco degli elementi con il valore della densità, precisando l’unità di misura nell’intestazione
della colonna.

SELECT NumeroAtomico, SimboloAtomico, NomeItaliano, Le parentesi quadre devono


Densità AS [Densità in g/mL] essere usate quando la
FROM Elementi; nuova intestazione di colonna
contiene spazi bianchi.

Con il comando Select si può richiedere il calcolo di espressioni basate sugli attributi della
tabella; la tabella risultante contiene le colonne con i risultati del calcolo per ogni riga. Tali
colonne possono avere un’intestazione opportuna utilizzando la parola AS. In assenza di AS
l’intestazione della colonna con l’espressione viene costruita dal sistema in modo differente a
seconda dell’implementazione. Nel caso di Access il nome è EXPR1001 per la prima espressione,
EXPR1002 per la seconda espressione e così via.

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 415


Elenco degli elementi del gruppo 12 con la temperatura di fusione in gradi Celsius e in Kelvin.

SELECT NumeroAtomico, SimboloAtomico, NomeItaliano,


PuntoFusione AS Celsius, PuntoFusione + 273.15 AS Kelvin I valori della colonna
FROM Elementi PuntoFusione non
WHERE Gruppo = "12"; vengono modificati.

Elenco degli elementi con punto di fusione inferiore a 100 °C.

SELECT NumeroAtomico, SimboloAtomico, NomeItaliano, PuntoFusione


FROM Elementi
WHERE PuntoFusione <100;

Elenco degli elementi con punto di fusione uguale o superiore a un valore preissato.

SELECT NumeroAtomico, SimboloAtomico, NomeItaliano, PuntoFusione


Interrogazione para-
FROM Elementi
metrica: la tempera-
WHERE PuntoFusione >= [quale temperatura minima?];
tura minima è scelta
dall’utente al momento
dell’esecuzione della
query.

Per controllare la presenza di valori nulli si deve usare il predicato IS NULL.

Elenco degli elementi che non hanno un valore per l’elettronegatività.


Il comando riconosce
SELECT NumeroAtomico, SimboloAtomico, NomeItaliano
le righe con valori
FROM Elementi
nulli nel campo
WHERE Elettronegatività IS NULL;
Elettronegatività.

7 Operazioni relazionali nel linguaggio SQL


Le operazioni fondamentali del modello relazionale dei database sono realizzate
in SQL con il comando Select, nelle diverse forme consentite dalla sintassi del
comando.

• La selezione, che estrae da una tabella solo le righe che soddisfano a una certa
condizione, viene realizzata nel linguaggio SQL speciicando la condizione di
selezione nella clausola Where del comando Select.

Esempio
Elenco degli elementi che hanno il punto di ebollizione, in gradi Celsius, inferiore
a zero.
Selezione sulla tabella
Elementi per SELECT *
PuntoEbollizione FROM Elementi
minore di 0: estrae le WHERE PuntoEbollizione < 0;
righe che soddisfano
la condizione.
• L’operazione di proiezione, che permette di ottenere una tabella contenente
solo alcuni attributi della tabella di partenza, si realizza scrivendo l’elenco degli
attributi richiesti dopo la parola Select.

416 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


Esempio
Elenco degli elementi con simbolo atomico, nome in italiano e nome in inglese.
Proiezione della tabella
SELECT SimboloAtomico, NomeItaliano, NomeInglese Elementi sugli attributi
FROM Elementi; richiesti: estrae alcune
colonne dalla tabella.
• La congiunzione (join) opera su più tabelle: il comando Select speciica i nomi
delle tabelle (separati da virgola) nella clausola From e la condizione di con-
giunzione (cioè la condizione che fa corrispondere le righe di una tabella con
quelle dell’altra) nella clausola Where.

Esempio
Elenco degli elementi con la descrizione della serie chimica. Congiunzione della
tabella Elementi e della
SELECT * tabella SerieChimiche
FROM Elementi, SerieChimiche secondo gli attributi
WHERE SerieChimica = ID; comuni SerieChimica e
ID : fornisce tutti i dati
delle due tabelle.
Per maggiore chiarezza, o se ci sono attributi con il medesimo nome nelle due
tabelle, si usa la dot notation (notazione con il punto), speciicando oltre al nome
dell’attributo anche quello della tabella alla quale appartengono.

SELECT *
FROM Elementi, SerieChimiche
WHERE Elementi.SerieChimica = SerieChimiche.ID;

Nella teoria dei database questo tipo di congiunzione si chiama inner join (join
interno), con la quale si ottengono le righe per le quali i campi corrispondenti
di entrambe le tabelle sono uguali. Essa si distingue dall’outer join ( join esterno)
che individua situazioni nelle quali non tutte le righe possono essere messe in
corrispondenza.

Nella versione di SQL adottata da Access il join viene normalmente indicato come
inner join. Se la query precedente viene realizzata con Access in modalità QBE e,
successivamente, si accede alla query in visualizzazione SQL, si legge il seguente
comando: INNER JOIN definisce le
tabelle in congiunzione.
SELECT Elementi.*, SerieChimiche.* La corrispondenza
FROM SerieChimiche INNER JOIN Elementi degli attributi comuni
ON SerieChimiche.ID = Elementi.SerieChimica; è scritta nella stessa
clausola From dopo la
La sintassi adottata da Access è una delle sintassi ammesse tra gli standard di parola ON.
SQL2. Questa forma, inoltre, è in genere da preferire per chiarezza di lettura, perché
mette in evidenza le tabelle da congiungere e gli attributi che si corrispondono,
senza usare la clausola Where, che serve più propriamente a rappresentare le
condizioni nelle operazioni di selezione delle righe di una tabella.

Le operazioni di selezione, proiezione e congiunzione consentono di costruire


interrogazioni complesse con poche righe di codice e utilizzando i dati contenuti
in più tabelle.

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 417


Esempio
Per ottenere l’elenco degli elementi del gruppo 12 con numero atomico, simbolo
atomico, nome, massa atomica e descrizione della serie chimica nella quale sono
classiicati, occorre dapprima operare una selezione su Elementi per Gruppo =
“12”, poi si deve effettuare una congiunzione della tabella ottenuta con la tabella
SerieChimiche e, inine, applicare una proiezione sugli attributi NumeroAtomico,
SimboloAtomico, NomeItaliano, MassaAtomica, Nome della serie chimica, sulla
nuova tabella risultante.

SELECT Elementi.NumeroAtomico, Elementi.SimboloAtomico,


Per evitare ogni
Elementi.NomeItaliano, Elementi.MassaAtomica, SerieChimiche.Nome
ambiguità è opportuno
FROM Elementi INNER JOIN SerieChimiche
precisare il nome delle
ON Elementi.SerieChimica = SerieChimiche.ID
tabelle oltre a quello
WHERE Elementi.Gruppo = "12";
degli attributi.
Per sempliicare la scrittura del comando Select è possibile fare ricorso agli alias
per il nome della tabella, speciicando dopo il nome originale della tabella la
parola AS seguita dal nuovo nome.
Si potrebbe, per esempio, indicare la tabella Elementi con E e la tabella SerieChimiche
con S, limitando il numero di caratteri da digitare, scrivendo così comandi più
compatti, più semplici da leggere, ma ugualmente signiicativi.
La precedente interrogazione, scritta usando gli alias, è riportata di seguito.

SELECT E.NumeroAtomico, E.SimboloAtomico, E.NomeItaliano,


E.MassaAtomica, S.Nome
FROM Elementi AS E INNER JOIN SerieChimiche AS S
ON E.SerieChimica = S.ID
WHERE E.Gruppo = "12";

Dagli esempi di questo paragrafo si può osservare come nel linguaggio SQL con
poche parole di codice sia possibile estrarre da una base di dati tutte le informa-
zioni che si desiderano. Le stesse operazioni, formulate attraverso le istruzioni di
CONTENUTI DIGITALI un linguaggio di programmazione tradizionale, richiederebbero un elevato numero
INTEGRATIVI di righe di codice, oltre che lunghi processi di ricerca sui ile e di confronti tra i
1. Join esterni, self- campi dei record.
join e operazioni (Le modalità operative per la gestione degli archivi di dati in linguaggio C++ sono
insiemistiche illustrate nei Contenuti digitali integrativi del Capitolo 2).

8 Funzioni di aggregazione
Nel comando Select si possono usare funzioni predeinite che agiscono sui valori
contenuti in insiemi di righe di una tabella e che, per questo motivo, si chiamano
funzioni di aggregazione.
Le funzioni di aggregazione agiscono sui valori di una colonna e restituiscono
un solo valore, per esempio il massimo o il minimo dei valori considerati. Le
righe considerate per l’aggregazione sono quelle prodotte dall’interrogazione e
quindi, in presenza di una clausola Where, sono le sole righe che soddisfano la
condizione speciicata.
Le funzioni di aggregazione possono comparire solo nelle clausole Select e Having
(che sarà spiegata nel riquadro di approfondimento alla ine del prossimo paragrafo).
La presenza di una funzione di aggregazione nella clausola Select provoca un’inte-
stazione che dipende dall’implementazione di SQL. Nel caso di Access l’intestazione
è del tipo EXPR1001, EXPR1002, ecc.

418 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


L’uso delle funzioni di aggregazione attraverso l’interfaccia graica di Access (per
le query in modalità QBE) è stato spiegato nei Contenuti digitali integrativi del
Capitolo 6.

ESEMPIO 5: Funzioni Count, Sum, Avg, Min, Max

• Funzione COUNT
La funzione COUNT conta il numero di occorrenze selezionate dall’interrogazione. La sintassi del
linguaggio SQL richiede di speciicare come argomento della funzione il nome di un attributo
oppure il carattere * (asterisco). Nel primo caso sono conteggiati i valori non nulli nella colonna
considerata; nel secondo caso, la funzione Count(*) calcola il numero di righe nella tabella.

Numero di righe della tabella Elementi.

SELECT COUNT(*)
FROM Elementi;

Numero di elementi per i quali è presente un valore per l’afinità elettronica (in alcune righe i
valori sono nulli).

SELECT COUNT(AffinitàElettronica)
FROM Elementi;

Numero degli elementi che sono gas nobili (gruppo 18).

SELECT COUNT(*)
FROM Elementi
WHERE Gruppo = "18";

Con le funzioni di aggregazione è opportuno rinominare le colonne con la clausola AS, per
evitare la presenza di intestazioni poco signiicative.

SELECT COUNT(*) AS GasNobili


FROM Elementi
WHERE Gruppo = "18";

• Funzione SUM
La funzione SUM restituisce la somma dei valori contenuti in una colonna, speciicata come
argomento della funzione: naturalmente l’attributo utilizzato nel calcolo deve essere di tipo
numerico; i valori nulli sono trascurati dalla funzione Sum.

Somma delle masse atomiche dei metalli alcalini (identiicativo della serie chimica uguale a 1).

SELECT SUM(MassaAtomica)
FROM Elementi
WHERE SerieChimica = 1;

Somma delle masse atomiche degli elementi Na e Cl (peso formula del cloruro di sodio NaCl).

SELECT SUM(MassaAtomica)
FROM Elementi
WHERE SimboloAtomico = "Na" OR SimboloAtomico = "Cl";

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 419


• Funzione AVG
La funzione AVG (dall’inglese average = media) calcola la media dei valori (numerici) contenuti in
una delle colonne della tabella. L’argomento della funzione può essere un’espressione aritmetica
anziché il nome di un attributo. La media calcolata dalla funzione Avg è la media aritmetica,
cioè la somma dei valori diviso il numero dei valori. La funzione Avg non include nel calcolo i
valori Null presenti nella colonna.

Valore medio delle masse atomiche degli elementi alogeni (serie chimica con identiicativo = 9).

SELECT AVG(MassaAtomica) AS MediaAlogeni


FROM Elementi
WHERE SerieChimica = 9;

• Funzioni MIN e MAX


Le funzioni MIN e MAX restituiscono rispettivamente il valore minimo e il valore massimo tra
quelli assunti dalla colonna speciicata come argomento della funzione; le funzioni Min e Max
consentono di determinare i valori minimi e massimi anche per campi di tipo carattere (secondo
l’ordine alfabetico delle stringhe). Anche le funzioni Min e Max ignorano i campi con valore Null
e possono avere come argomento un’espressione anziché il nome di un attributo.

Valori minimo e massimo dei punti di fusione (in °C).

SELECT MIN(PuntoFusione) AS Minimo, MAX(PuntoFusione) AS Massimo


FROM Elementi;

9 Ordinamenti e raggruppamenti
Nel comando Select si può inserire la clausola ORDER BY per ottenere i risultati
di un’interrogazione ordinati secondo i valori contenuti in una o più colonne, che
vengono speciicate di seguito alla clausola Order By. L’indicazione delle colonne
da considerare nell’ordinamento avviene precisando il nome della colonna oppure
la posizione che essa occupa nella lista che segue la parola Select: 1 per la prima
posizione, 2 per la seconda, e così via.

L’ordinamento può essere crescente (le stringhe dalla A alla Z e i numeri dal mi-
nore al maggiore) oppure decrescente (le stringhe dalla Z alla A e i numeri dal
maggiore al minore): i due tipi di ordinamento sono precisati usando le parole
chiave ASC per crescente e DESC per decrescente.
L’ordinamento è crescente per default e quindi va speciicata la parola Desc solo
se si desidera l’ordinamento decrescente.
Negli ordinamenti il valore Null compare, di norma, all’inizio delle sequenze cre-
scenti e alla ine delle sequenze decrescenti.
La clausola Order By, se presente, deve essere l’ultimo elemento di un comando
Select.

Le impostazioni di ordinamento attraverso l’interfaccia graica di Access sono state


presentate nel Capitolo 6.

420 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


ESEMPIO 6: Ordinamenti sulla tabella degli elementi

Elenco degli elementi per periodo e, a parità di periodo, per gruppo.


SELECT Periodo, Gruppo, NumeroAtomico, SimboloAtomico, NomeItaliano
FROM Elementi
ORDER BY Periodo, Gruppo;

Elenco alfabetico degli elementi, con numero atomico e simbolo atomico.


SELECT NomeItaliano, NumeroAtomico, SimboloAtomico
FROM Elementi
ORDER BY NomeItaliano;

Elenco degli elementi in ordine decrescente di punto di ebollizione.


SELECT NumeroAtomico, SimboloAtomico, PuntoEbollizione
FROM Elementi
ORDER BY PuntoEbollizione DESC;

Elenco degli elementi in ordine decrescente di massa atomica e, a parità di massa atomica, in
ordine crescente di numero atomico.
SELECT NumeroAtomico, SimboloAtomico, MassaAtomica
FROM Elementi
ORDER BY MassaAtomica DESC, NumeroAtomico;

Con le funzioni di aggregazione si condensano le informazioni di una tabella in un


solo valore, per esempio il numero degli elementi classiicati in una serie chimica.
Spesso è però utile sintetizzare i valori per classi omogenee, secondo opportuni
criteri di raggruppamento, per esempio per produrre il numero di elementi per
i diversi periodi.
La clausola GROUP BY ha questo scopo, in quanto permette di raggruppare
un insieme di righe aventi lo stesso valore nelle colonne indicate dalla clausola.
L’opzione produce una riga di risultati per ogni raggruppamento. Se nel comando
viene inserita una funzione di aggregazione, come Sum o Count, per ciascuna riga
della tabella risultante viene prodotto un valore di raggruppamento.
I valori Null sono raggruppati, ma non vengono valutati da nessuna delle funzioni
di aggregazione ad eccezione di Count(*).

ESEMPIO 7: Raggruppamenti sulle tabelle del sistema periodico

Numero degli elementi per ciascun periodo.


SELECT Periodo, COUNT(*) AS [Numero elementi]
FROM Elementi Osservazione importan-
GROUP BY Periodo; te: con i raggruppa-
menti, nella clausola
Media delle masse atomiche per ciascun gruppo della tavola periodica degli elementi. Select devono compa-
rire solo i campi
SELECT Gruppo, AVG(MassaAtomica) AS Media presenti in Group By
FROM Elementi o nelle funzioni di
GROUP BY Gruppo; aggregazione.

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 421


Numero degli elementi per ciascuna serie chimica con la descrizione della serie chimica.

Se nell’elenco si desidera che


SELECT S.Nome AS SerieChimica, COUNT(*) AS Numero
compaia, invece del codice iden-
FROM Elementi AS E INNER JOIN SerieChimiche AS S
tificativo, il nome per esteso della
ON E.SerieChimica = S.ID
serie chimica, occorre effettuare il
GROUP BY S.Nome;
raggruppamento sul campo Nome
della tabella SerieChimiche.

Condizioni sui raggruppamenti

La struttura del comando Select con raggruppamenti può essere ulteriormen-


te ampliata con la clausola HAVING, con la quale è possibile sottoporre al
controllo di una o più condizioni i gruppi creati con la clausola Group by. La
condizione scritta dopo Having in genere controlla il valore restituito dalle
funzioni di aggregazione (Count, Sum, Avg, Min, Max).
Si noti che la clausola Having deve essere usata insieme a Group By: dopo che
Group By ha formato i raggruppamenti di righe, Having serve a visualizzare i
soli raggruppamenti che soddisfano alle condizioni scritte accanto a Having.

ESEMPIO 8: Clausola Having

Media della massa atomica per i periodi della tavola periodica che hanno più di 8 elementi.
Gli elementi sono raggruppati per periodo e vengono selezionati i gruppi aventi più di 8 elementi.
Per ciascuno dei gruppi selezionati viene calcolata la media delle masse atomiche.

SELECT Periodo, AVG(MassaAtomica) AS Media


FROM Elementi
GROUP BY Periodo
HAVING COUNT(*) > 8;

Descrizione e numero degli elementi per le serie chimiche che hanno almeno 5 elementi con punto
di fusione maggiore di 1000 °C.

SELECT S.Nome AS SerieChimica, COUNT(*) AS Numero


FROM Elementi AS E INNER JOIN SerieChimiche AS S Se l’istruzione Select contiene la
ON E.SerieChimica = S.ID clausola Where, i valori vengono
WHERE E.PuntoFusione > 1000 raggruppati dopo aver operato la se-
GROUP BY S.Nome lezione sulle righe che rispettano la
HAVING COUNT(*) >= 5; condizione scritta accanto a Where.

La precedente query evidenzia la differenza tra le clausole Where e Having: Where pone condi-
zioni sulle singole righe della tabella, Having pone condizioni sui raggruppamenti formati con
Group By.

Per realizzare l’ultima interrogazione con Access in modalità QBE bisogna trovare il modo di
esprimere nella griglia posta nella parte inferiore della QBE sia le condizioni sui raggruppamenti
(clausola Having), sia le condizioni sulle righe (clausola Where).
Clic sul pulsante Totali nella scheda Home per attivare la riga Formula nella griglia QBE: si
deiniscono nei diversi campi i raggruppamenti, i conteggi, le somme, in base alle richieste del
problema, come illustrato di seguito.

422 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


2

3 4

1 Selezionare Dove nel menu a discesa della riga Formula.


Il segno di spunta nella casella Mostra è deselezionato automatica- 1
2
mente.
3 Le condizioni scritte nella riga Criteri della QBE, avente una funzione di
aggregazione, sono interpretate come condizioni sui raggruppamenti:
clausola Having.
Le condizioni scritte nella riga Criteri della QBE, avente l’opzione Dove,
4
sono interpretate come condizioni sulle righe: clausola Where.

Riassumendo, le diverse clausole che possono apparire nel comando Select sono:
SELECT Elenco espressioni da mostrare
FROM Tabelle da cui estrarre le righe
WHERE Condizioni sulle righe estratte
GROUP BY Campi da considerare per i raggruppamenti
HAVING Condizioni sui raggruppamenti
ORDER BY Ordinamenti sulle espressioni elencate nella clausola SELECT.

È opportuno fare le seguenti precisazioni:


• Per estrarre dati da una tabella le uniche clausole che devono comparire obbli-
gatoriamente sono Select e From mentre le altre sono facoltative.
• Le clausole utilizzate devono essere elencate rispettando l’ordine del precedente
elenco: Select deve precedere From, ..., Having deve precedere Order by. CONTENUTI DIGITALI
• La presenza della clausola Having richiede necessariamente la clausola Group by, INTEGRATIVI
perché devono essere controllate condizioni sui risultati dei raggruppamenti. 2. Query di comando
• Le interrogazioni che si possono costruire con le operazioni relazionali (selezione, e query di servizio
proiezione, congiunzione) si esprimono con le sole clausole Select, From e Where. in Access

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 423


10 Condizioni di ricerca
Le condizioni di ricerca sono utilizzate nelle clausole Where e Having per de-
terminare i criteri di selezione rispettivamente delle righe e dei raggruppamenti.
Nella scrittura delle condizioni si usano i segni del confronto =, <, >, <>, >=, <=.
Una condizione di ricerca è costruita anche mettendo insieme più condizioni le-
gate tra loro con gli operatori AND e OR, precedute eventualmente dall’operatore
NOT. L’ordine di applicazione degli operatori è il seguente: NOT viene applicato
prima di AND e AND prima di OR.
Le condizioni di ricerca si possono esprimere utilizzando anche altri operatori
(o predicati) che rendono più potenti ed espressive le interrogazioni alla base di
dati: BETWEEN e LIKE.

Questi predicati sono già stati presentati nei Contenuti digitali integrativi del Ca-
pitolo 6 per le query in modalità QBE.

• BETWEEN controlla se un valore è compreso in un intervallo di valori, inclusi


gli estremi. È possibile speciicare, anteponendolo a Between, anche l’operatore
logico NOT per valutare la condizione opposta, cioè per controllare se il valore
non rientra nell’intervallo speciicato.

Elenco degli elementi che hanno una massa atomica compresa tra 50 e 100.

SELECT NumeroAtomico, SimboloAtomico, MassaAtomica


FROM Elementi
WHERE MassaAtomica BETWEEN 50 AND 100
ORDER BY MassaAtomica;

• LIKE confronta il valore di un attributo di tipo carattere con un modello di


stringa che può contenere caratteri jolly (o metacaratteri). Anche in questo
caso si può usare l’operatore NOT prima di Like per indicare criteri di ricerca
opposti. Per l’uso dell’operatore LIKE nelle interrogazioni SQL di Access valgono
le convenzioni descritte nel capitolo precedente.

I caratteri jolly sono:


_ (underline o underscore) per indicare uno e un solo carattere qualsiasi in quella
posizione della stringa.
Access, come altre implementazioni di SQL, usa il carattere ? al posto di _.
% (percento) per indicare una sequenza di zero o più caratteri in quella posizione
della stringa.
Access, come altre implementazioni di SQL, usa il carattere * al posto di %;

Per esempio:
LIKE ‘xyz%’ Ricerca le stringhe che iniziano con ‘xyz’ e anche i soli caratteri
‘xyz’;
LIKE ‘%xyz’ Ricerca le stringhe che terminano con ‘xyz’ e anche i soli
caratteri ‘xyz’;
LIKE ‘%xyz%’ Ricerca le stringhe che contengono ‘xyz’ e anche i soli caratteri
‘xyz’;
LIKE ‘_xyz’ Ricerca le stringhe di 4 caratteri che iniscono con ‘xyz’;
Nome LIKE ‘xyz’ Equivale al confronto: Nome = ‘xyz’.

424 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


Elementi che hanno il nome che inizia con la lettera A , in ordine di numero atomico.

SELECT NumeroAtomico, SimboloAtomico, NomeItaliano


FROM Elementi
WHERE NomeItaliano LIKE 'A%'
ORDER BY NumeroAtomico;

Elementi che hanno il nome con la lettera e in seconda posizione, in ordine di


numero atomico.

SELECT NumeroAtomico, SimboloAtomico, NomeItaliano CONTENUTI DIGITALI


FROM Elementi INTEGRATIVI
WHERE NomeItaliano LIKE '_e%'
3. Interrogazioni
ORDER BY NumeroAtomico;
annidate

11 Esempi di interrogazioni in SQL


ESEMPIO 9: Prontuario dei farmaci

Riprendiamo il database Prontuario presentato nel Capitolo 6, che organizza le informazioni sui
farmaci, le aziende farmaceutiche e i principi attivi.
Per comodità di lettura si riporta il modello logico del database con le tre tabelle:
Principi (ATC, PrincipioAttivo)
Ditte (IDDitta, NomeDitta)
Farmaci (Codice, Denominazione, Descrizione, Prezzo, ATC, IDDitta, DataAutMin)
Le chiavi primarie sono sottolineate e le chiavi esterne sono in corsivo.

Interrogazioni
Le parentesi quadre indicano la presenza di una interrogazione parametrica con il valore da
richiedere al momento dell’esecuzione.

Denominazione, prezzo e codice della Ditta per i farmaci che sono classiicati con un principio
attivo del quale viene fornito da tastiera il codice ATC.

SELECT Denominazione, Prezzo, IDDitta


FROM Farmaci
WHERE ATC = [quale codice ATC?];

Denominazione, prezzo e codice della Ditta per i farmaci aventi il prezzo superiore a un valore
fornito come parametro.

SELECT Denominazione, Prezzo, IDDitta


FROM Farmaci
WHERE Prezzo > [quale prezzo minimo?];

Denominazione, prezzo e nome della Ditta per i farmaci che appartengono ad un principio attivo
del quale viene fornito da tastiera il codice ATC.

SELECT F.Denominazione, F.Prezzo, D.NomeDitta


FROM Farmaci AS F INNER JOIN Ditte AS D
ON D.IDDitta = F.IDDitta
WHERE F.ATC = [quale codice ATC?];

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 425


Numero dei farmaci forniti da una ditta della quale viene fornito il codice.

SELECT COUNT(*)
FROM Farmaci
WHERE IDDitta = [quale codice ditta?];

Prezzo medio dei farmaci forniti da una ditta della quale viene fornito il codice.

SELECT AVG(Prezzo) AS PrezzoMedio


FROM Farmaci
WHERE IDDitta = [quale codice ditta?];

Prezzo minimo e massimo dei farmaci.

SELECT MIN(Prezzo) AS Minimo, MAX(Prezzo) AS Massimo


FROM Farmaci;

Elenco dei farmaci in ordine di denominazione e, a parità di denominazione, in ordine decrescente


di prezzo.

SELECT Denominazione, Prezzo


FROM Farmaci
ORDER BY Denominazione, Prezzo DESC;

Numero di farmaci forniti da ciascuna ditta.

SELECT IDDitta, COUNT(*) AS NumeroFarmaci


FROM Farmaci
GROUP BY IDDitta;

Codici delle ditte e numero di farmaci solo per le ditte che forniscono almeno 50 farmaci.

SELECT IDDitta, COUNT(*) AS NumeroFarmaci


FROM Farmaci
GROUP BY IDDitta
HAVING COUNT(*) >= 50;

Nomi delle ditte e numero di farmaci solo per le ditte che forniscono meno di 30 farmaci.

SELECT D.NomeDitta, COUNT(*) AS NumeroFarmaci


FROM Farmaci AS F INNER JOIN Ditte AS D
ON D.IDDitta = F.IDDitta
GROUP BY D.NomeDitta
HAVING COUNT(*) < 30;

Nomi delle ditte e numero di farmaci solo per le ditte che forniscono almeno 10 farmaci aventi
prezzo superiore a 20 euro.

SELECT D.NomeDitta, COUNT(*) AS NumeroFarmaci


FROM Farmaci AS F INNER JOIN Ditte AS D
ON D.IDDitta = F.IDDitta
WHERE F.Prezzo > 20
GROUP BY D.NomeDitta
HAVING COUNT(*) >= 10;

426 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


ESEMPIO 10: Attività sportive studentesche

Le informazioni relative alle attività sportive studentesche devono essere organizzate in una base di
dati. Gli studenti, dei quali si conservano le informazioni anagraiche, frequentano i diversi Istituti
superiori e partecipano alle manifestazioni sportive (per semplicità si suppone che ogni studente
partecipi a una sola specialità sportiva).

Le entità che possono essere individuate nel problema sono:


• Istituto, per gli istituti di appartenenza degli studenti; gli attributi sono: codice dell’istituto
(chiave primaria), denominazione, indirizzo, telefono, tutti di tipo carattere.
• Studente, per gli studenti delle diverse scuole che partecipano alle manifestazioni, con attributi:
codice dello studente (chiave primaria), cognome, nome, data di nascita, classe; il codice dello
studente e la classe sono di tipo numerico, la data di nascita è di tipo data, mentre gli altri
attributi sono di tipo carattere.
• Manifestazione, per le attività sportive, con attributi: codice della manifestazione (chiave pri-
maria), descrizione, luogo, data di inizio per i tornei e i campionati, o di svolgimento per le
gare di una giornata. Tutti gli attributi sono di tipo carattere ad eccezione della data di inizio
che è di tipo data.

Si può ipotizzare che i dati sugli Istituti siano comunque inseriti nel database, anche se non ci
sono studenti che partecipano alle manifestazioni di un determinato anno scolastico.
Tra Istituto e Studente esiste un’associazione uno a molti, perché ci sono più studenti di un
istituto che partecipano alle gare e uno studente frequenta un solo istituto.
Tra Manifestazione e Studente esiste un’associazione uno a molti, perché ci sono più studenti
che partecipano a una manifestazione e uno studente (secondo le ipotesi iniziali) può iscriversi
a una sola manifestazione.
Le associazioni uno a molti si rappresentano introducendo le chiavi esterne nella tabella degli
studenti.

Dall’analisi precedente, ricaviamo le tabelle del modello logico del database.


Istituti (CodiceIstituto, Denominazione, Indirizzo, Telefono)
Manifestazioni (CodiceManif, Descrizione, Luogo, DataInizio)
Studenti (CodiceStud, CognStud, NomeStud, DataNascita, Classe, CodiceIstituto, CodiceManif)

Le chiavi primarie sono sottolineate, le chiavi esterne sono in corsivo.

Interrogazioni
Le parentesi quadre indicano la presenza di una interrogazione parametrica con il valore da
richiedere al momento dell’esecuzione.

Numero degli studenti che partecipano a una determinata manifestazione sportiva.


SELECT COUNT(*) AS NumeroStudenti
FROM Studenti INNER JOIN Manifestazioni
ON Studenti.CodiceManif = Manifestazioni.CodiceManif
WHERE Manifestazioni.Descrizione = [manifestazione da controllare];

Elenco alfabetico degli studenti che partecipano a una manifestazione sportiva di cui viene fornito
il codice.
SELECT CognStud, NomeStud
FROM Studenti
WHERE CodiceManif = [codice manifestazione]
ORDER BY CognStud, NomeStud;

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 427


Elenco delle scuole (denominazione) con il numero di studenti che partecipano alle attività sportive.

SELECT I.Denominazione, COUNT(*) AS Numero


FROM Studenti AS S INNER JOIN Istituti AS I
ON S.CodiceIstituto = I.CodiceIstituto
GROUP BY I.Denominazione;

Elenco alfabetico degli studenti (cognome e nome) e scuole (denominazione) di appartenenza.

SELECT S.CognStud, S.NomeStud, I.Denominazione


FROM Studenti AS S INNER JOIN Istituti AS I
ON S.CodiceIstituto = I.CodiceIstituto
ORDER BY S.CognStud, S.NomeStud;

Numero degli studenti partecipanti per ciascuna delle manifestazioni sportive.

SELECT M.Descrizione, COUNT(*) AS NumeroStudenti


FROM Studenti AS S INNER JOIN Manifestazioni AS M
ON Studenti.CodiceManif = Manifestazioni.CodiceManif
GROUP BY M.Descrizione;

Manifestazioni sportive che hanno meno di 5 studenti iscritti.

SELECT M.Descrizione, M.Luogo


FROM Studenti AS S INNER JOIN Manifestazioni AS M
ON Studenti.CodiceManif = Manifestazioni.CodiceManif
GROUP BY M.Descrizione, M.Luogo
HAVING COUNT(*) < 5;

ESEMPIO 11: Viaggi e vacanze

Un’agenzia di viaggi intende organizzare in una base di dati tutte le informazioni riguardanti la
sua attività: i viaggi o vacanze, le organizzazioni turistiche o tour operator, le nazioni o località
o città che sono destinazione dei viaggi/vacanze.
Tutte le attività proposte ai clienti sono dei pacchetti: ciascuno di essi si riferisce a un’organizzazione
turistica, e riguardano una precisa zona del mondo o nazione o città. Ci possono essere offerte di
viaggi con la stessa destinazione da parte di organizzazioni diverse.
Per esempio ci può essere una crociera nel Mediterraneo proposta dall’organizzazione turistica A,
oppure un soggiorno di una settimana a New York offerta dall’organizzazione turistica B.
Di ogni pacchetto offerto occorre conoscere modalità e prezzi; di ogni località o nazione è oppor-
tuno tenere memorizzate informazioni su condizioni climatiche, moneta, ecc.

Le entità che possono essere individuate nel problema sono:


• Nazione, per rappresentare gli stati o le località che sono destinazioni dei pacchetti di vacanze;
gli attributi sono: il codice della nazione o località, una denominazione più dettagliata e altre
informazioni utili.
• Organizzazione, per le società di turismo che offrono i viaggi e i soggiorni di vacanze, con gli
attributi: codice dell’organizzazione, nome, telefono.
• Pacchetto, per rappresentare i pacchetti di viaggio o soggiorno, con gli attributi: codice del
pacchetto, descrizione, modalità, prezzo.

428 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


Tra Nazione e Pacchetto esiste un’associazione uno a molti perché ci possono
essere più viaggi che hanno come destinazione una certa nazione.
Tra Organizzazione e Pacchetto esiste un’associazione uno a molti, perché un’or-
ganizzazione può offrire molti pacchetti, ma ogni pacchetto deve essere inteso
come offerto da una precisa organizzazione.
Le associazioni uno a molti si rappresentano introducendo le chiavi esterne nella
tabella Pacchetti per indicare l’organizzazione proponente e la nazione o località
di destinazione.

Dall’analisi precedente, ricaviamo le tabelle del modello logico del database.


Nazioni (CodiceNaz, Denominazione, Moneta, Clima)
Organizzazioni (CodiceOrg, NomeOrg, TelefonoOrg)
Pacchetti (CodicePac, Descrizione, Modalità, Prezzo, CodiceNaz, CodiceOrg)

Le chiavi primarie sono sottolineate, le chiavi esterne sono in corsivo.

Interrogazioni

Elenco dei viaggi/vacanza con prezzo inferiore a un prezzo preissato.

SELECT *
FROM Pacchetti
WHERE Prezzo < [prezzo massimo];

Elenco dei soggiorni (con modalità e prezzo) relativi ad una località preissata.

SELECT P.Descrizione, P.Modalità, P.Prezzo


FROM Nazioni AS N INNER JOIN Pacchetti AS P
ON N.CodiceNaz = P.CodiceNaz
WHERE N.Denominazione = [località prefissata];

Numero dei pacchetti offerti da un’organizzazione turistica preissata.

SELECT COUNT(*) AS Numero


FROM Pacchetti INNER JOIN Organizzazioni
ON Pacchetti.CodiceOrg = Organizzazioni.CodiceOrg
WHERE Organizzazioni.NomeOrg = [organizzazione da controllare];

Elenco di tutte le nazioni o località con il numero di pacchetti che si riferiscono ad


esse.

SELECT N.Denominazione, COUNT(*) AS Numero


FROM Nazioni AS N INNER JOIN Pacchetti AS P
ON N.CodiceNaz = P.CodiceNaz
GROUP BY N.Denominazione;

Organizzazioni turistiche per le quali sono registrati nel database più di 20 pacchetti.

SELECT O.NomeOrg CONTENUTI DIGITALI


FROM Pacchetti AS P INNER JOIN Organizzazioni AS O
INTEGRATIVI
ON P.CodiceOrg = O.CodiceOrg
GROUP BY O.NomeOrg 4. Esempi con
HAVING COUNT(*) > 20; query annidate
e condizioni sui
raggruppamenti

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 429


12 Comandi per la sicurezza
I comandi di tipo DCL (Data Control Language) hanno lo scopo di garantire la
sicurezza agli oggetti del database. L’amministratore della base di dati può con-
cedere, con il comando GRANT (o revocare, con il comando REVOKE), il diritto
di eseguire certe azioni su determinati oggetti del database a speciici utenti.

Il comando GRANT concede i permessi, speciicando il tipo di accesso, le tabelle


sulle quali è consentito l’accesso e l’elenco degli utenti ai quali è permesso di ac-
cedere. Il tipo di accesso può riguardare, per esempio, il diritto di modiica della
struttura della tabella con l’aggiunta di nuove colonne, oppure di modiica dei
dati contenuti nella tabella, oppure l’uso del comando Select.

Per concedere il diritto di modiica sulla tabella Elementi agli utenti denominati
con User1 e User2, si deve usare il comando Grant nella forma:

GRANT UPDATE
ON Elementi
TO User1, User2;

La revoca dei permessi con annullamento dei diritti di accesso viene effettuato
con il comando REVOKE che ha una sintassi analoga a quella del comando Grant:

REVOKE UPDATE
ON Elementi
FROM User1, User2;

I permessi che possono essere concessi (o revocati) agli utenti sono indicati con
le seguenti parole chiave che vanno speciicate dopo Grant o Revoke:
ALTER per aggiungere o eliminare colonne, oppure per modiicare i tipi di dati
DELETE per eliminare righe dalle tabelle
INDEX per creare indici
INSERT per inserire nuove righe nelle tabelle
SELECT per ritrovare i dati dalle tabelle
UPDATE per cambiare i valori contenuti nelle tabelle
ALL per tutti i permessi precedenti.

I permessi con le opzioni Select e Update, nei comandi Grant e Revoke, diventano
più restrittivi speciicando, tra parentesi tonde e separati con la virgola, i nomi
delle colonne che l’utente può vedere o modiicare.
Con riferimento alla tabella degli elementi nel database del sistema periodico,
visto nei paragrai precedenti, per concedere il diritto di modiica della tempera-
tura di fusione e della densità all’utente denominato con User3, si deve usare il
comando Grant nella forma:

GRANT UPDATE (PuntoFusione, Densità)


ON Elementi
TO User3;

430 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


QUESITI DI AUTOVERIFICA
Test interattivo
Soluzioni ai quesii a pag. 448

Linguaggio SQL 6. Quale delle segueni frasi SQL coniene una selezione?
1. Completa le frasi segueni uilizzando una tra le a. Select * From Tabella1
parole elencate alla ine della domanda. b. Select * From Tabella1, Tabella2 Where K1 = K2
c. Select A1 = A2 From Tabella1
a. Per eliminare una tabella dal database si usa il d. Select * From Tabella1 Where A1 = ‘xyz’
comando .........
b. Per modiicare i valori nelle righe di una tabella 7. Quale delle segueni frasi SQL rappresenta meglio
si usa il comando ......... una congiunzione (join)?
a. Select * From Tabella1, Tabella2 Where K1 = K2
c. Per inserire nuove tabelle nel database si usa il
b. Select A1, A2 From Tabella1
comando .........
c. Select A1, A2, K1 From Tabella1, Tabella2
d. Per aggiungere una colonna a una tabella si usa Where K1 = K2 And A1 = ‘xyz’
il comando ......... d. Select * From Tabella2 Where A1 = ‘xyz’
Insert, Select, Create Table, Update, Alter Table,
Delete, Drop Table Calcoli, ordinamenti, raggruppamenti
e comandi per la sicurezza
2. Determina il ipo di linguaggio per ciascuno dei
comandi SQL elencai nella colonna di sinistra. 8. Quali delle segueni frasi SQL sono sintaicamente
correte (V) e quali sono errate (F)?
comando ipo di linguaggio: DDL, DML,
a. Select SUM (Num1 * Num2) AS ‘Totale’
QL (Query Language)
From Tabella; VF
a. INSERT .............. b. Select Tabella Where AVG(Importo) > 100; V F
b. CREATE TABLE .............. c. Select Count (Num1) AS Conteggio
c. UPDATE .............. From Tabella Where Nome = ‘ABCD’; VF
d. ALTER TABLE .............. d. Select Nome, Num1 From Tabella
Group By Nome; VF
e. DELETE ..............
9. Quali delle segueni frasi SQL elenca il totale delle
3. Quale delle segueni frasi SQL estrae i valori di A1 fature suddivise per cliente?
nelle righe di Tabella con A2 = 5? a. Select Cliente, SUM(Importo)
a. Select A1, A2=5 From Tabella From TabellaFature Group By Importo;
b. Select A2=5 From Tabella.A1 b. Select Cliente, SUM (Importo)
c. Select A1 From Tabella Where A2 = 5 From TabellaFature Order By Cliente;
d. Select Tabella.A1 From Tabella.A2 = 5 c. Select ORDER (Cliente, Importo )
From TabellaFature;
4. Quale delle segueni frasi SQL estrae le righe di d. Select Cliente, SUM (Importo)
Tabella prive di valori in A2? From TabellaFature Group By Cliente;
a. Select ALL From Tabella Where A1 = ’ ’ 10. Quale delle segueni frasi SQL consente di otenere
b. Select * From Tabella Where A2 Is Null il nome delle cità da cui provengono più di 10
c. Select Tabella.* From Tabella Where A1 = ’ ’ studeni?
d. Select A1 From Tabella With A2 Null a. Select Studeni From Cità Group By Cità
Having COUNT(*) > 10;
5. Quale delle segueni frasi SQL rappresenta meglio b. Select Studeni From Cità Group By Cità
una proiezione? Where COUNT(*) > 10;
a. Select A1, A2 From Tabella1 Where K1 > 10 c. Select Cità From Studeni Group By Cità
b. Select * From Tabella1, Tabella2 Where K1 = K2 Having COUNT(*) > 10;
c. Select A1, A2 From Tabella1 d. Select Cità From Studeni Group By Cità
d. Select * From Tabella1 Where A1 = ‘xyz’ Where COUNT(*) > 10;

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 431


11. Quale delle segueni frasi SQL consente di otenere 13. Quali delle segueni afermazioni sono vere (V) e
il numero degli studeni che provengono da una quali false (F)?
cità preissata? a. Il comando Grant All imposta i permessi per tui
a. Select COUNT(*) From Studeni gli uteni di un database VF
Group By [Cità preissata];
b. L’annullamento dei permessi agli uteni per l’ac-
b. Select COUNT(*) From Studeni
cesso alle tabelle viene efetuato con il comando
Where Cità = [Cità preissata];
c. Select COUNT(*) From Studeni
Revoke VF
Group By Cità Where Cità = [Cità preissata]; c. Nel comando Grant si possono speciicare i sin-
d. Select COUNT(*) From Studeni goli campi su cui concedere i permessi V F
Having Cità = [Cità preissata]; d. Il comando Grant Update concede permessi di
variazione sui dai VF
12. Associa a ciascun predicato o clausola della colonna
di sinistra la funzione da esso svolta nelle condizioni 14. Quale dei segueni comandi assegna all’utente
di ricerca scegliendo tra quelle elencate a destra. User1 il permesso per inserire nuove righe in
a. BETWEEN 1. Pone una condizione sulle Tabella?
b. WHERE righe di una tabella a. Grant Insert On Tabella To User1;
c. LIKE 2. Pone una condizione sul risul- b. Grant Update On Tabella To User1;
d. HAVING tato dei raggruppameni c. Grant User1 Insert To Tabella;
3. Controlla se un valore è com- d. Grant Update On User1 To Tabella;
preso in un intervallo di valori
4. Confronta il valore di un atri-
buto con un modello di stringa

PER LO SVILUPPO DELLE COMPETENZE


Esercizi e problemi
Gli esercizi proposi consistono nel progetare il database e deinire le tabelle del modello logico, con atribui,
chiavi primarie e chiavi esterne. Inoltre devono essere codiicate le interrogazioni atraverso il linguaggio SQL.
Per ciascun problema le interrogazioni sono di diicoltà crescente e richiedono l’uilizzo di operatori, funzioni e
predicai del linguaggio SQL: quindi possono essere svolte anche in tempi successivi per lo stesso esercizio con il
procedere dello studio del linguaggio SQL.

Database 1 Creazione delle tabelle


Costruire il modello dei dai per organizzare le infor- 1. Scrivere le istruzioni SQL per la creazione della
mazioni sui reddii dei dipendeni e le aziende dove tabella delle aziende.
lavorano. L’azienda efetua versameni d’imposta, per
2. Scrivere le istruzioni SQL per la creazione della
conto dei dipendeni, in date diverse durante l’anno.
tabella dei dipendeni, rendendo obbligatoria l’im-
Le enità del modello sono quindi Dipendente, Azienda
missione del nome e del cognome e dichiarando il
e Versamento.
campo della tabella che è messo in corrispondenza
Tra gli atribui dei dipendeni, oltre ai dai anagraici
con la chiave della tabella delle aziende.
sono contenui anche la professione, il reddito annuo
lordo, il numero dei familiari a carico, il totale delle
Interrogazioni
tratenute efetuate. Negli atribui dell’azienda, oltre
alla denominazione, occorre inserire anche l’indirizzo e 3. Elenco dei dipendeni con matricola, cognome,
il setore di aività. Gli atribui dei versameni sono: nome, professione e reddito lordo.
numero progressivo di registrazione, data, importo. 4. Denominazione e indirizzo dell’azienda avente un
Deinire il modello logico con le tabelle. codice preissato.

432 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


5. Cognome e nome dei dipendeni che hanno un 23. Numero dei dipendeni e reddito medio per i di-
reddito superiore a una cifra preissata. pendeni con una professione preissata raggruppai
per azienda.
6. Denominazione e indirizzo delle aziende che hanno
la sede in un Comune preissato. 24. Valore medio dei versameni di imposta raggruppai
per azienda.
7. Cognome, nome, professione, reddito, per i dipen-
deni che svolgono una determinata professione e
25. Cognome e professione dei dipendeni che hanno
hanno il reddito inferiore a un valore preissato.
il cognome con iniziale dalla letera A alla letera M.
8. Cognome e nome dei dipendeni di una determinata
azienda che svolgono una professione preissata. 26. Cognome, nome e professione dei dipendeni che
hanno il reddito compreso tra due cifre preissate.
9. Lista delle difereni professioni preseni in un’azien-
da di cui si conosce il codice. 27. Lista delle aziende, con denominazione e valore
medio dei versameni di imposta, per le quali il
10. Lista delle professioni, con eliminazione dei dupli- valore medio è superiore a un valore preissato.
cai, per le quali i reddii sono superiori a un valore
preissato. 28. Lista delle aziende, con denominazione e nume-
ro dei dipendeni che svolgono una professione
11. Elenco dei versameni, con data e importo, efetuai
preissata, per le quali il numero dei dipendeni è
per i dipendeni di una determinata azienda.
superiore a 10.
Funzioni di aggregazione, ordinameni, raggruppameni
29. Elenco delle professioni dei dipendeni per i quali
12. Numero dei dipendeni che lavorano in un’azienda il valore medio dei reddii è superiore a un valore
di cui si conosce la denominazione. preissato.

13. Valore minimo e massimo tra i reddii di tui i


Database 2
dipendeni.
Si vogliono gesire con una base di dai le informazioni
14. Valore medio dei reddii dei dipendeni con pro- necessarie a organizzare i corsi di recupero in una scuola.
fessione preissata. Gli elemeni caraterizzani il problema sono: gli stu-
deni, le materie, dove gli studeni possono avere delle
15. Somma dei versameni di imposta relaivi ai dipen- carenze, e i doceni che devono fare i corsi di recupero.
deni di un’azienda di cui si conosce il codice. Gli studeni possono avere più materie careni e in ogni
16. Elenco alfabeico con i dai anagraici di tui i materia ci possono essere più studeni bisognosi di
dipendeni. recupero. Il legame tra studente e materia è realizzato
tramite il voto che lo studente ha in quella materia e
17. Elenco alfabeico di tute le aziende. la data in cui questo voto è stato assegnato.
Ogni docente insegna una sola materia, ma la stessa
18. Elenco alfabeico dei dipendeni di un’azienda, con materia può essere insegnata da più doceni.
cognome, nome e reddito. Deinire il modello logico con le tabelle.
19. Elenco alfabeico dei dipendeni di un’azienda con
cognome, nome e numero dei familiari a carico. Creazione delle tabelle

20. Elenco alfabeico con cognome, nome dei dipen- 30. Scrivere le istruzioni SQL per la creazione delle
deni e indirizzo dell’azienda dove lavorano. tabelle degli studeni, delle materie e dei doceni.

21. Elenco dei dipendeni di un’azienda (di cui viene 31. Scrivere le istruzioni SQL per la creazione della ta-
fornito il codice) con cognome, nome, reddito lordo, bella dei voi, che rappresenta il legame tra studeni
somma dei versameni di imposta. e materie, rendendo obbligatoria l’immissione del
voto e dichiarando i campi della tabella che sono
22. Per ciascuna azienda: denominazione, numero dei in corrispondenza con le tabelle degli studeni e
dipendeni, totale dei reddii. delle materie.

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 433


Interrogazioni 46. Elenco degli studeni di un docente, di cui si conosce
32. Elenco, con cognome e nome, degli studeni delle il cognome, ordinato per classe e per cognome e
classi terze. nome dello studente.
47. Elenco alfabeico di tui gli studeni con cognome,
33. Elenco dei voi otenui da uno studente di cui si
nome e numero delle prove suicieni in una de-
conosce il codice.
terminata materia.
34. Elenco dei doceni di uno studente di cui si conosce 48. Elenco dei cognomi e nomi degli studeni di una
il codice. certa classe con il numero delle prove che hanno
35. Elenco dei doceni con descrizione della materia il voto inferiore a 5 di ciascun studente.
insegnata. 49. Elenco delle descrizioni delle materie con il numero
di doceni per ogni materia.
36. Elenco delle prove sostenute dagli studeni in una
materia, della quale viene fornito il codice, con 50. Per ciascuna materia la descrizione e il numero
cognome, nome e voto. delle prove svolte nel periodo tra 1 otobre e 15
novembre.
37. Cognome, nome e classe degli studeni che hanno
otenuto voi inferiori a 5 in una certa materia di 51. Numero delle prove che un determinato studente,
cui viene fornita la descrizione, facendo comparire di cui si conosce il cognome e nome, ha sostenuto
ciascun studente una sola volta nell’elenco. in ciascuna materia con la descrizione della materia.

38. Elenco degli studeni di un docente, di cui si conosce 52. Cognome, nome e classe degli studeni per i quali
il codice. il cognome inizia con la letera R.

39. Elenco delle materie insegnate nella scuola, con 53. Cognome e nome degli studeni di una data classe
descrizione della materia e dei dai dei doceni che che hanno voi compresi tra i valori di 7,5 e 10 in
la insegnano. una materia fornita come parametro.
54. Elenco alfabeico dei doceni con la media dei voi
Funzioni di aggregazione, ordinameni, raggruppameni assegnai per i quali la media è superiore a 5.
40. Media dei voi di Inglese di uno studente di cui si
55. Elenco con cognome e nome degli studeni di
conosce il nome.
una determinata classe che hanno il voto minimo
41. Numero degli studeni di una classe. inferiore a 4.
56. Elenco con cognome e nome degli studeni di una
42. Numero degli studeni della scuola.
determinata classe che hanno il voto massimo
43. Miglior voto di Matemaica nella classe terza. superiore a 7.

44. Miglior voto e peggior voto di uno studente di cui 57. Elenco dei doceni, con la materia di insegnamento,
si conosce il codice. che hanno svolto più di 2 prove.

45. Elenco dei voi otenui da uno studente di cui si 58. Descrizione delle materie nelle quali sono state
conosce il codice. L’elenco, con descrizione della efetuate più di 10 prove.
materia, data e voto, deve essere ordinato per 59. Cognome e nome degli studeni che hanno più di
materia e data. 10 prove.

434 © Istituto Italiano Edizioni Atlas Cap. 7 - LINGUAGGIO SQL


PROBLEMI DI RIEPILOGO
60. Date le tabelle: Conservando nell’archivio tui i contrai degli anni
Anagraiche (Codice, Cognome, Nome, DataNascita, precedeni, si possono anche avere informazioni
Indirizzo, Cità, Provincia) sulla carriera di un giocatore.
Immobili (CodImm, Collocazione, Tipo, Dimensione, Le interrogazioni da codiicare in SQL sono:
CodAnag) • Per ogni squadra, visualizzare il codice della
Versameni (ID, DataVers, Importo, CodImmobile) squadra e il numero dei giocatori con contrato
(le chiavi primarie sono sottolineate, le chiavi in corso.
esterne sono in corsivo) che rappresentano gli • Denominazione delle squadre che hanno più di
impori versai dai proprietari di immobili per il 30 giocatori con contrato in corso.
pagamento delle imposte, produrre in linguaggio • Dato il codice di un giocatore, fornire l’elenco
SQL le segueni interrogazioni. delle squadre (denominazione, data inizio, data
• Importo totale dei versameni per un immobile scadenza) con le quali ha avuto o ha contrai,
preissato. cioè la carriera del giocatore.
• Numero degli immobili raggruppai per Tipo. • Cognome, nome e ruolo dei giocatori atualmente
• Cognome e Nome delle persone che posseggono svincolai.
più di un immobile. • Elenco dei giocatori (cognome, nome e squadra
dove giocano) atualmente in comproprietà.
• Codice degli immobili per i quali sono stai fai
• Cognome, nome dei giocatori, con denominazione
versameni con importo superiore a una cifra
della squadra, che atualmente hanno in corso con-
preissata.
trai con ingaggio superiore a una cifra preissata.
• Elenco con Cognome, Nome del proprietario e
Collocazione dell’immobile per un Tipo preissato. 62. Si vuole gesire in modo automaizzato il servizio di
• Numero delle persone raggruppate per Provin- fotocopiatura presso il Centro Stampa di una scuo-
cia tra quelle che posseggono un immobile con la: ogni aività svolta (giorno, numero fotocopie,
Dimensione superiore a un valore preissato. prezzo pagato) può essere richiesta da un utente
• Codici degli immobili, riferii ai versameni efet- che può essere uno studente, un docente oppure
tuai tra due date preissate. una classe; si può quindi usare un’unica anagraica
• Media giornaliera degli impori dei versameni per gli uteni disinguendo tra studeni, doceni e
per ciascuna data dei versameni. classi atraverso un campo di un caratere (con valori
S, D, C). Le informazioni sugli uteni sono minime
61. Le informazioni relaive ai contrai dei giocatori (codice, descrizione, ipo, oltre a un riferimento:
con le società di calcio devono essere organizzate in classe per gli studeni, sigla della materia per i
una base di dai. Le squadre possono naturalmente doceni, aula per le classi).
sipulare contrai con moli giocatori; di solito un Le aività di fotocopiatura vengono svolte da ope-
giocatore ha un contrato con una sola società; ratori diversi e con macchine di stampa diverse.
accade però anche il caso della comproprietà di Si devono poi realizzare le segueni interrogazioni:
un giocatore con squadre diverse a opera di più • Elenco delle aività svolte per i doceni di mate-
contrai con i quali deve essere indicata anche la maica (con giorno, numero fotocopie e prezzo).
percentuale di possesso per ciascuna società; in • Nome degli operatori che hanno svolto aività di
ogni caso il giocatore ha una sola squadra di cui fotocopie usando la macchina con codice ABC.
indossa la maglia e in cui efeivamente gioca. • Elenco delle classi che hanno richiesto fotocopie
Se per ciascun contratto venissero indicate la in numero superiore a 100.
data di inizio e la data di scadenza, si potrebbe • Elenco dei doceni con la descrizione e la materia.
anche sapere quali giocatori sono già occupai in • Descrizione degli studeni che hanno fato foto-
una squadra, quali sono svincolai e quali sono in copie, in numero superiore a un valore preissato,
comproprietà: nel primo caso un solo contrato ha con l’operatore avente codice XYZ.
la data di scadenza superiore alla data odierna, nel • Classi (con aula e numero fotocopie) che hanno
secondo nessuno, nel terzo più di uno. richiesto il servizio nella giornata odierna.

Cap. 7 - LINGUAGGIO SQL © Istituto Italiano Edizioni Atlas 435

Potrebbero piacerti anche