EXIBINDO DADOS DE VÁRIAS TABELAS
Há situações em que precisamos buscar dados de várias tabelas, onde um select simples não consegue obter esses dados;
Nesses casos, é necessário utilizar dados a partir de uma ou mais tabelas;
Para isso, precisamos fazer junção de tabelas;
O QUE É JUNÇÃO?
Use a junção para consultar dados a partir de uma ou mais tabelas;
Criar uma condição de junção na cláusula WHERE;
Prefixar o nome da coluna com o nome da tabela quando o mesmo nome da coluna aparecer em mais de uma tabela
Exemplo de junção
SQL> SELECT tabela1.coluna, tabela2.coluna
2 FROM tabela1, tabela2
3 WHERE tabela1.coluna = tabela2.coluna;
USANDO O SCHEMA HR DO ORACLE
PRODUTO CARTESIANO
Um produto cartesiano é formado quando:
– Uma condição de junção estiver omitida;
– Uma condição de junção estiver inválida;
– Todas as linhas na primeira tabela estão unidas a todas as linhas da segunda tabelas;
Para evitar um produto Cartesiano, sempre inclua uma condição de junção válida em uma cláusula WHERE;
GERANDO UM PRODUTO CARTESIANO
Gera-se um produto cartesiano caso uma condição de junção seja omitida.
SQL> SELECT FIRST_NAME,
2 DEPARTMENT_NAME
3 FROM EMPLOYEES,
4 DEPARTMENTS;
TIPOS DE JUNÇÃO
Há dois tipos principais de condições de junção:
– Junção idênticas;
– Junção não-idêntcias;
Métodos de junção adicional incluem:
– Junções externas;
– Autojunções;
– Operadores de conjunto;
JUNÇÃO IDÊNTICA
RECUPERANDO REGISTROS COM JUNÇÕES IDÊNTICAS
SQL>SELECT FIRST_NAME,
EMPLOYEES.DEPARTMENT_ID,
DEPARTMENTS.DEPARTMENT_ID,
DEPARTMENT_NAME
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID =
DEPARTMENTS.DEPARTMENT_ID;
QUALIFICANDO NOMES DE COLUNA AMBÍGUAS
Use os prefixos de tabela para qualificar nomes de colunas que estão em várias tabelas;
Diferencie colunas que possuem nomes idênticos, mas que residam em tabelas diferentes usando apelidos de coluna;
CONDIÇÕES DE PESQUISA ADICIONAIS USANDO O OPERADOR AND
Além da junção, é possível ter critérios para a cláusula WHERE;
SELECT EMPLOYEE_ID, FIRST_NAME,
DEPARTMENT_NAME
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID =
DEPARTMENTS.DEPARTMENT_ID
AND FIRST_NAME = 'Diana';
USANDO APELIDOS DE TABELA
Apelidos de tabelas podem ter um tamanho de até 30 caracteres;
Se um apelido de tabela for usado para um determinado nome de tabela na cláusula FROM, deve-se utilize-lo para toda a instrução SELECT;
Apelidos devem ser significativos;
O apelido de tabela é válido somente para a instrução SELECT atual;
USANDO APELIDOS DE TABELA
SELECT E.FIRST_NAME,
J.JOB_TITLE,
D.DEPARTMENT_NAME
FROM EMPLOYEES E,
JOBS J,
DEPARTMENTS D
WHERE E.JOB_ID = J.JOB_ID
AND E.DEPARTMENT_ID = D.DEPARTMENT_ID;
JUNÇÕES NÃO-IDÊNTICAS
O relacionamento de junção não-idênticas significa que não há nenhum coluna correspondente diretamente entre as duas tabelas;
SELECT E.FIRST_NAME, E.LAST_NAME,
E.SALARY, J.MIN_SALARY, J.MAX_SALARY,
J.JOB_TITLE
FROM EMPLOYEES E, JOBS J
WHERE E.SALARY
BETWEEN J.MIN_SALARY AND J.MAX_SALARY;
Se uma linha não satisfazer uma condição de junção, a linha não aparecerá no resultado da consulta.
Use uma junção externa para consultar também todas as linhas que em geral não atendem à condição de junção.
O operador de junção externo é um sinal de adição (+);
EXEMPLO DE JUNÇÕES EXTERNAS
SELECT E.FIRST_NAME,
D.DEPARTMENT_NAME
FROM EMPLOYEES E,
DEPARTMENTS D
WHERE E.DEPARTMENT_ID(+) =
D.DEPARTMENT_ID
O operador da junção externa pode aparecer somente de um lado da expressão – o lado que possui informações ausentes. Ele retorna estas linhas de uma tabela que não possui correspondênciadireta em outra tabela;
Uma condição envolvendo uma junção externa não pode usar o operador IN ou vincular a outra condição pelo operador OR;
AUTOJUNÇÕES
Algumas vezes será necessário unir uma tabela a ela mesma.
EXEMPLO DE AUTOJUNÇÕES
SELECT WORKER.FIRST_NAME
||' TRABALHA PARA ' ||
MANAGER.FIRST_NAME
FROM EMPLOYEES WORKER,
EMPLOYEES MANAGER
WHERE WORKER.MANAGER_ID =
MANAGER.EMPLOYEE_ID;