logo

Aula 06 – Oracle/SQL – Parametros natural join, cross, inner, outer, left e right

Queridos alunos,

Neste post damos continuidade aos nossos estudos sobre Oracle/SQL. Nele vamos abordar os seguintes parâmetros:

Parâmetro JOIN (Conceito e variantes)

De forma generica, o comando JOIN serve para unir o conteudo de duas tabelas (Join significa “unir-se a algo”). No entanto, existem alguns parametros modificados do JOIN, para se obter resultados mais personalizados.

Estes sub-parametros sao:

INNER JOIN
Explicaçao: unifica o conteudo de duas tabelas, UTILIZANDO OS DADOS QUE ELAS TEM EM COMUM, segundo o critério de junção especificado EXPLICITAMENTE

LEFT OUTER
Explicação: unifica o conteudo de duas tabelas, UTILIZANDO OS DADOS QUE ELAS TEM EM COMUM, segundo o critério de junção (campo) expecificado EXPLICITAMENTE, adicinando-se ao resultado da junçao os campos da PRIMEIRA TABELA especificada, cujos campos nao tenham relaçao com conteudo algum da SEGUNDA tabela especificada

RIGHT OUTER
Explicaçao: unifica o conteudo de duas tabelas, UTILIZANDO OS DADOS QUE ELAS TEM EM COMUM, segundo o critério (campo) de junçao expecificado EXPLICITAMENTE, adicinando-se ao resultado da junçao os campos da SEGUNDA TABELA especificada, cujos campos nao tenham relaçao com conteudo algum da PRIMEIRA tabela especificada

CROSS JOIN
explicaçao: cria um produto cartesiano (combinaçao total) de todos os registros das duas tabelas

NATURAL JOIN
Explicaçao: cria um INNER ou OUTTER join entre as duas tabelas, sem definição EXPLICITA do critério de junção, pois, automaticamente, se utiliza dos campos que as duas tabelas tem em comum para criar a junçao (Utiliza as chaves estrangeiras que interligam as duas tabelas).

Mas… O que é uma chave estrangeira?

É um registro de uma tabela que esta presente em outra tabela para entre-relacionar dois registros presentes em tabelas distintas

Para podermos entender melhor, utilizaremos as tabelas “Countries” e “Locations”, com suas estruturas exibidas abaixo:

Estrutura das tabelas countries e locations

Estrutura das tabelas countries e locations

Observação: para voce obter a saida acima, utilize o comando abaixo:
describe countries and locations

Explicaçao: Este comando mostra a estrutura das tabelas declaradas!

Parâmetro natural join

Exemplo 01:
select * from countries natural join locations

Explicação: Nesta consulta eu solicito a exibição de TODOS os campos resultantes da junção das tabelas countries e locations, DESDE QUE existam conteúdos iguais nos campos que são chaves estrangeiras em ambas. Observe na figura acima que o campo que é chave estrangeira nas tabelas é o campo “country_id”

IMPORTANTE: Obtive 23 resultados com este pesquisa (Guarde esta informação)

Exemplo 02:
select * from countries natural join locations
order by country_id asc

Explicaçao: nesta consulta eu solicito que o resultado seja organizado por ordem ascendente de “country_id”. Desta forma eu vejo que, em alguns casos, existe mais de uma localidade (endereço da empresa) em alguns paises. Ou seja… a empresa tem dois ou mais escritorios em alguns paises. Obviamente eu poderia obter a mesma resposta utilizando o select em apenas uma tabela, mas nao iria ver outras informaçoes da tabela countries, tais como “country_name” e “region_ID”

Exemplo 03:
select * from countries natural join locations
where country_id = ‘US’

Explicaçao: Apenas mostrando que é possivel fazer uso de filtros condicionais junto de parâmetros JOIN. Neste caso quero que o resultado da uniao destas duas tabelas me retorne APENAS os registros com country_id igual a “US”.

Parametro INNER JOIN

Exemplo 04:
Select con.country_id, loc.country_id, loc.city from countries con inner join locations loc
on con.country_id = loc.country_id
order by con.country_id asc

Antes de mais nada… veja os seguintes pontos e entenda que:
1) tabelas contém campos. Correto? Pois bem… entao é correto afirmar que os campos ficam dentro das tabelas, correto? Se os campos ficam dentro das tabelas, podemos falar que OS CAMPOS SAO FILHOS DAS TABELAS!
2) Em algumas situaçoes, quando nos referimos a “entidades” de mesmo nome (campo “country_id” da tabela “countries” e campo “country_id” da tabela “locations”), precisamos definir a qual “entidade” estamos nos referindo.
3) Para identificar a qual “entidade”estamos nos referindo, utilizamos a seguinte sintaxe: nome_do_objeto_pai.nome_do_objeto_filho
4) Neste caso, entao, para nos referirmos ao campo “country_id” da tabela “countries”, precisamos descreve-lo assim: countries.country_id
5) EPA! PARA TUDO! (Voce deve estar pensando) e porque motivo voce utilizou “con.country_id”, ao inves de “contries.country_id”? Observe que, en determinado momento em “apelidei” a tabela contries de “con” e a tabela locations de “loc”. Isto é utilizado para otimizar a digitaçao e diminuir o processamento de informaçoes (Economizando letrinhas!)
Explicaçao: Na consulta acima eu declaro que quero exibir na saida os campos country_id (da tabela countries), country_id (da tabela locations) e o campo city (da tabela locations), exibindo na junçao desta duas tabelas (JOIN) todos os campos onde (ON) o “country_id” da tabela countries seja igual ao campo “country_id” da tabela locations, por fim solicito que eles sejam organizados por ordem alfabetica crescente do campo “country_id”da tabela countries.

Em resumo: Os registros cujo “country_id” que estejam em uma das tabelas, mas nao estejam em outra, nao serao exibidos na saida deste comando.

Para entender de vez: A tabela “countries” tem 25 registros e a tabela “locations” tem 23 (Só ai ja vemos que “existem countries que nao tem locations”). Os registros “Ar”, “Be”, “DK” e mais alguns outros, armazenados no campo “country_id” da tabela countries, nao estão presentes no campo “country_id” da tabela locations (veja ai de voce os encontra na saida do exemplo 04.. nao encontrará, pois o parametro INNER serve para mostrar os registros que existem em uma tabela e na outra tambem!)

parametro LEFT OUTER JOIN

Exemplo 05:
Select con.country_id, loc.country_id, loc.city from countries con left outer join locations loc
on con.country_id = loc.country_id
order by con.country_id asc

explicaçao: A consulta acima me retorna tudo o que as duas tabelas tem em comum (como o inner faz) MAAAAS me trás, também aqueles valores que estao na primeira tabela informada (a tabela que esta a esquerda – LEFT) junto daqueles valores da primeira tabela que nao estao se relacionando com nenhum registro da segunda tabela informada (locations). veja que o resultado desta consulta vai trazer alguns registros da tabela “countries” que estao com “NULL” referenciados nos campos da tabela locations… obviamente… isto significa que eles nao se relacionam com nenhum campo de locations!

Exemplo 06:
Select con.country_id, loc.country_id, loc.city from locations loc left outer join countries con
on con.country_id = loc.country_id
order by con.country_id asc

Explicaçao: No codigo acima eu inverti a ordem na qual declarei as tabelas. agora “locations” é a primeira (Tabela da esquerda – LEFT) e coutries é a segunda tabela. Eu estou pedindo que o banco de dados me retorne todos os registros do campo “country_id” da locations que se relacionam com campos os registros do campo “country_id” da tabela countries JUNTO daqueles da tabela LOCATIONS que nao se relacionam com algum na tabela COUNTRIES. Oras… vamos pensar! Ja vimos que TODOS os registros de locations se ralacionam com country (O contrario é que nAo é verdade, como vimos acima), logo o resultado desta saida será identica ao resultado do inner join, ou seja… serao retornados 23 registros!

Parametro RIGHT OUTER JOIN

Exemplo 07:
Select con.country_id, loc.country_id, loc.city from countries con RIGHT outer join locations loc
on con.country_id = loc.country_id
order by con.country_id asc

Exemplo 08:
Select con.country_id, loc.country_id, loc.city from locations loc RIGHT outer join countries con
on con.country_id = loc.country_id
order by con.country_id asc

Explicaçao: Amigos… nem tem o que explicar! A explicaçao é MUITO semelhante as explicaçoes dos exemplos 05 e 06. A diferença agora é que ele trará os registros contidos no campo “country_id” da SEGUNDA tabela que nao se relacionam com registros da PRIMEIRA MAAAAAIIIIIS os que se relacionam.

Uma dica de amigo: Para voce entender, gaste uns 10 minutos analisando as saidas dos exemplos 05, 06, 07 e 08 junto do comando abaixo:
select * from countries

analise e pense que voce vai entender!

Parametro FULL OUTER JOIN

Exemplo 09:
Select con.country_id, loc.country_id, loc.city from locations loc full outer join countries con
on con.country_id = loc.country_id
order by con.country_id asc

Explicaçao: Este comando pode ser entendido como sendo a junçao do left outer join com o right outer join. Ele retorna os campos que se relacionam entre as duas tabelas + os campos da primeira que nao se relacionam com a segunda + os campos da segunda que nao se relacionam com a primeira. Nesta tabela que nós estamos usando, infelizmente nao veremos efeito algum, pois apenas a tabela COUNTRIES tem alguns campos que nao se relacionam com locations… já na tabela locations… todos os campso tem relaçoes com contries. O bom é quando ambas tabelas tem dados em comum e, TAMBEM, tanto uma quanto outra tem dados que nao se relacionam… ai sim este comando nos mostraria resultados que fariam sentido!

Parametro CROSS JOIN

Exemplo 10:
Select con.country_id, loc.city from countries con cross join locations loc
order by con.country_id asc

Explicaçao: este comando ele faz um cruzamento de todos os registros do campo “country_id” da tabela countries com todos os registros do campo “country_id” da tabela locations




1200 Visitas totais: 6 Visitas hoje:

Deixe um comentário

*

captcha *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Pular para a barra de ferramentas