Obtendo Dados de Várias Tabelas EMPLOYEES DEPARTMENTS Exibindo Dados de Várias Tabelas 4-2 Produtos Cartesianos Gerando um Produto Cartesiano EMPLOYEES (20 linhas) DEPARTMENTS (8 linhas) Um produto cartesiano será formado quando: Uma condição de junção for omitida. Uma condição de junção for inválida. Todas as linhas da primeira tabela forem unidas a todas as linhas da segunda tabela. Para evitar um produto Cartesiano, sempre inclua uma condição de junção válida em uma cláusula WHERE. Produto cartesiano: 20x8=160 linhas 4-3 4-4 Unindo Tabelas EMPLOYEES O Que é uma Eqüijunção? DEPARTMENTS Usar uma junção para consultar dados de uma ou mais tabelas. SELECT FROM WHERE tabela1.coluna, tabela2.coluna tabela1, tabela2 tabela1.coluna1 = tabela2.coluna2; Crie uma condição de junção na cláusula WHERE. Coloque o nome da tabela antes do nome da coluna quando aparecer o mesmo nome de coluna em mais de uma tabela. Chave estrangeira Chave primária 4-5 4-6
Eqüijunções Qualificando Nomes de Colunas Ambíguos 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; Use prefixos de tabela para qualificar nomes de colunas que estão em várias tabelas. Melhore o desempenho usando prefixos de tabela. Diferencie colunas que possuem nomes idênticos, mas que residam em tabelas diferentes usando apelidos de coluna. 4-7 4-8 Usando Apelidos de Tabela Unindo Mais de Duas Tabelas EMPLOYEES DEPARTMENTS LOCATIONS Simplifique consultas usando apelidos de tabela. Melhore o desempenho usando prefixos de tabela., departments d WHERE e.department_id = d.department_id; Para unir n tabelas, é necessário um mínimo de n-1 condições de junção. Por exemplo, para unir três tabelas, é necessário um mínimo de duas junções. 4-9 4-10 Autojunções Unindo uma Tabela a ela Mesma EMPLOYEES (WORKER) EMPLOYEES (MANAGER) SELECT worker.last_name ' works for ' manager.last_name FROM employees worker, employees manager WHERE worker.manager_id = manager.employee_id ; MANAGER_ID na tabela WORKER é igual a EMPLOYEE_ID na tabela MANAGER. 4-11 4-12
Unindo Tabelas Usando a Sintaxe SQL: 1999 Criando Junções Híbridas Usar uma junção para consultar dados de uma ou mais tabelas. SELECT tabela1.coluna, tabela2.coluna FROM tabela1 [CROSS JOIN tabela2] [NATURAL JOIN tabela2] [JOIN tabela2 USING (nome_coluna)] [JOIN tabela2 ON(tabela1.nome_coluna = tabela2.nome_coluna)] [LEFT RIGHT FULL OUTER JOIN tabela2 ON (tabela1.nome_coluna = tabela2.nome_coluna)]; A cláusula CROSS JOIN cria o produto híbrido de duas tabelas. Esse processo equivale ao produto cartesiano entre as duas tabelas. SELECT last_name, department_name FROM employees CROSS JOIN departments ; 4-13 4-14 Criando Junções Naturais A cláusula NATURAL JOIN baseia-se em todas as colunas com o mesmo nome nas duas tabelas. Ela seleciona linhas das duas tabelas que têm valores iguais em todas as colunas correspondentes. Se as colunas com os mesmos nomes tiverem tipos de dados diferentes, será retornado um erro. Junções Naturais SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations ; 4-15 4-16 Criando Junções com a Cláusula USING Se várias colunas tiverem os mesmos nomes mas se os tipos de dados não forem correspondentes, a cláusula NATURAL JOIN poderá ser modificada com a cláusula USING para especificar as colunas que devem ser usadas em uma eqüijunção. Usar a cláusula USING para estabelecer a correspondência com apenas uma coluna quando mais de uma coluna for correspondente. Não usar um apelido ou nome de tabela nas colunas às quais foram feitas referências. As cláusulas NATURAL JOIN e USING são mutuamente excludentes. SELECT e.employee_id, e.last_name, d.location_id JOIN departments d USING (department_id) ; a Cláusula USING 4-17 4-18
Criando Junções com a Cláusula ON A condição da junção natural é basicamente uma eqüijunção de todas as colunas com o mesmo nome. Para especificar condições arbitrárias ou colunas a serem unidas, é usada a cláusula ON. A condição de junção é separada de outras condições de pesquisa. A cláusula ON facilita a compreensão do código. a Cláusula ON JOIN departments d 4-19 4-20 Criando Junções Triplas com a Cláusula ON Junções INNER Versus OUTER SELECT employee_id, city, department_name JOIN departments d ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id; Na sintaxe SQL: 1999, a junção de duas tabelas que retorna apenas linhas correspondentes é uma junção interna. Uma junção entre duas tabelas que retorna os resultados da junção interna assim como linhas não correspondentes em tabelas esquerdas (ou direitas) é uma junção externa esquerda (ou direita). Uma junção entre duas tabelas que retorna os resultados de uma junção interna assim como os resultados de uma junção esquerda ou direita é uma junção externa completa. 4-21 4-22 LEFT OUTER JOIN RIGHT OUTER JOIN LEFT OUTER JOIN departments d RIGHT OUTER JOIN departments d 4-23 4-24
FULL OUTER JOIN Condições Adicionais FULL OUTER JOIN departments d JOIN departments d ON (e.department_id = d.department_id) AND e.manager_id = 149 ; 4-25 4-26 Exercício Lista 3 4-27