Objetivos Obtendo Dados de Várias Tabelas Produtos Cartesianos

Propaganda
Banco de Dados
Banco de Dados
Objetivos
Obtendo Dados de Várias Tabelas
Ao concluir esta lição, você será capaz de:
• Criar instruções SELECT para acessar dados de mais
de uma tabela com equijoins e não-equijoins
•
Usar joins externas para exibir dados que
geralmente não atendem a uma condição de join
•
Juntar uma tabela a si própria com uma auto-join
EMPLOYEES
DEPARTMENTS
…
…
Prof. Vitor Mazzon
C-1
Prof. Vitor Mazzon
C-2
Banco de Dados
Banco de Dados
Produtos Cartesianos
•
•
Gerando um Produto Cartesiano
Um produto cartesiano será formado quando:
EMPLOYEES (20 linhas)
–
–
–
…
DEPARTMENTS (8 linhas)
Uma condição de join for omitida
Uma condição de join for inválida
Todas as linhas da primeira tabela se unirem a todas
as linhas da segunda tabela
Para evitar um produto cartesiano, inclua sempre
uma condição de join válida na cláusula WHERE.
Produto cartesiano:
20 x 8 = 160 linhas
…
Prof. Vitor Mazzon
C-3
Prof. Vitor Mazzon
C-4
1
Banco de Dados
Banco de Dados
Tipos de Join
Joins de propriedade Oracle
(8i e releases anteriores)
•
•
•
•
Equijoin
Não-equijoin
Join externa
Auto-join
Unindo Tabelas com a Sintaxe Oracle
Joins compatíveis com o
SQL:1999
•
•
•
•
Join cruzada
•
Condição arbitrária
de join para join
externa
Use uma join para consultar dados de mais de uma
tabela:
SELECT
FROM
WHERE
Join natural
Cláusula USING
•
•
Join externa integral
(ou de dois lados)
table1.column, table2.column
table1, table2
table1.column1 = table2.column2;
Crie a condição de join na cláusula WHERE.
Adicione o nome da tabela como prefixo ao nome da
coluna quando o mesmo nome de coluna aparecer
em mais de uma tabela.
Prof. Vitor Mazzon
C-5
Prof. Vitor Mazzon
C-6
Banco de Dados
Banco de Dados
Equijoins
Recuperando Registros
com Equijoins
EMPLOYEES
DEPARTMENTS
…
…
Chave estrangeira
SELECT employees.employee_id, employees.last_name,
employees.department_id, departments.department_id,
departments.location_id
FROM
employees, departments
WHERE employees.department_id = departments.department_id;
…
Chave primária
Prof. Vitor Mazzon
C-7
Prof. Vitor Mazzon
C-8
2
Banco de Dados
Banco de Dados
Condições Adicionais de Pesquisa
com o Operador AND
EMPLOYEES
Qualificando Nomes de Colunas Ambíguos
DEPARTMENTS
•
Use prefixos de tabela para qualificar nomes de
colunas presentes em várias tabelas.
•
•
Use prefixos de tabela para melhorar o desempenho.
Use apelidos de colunas para diferenciar colunas
com nomes idênticos, mas localizadas em tabelas
distintas.
…
…
Prof. Vitor Mazzon
C-9
Prof. Vitor Mazzon
C-10
Banco de Dados
Banco de Dados
Usando Apelidos de Tabelas
•
•
Use apelidos de tabelas para simplificar consultas.
Unindo Mais de Duas Tabelas
EMPLOYEES
DEPARTMENTS
LOCATIONS
Use prefixos de tabela para melhorar o desempenho.
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM
employees e , departments d
WHERE e.department_id = d.department_id;
…
Prof. Vitor Mazzon
C-11
Para unir n tabelas, você precisa de, pelo menos,
n–1 condições de join. Por exemplo, para unir três
tabelas, são necessárias, no mínimo, duas joins.
Prof. Vitor Mazzon
C-12
3
Banco de Dados
Banco de Dados
Não-Equijoins
EMPLOYEES
…
Recuperando Registros
com Não-Equijoins
JOB_GRADES
SELECT e.last_name, e.salary, j.grade_level
FROM
employees e, job_grades j
WHERE e.salary
BETWEEN j.lowest_sal AND j.highest_sal;
O salário na tabela EMPLOYEES
deve estar compreendido entre
o menor e o maior salário na
tabela JOB_GRADES.
…
Prof. Vitor Mazzon
C-13
Prof. Vitor Mazzon
C-14
Banco de Dados
Banco de Dados
Joins Externas
DEPARTMENTS
Sintaxe de Joins Externas
EMPLOYEES
•
Use uma join externa para ver as linhas que não
atendem à condição de join.
•
O operador de join externa é o sinal de adição (+).
SELECT table1.column, table2.column
FROM
table1, table2
WHERE table1.column(+) = table2.column;
SELECT table1.column, table2.column
FROM
table1, table2
WHERE table1.column = table2.column(+);
…
Não há funcionários
no departamento 190.
Prof. Vitor Mazzon
C-15
Prof. Vitor Mazzon
C-16
4
Banco de Dados
Banco de Dados
Usando Joins Externas
Auto-Joins
SELECT e.last_name, e.department_id, d.department_name
FROM
employees e, departments d
WHERE
EMPLOYEES (WORKER)
EMPLOYEES (MANAGER)
…
…
e.department_id(+) = d.department_id ;
…
MANAGER_ID na tabela WORKER é igual a
EMPLOYEE_ID na tabela MANAGER.
Prof. Vitor Mazzon
C-17
Prof. Vitor Mazzon
C-18
Banco de Dados
Banco de Dados
Unindo uma Tabela a Ela Própria
SELECT worker.last_name || ' works for '
|| manager.last_name
FROM
employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;
Sumário
Neste apêndice, você aprendeu a usar joins para exibir
dados de várias tabelas com a sintaxe.
…
Prof. Vitor Mazzon
C-19
Prof. Vitor Mazzon
C-20
5
Download