Sei sulla pagina 1di 8

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

cogn

stipendio

dipartimento

101

Sili

60

No

102

Rossi

40

No

103

Neri

40

No

201

Neri

40

Su

202

Verdi

50

Su

301

Bisi

70

Is

DIPARTIMENTO

codice

nome

sede

direttore

No

Nord

Milano

101

Su

Sud

Napoli

201

Is

Isole

Palermo

301

PROGETTO

sigla

nome

bilancio

responsabile

Alpha

Vendite

50

202

Beta

Inventario

30

301

Gamma

Distribuzione

18

301

PARTECIPAZIONE

impiegato

progetto

101

Alpha

101

Beta

103

Alpha

103

Beta

201

Beta

202

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 equi- join.

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: IMPIEGATO e PARTECIPAZIONE.

SELECT

matr, cogn, progetto

FROM

impiegato, partecipazione

WHERE

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

cogn

stipendio

dipartimento

impiegato

progetto

101

Sili

60

No

101

Alpha

101

Sili

60

No

101

Beta

101

Sili

60

No

103

Alpha

101

Sili

60

No

103

Beta

101

Sili

60

No

201

Beta

101

Sili

60

No

202

Beta

102

Rossi

40

No

101

Alpha

102

Rossi

40

No

101

Beta

102

Rossi

40

No

103

Alpha

102

Rossi

40

No

103

Beta

102

Rossi

40

No

201

Beta

102

Rossi

40

No

202

Beta

103

Neri

40

No

101

Alpha

103

Neri

40

No

101

Beta

103

Neri

40

No

103

Alpha

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

2

103

Neri

40

No

103

Beta

103

Neri

40

No

201

Beta

103

Neri

40

No

202

Beta

201

Neri

40

Su

101

Alpha

201

Neri

40

Su

101

Beta

201

Neri

40

Su

103

Alpha

201

Neri

40

Su

103

Beta

201

Neri

40

Su

201

Beta

201

Neri

40

Su

202

Beta

202

Verdi

50

Su

101

Alpha

202

Verdi

50

Su

101

Beta

202

Verdi

50

Su

103

Alpha

202

Verdi

50

Su

103

Beta

202

Verdi

50

Su

201

Beta

202

Verdi

50

Su

202

Beta

301

Bisi

70

Is

101

Alpha

301

Bisi

70

Is

101

Beta

301

Bisi

70

Is

103

Alpha

301

Bisi

70

Is

103

Beta

301

Bisi

70

Is

201

Beta

301

Bisi

70

Is

202

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

cogn

stipendio

dipartimento

impiegato

progetto

101

Sili

60

No

101

Alpha

101

Sili

60

No

101

Beta

103

Neri

40

No

103

Alpha

103

Neri

40

No

103

Beta

201

Neri

40

Su

201

Beta

202

Verdi

50

Su

202

Beta

Infine, se non ci sono altre condizioni da soddisfare, viene effettuata la proiezione.

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

3

matr

cogn

progetto

101

Sili

Alpha

101

Sili

Beta

103

Neri

Alpha

103

Neri

Beta

201

Neri

Beta

202

Verdi

Beta

Esempio 2: Trovare matricola e cognome degli impiegati che partecipano al progetto Beta

I dati che cerchiamo si trovano su 2 tabella: IMPIEGATO e PARTECIPAZIONE.

SELECT

matr, cogn

FROM

impiegato, partecipazione

WHERE

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

Resultset:

matr

cogn

101

Sili

103

Neri

201

Neri

202

Verdi

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

dipartimento.nome

FROM

dipartimento, progetto

WHERE

dipartimento.direttore = progetto. responsabile and progetto.nome = ‘Distribuzione’

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

4

Resultset:

codice

nome

sede

direttore

sigla

nome

bilancio

responsabile

No

Nord

Milano

101

Alpha

Vendite

50

202

No

Nord

Milano

101

Beta

Inventario

30

301

No

Nord

Milano

101

Gamma

Distribuzione

18

301

Su

Sud

Napoli

201

Alpha

Vendite

50

202

Su

Sud

Napoli

201

Beta

Inventario

30

301

Su

Sud

Napoli

201

Gamma

Distribuzione

18

301

Is

Isole

Palermo

301

Alpha

Vendite

50

202

Is

Isole

Palermo

301

Beta

Inventario

30

301

Is

Isole

Palermo

301

Gamma

Distribuzione

18

301

Applicando la condizione di equi-join si eliminano tutte le righe che hanno valori diversi nei campi direttore e responsabile.

codice

nome

sede

direttore

sigla

nome

bilancio

responsabile

Is

Isole

Palermo

301

Beta

Inventario

30

301

Is

Isole

Palermo

301

Gamma

Distribuzione

18

301

La seconda condizione della clausola WHERE elimina tutte le righe che hanno valori del campo nome (del PROGETTO) diverso da Distribuzione.

codice

nome

sede

direttore

sigla

nome

bilancio

responsabile

Is

Isole

Palermo

301

Gamma

Distribuzione

18

301

Infine, viene eseguita la proiezione sul campo nome di DIPARTIMENTO.

nome Isole
nome
Isole

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: IMPIEGATO, PARTECIPAZIONE e PROGETTO.

SELECT

matr, cogn, nome

FROM

impiegato, partecipazione, progetto

WHERE

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

cogn

stipendio

dipartimento

impiegato

progetto

101

Sili

60

No

101

Alpha

101

Sili

60

No

101

Beta

103

Neri

40

No

103

Alpha

103

Neri

40

No

103

Beta

201

Neri

40

Su

201

Beta

202

Verdi

50

Su

202

Beta

Con il secondo:

matr

cogn

stipendio

dipartimento

impiegato

progetto

sigla

nome

bilancio

responsabile

101

Sili

60

No

101

Alpha

Alpha

Vendite

50

202

101

Sili

60

No

101

Beta

Beta

Inventario

30

301

103

Neri

40

No

103

Alpha

Alpha

Vendite

50

202

103

Neri

40

No

103

Beta

Beta

Inventario

30

301

201

Neri

40

Su

201

Beta

Beta

Inventario

30

301

202

Verdi

50

Su

202

Beta

Beta

Inventario

30

301

Infine, viene eseguita la proiezione su matr, cogn e nome:

matr

cogn

nome

101

Sili

Vendite

101

Sili

Inventario

103

Neri

Vendite

103

Neri

Inventario

201

Neri

Inventario

202

Verdi

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

matr, cogn, progetto

FROM

impiegato

oppure

INNER JOIN partecipazione ON partecipazione.impiegato = impiegato.matr

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

matr, cogn, progetto

FROM

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

cogn

stipendio

dipartimento

codice

nome

sede

direttore

101

Sili

60

No

No

Nord

Milano

101

102

Rossi

40

No

No

Nord

Milano

101

103

Neri

40

No

No

Nord

Milano

101

201

Neri

40

Su

Su

Sud

Napoli

201

202

Verdi

50

Su

Su

Sud

Napoli

201

301

Bisi

70

Is

Is

Isole

Palermo

301

Successivamente, dobbiamo eseguire un join tra la tabella ottenuta (il resultset) e IMPIEGATO, sui campi direttore e matr.

matr

cogn

 

direttore

matr

cogn

stipendio

dipartimento

101

Sili

 

101

101

Sili

60

No

102

Rossi

 

101

101

Sili

60

No

103

Neri

 

101

101

Sili

60

No

201

Neri

 

201

201

Neri

40

Su

202

Verdi

….

201

201

Neri

40

Su

301

Bisi

….

301

301

Bisi

70

Is

Infine, con la proiezione, otteniamo:

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

7

matr

cogn

cogn

101

Sili

Sili

102

Rossi

Sili

103

Neri

Sili

201

Neri

Neri

202

Verdi

Neri

301

Bisi

Bisi

Come si può notare, è utile ridenominare il campo cogn del direttore di dipartimento, per esempio in direttore.

SELECT

impiegato.matr, impiegato.cogn, direttoreDip.cogn AS direttore

FROM

impiegato, dipartimento, impiegato AS direttoreDip

WHERE

impiegato.dipartimento = dipartimento.codice and dipartimento.direttore = direttoreDip.matr;