Fonte: www.activedelphi.com.br 
Para aqueles que tinham dúvidas quanto ao funcionamento dos JOIN's das  tabelas no SQL, desenvolvi um pequeno tutorial de apoio...
Tabelas e seus registros:
TABELA_A
|       Codigo  |            Nome  |    
|       1  |            um  |    
|       2  |            dois  |    
|       3  |            três  |    
|       4  |            quatro  |    
|       5  |            cinco  |    
TABELA B
|       Lanca  |            Codigo  |            Valor  |    
|       1  |            1  |            1.000  |    
|       2  |            1  |            2.000  |    
|       3  |            1  |            5.000  |    
|       4  |            2  |            4.000  |    
|       5  |            2  |            9.000  |    
|       6  |            3  |            7.000  |    
|       7  |            5  |            4.000  |    
|       8  |            8  |            7.000  |    
Para a relação entre as tabelas  temos:
3 registros para a empresa 1 (que existe na tabela de empresas);
2 registros para a empresa 2 (que existe na tabela de empresas);
1 registros para a empresa 3 (que existe na tabela de empresas);
0 registros para a empresa 4 (que existe na tabela de empresas);
1 registros para a empresa 5 (que existe na tabela de empresas);
1 registros para a empresa 8 (que NÃO existe na tabela de empresas);
Agora vamos ver como ficariam as pesquisas* (SELECT's) com os JOIN's ( INNER, [ LEFT | RIGHT | FULL ] OUTER ):
* Para tais pesquisas vamos usar a seguinte linguagem:
  
3 registros para a empresa 1 (que existe na tabela de empresas);
2 registros para a empresa 2 (que existe na tabela de empresas);
1 registros para a empresa 3 (que existe na tabela de empresas);
0 registros para a empresa 4 (que existe na tabela de empresas);
1 registros para a empresa 5 (que existe na tabela de empresas);
1 registros para a empresa 8 (que NÃO existe na tabela de empresas);
Agora vamos ver como ficariam as pesquisas* (SELECT's) com os JOIN's ( INNER, [ LEFT | RIGHT | FULL ] OUTER ):
* Para tais pesquisas vamos usar a seguinte linguagem:
 SELECT [CAMPOS]
FROM "TABELA_DA_ESQUERDA"
[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN "TABELA_DA_DIREITA"
1) INNER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
INNER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
FROM "TABELA_DA_ESQUERDA"
[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN "TABELA_DA_DIREITA"
1) INNER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
INNER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
|       |            A.NOME  |            B.VALOR  |    
|       1  |            UM  |            1.000  |    
|       2  |            UM  |            2.000  |    
|       3  |            UM  |            5.000  |    
|       4  |            DOIS  |            4.000  |    
|       5  |            DOIS  |            9.000  |    
|       6  |            TRÊS  |            7.000  |    
|       7  |            CINCO  |            4.000  |    
Nas pesquisas com INNER JOIN o resultado trará somente as linhas que sejam comum nas 2 tabelas, ligadas pelos campos das tabelas em questão na pesquisa.
2) LEFT OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
LEFT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
|       |            A.NOME  |            B.VALOR  |    
|       1  |            UM  |            1.000  |    
|       2  |            UM  |            2.000  |    
|       3  |            UM  |            5.000  |    
|       4  |            DOIS  |            4.000  |    
|       5  |            DOIS  |            9.000  |    
|       6  |            TRÊS  |            7.000  |    
|       7  |            QUATRO  |            NULL  |    
|       8  |            CINCO  |            4.000  |    
Nas pesquisas com LEFT OUTER JOIN o  resultado trará todas os registros que estejam na tabela da esquerda do JOIN  (neste caso é a TABELA_A) ao menos 1 vez, mesmo que não tenham registros na  tabela da direita do JOIN (neste caso é a TABELA_B) ligadas à tabela da  esquerda, como é o caso da linha 7.
3) RIGHT OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
RIGHT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
RIGHT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
|       |            A.NOME  |            B.VALOR  |    
|       1  |            UM  |            1.000  |    
|       2  |            UM  |            2.000  |    
|       3  |            UM  |            5.000  |    
|       4  |            DOIS  |            4.000  |    
|       5  |            DOIS  |            9.000  |    
|       6  |            TRÊS  |            7.000  |    
|       7  |            CINCO  |            4.000  |    
|       8  |            NULL  |            7.000  |    
Nas pesquisas com RIGHT OUTER JOIN o  resultado trará todas os registros que estejam na tabela da direita do JOIN  (neste caso é a TABELA_B) ao menos 1 vez, mesmo que não tenham registros na  tabela da esquerda do JOIN (neste caso é a TABELA_A) ligadas à tabela da  direita, como é o caso da linha 8.  
4) FULL OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
FULL OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
FULL OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
|       |            A.NOME  |            B.VALOR  |    
|       1  |            UM  |            1.000  |    
|       2  |            UM  |            2.000  |    
|       3  |            UM  |            5.000  |    
|       4  |            DOIS  |            4.000  |    
|       5  |            DOIS  |            9.000  |    
|       6  |            TRÊS  |            7.000  |    
|       7  |            QUATRO  |            NULL  |    
|       8  |            CINCO  |            4.000  |    
|       9  |            NULL  |            7.000  |    
Nas pesquisas com FULL OUTER JOIN o  resultado trará todas os registros, ao menos 1 vez, que estejam nas 2 tabelas,  tanto a da esquerda do JOIN (neste caso é a TABELA_A) quanto a da direita do  JOIN (neste caso é a TABELA_B), como é o caso das linhas 7 e 9. O FULL  poderíamos dizer que é uma junção entre o LEFT OUTER JOIN e o RIGHT OUTER JOIN.
Perfeitos os seus exemplos.
ResponderExcluirClaros e didáticos.
Parabéns !!!
João Carlos