LPBD / Ebd: Obtendo Dados de Várias Tabelas

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

LPBD / EBD

Junções de Tabelas (JOINs)

Obtendo Dados de Várias Tabelas

EMPLOYEES DEPARTMENTS

1
Análise de uma Junção
Exemplo: Tabelas Regions e Countries

Region_id Region_name Country_id Country_name Region_id


1 Europe AR Argentina 2
2 Americas AU Australia 3
3 Asia BR Brazil 2
4 Middle East and Africa CN China 3
DE Germany 1
DK Denmark 1
EG Egypt 4

Análise de uma Junção


PK R PK C FK
Region_id Region_name Country_id Country_name Region_id
SELECT 1
2
Europe
Americas
AR
AR
Argentina
Argentina
2
2
3 Asia AR Argentina 2
* 4 Middle East and Africa AR Argentina 2
1 Europe AU Australia 3

FROM 2
3
Americas
Asia
AU
AU
Australia
Australia
3
3
4 Middle East and Africa AU Australia 3
regions, 1 Europe BR Brazil 2
2 Americas BR Brazil 2
3 Asia BR Brazil 2
countries ; 4 Middle East and Africa BR Brazil 2
1 Europe CN China 3
2 Americas CN China 3
3 Asia CN China 3
4 Middle East and Africa CN China 3
PRODUTO 1 Europe DE Germany 1
2 Americas DE Germany 1

CARTESIANO !
3 Asia DE Germany 1
4 Middle East and Africa DE Germany 1
1 Europe DK Denmark 1
2 Americas DK Denmark 1
3 Asia DK Denmark 1
4 Middle East and Africa DK Denmark 1
1 Europe EG Egypt 4
2 Americas EG Egypt 4
3 Asia EG Egypt 4
4 Middle East and Africa EG Egypt 4

2
Análise de uma Junção
PK R PK C FK
Region_id Region_name Country_id Country_name Region_id
1 Europe AR Argentina 2 Quando:
2 Americas AR Argentina 2
3 Asia AR Argentina 2 Region_id(Regions) =
4 Middle East and Africa AR Argentina 2
1 Europe AU Australia 3 Region_id(Countries)
2 Americas AU Australia 3
3 Asia AU Australia 3 → CORRETO !
4 Middle East and Africa AU Australia 3
1 Europe BR Brazil 2
2 Americas BR Brazil 2
3 Asia BR Brazil 2
4 Middle East and Africa BR Brazil 2
1 Europe CN China 3
2 Americas CN China 3
3 Asia CN China 3
4 Middle East and Africa CN China 3
1 Europe DE Germany 1
2 Americas DE Germany 1
3 Asia DE Germany 1
4 Middle East and Africa DE Germany 1
1 Europe DK Denmark 1
2 Americas DK Denmark 1
3 Asia DK Denmark 1
4 Middle East and Africa DK Denmark 1
1 Europe EG Egypt 4
2 Americas EG Egypt 4
3 Asia EG Egypt 4
4 Middle East and Africa EG Egypt 4

Análise de uma Junção


SELECT *
FROM regions, countries
WHERE regions.region_id = countries.region_id;
(JOIN CLÁSSICO)

Region_id Region_name Country_id Country_name Region_id


2 Americas AR Argentina 2
3 Asia AU Australia 3
2 Americas BR Brazil 2
3 Asia CN China 3
1 Europe DE Germany 1
1 Europe DK Denmark 1
4 Middle East and Africa EG Egypt 4

3
Recuperando Registros com Joins
“Clássicos”

SELECT d.department_id, d.department_name,


d.location_id, l.city
FROM departments d, locations l
WHERE l.location_id = d.location_id;

Recuperando Registros com INNER JOINs

SELECT d.department_id, d.department_name,


d.location_id, l.city
FROM departments d INNER JOIN locations l
ON l.location_id = d.location_id;

4
Aplicando Outras Condições a uma INNER
JOIN
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 ;

Recuperando Registros (Exemplo 2)

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id, d.department_name
FROM employees e , departments d
WHERE e.department_id = d.department_id
AND d.department_name NOT IN (‘Sales’,’Shipping’);

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id, d.department_name
FROM employees e INNER JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name NOT IN (‘Sales’,’Shipping’);

5
Employee_id last_name department_id department_id location_id department_name
100 King 90 90 1700 Executive
101 Kochhar 90 90 1700 Executive
102 De Haan 90 90 1700 Executive
103 Hunold 60 60 1400 IT
104 Ernst 60 60 1400 IT
105 Austin 60 60 1400 IT
106 Pataballa 60 60 1400 IT
107 Lorentz 60 60 1400 IT
108 Greenberg 100 100 1700 Finance
109 Faviet 100 100 1700 Finance
110 Chen 100 100 1700 Finance
111 Sciarra 100 100 1700 Finance
112 Urman 100 100 1700 Finance
113 Popp 100 100 1700 Finance
114 Raphaely 30 30 1700 Purchasing
115 Khoo 30 30 1700 Purchasing
116 Baida 30 30 1700 Purchasing
117 Tobias 30 30 1700 Purchasing
118 Himuro 30 30 1700 Purchasing
119 Colmenares 30 30 1700 Purchasing
200 Whalen 10 10 1700 Administration
201 Hartstein 20 20 1800 Marketing
202 Fay 20 20 1800 Marketing
203 Mavris 40 40 2400 Human Resources
204 Baer 70 70 2700 Public Relations
205 Higgins 110 110 1700 Accounting
206 Gietz 110 110 1700 Accounting

Criando Joins Tridimensionais (Junção de


3 tabelas)
SELECT e.employee_id, l.city, d.department_name
FROM employees e
INNER JOIN departments d
ON d.department_id = e.department_id
INNER JOIN locations l
ON l.location_id = d.location_id;

6
Exemplo 1: O RH precisa de um relatório com os seguintes dados de
cada funcionário: Nome e sobrenome, Salário, Cargo, Data de admissão,
Nome do Depto, (Cidade, Estado, País e Continente do Depto ).
Ordenação por nome do funcionário.

SELECT
concat(e.first_name,' ',e.last_name),
e.salary, e.job_id, e.hire_date,
d.department_name,
l.city, l.state_province,
c.country_name,
r.region_name
FROM
employees e
INNER JOIN departments d ON d.department_id=e.department_id
INNER JOIN locations l ON l.location_id=d.location_id
INNER JOIN countries c ON c.country_id=l.country_id
INNER JOIN regions r ON r.region_id=c.region_id
order by e.first_name;

7
Exemplo 2: O RH precisa de um relatório com os seguintes dados dos
funcionários com nome iniciado pela letra K: Sobrenome, Salário, Cargo,
Data de admissão, Nome do Depto, (Cidade, Estado, País e Continente
do Depto ). Ordenação por nome do funcionário.

SELECT
e.last_name, e.salary, e.job_id, e.hire_date,
d.department_name,
l.city, l.state_province,
c.country_name,
r.region_name
FROM
employees e
INNER JOIN departments d ON d.department_id=e.department_id
INNER JOIN locations l ON l.location_id=d.location_id
INNER JOIN countries c ON c.country_id=l.country_id
INNER JOIN regions r ON r.region_id=c.region_id
WHERE e.last_name like ‘K%’
order by e.first_name;

Não-Equijoins

EMPLOYEES JOB_GRADES

O salário na tabela EMPLOYEES


deve estar compreendido entre
… o menor e o maior salário na
tabela JOB_GRADES.

8
Recuperando Registros com Não-Equijoins

SELECT e.last_name, e.salary, j.grade_level


FROM employees e JOIN job_grades j
ON e.salary
BETWEEN j.lowest_sal AND j.highest_sal;

Joins Externas

DEPARTMENTS EMPLOYEES

Não há funcionários no
departamento 190 na Tabela
EMPLOYEES (Não aparece no JOIN)

9
LEFT OUTER JOIN
Esta consulta recupera todas as linhas da tabela EMPLOYEES, mesmo quando
não há correspondência na tabela DEPARTMENTS.
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) ;

RIGHT OUTER JOIN


Esta consulta recupera todas as linhas da tabela DEPARTMENTS, mesmo
quando não há correspondência na tabela EMPLOYEES.

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) ;

10
FULL OUTER JOIN (MySQL não possui)
Esta consulta recupera todas as linhas da tabela EMPLOYEES, mesmo quando não
há correspondência na tabela DEPARTMENTS. Ela também recupera todas as
linhas da tabela DEPARTMENTS, mesmo quando não há correspondência na tabela
EMPLOYEES.
SELECT e.last_name, d.department_id, d.department_name
FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

Gerando um Produto Cartesiano

EMPLOYEES (20 linhas) DEPARTMENTS (8 linhas)

Produto cartesiano:
20 x 8 = 160 linhas

11
Criando Joins Cruzadas
• A cláusula CROSS JOIN gera o produto cruzado de
duas tabelas.
• Ele também é chamado de produto cartesiano entre
as duas tabelas.
SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;

SELECT last_name, department_name


FROM employees, departments;

Criando uma Tabela


com uma Consulta

CREATE TABLE dept80


AS
SELECT employee_id, last_name,
salary*12 as ANNSAL,
hire_date
FROM employees
WHERE department_id = 80;
Table created.

DESCRIBE dept80

12

You might also like