📁
Forum per Webmaster
SQL

Operazioni relazionali nel 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 nel paragrafo precedente.
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 pseudo codifica:

Proiezione di Personale
 su Cognome, Nome, CodFisc

Questa operazione viene codificata in linguaggio SQL con il comando:

SELECT Cognome, Nome, CodFisc
 FROM Personale;

Il comando Select può 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 si supponga di aver creato accanto alla tabella Personale anche la tabella Dipendenza con il comando CREATE TABLE Dipendenza (CodFil smallint, Descrizione char(20) Indirizzo char(25) );

contenente per ogni dipendenza il codice, usato nei dati dei dipendenti, la descrizione e l'indirizzo della filiale. Lattributo CodFil è la chiave primaria della tabella.
Tra la relazione Dipendenza e la relazione Personale viene stabilita un’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 Dipendenza secondo gli attributi comuni Filiale e CodFil. In pseudocodifica:

Congiunzione di Personale su Filiale
 e di Dipendenza su CodFil

In linguaggio SQL:

SELECT *
 FROM Personale, Dipendenza
 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, Dipendenza
 WHERE Personale.Filiale=Dipendenza.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 Tab1.Cognome, Tab1.Nome, Tab2.Cognome
 FROM Personale AS Tab1, Personale AS Tab2
 WHERE Tab1.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 Dipendenza su CodFil ed infine sulla nuova tabella ottenuta si applica una proiezione sugli attributi Cognome, Nome, Descrizione, Indirizzo.
In pseudo codifica l'interrogazione si rappresenta in questo modo:

Proiezione di
 (Congiunzione di
 (Selezione di Personale per Funzione 'Impiegato')
 su Filiale e di Dipendenza 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
 FRON Personale, Dipendenza
 WHERR 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,
 Dipendenza.Descrizione, Dipendenza.Indirizzo
 FRON Personale, Dipendenza
 WHERE Personale.Filiale=Dipendenza.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 ;

Argomenti nella stessa categoria