Académique Documents
Professionnel Documents
Culture Documents
PARTE I
Conteudista
Prof. Me. MARCUS ROGERIO OLIVEIRA
A juno (join) uma consulta que combina linhas de duas ou mais tabelas, views ou views
materializadas. O Oracle Database realiza uma juno sempre que mltiplas tabelas aparecem
na clusula FROM da consulta. A lista de seleo da consulta pode selecionar todas as colunas
de qualquer uma dessas tabelas. Se duas dessas tabelas tm um nome de coluna em comum,
ento o usurio deve qualificar todas as referncias a essas colunas em toda a consulta com o
nome da respectiva tabela, para evitar ambiguidade.
A maioria das consultas de juno contm pelo menos uma condio de juno, quer na
clusula FROM ou na clusula WHERE. A condio de juno compara duas colunas, cada uma
de uma tabela diferente. Para executar a juno, o Oracle Database combina pares de linhas,
cada uma contendo uma linha de cada tabela, para o qual a condio de juno deve ser
avaliada como TRUE. As colunas que participam nas condies no precisam aparecer na lista
de seleo.
Para executar uma juno de trs ou mais tabelas, o Oracle primeiramente junta duas das
tabelas com base nas condies de juno, comparando as suas colunas, e depois junta o
resultado com a outra tabela, com base nas condies de juno das colunas da outra tabela e
com as colunas do resultado. O Oracle continua este processo at que todas as tabelas
estejam associadas no resultado. O otimizador determina a ordem e junta as tabelas com base
nas condies de juno, nos ndices das tabelas e em todas as estatsticas disponveis para as
tabelas.
A clusula WHERE, que contm as condies de juno, tambm pode conter outras condies
que se referem s colunas das tabelas. Essas condies podem restringir ainda mais as linhas
retornadas pela consulta de juno.
Quando forem necessrios dados de mais de uma tabela na consulta, ser usada uma condio
de juno. As linhas de uma tabela podem ser unidas s linhas de outra tabela de acordo com
os valores comuns existentes nas colunas correspondentes, ou seja, em geral, colunas de
chave primria e chave estrangeira.
Para exibir dados de duas ou mais tabelas relacionadas, o usurio deve criar uma condio de
juno na clusula WHERE. A sintaxe da juno da Oracle :
tabela1.coluna
recuperados.
recuperados:
o
tabela EMPLOYEES
tabela DEPARTMENTS
employees.department_id=departments.department_id
Como a coluna DEPARTMENT_ID comum s duas tabelas, ela deve ser precedida do nome da
tabela, a fim de evitar ambiguidade.
Qualificando Nomes de Colunas Ambguos
O usurio precisa qualificar os nomes das colunas na clusula WHERE com o nome da tabela, a
fim de evitar ambiguidade. Sem os prefixos de tabela, a coluna DEPARTMENT_ID pode ser
proveniente tanto da tabela DEPARTMENTS quanto da tabela EMPLOYEES. necessrio, ainda,
adicionar o prefixo de tabela para executar a consulta.
Se no houver nomes de colunas comuns s duas tabelas, no haver necessidade de qualificar
as colunas. No entanto, o uso do prefixo de tabela melhora o desempenho, pois informa ao
Oracle Server exatamente onde localizar as colunas.
A necessidade de qualificar nomes de colunas ambguos tambm se aplica s colunas que
possam ser ambguas em outras clusulas, como na clusula SELECT ou na clusula ORDER BY.
Condies de Pesquisa Adicionais
Alm da juno, possvel usar critrios para a clusula WHERE, a fim de restringir as linhas a
serem consideradas para uma ou mais tabelas da juno. Por exemplo, para exibir o nmero e
o nome do departamento do funcionrio Matos, necessria uma condio adicional na
clusula WHERE.
SELECT
last_name,
employees.department_id,
department_name
FROM employees, departments
WHERE
employees.department_id
=
departments.department_id
AND last_name = 'Matos';
Equijuno;
No-equijuno;
Juno externa e,
Autojuno.
Junes hbridas;
Junes naturais;
Clusula Using;
1.4 Equijunes
O relacionamento entre duas tabelas uma equijuno quando os valores nas colunas
utilizadas para juno so iguais. Geralmente, esse tipo de juno envolve colunas que sejam
chave primria e chave estrangeira. As equijunes tambm so denominadas junes simples
ou junes internas. Por exemplo:
1.5 No-equijunes
JOB_GRADES
Caso uma linha no atenda a uma condio de juno, ela no aparecer no resultado da
consulta. Por exemplo:
Na
condio
de
equijuno
das tabelas
EMPLOYEES e DEPARTMENTS, no h
funcionrios
os para o departamento 190
forma, esse departamento no aparecer
a
no resultado da juno.
e, dessa
As linhas ausentes podem ser retornadas se um operador de juno externa for usado na
condio de juno. O operador um sinal de mais entre parnteses (+) e colocado ao "lado"
da juno com informaes incompletas. Esse operador tem a funo de criar uma ou mais
linhas nulas, s quais podem ser unidas uma ou mais linhas da tabela completa.
Na sintaxe:
tabela2.coluna(+)
Exibe
xibe os sobrenomes dos funcionrios, os IDs e os nomes de departamento. O departamento
de contratao (Contacting) no tem funcionrios e ento o valor em branco mostrado na
sada exibida.
9
1.7 Autojunes
Autojuno permite a juno de uma tabela com ela mesma.. Por exemplo, para localizar o
nomee do gerente de cada funcionrio, necessrio unir a tabela EMPLOYEES a ela mesma ou
executar uma autojuno. Por exemplo:
1.8 Juno
no com a sintaxe da SQL 1999
NATURAL JOIN: une as duas tabelas com base no mesmo nome de coluna;
No Oracle10g, possvel deixar que a juno seja concluda automaticamente com base nas
colunas com nomes e tipos de dados correspondentes nas duas tabelas. Para isso, basta usar
as palavras-chave NATURAL JOIN. A juno s poder ocorrer nas colunas com os mesmos
nomes e tipos de dados nas duas tabelas. Se as colunas tiverem o mesmo nome, mas tipos de
dados diferentes, a sintaxe NATURAL JOIN ocasionar um erro.
Exemplo da juno natural:
As restries adicionais em uma juno natural so implementadas por meio de uma clusula
WHERE. Conforme pode ser observado, a consulta restringe as linhas da sada que tem um ID
de departamento igual a 20 ou 50.
11
As junes naturais, conforme visto anteriormente, usam todas as colunas com nomes e tipos
de dados correspondentes para unir as tabelas. A clusula USING pode ser utilizada para
especificar apenas as colunas que devem ser usadas em uma equijuno. As colunas s quais a
clusula USING faz referncia no devem ter um qualificador (apelido ou nome de tabela) em
nenhuma parte da instruo SQL.
Por exemplo, essa instruo vlida:
1.11 Clusula ON
A clusula ON deve ser utilizada para especificar uma condio de juno. Isso permite que o
usurio especifique condies de juno separadas de qualquer condio de pesquisa ou de
filtro na clusula WHERE. Isso permite que a condio de juno seja separada de outras
condies de pesquisa. Dessa forma, pode-se dizer que a clusula ON facilita a compreenso
do cdigo. Por exemplo:
12
d.department_id,
A clusula ON tambm pode ser usada para autojuno, ou seja, juno de uma tabela com ela
mesma quando as colunas possuem nomes diferentes:
A clusula ON tambm pode ser utilizada em uma juno tripla. Uma juno tripla consiste de
uma juno que une trs tabelas. Na sintaxe compatvel com SQL: 1999, as junes so
efetuadas da esquerda para a direita; sendo assim, a primeira juno a ser feita EMPLOYEES
JOIN DEPARTMENTS.
13
A primeira condio de juno pode fazer referncia a colunas nas tabelas EMPLOYEES e
DEPARTMENTS, mas no a colunas na tabela LOCATIONS. A segunda condio de juno pode
fazer referncia a colunas de todas as trs tabelas.
Esse tipo de consulta tambm pode ser expresso como uma equijuno tripla:
14