logo

Aula 07 – Oracle/SQL – Join de múltiplas tabelas

Queridos alunos,

No post de ontem vimos a junçao de duas tabelas de registros (A tabela countries e a tabela locations). Tambem estudamos os parametros modificadores de junçao (left outer, right outer, full outer e cross). No entanto, vimos apenas como unir duas tabelas, mas… e quando sao 3 tabelas ou mais? é possível? A resposta é sim!

Para isto, vou utilizar 3 tabelas, do banco de dados que criamos e populamos durante os procedimentos demonstrados na “videoaula 01” (se voce ainda nao viu, vá ver!)

utilizando os comandos:

describe countries
describe locations
describe departments

Obtive as saidas que voces estao vendo abaixo, para que seja possivel entender os exercícios que seguem.
TABELA: COUNTRIES

Nome Nulo Tipo
———— ——– ————
COUNTRY_ID NOT NULL CHAR(2)
COUNTRY_NAME VARCHAR2(40)
REGION_ID NUMBER

TABELA: LOCATIONS

Nome Nulo Tipo
————– ——– ————
LOCATION_ID NOT NULL NUMBER(4)
STREET_ADDRESS VARCHAR2(40)
POSTAL_CODE VARCHAR2(12)
CITY NOT NULL VARCHAR2(30)
STATE_PROVINCE VARCHAR2(25)
COUNTRY_ID CHAR(2)

TABELA: DEPARTMENTS

Nome Nulo Tipo
————— ——– ————
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
Observe que cada uma destas 3 tabelas apresenta um campo em uma das outras duas tabelas. Lembrando o que eu falei na aula passada, que foi: “Quando temos 1 campo em uma tabela e observamos que ele também esta presente em outra, chamamos este campo de CHAVE ESTRANGERIA (FOREIGN KEY)”. A finalidade de se utilizar chaves estrangeiras é a de interrelacionar registros presentes em tabelas diferentes.

Obviamente que, para voce entender um pouco mais sobre o design de um banco de dados, voce terá que estudar um pouco mais esta parte pois, aqui no meu site, ressalvados alguns momentos “especiais” irei me concentrar na parte operacional do assunto, ou seja: “mexer com os dados”. Mais na frente, falaremos sobre design de Dbs.

Junçao de multiplas tabelas

Exemplo 01:
Select * from countries
natural join locations
natural join departments

Explicaçao: Na consulta acima, eu unifiquei TODOS os registros das tres tabelas, independente de que seus registros tenham conteudo relacionado com o da outra tabela, ou seja: se um registro da tabela COUNTRIES nao tiver nenhum registro em LOCATIONS, ele irá aparecer do mesmo jeito. No entanto, as colunas de registro da tabela LOCATIONS, que correspondem a estes campos de COUNTRY que nao tem interrelaçao, aparecerao com o conteúdo “NULL”.

Obs1.: Cuidado! O “NULL” poderá aparecer por força da “nao interrelaçao”entre as tabelas OU porque seu conteúdo nao foi preenchido (Nao há registro algum naquele campo.. ele é vazio… nulo!)
Obs2.: Nesta consulta obtivemos 27 resultados

Exemplo 02:
Select con.country_id, con.country_name, loc.city, loc.state_province, dep.department_id, dep.department_name from countries con
inner join locations loc on con.country_id = loc.country_id
inner join departments dep on loc.location_id = dep.location_id

Explicaçao: Para começar, nesta consulta obtivemos os mesmos 27 resultados que na consulta anterior e a mesma quatidade nesta, o que nao quer dizer nada, mas neste caso sim… O motivo é que “Natural Join”e “Inner join” fazem exatamente a mesma coisa, mas o “natural join” é uma maneira mais facil de se fazer o inner join, pois o natural join automaticamente suprime (Esconde) os campos que sao chaves_estrangeiras, para que dados nao apareçam duplicadamente na saída. Outra diferença é que o natural join nao permite o uso de qualificadores (Isto é um qualificador: nome_do_objeto_pai.nome_do_objeto_filho, ou seja, nome_da_tabela.nome_do_campo). Ja o Inner join, além de ser possível utilizar qualificadores, é possível identificar cláusulas de junçao (on campo1-da-tabela=X = campo2-da-tabela-Y), tambem é possível definir qual campo, de qual tabela se deseja exibir na saída.

Exemplo 03:
Select con.country_id, con.country_name, loc.city, loc.state_province, dep.department_id, dep.department_name from countries con
inner join locations loc on con.country_id = loc.country_id
right outer join departments dep on loc.location_id = dep.location_id

Explicaçao: Mais uma vez, a mesma quatidade de resultados: 27! O motivo é que da junçao de todos os registros da junçao de contries+locations (23 resultdados) + os registros de departments que se relacionam com a junçao anterior + os registros que nao se relacionam (que sao 0) temos o valor de 27 (Mesmo resultado das consultas dos exemplos 1 e 2), o que nos leva a conclusao de que alguns registros da tabela “departments” se relacionam mais de uma vez com os registros resultantes da junçao de countries+locations

Exemplo 04
Select con.country_id, con.country_name, loc.city, loc.state_province, dep.department_id, dep.department_name from countries con
inner join locations loc on con.country_id = loc.country_id
left outer join departments dep on loc.location_id = dep.location_id




978 Visitas totais: 3 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