Algebra relazionale: giunzioni (prima parte

)
L’operazione di giunzione (join) consente di combinare le righe di due o più tabelle ed è costituita da un prodotto cartesiano seguito da una selezione operata in base alle consizioni della clausola WHERE dell’istruzione SELECT. Inizialmente prenderemo in considerazione un particolare tipo di join, detto equi-join. Per quanto riguarda gli esempi, utilizzeremo le tabelle seguenti:
IMPIEGATO

matr 101 102 103 201 202 301
DIPARTIMENTO

cogn Sili Rossi Neri Neri Verdi Bisi

stipendio 60 40 40 40 50 70

dipartimento No No No Su Su Is

codice No Su Is
PROGETTO

nome Nord Sud Isole

sede Milano Napoli Palermo

direttore 101 201 301

sigla Alpha Beta Gamma
PARTECIPAZIONE

nome Vendite Inventario Distribuzione

bilancio 50 30 18

responsabile 202 301 301

impiegato 101 101 103 103 201 202

progetto Alpha Beta Alpha Beta Beta Beta

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

1

Equi-join

L’equi-join combina le righe di due o più tabelle che hanno valori uguali presenti nelle colonne considerate. Tali colonne corrispondono rispettivamente alla chiave primaria di una tabelle e alla relativa chiave esterna presente nella tabella correlata. L’uguaglianza dei valori per le colonne in questione viene esplicitata nella clausola WHERE dell’istruzione SELECT, mediante una condizione detta condizione di equi-join. Nel caso in cui le tabelle coinvolte sono solo due, la condizione di equi-join è unica; per tre tabelle si devono scrivere 2 condizioni di equi-.join; per ne tabelle, n-1 condizioni di equijoin. Mostriamo il comportamento di tale operatore mediante alcuni esempi. Esempio 1: Trovare matricola e cognome degli impiegati che partecipano ad un progetto, insieme al nome del progetto I dati che cerchiamo si trovano su 2 tabelle: SELECT FROM WHERE
IMPIEGATO

e PARTECIPAZIONE.

matr, cogn, progetto impiegato, partecipazione partecipazione.impiegato = impiegato.matr

In blu la condizione di equi-join. Esecuzione e Resultset: Per prima cosa, il DBMS esegue un prodotto cartesiano sulle due tabelle, ossia combina ogni riga della prima tabella con ogni riga della seconda.
matr 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 cogn Sili Sili Sili Sili Sili Sili Rossi Rossi Rossi Rossi Rossi Rossi Neri Neri Neri stipendio 60 60 60 60 60 60 40 40 40 40 40 40 40 40 40 dipartimento No No No No No No No No No No No No No No No impiegato 101 101 103 103 201 202 101 101 103 103 201 202 101 101 103 progetto Alpha Beta Alpha Beta Beta Beta Alpha Beta Alpha Beta Beta Beta Alpha Beta Alpha

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

2

103 103 103 201 201 201 201 201 201 202 202 202 202 202 202 301 301 301 301 301 301

Neri Neri Neri Neri Neri Neri Neri Neri Neri Verdi Verdi Verdi Verdi Verdi Verdi Bisi Bisi Bisi Bisi Bisi Bisi

40 40 40 40 40 40 40 40 40 50 50 50 50 50 50 70 70 70 70 70 70

No No No Su Su Su Su Su Su Su Su Su Su Su Su Is Is Is Is Is Is

103 201 202 101 101 103 103 201 202 101 101 103 103 201 202 101 101 103 103 201 202

Beta Beta Beta Alpha Beta Alpha Beta Beta Beta Alpha Beta Alpha Beta Beta Beta Alpha Beta Alpha Beta Beta Beta

Successivamente, il DBMS applica la condizione di equi-join, cioè effettua una selezione eliminando le righe che non soddisfano la condizione. Quest’ultima si costruisce eguagliando il campo chiave primaria di una tabella con il campo chiave esterna correlato dell’altra tabella. Nel nostro esempio il campo chiave primaria di IMPIEGATO (matr) deve essere uguale al campo chiave esterna della tabella PARTECIPAZIONE (impiegato).
matr 101 101 103 103 201 202 cogn Sili Sili Neri Neri Neri Verdi stipendio 60 60 40 40 40 50 dipartimento No No No No Su Su impiegato 101 101 103 103 201 202 progetto Alpha Beta Alpha Beta Beta Beta

Infine, se non ci sono altre condizioni da soddisfare, viene effettuata la proiezione.
Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

3

matr 101 101 103 103 201 202

cogn Sili Sili Neri Neri Neri Verdi

progetto Alpha Beta Alpha Beta Beta Beta

Esempio 2: Trovare matricola e cognome degli impiegati che partecipano al progetto Beta I dati che cerchiamo si trovano su 2 tabella: SELECT FROM WHERE Resultset:
matr 101 103 201 202 cogn Sili Neri Neri Verdi
IMPIEGATO

e PARTECIPAZIONE.

matr, cogn impiegato, partecipazione partecipazione.impiegato = impiegato.matr AND progetto = ‘Beta’

Esempio 3: Trovare il nome del dipartimento diretto dal responsabile del progetto Distribuzione I dati che cerchiamo si trovano su 2 tabelle: DIPARTIMENTO e PROGETTO. Gli attributi direttore (di DIPARTIMENTO) e responsabile (di PROGETTO) sono definiti su un dominio comune. La condizione di equi-join coinvolgerà quindi questi due campi. Osservate che le due tabelle hanno un attributo con lo stesso nome (nome) che contiene dati con diverso significato. Quando utilizziamo tali campi è necessario specificare a quale tabella appartengono, per evitare ambiguità. Si usa a tal scopo la notazione puntata: nomeTabella.nomeAttributo SELECT FROM WHERE dipartimento.nome dipartimento, progetto dipartimento.direttore = progetto. responsabile and progetto.nome = ‘Distribuzione’ 4

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

Resultset:
codice No No No Su Su Su Is Is Is nome Nord Nord Nord Sud Sud Sud Isole Isole Isole sede Milano Milano Milano Napoli Napoli Napoli Palermo Palermo Palermo direttore 101 101 101 201 201 201 301 301 301 sigla Alpha Beta Gamma Alpha Beta Gamma Alpha Beta Gamma nome Vendite Inventario Distribuzione Vendite Inventario Distribuzione Vendite Inventario Distribuzione bilancio 50 30 18 50 30 18 50 30 18 responsabile 202 301 301 202 301 301 202 301 301

Applicando la condizione di equi-join si eliminano tutte le righe che hanno valori diversi nei campi direttore e responsabile.
codice Is Is nome Isole Isole sede Palermo Palermo direttore 301 301 sigla Beta Gamma nome Inventario Distribuzione bilancio 30 18 responsabile 301 301

La seconda condizione della clausola WHERE elimina tutte le righe che hanno valori del campo nome (del PROGETTO) diverso da Distribuzione.
codice Is nome Isole sede Palermo direttore 301 sigla Gamma nome Distribuzione bilancio 18 responsabile 301

Infine, viene eseguita la proiezione sul campo nome di
nome Isole

DIPARTIMENTO.

Esempio 4: Trovare per ogni impiegato la matricola, il cognome e il nome del progetto a cui partecipa I dati che cerchiamo si trovano su 3 tabelle: SELECT FROM WHERE
IMPIEGATO, PARTECIPAZIONE

e PROGETTO.

matr, cogn, nome impiegato, partecipazione, progetto partecipazione.impiegato = impiegato.matr and partecipazione.progetto = progetto.sigla

Con il primo equi-join si ottiene:
Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

5

matr 101 101 103 103 201 202

cogn Sili Sili Neri Neri Neri Verdi

stipendio 60 60 40 40 40 50

dipartimento No No No No Su Su

impiegato 101 101 103 103 201 202

progetto Alpha Beta Alpha Beta Beta Beta

Con il secondo:
matr 101 101 103 103 201 202 cogn Sili Sili Neri Neri Neri Verdi stipendio 60 60 40 40 40 50 dipartimento No No No No Su Su impiegato 101 101 103 103 201 202 progetto Alpha Beta Alpha Beta Beta Beta sigla Alpha Beta Alpha Beta Beta Beta nome Vendite Inventario Vendite Inventario Inventario Inventario bilancio 50 30 50 30 30 30 responsabile 202 301 202 301 301 301

Infine, viene eseguita la proiezione su matr, cogn e nome:
matr cogn 101 101 103 103 201 202 Sili Sili Neri Neri Neri Verdi nome Vendite Inventario Vendite Inventario Inventario Inventario

Vedremo in seguito che esiste un modo migliore di rispondere a questa interrogazione. Sintassi alternative per l’equi-join Di seguito è riportata la sintassi alternativa per la query dell’esempio 1. SELECT FROM matr, cogn, progetto impiegato INNER JOIN partecipazione ON partecipazione.impiegato = impiegato.matr

oppure se la chiave primaria e la chiave esterna hanno lo stesso nome, supponiamo uguale a matr, si può scrivere:

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

6

SELECT FROM

matr, cogn, progetto impiegato INNER JOIN partecipazione USING matr

Un caso particolare: il self equi-join

Si parla di self join quando il join viene eseguito sulla stessa tabella. In tal caso occorre assegnare alla tabella un alias. Esempio 5: Trovare la matricola, il cognome degli impiegati con i cognomi dei rispettivi direttori di dipartimento Sia il cognome degli impiegati che quello dei direttori si trova nella stessa tabella. Per prima cosa dobbiamo fare un equi-join tra IMPIEGATO e DIPARTIMENTO sui campi dipartimento e codice.
matr 101 102 103 201 202 301 cogn Sili Rossi Neri Neri Verdi Bisi stipendio 60 40 40 40 50 70 dipartimento No No No Su Su Is codice No No No Su Su Is nome Nord Nord Nord Sud Sud Isole sede Milano Milano Milano Napoli Napoli Palermo direttore 101 101 101 201 201 301

Successivamente, dobbiamo eseguire un join tra la tabella ottenuta (il resultset) e IMPIEGATO, sui campi direttore e matr.
matr 101 102 103 201 202 301 cogn Sili Rossi Neri Neri Verdi Bisi .... .... .... .... .... …. …. direttore 101 101 101 201 201 301 matr 101 101 101 201 201 301 cogn Sili Sili Sili Neri Neri Bisi stipendio 60 60 60 40 40 70 dipartimento No No No Su Su Is

Infine, con la proiezione, otteniamo:

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

7

matr 101 102 103 201 202 301

cogn Sili Rossi Neri Neri Verdi Bisi

cogn Sili Sili Sili Neri Neri Bisi

Come si può notare, è utile ridenominare il campo cogn del direttore di dipartimento, per esempio in direttore. SELECT FROM WHERE impiegato.matr, impiegato.cogn, direttoreDip.cogn AS direttore impiegato, dipartimento, impiegato AS direttoreDip impiegato.dipartimento = dipartimento.codice and dipartimento.direttore = direttoreDip.matr;

Quest'opera è stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

8

Sign up to vote on this title
UsefulNot useful