SQL: JOIN vs WHERE

Quanti di voi continuano ad usare lo standard SQL dell’89 senza tenere presente il nuovo standard che prevede, tra le altre cose l’utilizzo della Join? A giudicare dal codice molti… e la risposta più frequente è “non serve….”.

Partiamo da un presupposto, a livello di prestazioni non cambia nulla e neanche di “possibilità“… cioè tutto quello che si poteva fare prima si puo fare adesso… allora perchè imparare un costrutto nuovo se non mi da nulla in più? La risposta è LEGGIBILITA’… quando in Java5 uscì il costrutto foreach tutti, o quasi, i programmatori si affrettarono ad usare questo nuovo metodo che rendeva il codice molto più leggibile… non è vero??? Lo stesso sarebbe dovuto valere per la Join ma questo non è successo forse per la poca conoscenza dello standard… facciamo un esempio concreto:

Abbiamo due tabelle

Impiegato(Id, Nome, Cognome, Gruppo)
Gruppo(Id, Nome)

Prima query tutti i nomi degli impiegati ed il nome del gruppo di appartenenza:

WHERE

select Impiegato.Nome, Gruppo.Nome
from Impiegato, Gruppo
where Gruppo.Id = Impiegato.Gruppo

JOIN

select Impiegato.Nome, Gruppo.Nome
from Impiegato inner join Gruppo on Gruppo.Id = Impiegato.Gruppo

Voi direte: “non è che ci sia tutta questa differenza……” facciamo pero un nuovo assunto, un Impiegato può anche non far parte di nessun gruppo e voi volete la stessa lista di prima…. per far “apparire” anche gli impiegati “solitari” sarete costretti a scrivere:

select Impiegato.Nome, Gruppo.Nome grupName
from Impiegato, Gruppo
where Gruppo.Id = Impiegato.Gruppo
union
select Impiegato.Nome, null grupName
from Impiegato
where Impiegato.Gruppo IS NULL

con la Join un semplice:

select Impiegato.Nome, Gruppo.Nome
from Impiegato left outer join Gruppo on Gruppo.Id = Impiegato.Gruppo

Ora qual’è più leggibile e facile da comprendere??? e questo è un esempio idiota…. aggiungete una decina di tabelle in join e una manciata di clausole where “VERE” e avrete la percezione del perchè usare la JOIN….

enjoy, :-D