Prévia do material em texto
BANCO DE DADOS JUNÇÃO DE TABELAS INNER JOIN Prof Luiz Antonio Gobitta ESTRUTURA DO BANCO DE DADOS JUNÇÃO DE TABELAS Imagine que desejamos emitir um relatório contendo sobrenome e salário dos funcionários e o nome do departamento em que ele trabalha. Ao verificarmos na base vemos que o sobrenome e o salário estão na tabela Funcionários e o nome do departamento está na tabela departamentos. Notamos também que a relação entre estas duas tabelas (entidades) é 1 departamento tem n funcionários, portanto vemos que na tabela Funcionários temos uma chave estrangeira que é o código do departamento. Junção Interna - INNER JOIN A junção interna (inner join) é um comando para juntar 2 tabelas, sendo sua sintaxe: SELECT col1, col2, ..., coln FROM tabela1 INNER JOIN tabela2 ON tabela1.chave = tabela2.chave Então precisamos juntar as informações da tabela Funcionários com a informação da tabela departamentos: SELECT last_name, salary, department_name FROM hr.employees INNER JOIN hr.departments ON hr.employees.department_id = hr.departments.department_id; Como department_id está presente nas 2 tabelas (mesmo nome), temos que informar a qual tabela nos referimos. • Desta forma podemos juntar quantas tabelas forem necessárias, 2, 3, 4 ou mais. Para isso, devemos colocar o primeiro INNER JOIN com 2 tabelas e depois mais um INNER JOIN com a terceira tabela e etc... • Inner Join: retorna os registros que são comuns às duas tabelas envolvidas. • Para o SQL SERVER e ORACLE, podemos usar INNER JOIN ou somente JOIN. Exemplos Crie uma query que mostre os sobrenomes dos funcionários, os cargos e as respectivas descrições de cargo. select F.last_name, F.job_id, C.job_title from hr.employees F INNER JOIN hr.jobs C ON F.job_id = C.job_id Crie uma consulta para o RH a fim de gerar os endereços de todas as unidades (filiais) da empresa. Mostre o ID do local, o endereço, a cidade, o estado e o país do depto. select L.location_id, L.street_address, L.city, L.state_province, P.country_name from hr.locations L INNER JOIN hr.countries P ON L.country_id = P.country_id Exemplos O RH precisa de um relatório sobre os funcionários e os seus respectivos departamentos. Crie uma consuta que exiba o sobrenome, o salário, o nome do departamento e a descrição de cargo para todos os funcionários. select F.last_name, F.salary, D.department_name, C.job_title from hr.employees F JOIN hr.departments D ON F.department_id = D.department_id JOIN hr.jobs C ON F.job_id = C.job_id Note que as duas junções de tabela são representadas com um JOIN após o outro. O primeiro JOIN cria uma "tabela" virtual reunindo 'hr.employees' e 'hr.departments'. O segundo reúne essa tabela virtual à tabela ‘hr.jobs‘. Exemplos O RH precisa de um relatório sobre os funcionários e os seus respectivos departamentos. Crie uma consuta que exiba o sobrenome, o salário, o nome do departamento e a descrição de cargo somente para os funcionários com salário entre 2000 e 4000. select F.last_name, F.salary, D.department_name, C.job_title from hr.employees F JOIN hr.departments D ON F.department_id = D.department_id JOIN hr.jobs C on F.job_id = C.job_id where salary between 2000 and 4000 Exemplos O RH precisa de um relatório dos funcionários em South San Francisco. Exiba o sobrenome, o cargo, o nome do departamento e a cidade de todos os funcionários que trabalham na cidade de South San Francisco. select F.last_name, D.department_name, C.job_title, L.city from hr.employees F JOIN hr.departments D ON F.department_id = D.department_id JOIN hr.jobs C ON F.job_id = C.job_id JOIN hr.locations L ON D.location_id = L.location_id WHERE L.city = 'South San Francisco' Exemplos Crie uma query que exiba os nomes de cada um dos departamentos e a respectiva média salarial para os departament0s com média salarial maior que 3.900. select D.department_name, avg(F.salary) from hr.employees F JOIN hr.departments D ON F.department_id = D.department_id group by D.department_name having avg(F.salary) > 3900 EXEMPLOS Crie uma query que exiba o primeiro nome, o sobrenome e a descrição do cargo dos funcionários, o nome dos departamentos, o nome do pais e o nome da região aonde estes funcionários trabalham. select F.first_name, F.last_name, C.job_title, D.department_name, P.country_name, R.region_name from hr.employees F JOIN hr.departments D ON F.department_id = D.department_id JOIN hr.jobs C on F.job_id = C.job_id JOIN hr.locations L on D.location_id = L.location_id JOIN hr.countries P on L.country_id = P.country_id JOIN hr.regions R on P.region_id = R.region_id