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