Operazioni relazionali in linguaggio SQL
Le operazioni di selezione, proiezione e congiunzione su una base di dati relazionale vengono realizzate in pratica attraverso il comando SELECT, secondo le diverse forme consentite dalla sintassi di questo comando.
Se si vuole rispettare una delle regole del modello relazionale che non
consente la presenza di righe uguali all'interno della stessa tabella, basta
porre accanto alla parola SELECT la clausola DISTINCT:
con questa specificazione la tabella ottenuta non contiene righe duplicate.
La selezione e la proiezione sono state già state utilizzate in pratica
negli esempi di uso del comando SELECT viste in precedenza.
L’operazione di selezione, che consente di ricavare da una relazione un’altra relazione contenente solo le righe che soddisfano ad una certa condizione, viene realizzata nel linguaggio SQL utilizzando la clausola WHERE del comando SELECT.
Per esempio per ottenere l'elenco con tutti i dati dei dipendenti che svolgono la funzione di Dirigente, si opera una selezione sulla tabella Personale estraendo le righe per le quali l'attributo Funzione contiene il valore 'Dirigente'.
In pseudocodifica si scrive:
Selezione di Personale
per Funzione = 'Dirigente'
la precedente interrogazione viene codificata in linguaggio SQL con il comando:
SELECT *
FROM Personale
WHERE Funzione = 'Dirigente';
L'operazione di proiezione, che permette di ottenere una relazione contenente solo alcuni attributi della relazione di partenza, si realizza indicando accanto alla parola SELECT l'elenco degli attributi richiesti.
Per esempio per ottenere l'elenco di tutti i dipendenti con cognome, nome e codice fiscale, si deve effettuare una proiezione sulla tabella Personale estraendo soltanto le colonne corrispondenti agli attributi richiesti.
In pseudocodifica:
Proiezione di Personale
su id, Cognome, Nome
Questa operazione viene codificata in linguaggio SQL con il comando:
SELECT id, Cognome, Nome
FROM Personale;
Il comando Select puo operare su più tabelle, indicandone i nomi (separati da virgola) dopo la parola FROM; scrivendo poi dopo la parola WHERE i nomi degli attributi che si corrispondono nelle due tabelle (legati tra loro dal segno =), si realizza in pratica l'operazione di congiunzione di due tabelle secondo un attributo comune.
Qualora ci sia l'esigenza di maggiore chiarezza nella descrizione del comando oppure ci siano due attributi con lo stesso nome in due tabelle diverse, è opportuno, come già visto, indicare il nome della tabella e il nome dell'attributo separati dal punto.
Per esempio supponiamo di aver creato accanto alla tabella Personale anche la tabella Sede con il comando:
CREATE TABLE Sede
(CodFil smallint,
Descrizione char(20),
Indirizzo char(25));
Si tratta di una entità che nei diagrammi ER viene rappresentata nel modo seguente:

contenente per ogni Sede il codice, usato nei dati dei dipendenti, la descrizione e l'indirizzo della filiale. L'attributo CodFil è la chiave primaria della tabella.
L'aspetto della tabella potrebbe essere il seguente:
| CodFil | Descrizione | Indirizzo |
| 1 | centro direzionale | viale Mazzini 4 |
| 2 | punto vendita | piazza Dante 14 |
| 3 | produzione | via Gradoli 34 |
| 4 | magazzino | via Roma 8 |
Tra la relazione Sede e la relazione Personale viene stabilita una associazione uno a molti e l'attributo Filiale nella tabella Personale diventa chiave esterna.

Per ottenere l'elenco di tutti i dipendenti con la descrizione e l'indirizzo della filiale dove lavorano, occorre effettuare la congiunzione delle tabelle Personale e Sede secondo gli attributi comuni Filiale e CodFil.
In pseudocodifica:
Congiunzione di Personale su Filiale
e di Sede su CodFil
In linguaggio SQL:
SELECT *
FROM Personale, Sede
WHERE Filiale = CodFil;
per maggiore chiarezza si può anche scrivere nel modo seguente, esplicitando il nome delle tabelle insieme ai nomi degli attributi comuni:
SELECT *
FROM Personale, Sede
WHERE Personale.Filiale = Sede.CodFil;
Poiché nella condizione scritta accanto a WHERE viene usato il segno uguale, la congiunzione precedente fornisce un esempio di equi-join, cioè vengono combinate solo le righe per le quali si possono trovare valori uguali negli attributi che si corrispondono. Nella versione del linguaggio SQL per Access in ambiente Windows l'equi-join viene indicato con inner join; inoltre si possono realizzare anche join esterni (outer join) con left join e right join.
Nell'esempio seguente viene mostrato come si possa realizzare un self-join
su una tabella. Supponiamo di aggiungere agli attributi della tabella Personale
un nuovo attributo denominato Dirigente adatto a contenere, per ogni dipendente,
il codice della persona che svolge il ruolo di dirigente rispetto a quel
dipendente.
Le informazioni sui dirigenti sono contenute nella stessa tabella dei dipendenti,
poiché sono anch'essi dipendenti dell'azienda: pertanto se si vogliono conoscere
le informazioni dei dipendenti con il dirigente a cui fanno capo, occorre
fare una congiunzione della tabella Personale con se stessa, cioè un self-join.
Per risolvere questo problema si devono usare gli alias per il nome della tabella, cioè indicare con due nomi diversi la stessa tabella, utilizzando la parola AS nella clausola From del comando Select, come mostrato nell'esempio. Con questa interrogazione si ottiene per ciascun dipendente il cognome e nome insieme al cognome del dirigente.
SELECT Tabl.Cognome, Tabl.Nome, Tab2.Cognome
FROM Personale AS Tabl, Personale AS Tab2
WHERE Tabl.Dirigente = Tab2.Matricola;
Dopo aver visto come si rappresentano nel linguaggio SQL le operazioni fondamentali del modello relazionale, si può facilmente comprendere a questo punto come sia realizzabile la combinazione di diverse operazioni (proiezione e selezione, congiunzione e selezione, congiunzione e proiezione, congiunzione, selezione e proiezione) usando la struttura SELECT...FROM...WHERE... secondo tutte le sue possibili varianti.
Per esempio se si vuole ottenere l'elenco dei dipendenti che hanno la funzione di Impiegato, con cognome, nome, descrizione e indirizzo della Filiale dove lavorano, occorre dapprima operare una selezione su Personale per Funzione uguale al valore 'Impiegato'; poi si deve effettuare una congiunzione della tabella ottenuta su Filiale e di Sede su CodFil ed infine sulla nuova tabella ottenuta si applica una proiezione sugli attributi Cognome, Nome, Descrizione, Indirizzo.
In pseudocodifica l'interrogazione si rappresenta in questo modo:
Proiezione di
(Congiunzione di (Selezione di Personale per Funzione = 'Impiegato' )
su Filiale e di Sede su CodFil)
su Cognome, Nome, Descrizione, Indirizzo
Il comando viene codificato nel linguaggio SQL con il seguente formato per Select:
SELECT Cognome, Nome, Descrizione, Indirizzo
FROM Personale, Sede
WHERE Filiale = CodFil AND Funzione = 'Impiegato';
La prima condizione scritta dopo WHERE (Filiale
= CodFil) serve a specificare l'uguaglianza tra gli attributi comuni
delle tabelle coinvolte nella congiunzione, la seconda condizione (Funzione
= 'Impiegato') specifica il criterio per operare la selezione sulle
righe della tabella risultante dalla congiunzione.
Le due condizioni sono combinate tramite l'operatore AND.
La codifica in SQL diventa più precisa facendo precedere il nome delle tabelle ai nomi degli attributi, come mostrato nella versione seguente del comando:
SELECT Personale.Cognome, Personale.Nome, Sede.Descrizione, Sede.Indirizzo
FROM Personale, Sede
WHERE Personale.Filiale = Sede.CodFil AND Personale.Funzione = 'Impiegato';
È opportuno far notare come nel linguaggio SQL con
poche parole di codice sia possibile estrarre da una base di dati tutte
le informazioni che si desiderano.
Le stesse operazioni,formulate attraverso le istruzioni di un linguaggio
di programmazione tradizionale, richiederebbero un elevato numero di righe
di codice oltre che lunghi processi di ricerca sui file e di confronti tra
i campi dei record.
Si provi ad immaginare la complessità nella stesura della parte di programma
e nella sua esecuzione, per realizzare le stesse funzioni della congiunzione
di due tabelle vista ora.
Abbiamo detto che le operazioni di selezione, proiezione, congiunzione
e le combinazioni tra esse servono ad ottenere una nuova relazione dalla
relazione di partenza.
Se si vuole conservare la tabella risultante dall'operazione, occorre aggiungere
al comando SELECT la clausola INTO
seguita dal nome da assegnare alla nuova tabella.
Per esempio se si desidera creare una nuova tabella di nome Manager
contenente le informazioni per i soli dipendenti che hanno la funzione di
Dirigente, occorre usare un comando come il seguente:
SELECT * INTO Manager
FROM Personale
WHERE Funzione = 'Dirigente';
Le colonne della nuova tabella presentano gli stessi nomi, formati e dimensioni degli attributi della tabella di origine.
Se invece si vogliono aggiungere le righe della tabella risultante alle righe di una tabella già esistente, si deve usare il comando INSERT INTO seguito dal nome della tabella e dalla frase SELECT che determina le righe da aggiungere nella tabella.
Se si vogliono aggiungere alla tabella Personale le righe provenienti da un'altra tabella contenente i dati dei nuovi assunti, il comando assume il formato:
INSERT INTO Personale
SELECT *
FROM NuoviAssunti ;
Pagine correlate:
edutecnica