Exibindo Dados de Várias Tabelas
4-2
Obtendo Dados de Várias Tabelas
EMPLOYEES DEPARTMENTS
…
…
4-3
Produtos Cartesianos
•
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áusulaWHERE.4-4
Gerando um Produto Cartesiano
Produto cartesiano:
20x8=160 linhas
EMPLOYEES (20 linhas) DEPARTMENTS (8 linhas)
…
…
Unindo Tabelas
Usar uma junção para consultar dados de uma ou mais tabelas.
•
Crie uma condição de junção na cláusulaWHERE.•
Coloque o nome da tabela antes do nome da coluna quando aparecer o mesmo nome de coluna em mais de uma tabela.SELECT tabela1.coluna, tabela2.coluna FROM tabela1, tabela2
WHERE tabela1.coluna1 = tabela2.coluna2;
O Que é uma Eqüijunção?
EMPLOYEES DEPARTMENTS
Chave estrangeira
Chave primária
… …
4-7
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;
Recuperando Registros com Eqüijunções
…
4-8
Qualificando Nomes de Colunas Ambíguos
•
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-9
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;
Usando Apelidos de Tabela
•
Simplifique consultas usando apelidos de tabela.•
Melhore o desempenho usando prefixos de tabela.4-10
Unindo Mais de Duas Tabelas
EMPLOYEES DEPARTMENTS LOCATIONS
•
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-11
Autojunções
EMPLOYEES (WORKER) EMPLOYEES (MANAGER)
MANAGER_IDna tabelaWORKERé igual a EMPLOYEE_IDna tabelaMANAGER.
… …
4-12
Unindo uma Tabela a ela Mesma
SELECT worker.last_name || ' works for '
|| manager.last_name
FROM employees worker, employees manager WHERE worker.manager_id = manager.employee_id ;
…
4-13
Unindo Tabelas Usando a Sintaxe SQL: 1999
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)];
4-14
Criando Junções Híbridas
•
A cláusulaCROSS JOINcria 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-15
Criando Junções Naturais
•
A cláusulaNATURAL JOINbaseia-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.4-16
SELECT department_id, department_name, location_id, city
FROM departments NATURAL JOIN locations ;
Recuperando Registros com Junções Naturais
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áusulaNATURAL JOINpoderá ser modificada com a cláusulaUSINGpara especificar as colunas que devem ser usadas em uma eqüijunção.•
Usar a cláusulaUSINGpara 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áusulasNATURAL JOINe USINGsão mutuamente excludentes.SELECT e.employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING (department_id) ;
Recuperando Registros com a Cláusula USING
…
4-19
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áusulaON.•
A condição de junção é separada de outras condições de pesquisa.•
A cláusulaONfacilita a compreensão do código.4-20
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id
FROM employees e JOIN departments d ON (e.department_id = d.department_id) ;
Recuperando Registros com a Cláusula ON
…
4-21
Criando Junções Triplas com a Cláusula ON
SELECT employee_id, city, department_name FROM employees e
JOIN departments d
ON d.department_id = e.department_id JOIN locations l
ON d.location_id = l.location_id;
…
4-22
Junções INNER Versus OUTER
•
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-23
SELECT e.last_name, e.department_id, d.department_name FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
LEFT OUTER JOIN
…
4-24
SELECT e.last_name, e.department_id, d.department_name FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
RIGHT OUTER JOIN
…
4-25
SELECT e.last_name, e.department_id, d.department_name FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
FULL OUTER JOIN
…
4-26
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id
FROM employees e JOIN departments d ON (e.department_id = d.department_id) AND e.manager_id = 149 ;
Condições Adicionais
4-27