Outer Join
Agora vou falar sobre o Outer Join, que não é muito diferente do Inner, aliás, digo que ele o complementa. Como vimos, o Inner faz o cruzamento dos dados de várias tabelas, mas ele só exibe resultados que possuam valor correspondente em todas elas.
Essa á uma daquelas situações mais fáceis de demonstrar do que explicar. Vamos imaginar que nossa pequena loja que revende carros tenha recebido alguns modelos, portanto já os tenha cadastrado na tabela "carro", mas ainda não tenha tido tempo de calcular seu preço de venda, portanto eles não possuem cadastro na tabela "preco".
Foram recebidos os carros cujos dados foram inseridos na tabela "carro" da seguinte forma:
INSERT INTO carro VALUES ("Grand Cherokee SRT8 6.1 V8 16V 432cv", "Branca", 4, "Gasolina", "Jeep");
INSERT INTO carro VALUES ("ASX 2.0 16V 4x4 160cv Aut.", "Branca", 4, "Gasolina", "Mitsubishi");
Muito bem, os dois novos carros adicionados possuem a "Gasolina" cadastrada como combustível. Vamos agora tentar repetir o comando que executamos no tópico anterior, para vermos todos os preços dos carros com esse tipo de combustível:
SELECT carro.modelo AS Modelo, carro.combustivel AS ‘Combustível’, preco.valor AS ‘Preço’ FROM carro, preco WHERE carro.modelo = preco.modelo AND carro.combustivel like ‘Gasolina’;
Vejam que o retorno não incluiu os novos carros cadastrados no sistema, pois eles estão presentes somente na tabela "carro" e não na tabela "preco".
O OUTER JOIN serve para forçar a exibição de todos os itens cadastrados, mesmo que não exista a correspondência em todas as tabelas.
Existem dois tipos de OUTER JOIN, que são o LEFT JOIN e o RIGHT JOIN. Vou demonstrar suas diferenças. Vamos começar com um exemplo que utiliza o LEFT JOIN.
SELECT carro.modelo AS Modelo, carro.combustivel AS 'Combustível', preco.valor AS 'Preço' FROM carro LEFT JOIN preco ON carro.modelo = preco.modelo;
Vejam o retorno:
Mesmo com dados não cadastrados na tabela "preco", os dados são exibidos e os carros ASX e Grand Cherokee aparecem na relação.
Ou seja, conforme citei no início do tópico, o OUTER JOIN permite exibir dados mesmo que não existam correspondentes em todas as tabelas. Agora vamos entender as diferenças entre o LEFT JOIN e o RIGHT JOIN.
No comando acima usamos o LEFT JOIN e os dados exibidos estavam de acordo com o que queríamos, que era exibir todos os carros cadastrados, mesmo que não tivessem preço correspondente.
Vamos executar o mesmo comando, mas trocando o LEFT pelo RIGHT.
SELECT carro.modelo AS Modelo, carro.combustivel AS 'Combustível', preco.valor AS 'Preço' FROM carro RIGHT JOIN preco ON carro.modelo = preco.modelo;
Vejam que agora os dados nulos foram omitidos, deixando nosso resultado semelhante a um INNER JOIN.
O comando LEFT JOIN estava dizendo ao SGBD o seguinte:
Exiba todos os resultados da tabela da esquerda e os que possuírem correspondentes à direita.
Já o comando RIGHT JOIN estava dizendo para exibir todos os resultados da tabela da direita e os que possuírem correspondentes na tabela da esquerda. Como na tabela da direita, que era a tabela "preco", tínhamos apenas os 6 carros cadastrados com preço, os veículos ASX e Grand Cherokee foram omitidos. Você pode testar utilizando o RIGHT JOIN e invertendo as tabelas "preco" e "carro", fazendo com que a tabela "carro" passe a ficar do lado direito. Isso exibiria todos os resultados, inclusive dos carros não cadastrados na tabela preco. Vamos testar!
SELECT carro.modelo AS Modelo, carro.combustivel AS 'Combustível', preco.valor AS 'Preço' FROM preco RIGHT JOIN carro ON carro.modelo = preco.modelo;
Vejamos o retorno dessa consulta:
Vejam que novamente os resultados foram exibidos incluindo os carros que não possuem preco cadastrado. Joins são simples!
Com isso encerramos a parte do OUTER JOIN.