exatasfepi.com.br BDII SQL Junção Revisão 8 André Luís Duarte Leais são as feridas feitas pelo amigo, mas os beijos do inimigo são enganosos. Provérbios 27:6
SQL Introdução Produto cartesiano Nomes alternativos (apelidos) Tipos de junção 08/08/2014 2
SQL Introdução Produto cartesiano Nomes alternativos (apelidos) Tipos de junção 08/08/2014 3
Introdução Vimos na álgebra relacional que quando necessitávamos combinar tuplas de várias relações para produzir um determinado resultado usávamos a operação produto cartesiano Essa operação nos permite combinar informações a partir de diversas relações e é representada pela (cruz) 08/08/2014 4
SQL Introdução Produto cartesiano Nomes alternativos (apelidos) Tipos de junção 08/08/2014 5
Produto cartesiano Em SQL o produto cartesiano é realizado quando colocamos na cláusula FROM mais de uma tabela separada por vírgula O resultado desse tipo de comando é a combinação de todas as linhas de uma tabela com todas as linhas da(s) outra(s) tabela(s) envolvidas 08/08/2014 6
Produto cartesiano Podemos realizar o produto cartesiano com qualquer quantidade de tabelas Devemos lembrar sempre que precisamos igualar o atributo em comum em cada tabela participante para poder remover o lixo gerado 08/08/2014 7
Exemplo SELECT * FROM cliente, agencia SELECT cpf, nome FROM cliente, agencia 08/08/2014 8
Exemplo SELECT cpf, nome FROM cliente, agencia Cada cpf aparece combinado com todas as agências Como cliente possui 996 linhas Agencia possui 10 linhas Resultado 996 * 10 = 9960 08/08/2014 9
Produto cartesiano O resultado de todo produto cartesiano sem predicado de junção gera muitas linhas que podem ser consideradas como lixo para a nossa pesquisa No exemplo anterior, o produto cartesiano está inutilizado pois não temos atributos em comum entre as tabelas para remover o lixo gerado 08/08/2014 10
Produto cartesiano Uma consulta mais útil seria saber o número da conta de cada cliente Poderíamos pensar na seguinte consulta: SELECT numero, cpf, pnome FROM cliente, pessoaconta WHERE cpf = cpf 08/08/2014 11
Produto cartesiano Vimos que a consulta não funcionou pois o SGBD não conseguiu resolver a ambiguidade do atributo cpf que está presente em ambas as tabelas Para resolver essa ambiguidade, devemos informar, para os atributos em comum, de qual tabela eles pertencem 08/08/2014 12
Produto cartesiano Para isso colocamos o nome da tabela antes do nome do atributo separado por um ponto SELECT numero, cliente.cpf, pnome FROM cliente, pessoaconta WHERE cliente.cpf = pessoaconta.cpf 08/08/2014 13
Exercícios de fixação Informe todas as contas e os respectivos titulares dos clientes entre 20 e 30 anos Informe quais contas pertencem à agência International Informe os números das transações realizadas pela conta de número 500 Informe quais os cpf dos clientes do gerente Carlos 08/08/2014 14
SQL Introdução Produto cartesiano Nomes alternativos (apelidos) Tipos de junção 08/08/2014 15
Nomes alternativos O SQL permite darmos apelidos (aliases) em duas situações Para tabelas Normalmente usada quando fizermos junções Para colunas Normalmente para dar nomes às nossas operações 16
Nomes alternativos para tabelas Em SQL podemos ter atributos com o mesmo nome desde que estejam em relações diferentes Quando precisamos juntar essas relações ocorre o problema de ambiguidade dos atributos Devemos qualificar o atributo prefixando o nome da tabela separado por um ponto 08/08/2014 17
Nomes alternativos para tabelas Quando o nome da relação é muito grande, temos a inconveniência de ter que repeti-la para remover ambiguidades Neste caso podemos dar um apelido para a relação através da palavra-chave (AS) 08/08/2014 18
Nomes alternativos para tabelas Exemplo: SELECT numero, cl.cpf, pnome FROM cliente AS cl, pessoaconta AS pc WHERE cl.cpf = pc.cpf 08/08/2014 19
Nomes alternativos para tabelas Outro uso muito comum é quando precisamos fazer o produto cartesiano de uma relação com ela mesma Verifique se existem homônimos no sistema Obs.: Pessoas homônimas possuem o mesmo nome (completo) 08/08/2014 20
Exemplo SELECT c1.cpf, c1.pnome FROM cliente AS c1, cliente AS c2 WHERE c1.pnome = c2.pnome AND c1.mnome = c2.mnome AND c1.unome = c2.unome 08/08/2014 21
Nomes alternativos para tabelas No primeiro caso não há na resposta, pois a consulta retornou 996 linhas que representam os 996 clientes existentes Se necessitássemos verificar se há homônimos considerando somente o primeiro e segundo nomes 08/08/2014 22
Exemplo SELECT c1.cpf, c1.pnome FROM cliente AS c1, cliente AS c2 WHERE c1.pnome = c2.pnome AND c1.mnome = c2.mnome 08/08/2014 23
Nomes alternativos para tabelas Considerando somente o primeiro e segundo nome, a consulta retornou 1046 linhas, ou seja, 50 linhas a mais que a primeira Queremos apresentar somente as 50 linhas cujos clientes são homônimos, para isso devemos considerar o cpf na comparação 08/08/2014 24
Exemplo SELECT c1.cpf, c1.pnome FROM cliente AS c1, cliente AS c2 WHERE c1.pnome = c2.pnome AND c1.mnome = c2.mnome AND c1.cpf <> c2.cpf 08/08/2014 25
Nomes alterativos para tabelas Os SGBD mais atuais permitem também omitirmos a palavra-chave (AS) Exiba o(s) nome(s) do(s) cliente(s) do gerente Carlos Joseph Elliott Na tabela gerente x clientegerente posso encontrar o cpf dos cliente de um gerente Na tabela gerente x clientegerente x cliente posso encontrar o nome dos clientes de um gerente 26
Exemplo SELECT pnome, cg.cpf FROM gerente gr, clientegerente cg WHERE gr.registro = cg.registro AND pnome = Carlos ; 27
Exemplo SELECT cl.pnome, gr.pnome FROM gerente gr, clientegerente cg, cliente cl WHERE gr.registro = cg.registro AND cl.cpf = cg.cpf AND gr.pnome = Carlos ; 28
Exercício de fixação Exiba uma lista com o número da conta e o nomes dos titulares ordenada pela conta Exiba uma lista com o número da conta, número da transação, valor da transação para as contas 311 e 546 Exiba o(s) nome(s) do(s) cliente(s) dos gerentes que moram em Maria da Fé 29
Exercício de fixação Exiba as contas corrente (tipo 1) da agência número 10 Existem transações realizadas pelo cliente Richard Aaron West? Procure um cliente que tenha realizado pelo menos uma transação 30
SQL Introdução Produto cartesiano Nomes alternativos (apelidos) Tipos de junção 08/08/2014 31
Junção A operação junção natural é uma operação binária que permite combinar certas seleções e um produto cartesiano em uma operação, é representada pelo símbolo O resultado é uma única tabela com o resultado das cláusulas definidas na junção 32
CROSS JOIN Se nenhuma condição é informada na cláusula WHERE, o produto cartesiano entre as tabelas será o resultado Se o(s) atributo(s) em comum forem igualados teremos como resultado o mesmo que o INNER JOIN Funciona da mesma forma como fizemos anteriormente ao separarmos as tabelas por vírgulas 33
Exemplo SELECT numero, c.cpf, pnome FROM cliente c CROSS JOIN pessoaconta p WHERE c.cpf = p.cpf AND c.cpf = 60276635969 34
CROSS JOIN A diferença básica entre o CROSS JOIN e INNER JOIN é que no caso do INNER JOIN a cláusula de junção pode ser indicada através da palavra chave ON Obs.: é uma boa prática de desenvolvimento colocar todo o predicado de junção na cláusula ON deixando a cláusula WHERE somente para filtrar a seleção desejada 35
MySQL O MySQL permite o uso da clausula ON no CROSS JOIN SELECT numero, c.cpf, pnome FROM cliente c CROSS JOIN pessoaconta p ON c.cpf = p.cpf WHERE c.cpf = 60276635969 36
Exercícios Exiba os dados do cliente dono da conta 866 e 2 Exiba a soma dos salários dos cliente que possuem conta corrente Exiba a soma de todas as transações realizadas pela agencia Bluejay 37
INNER JOIN O tipo default de junção é a junção interna (INNER JOIN) Combina (junta) a informação de duas ou mais tabelas aplicando um critério de comparação entre os valores de uma ou mais colunas 38
INNER JOIN Uma tupla é inserida na resposta somente se existir uma combinação nos valores em ambas as tabelas para o atributo envolvido No geral é o mesmo que JOIN Se usado o caractere * na projeção, todas as colunas (atributos) serão apresentados no resultado 39
INNER JOIN SELECT * FROM cliente c INNER JOIN pessoaconta p ON c.cpf = p.cpf WHERE c.pnome LIKE Andre% Obs.: a coluna cpf aparece duplicada no resultado, isto ocorre porque ela existe em ambas as tabelas 40
INNER JOIN SELECT c.cpf, CONCAT(pnome, ' ', mnome, ' ', unome), numero, dataabertura FROM cliente c INNER JOIN pessoaconta p ON c.cpf = p.cpf WHERE c.pnome LIKE 'Andre% ; 41
MySQL O MySQL permite o uso da palavra USING para indicar qual atributo será usado como predicado de junção Claro, que o atributo em comum nas tabelas devem ter o mesmo nome Obs.: usando a palavra USING o atributo em comum não aparece duplicado na consulta 42
INNER JOIN SELECT * FROM cliente c INNER JOIN pessoaconta p USING(cpf) WHERE c.pnome LIKE André%'; 43
Exercícios de fixação Exiba as transações dos cliente com cpf entre 11111111111 e 12111111111 Exiba a soma de todas as transações obtidas na consulta anterior Exiba todos os clientes da agência Fairview Exiba a soma de todas as transações da agencia Jackson 44
NATURAL JOIN Realiza uma junção natural, que é caracterizada pela criação de uma equijoin, condição equijunção (igualdade) implícita nos atributos em comum Como na junção usando a palavra USING, a NATURAL JOIN exibe o atributo em comum no inicio da projeção e remove a coluna duplicada 45
Otimização de consultas A cláusula ON não é otimizada para trabalhar com operadores lógicos AND, OR ou NOT Por isso, prefira construir uma cláusula ON para cada junção ao invés de uma única cláusula usando AND 46
Exemplo SELECT c.pnome, c.cpf, g.pnome FROM cliente c INNER JOIN pessoaconta pc INNER JOIN clientegerente cg INNER JOIN gerente g ON c.cpf = pc.cpf AND cg.cpf = c.cpf AND g.registro = cg.registro; 47
Exemplo SELECT c.pnome, c.cpf, g.pnome FROM cliente c INNER JOIN pessoaconta pc ON c.cpf = pc.cpf INNER JOIN clientegerente cg ON cg.cpf = c.cpf INNER JOIN gerente g ON g.registro = cg.registro; 48
NATURAL JOIN SELECT * FROM cliente c NATURAL JOIN clientegerente cg WHERE c.pnome LIKE 'Carlos%'; 49
NATURAL JOIN SELECT * FROM gerente g NATURAL JOIN clientegerente cg WHERE g.pnome LIKE 'Carlos%'; Explique o resultado obtido; 50
Exercício de fixação Mostre o número e o tipo da conta dos clientes que têm o primeiro nome igual a Carlos Selecione os gerentes responsáveis pelas contas do exemplo anterior Selecione todas as contas da agência número 5 Selecione as transações da agência do exemplo anterior 51
LEFT OUTER JOIN Quando realizamos junções internas (INNER JOIN) para que uma tupla seja inserida na resposta o valor do atributo no predicado de junção deve corresponder nas duas tabelas Quando precisamos que todas as tuplas sejam incluídas no resultado precisamos explicitar uma junção externa (OUTER JOIN) 52
LEFT OUTER JOIN Combina todas as tuplas da tabela à esquerda da junção com as tuplas cujos valores combinam na tabela a direita Suponha que precisamos criar um relatório como nome de todos os clientes que possuem o padrão André% no seu primeiro nome e suas respectivas contas, se possuírem 53
LEFT OUTER JOIN Execute a seguinte inserção: INSERT INTO cliente VALUES (12345678900, 'MG1234567', 'André', 'Luís', 'Duarte', '1982-01-01', 'andre@bol.com.br', 550413536622004, 'Rua A', 'Maria da Fé', 'MG', 37517000, 'M', 4856.53); 54
LEFT OUTER JOIN Para ter os dados dos clientes e sua conta precisamos realizar uma junção entre as tabelas cliente e pessoaconta SELECT cpf, pnome, numero FROM cliente c INNER JOIN pessoaconta p USING(cpf) WHERE c.pnome LIKE 'Andre%'; 55
LEFT OUTER JOIN Para que todos os clientes apareçam no resultado, independente de ter uma ocorrência do cpf em pessoaconta devemos ter uma junção externa SELECT cpf, pnome, numero FROM cliente c LEFT OUTER JOIN pessoaconta p USING(cpf) WHERE c.pnome LIKE 'Andre%'; 56
Exercícios de fixação Selecione os clientes que não possuem conta em nenhuma agência Exiba o número, o valor das transações e as contas e a data as quais estão relacionadas Exiba quais transações não estão relacionadas à nenhuma conta Exiba o quantidade e o valor total das transações que se encontram na situação anterior 57
RIGHT OUTER JOIN Combina todas as tuplas da tabela à direita da junção com as tuplas cujos valores combinam na tabela a esquerda Suponha que precisamos criar um relatório com todos os clientes que não possuem conta 58
RIGHT OUTER JOIN Para que todos os clientes apareçam no resultado, independente de ter uma ocorrência do cpf em pessoaconta devemos ter uma junção externa SELECT numero, c.cpf, c.pnome FROM pessoaconta pc RIGHT OUTER JOIN cliente c ON pc.cpf = c.cpf; 59
RIGHT OUTER JOIN SELECT numero, c.cpf, c.pnome FROM pessoaconta pc RIGHT OUTER JOIN cliente c ON pc.cpf = c.cpf WHERE pc.numero IS NULL; 60
Exercícios de fixação Exiba o número, o valor das transações e as contas e a data as quais estão relacionadas Exiba quais transações não estão relacionadas à nenhuma conta Exiba o quantidade e o valor total das transações que se encontram na situação anterior 61
FULL OUTER JOIN Combina o resultado obtido com LEFT OUTER JOIN e RIGHT OUTER JOIN Retorna todas as linhas existentes nas tabela envolvidas 62
MySQL O MySQL não implementa o FULL OUTER JOIN podemos usar várias abordagens para conseguir o comando, por exemplo: Realizar JOIN e UNION Realizar UNION ALL e junção de exclusão 63
UNION Usado para combinar o resultado de múltiplas seleções Se usado como UNION, todas as linhas duplicadas serão removidas Se usada com a opção ALL (UNION ALL) todas as linhas serão retornadas independente de serem duplicadas Os nomes das colunas da primeira seleção são usados como nome da coluna no resultado 64
Exemplo Exiba os nomes de todos os clientes de qualquer agência Código 1 SELECT * FROM cliente UNION SELECT * FROM gerente; 65
Exemplo Exiba os nomes de todos os clientes de qualquer agência Código 2 SELECT pnome, mnome, unome FROM cliente UNION SELECT pnome, mnome, unome FROM gerente; 66
MySQL No MySQL somente as relações envolvidas devem ter o mesmo grau Cuidado: como não existe a regra de mesmo domínio no MySQL, podemos realizar a união de qualquer tipo de dados SELECT cpf FROM cliente UNION SELECT pnome FROM gerente LIMIT 993,10; 67
Exercícios Exiba o primeiro nome de todas as pessoas cadastradas no banco sem repetições que tenham o primeiro nome iniciando com o caractere C no primeiro nome Exiba o primeiro nome de todas as pessoas cadastradas no banco com repetições que tenham o primeiro nome iniciando com o caractere C no primeiro nome 68
Exercícios Exiba nome completo de todas as pessoas cadastradas no banco que tenham o padrão ANDRE em qualquer parte do nome Exiba todos os números de contas e transações Exiba todos os números de contas corrente e transações depósito Realize um FULL OUTER JOIN entre as tabelas cliente e pessoaconta 69