Ku pamięci:

Pobranie danych z tabel A i B gdzie A zawiera referencję do B:

select * from a,b where a.ref=b.id;

Gdy możliwe jest, że nie każde A ma odpowiednik w B to:

select * from a left join b on a.ref=b.id;

i brakujące dane w B zostaną zastąpione przez NULL

Podczas gdy:

select * from a,b,c where a.refb=b.id and a.refc=c.id

może działać to już dobranie się do brakujących rzędów z left join wygląda inaczej:

select * from a left join b on a.refb=b.id left join c on a.refc=c.id

każdy inny sposób jaki mi przyszedł do głowy dawał iloczyn kartezjański tablic, co w moim przypadku było (zaledwie) milionami rzędów.