Prévia do material em texto
BANCO DE DADOS Junções Cícero Alves da Silva cicero.alves@ifpb.edu.br Catolé do Rocha Objetivo • Aprender a utilizar os diferentes tipos de junções Banco de Dados pratica Tabelas Utilizadas nos Exemplos da Aula cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 funcionario cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 departamento Junção • P o s s í v e l s o l u ç ã o q u a n d o é necessário realizar um consulta envolvendo mais de uma tabela • Isso é feito utilizando o comando SELECT Junção • Para fazer um consulta envolvendo mais de uma tabela, relaciona-se a chave primária de uma tabela com a chave estrangeira de outra tabela Banco de Dados pratica Tabelas Utilizadas nos Exemplos da Aula cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 funcionario cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 departamento Tipos de Junções • CROSS JOIN (Junção cruzada) • INNER JOIN (Junção interna) • OUTER JOIN (Junção externa) • LEFT OUTER JOIN ( Junção externa esquerda) • RIGHT OUTER JOIN (Junção externa direita) CROSS JOIN • Em português, junção cruzada • Sintaxe SELECT colunas FROM tabela_esquerda CROSS JOIN tabela_direita; • Nesse tipo de junção, são combinadas todas as tuplas da tabela da esquerda, com todas as tuplas da tabela da direita CROSS JOIN Tabela Esquerda Tabela Direita CROSS JOIN • Selecione as descrições de todos os departamentos, relacionando-as com cada nome de funcionário. funcionario cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 departamento cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 CROSS JOIN • Selecione as descrições de todos os departamentos, relacionando-as com cada nome de funcionário. SELECT d.descricao, f.nome FROM departamento d CROSS JOIN funcionario f; CROSS JOIN SELECT d.descricao, f.nome FROM departamento d CROSS JOIN funcionario f; f cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 d cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 CROSS JOIN SELECT d.descricao, f.nome FROM departamento d CROSS JOIN funcionario f; f cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 d cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 CROSS JOIN cod_dep descricao localizacao cod_func nome dt_nascimento salario cod_dep 1 Análise Sala B2-30 1 Maria 1980-01-01 3000 NULL 2 Contabilidade Sala B1-15 1 Maria 1980-01-01 3000 NULL 3 RH Sala B2-15 1 Maria 1980-01-01 3000 NULL 1 Análise Sala B2-30 2 Ana 1980-01-01 2500 2 2 Contabilidade Sala B1-15 2 Ana 1980-01-01 2500 2 3 RH Sala B2-15 2 Ana 1980-01-01 2500 2 1 Análise Sala B2-30 3 José 1970-06-01 1500 2 2 Contabilidade Sala B1-15 3 José 1970-06-01 1500 2 3 RH Sala B2-15 3 José 1970-06-01 1500 2 1 Análise Sala B2-30 4 Pedro 1980-06-01 4000 3 2 Contabilidade Sala B1-15 4 Pedro 1980-06-01 4000 3 3 RH Sala B2-15 4 Pedro 1980-06-01 4000 3 1 Análise Sala B2-30 5 João 1990-06-01 3000 3 2 Contabilidade Sala B1-15 5 João 1990-06-01 3000 3 3 RH Sala B2-15 5 João 1990-06-01 3000 3 1 Análise Sala B2-30 6 Matheus 1990-09-01 2000 2 2 Contabilidade Sala B1-15 6 Matheus 1990-09-01 2000 2 3 RH Sala B2-15 6 Matheus 1990-09-01 2000 2 CROSS JOIN SELECT d.descricao, f.nome FROM departamento d CROSS JOIN funcionario f; descricao nome Análise Maria Contabilidade Maria RH Maria Análise Ana Contabilidade Ana RH Ana Análise José Contabilidade José RH José Análise Pedro Contabilidade Pedro RH Pedro Análise João Contabilidade João RH João Análise Matheus Contabilidade Matheus RH Matheus INNER JOIN • Em português, junção interna • Sintaxe SELECT colunas FROM tabela_esquerda INNER JOIN tabela_direita ON cláusula_de_junção; • Nesse tipo de junção, são combinadas apenas as tuplas da tabela da esquerda com tuplas da tabela da direita que atendam à cláusula de junção INNER JOIN Tabela Esquerda Tabela Direita INNER JOIN Selecione o nome dos funcionários q u e e s t ã o a l o c a d o s e m departamentos e a descrição dos respectivos departamentos. funcionario cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 departamento cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 INNER JOIN Selecione o nome dos funcionários que estão alocados em departamentos e a d e s c r i ç ã o d o s r e s p e c t i v o s departamentos. SELECT f.nome, d.descricao FROM departamento d INNER JOIN funcionario f ON d.cod_dep = f.cod_dep; INNER JOIN SELECT f.nome, d.descricao FROM departamento d INNER JOIN funcionario f ON d.cod_dep = f.cod_dep; f cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 d cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 INNER JOIN SELECT f.nome, d.descricao FROM departamento d INNER JOIN funcionario f ON d.cod_dep = f.cod_dep; cod_dep descricao localizacao cod_func nome dt_nascimento salario cod_dep 2 Contabilidade Sala B1-15 2 Ana 1980-01-01 2500 2 2 Contabilidade Sala B1-15 3 José 1970-06-01 1500 2 3 RH Sala B2-15 4 Pedro 1980-06-01 4000 3 3 RH Sala B2-15 5 João 1990-06-01 3000 3 2 Contabilidade Sala B1-15 6 Matheus 1990-09-01 2000 2 f cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 d cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 INNER JOIN SELECT f.nome, d.descricao FROM departamento d INNER JOIN funcionario f ON d.cod_dep = f.cod_dep; nome descricao Ana Contabilidade José Contabilidade Pedro RH João RH Matheus Contabilidade cod_dep descricao localizacao cod_func nome dt_nascimento salario cod_dep 2 Contabilidade Sala B1-15 2 Ana 1980-01-01 2500 2 2 Contabilidade Sala B1-15 3 José 1970-06-01 1500 2 3 RH Sala B2-15 4 Pedro 1980-06-01 4000 3 3 RH Sala B2-15 5 João 1990-06-01 3000 3 2 Contabilidade Sala B1-15 6 Matheus 1990-09-01 2000 2 OUTER JOIN • Em português, junção externa • Nesse t ipo de junção, podem aparecer no resultado tuplas de uma tabela que não possuam tuplas relacionadas na outra tabela LEFT OUTER JOIN • Em português, junção externa à esquerda • Sintaxe SELECT colunas FROM tabela_esquerda LEFT OUTER JOIN tabela_direita ON cláusula_de_junção; • Nesse tipo de junção, são combinadas todas as tuplas da tabela da esquerda, com as tuplas correspondentes na tabela da direita ou NULL LEFT OUTER JOIN Tabela Esquerda Tabela Direita LEFT OUTER JOIN Selec ione as descr ições de todos os departamentos cadastrados no BD. Para aqueles que possuam func ionár ios , também apresentar o nome do funcionário.funcionariodepartamento cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 LEFT OUTER JOIN S e l e c i o n e a s d e s c r i ç õ e s d e t o d o s o s departamentos cadastrados no BD. Para aqueles que possuam funcionários, também apresentar o nome do funcionário. SELECT d.descricao, f.nome FROM departamento d LEFT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; SELECT d.descricao, f.nome FROM departamento d LEFT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; LEFT OUTER JOIN fd cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 LEFT OUTER JOIN SELECT d.descricao, f.nome FROM departamento d LEFT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; cod_dep descricao localizacao cod_func nome dt_nascimento salario cod_dep 1 Análise Sala B2-30 NULL NULL NULL NULL NULL 2 Contabilidade Sala B1-15 2 Ana 1980-01-01 2500 2 2 Contabilidade Sala B1-15 3 José 1970-06-01 1500 2 2 Contabilidade Sala B1-15 6 Matheus 1990-09-01 2000 2 3 RH Sala B2-15 4 Pedro 1980-06-01 4000 3 3 RH Sala B2-15 5 João 1990-06-01 3000 3 cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 f d SELECT d.descricao, f.nome FROM departamento d LEFT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; LEFT OUTER JOIN descricao nome Análise NULL Contabilidade Ana Contabilidade José Contabilidade Matheus RH Pedro RH João cod_dep descricao localizacao cod_func nome dt_nascimento salario cod_dep 1 Análise Sala B2-30 NULL NULL NULL NULL NULL 2 Contabilidade Sala B1-15 2 Ana 1980-01-01 2500 2 2 Contabilidade Sala B1-15 3 José 1970-06-01 1500 2 2 Contabilidade Sala B1-15 6 Matheus 1990-09-01 2000 2 3 RH Sala B2-15 4 Pedro 1980-06-01 4000 3 3 RH Sala B2-15 5 João 1990-06-01 3000 3 RIGHT OUTER JOIN • Em português, junção externa à direita • Sintaxe SELECT colunas FROM tabela_esquerda RIGHT OUTER JOIN tabela_direita ON cláusula_de_junção; • Nesse tipo de junção, são combinadas todas as tuplas da tabela da direita, com as tuplas correspondentes na tabela da esquerda ou NULL RIGHT OUTER JOIN Tabela Esquerda Tabela Direita RIGHT OUTER JOIN S e l e c i o n e o s n o m e s d e t o d o s o s funcionários cadastrados no BD. Para a q u e l e s q u e e s t e j a m a l o c a d o s e m departamentos, também apresentar a descrição do departamento. funcionariodepartamento cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 RIGHT OUTER JOIN Selecione os nomes de todos os funcionários cadastrados no BD. Para aqueles que estejam a locados em departamentos , também apresentar a descrição do departamento. SELECT f.nome, d.descricao FROM departamento d RIGHT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; RIGHT OUTER JOIN SELECT f.nome, d.descricao FROM departamento d RIGHT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; fd cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 RIGHT OUTER JOIN SELECT f.nome, d.descricao FROM departamento d RIGHT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; cod_dep descricao localizacao cod_func nome dt_nascimento salario cod_dep NULL NULL NULL 1 Maria 1980-01-01 3000 NULL 2 Contabilidade Sala B1-15 2 Ana 1980-01-01 2500 2 2 Contabilidade Sala B1-15 3 José 1970-06-01 1500 2 3 RH Sala B2-15 4 Pedro 1980-06-01 4000 3 3 RH Sala B2-15 5 João 1990-06-01 3000 3 2 Contabilidade Sala B1-15 6 Matheus 1990-09-01 2000 2 f d cod_dep descricao localizacao 1 Análise Sala B2-30 2 Contabilidade Sala B1-15 3 RH Sala B2-15 cod_func nome dt_nascimento salario cod_dep 1 Maria 1980-01-01 3000 NULL 2 Ana 1980-01-01 2500 2 3 José 1970-06-01 1500 2 4 Pedro 1980-06-01 4000 3 5 João 1990-06-01 3000 3 6 Matheus 1990-09-01 2000 2 RIGHT OUTER JOIN SELECT f.nome, d.descricao FROM departamento d RIGHT OUTER JOIN funcionario f ON d.cod_dep = f.cod_dep; nome descricao Maria NULL Ana Contabilidade José Contabilidade Pedro RH João RH Matheus Contabilidade cod_dep descricao localizacao cod_func nome dt_nascimento salario cod_dep NULL NULL NULL 1 Maria 1980-01-01 3000 NULL 2 Contabilidade Sala B1-15 2 Ana 1980-01-01 2500 2 2 Contabilidade Sala B1-15 3 José 1970-06-01 1500 2 3 RH Sala B2-15 4 Pedro 1980-06-01 4000 3 3 RH Sala B2-15 5 João 1990-06-01 3000 3 2 Contabilidade Sala B1-15 6 Matheus 1990-09-01 2000 2 Dúvidas Fonte: Imagem de Hatice EROL por Pixabay. https://pixabay.com/pt/users/haticeerol-14967706/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=5676782 https://pixabay.com/pt/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=5676782 Referências • SILVA, T. A. E. ; SANTOS, N. M.; OLIVEIRA JR., W. Prática de banco de dados. – Teresina : Instituto Federal de Educação, Ciência e Tecnologia do Piauí, 2013. 88 p.