• Non ci sono risultati.

7 Le operazioni relazionali nel linguaggio SQL

Nel documento ESERCITAZIONI SVOLTE ACCESS (pagine 81-84)

Le operazioni fondamentali dell’algebra relazionale sono realizzate in SQL con il comando Select, secondo le diverse forme consentite dalla sintassi del 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 conterrà righe duplicate.

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

Esempio

σP Impiegati Selezione di Impiegati per Stipendio < 31000

SELECT * FROM Impiegati

WHERE Stipendio < 31000;

• L’operazione di proiezione, che permette di ottenere una relazione contenente solo alcuni attributi della relazione di partenza, si realizza scrivendo l’elenco degli attributi richiesti dopo la parole Select.

L’elenco con tutti i dati dei dipendenti con stipendio minore di 31000 euro, si ottiene con una selezione sulla tabella Impiegati estraendo le righe per le quali: Stipendio < 31000.

Esempio

ΠL Impiegati Proiezione di Impiegati su Cognome, Nome, ID

SELECT Cognome, Nome, ID FROM Impiegati;

• La congiunzione di tabelle. Il comando Select può operare su più tabelle, specificandone i nomi, (separati da virgola) nella clausola From e scrivendo la condizione di congiunzione (cioè la condizione che fa corrispondere le righe di una tabella con quelle dell’altra) nella clausola

Where. Nella quasi totalità dei casi si vogliono costruire degli equi-join, per cui la condizione

da scrivere nella clausola Where consiste nell’uguaglianza tra attributi di due tabelle.

Esempio

ImpiegatiFK DipartimentiPK Congiunzione di Impiegati su Dipartimento

e Dipartimenti su Codice

SELECT *

FROM Impiegati, Dipartimenti WHERE Dipartimento = Codice;

SELECT *

FROM Impiegati, Dipartimenti

WHERE Impiegati.Dipartimento = Dipartimenti.Codice;

Nella versione di SQL adottata da Access il join viene indicato, in accordo con la terminologia introdotta nel Capitolo 3, come inner join. Se la precedente interrogazione viene realizzata con Access in modalità QBE e, successivamente, si accede alla query in visualizzazione SQL, si legge (una volta ripulito dalle parentesi inutili) il seguente comando:

SELECT Impiegati.*, Dipartimenti.*

FROM Dipartimenti INNER JOIN Impiegati ON Dipartimenti.Codice =

Impiegati.Dipartimento;

La sintassi adottata da Access è una delle sintassi ammesse fra gli standard di SQL2, mentre il modo di costruire le congiunzioni presentato all’inizio del paragrafo è quello dello standard di base del linguaggio.

Va precisato che Access (come tutti gli SQL che ammettono tale ultima sintassi) accetta ed esegue correttamente le interrogazioni costruite secondo lo standard di base. Naturalmente, quando il comando Select è costruito direttamente da Access partendo da una QBE, l’interrogazione è realizzata secondo gli standard tipici dell’implementazione.

L’elenco di tutti i dipendenti con i dati del dipartimento dove lavorano, si ottiene con la congiunzione delle tabelle Impiegati e

Dipartimenti secondo gli attributi comuni Dipartimento e Codice.

Per maggiore chiarezza, o se ci sono attributi con il medesimo nome nelle due tabelle, si usa la dot notation, specificando oltre al nome dell’attributo anche quello della tabella alla quale appartengono. Condizione di uguaglianza tra attributi:

esempio di equi-join. Sono combinate solo le righe che soddisfano alla condizione.

INNER-JOIN definisce la congiunzione. La condizione di congiunzione è scritta nella stessa clausola FROM dopo ON.

L’elenco di tutti i dipendenti con cognome, nome e matricola, si ottiene con una proiezione di Impiegati sulle colonne richieste.

Impiegati JOIN Dipartimenti

Come si è anticipato nel Capitolo 3, gli strumenti per recuperare le informazioni sulle righe che non hanno corrispondenti nella congiunzione sono i join esterni e, in particolare, il left join che è presentato a fine paragrafo.

• Interrogazioni in SQL

Dopo aver visto come si rappresentano nel linguaggio SQL le operazioni fondamentali del modello relazionale, impariamo a costruire interrogazioni composte da una sequenza di opera- zioni relazionali.

Esempio

Per ottenere l’elenco dei dipendenti che lavorano in un dipartimento con sede a Roma, con cognome, nome e descrizione del dipartimento, occorre dapprima operare una selezione su

Dipartimenti per Sede = ‘Roma’; poi si deve effettuare una congiunzione della tabella ottenuta

con la tabella Impiegati e, infine, applicare una proiezione sugli attributi Cognome, Nome, Descri-

zione sulla nuova tabella risultante.

1. σP Dipartimenti Temp1=Selezione di Dipartimenti per Sede = ‘Roma’

2. Temp1PK ImpiegatiFK Temp2=Congiunzione di Temp1 su Codice e Impiegati su Dipartimento

3. ΠL Temp2 Proiezione di Temp2 su Cognome, Nome, Descrizione

SELECT Cognome, Nome, Descrizione FROM Impiegati, Dipartimenti WHERE Dipartimento=Codice AND

Sede = 'Roma';

SELECT Impiegati.Cognome, Impiegati.Nome, Dipartimenti.Descrizione FROM Impiegati, Dipartimenti

WHERE Impiegati.Dipartimento = Dipartimenti.Codice AND

Dipartimenti.Sede = 'Roma';

Per semplificare la scrittura del comando Select è possibile fare ricorso agli alias per il nome della tabella, specificando dopo il nome originale della tabella la parola AS seguita dal nuovo nome.

Nella congiunzione si può avere perdita di informazioni: mancano i dati del dipendente con ID=5 (manca il dipartimento di assegnazione) e del dipartimento di codice

Pers (senza dipendenti ad esso assegnati).

Dipartimento=Codice è la clausola di congiunzione

Sede=‘Roma’ è la clausola di selezione.

Per evitare ogni ambiguità si può precisare il nome delle tabelle oltre a quello degli attributi.

Si potrebbe, per esempio, indicare la tabella Impiegati con I e la tabella Dipartimenti con D, limitando il numero di caratteri da digitare, scrivendo così comandi più compatti, più semplici da leggere ma ugualmente significativi.

La precedente interrogazione, scritta nelle due diverse sintassi introdotte, è riportata di seguito.

Nel documento ESERCITAZIONI SVOLTE ACCESS (pagine 81-84)