History

BDII SQL Junção Revisão 8

Description
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
Categories
Published
of 87
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Related Documents
Share
Transcript
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 gerente, agencia; SELECT cpf, nome FROM gerente, agencia; SELECT cpf, nome FROM pessoa, agencia; Obs.: Note que os exemplos realizaram um produto cartesiano entre as relações o resultado não possui aplicação prática por enquanto 08/08/2014 8 Exemplo SELECT cpf, nome FROM pessoa, agencia; Cada cpf aparece combinado com todas as agências Como cliente possui 1000 linhas Agencia possui 10 linhas Resultado 1000 * 10 = /08/2014 9 Produto cartesiano O resultado de todo produto cartesiano sem o predicado de junção pode gerar muitas linhas que, até certo ponto, podem ser consideradas como lixo dependendo da consulta No exemplo anterior, o produto cartesiano não possui aplicação prática pois não temos atributos em comum entre as tabelas usadas para criar um predicado de junção que remova o lixo gerado 08/08/ Junção usando ',' 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 pessoa, pessoaconta WHERE cpf = cpf; 08/08/ Junção usando ',' 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/ Junção usando ',' Para isso colocamos o nome da tabela antes do nome do atributo separado por um ponto SELECT numero, pessoa.cpf, pnome FROM pessoa, pessoaconta WHERE pessoa.cpf = pessoaconta.cpf; 08/08/ Exercícios de fixação Informe o número da conta e o nome completo de todos clientes nascidos em 1990 Informe o nome completo de todos os gerentes Mostre as contas da agência número 3 Mostre o cpf do gerente e número das contas do gerente com registro 1 14 Junção com várias tabelas Podemos realizar a junção de varias tabelas colocando cada uma na cláusula FROM separada por vírgula Para cada junção devemos criar o predicado que removerá o lixo gerado 08/08/ Exercícios de fixação Informe o limite de todas as contas e o nome dos respectivos titulares que moram em Maria da Fé Identifique pelo nome os clientes da agência Pass Informe as transações realizadas pela agência Center Informe o cpf, o nome e as transações cujo valor é superior a dos clientes do gerente registro é 41 08/08/ SQL Introdução Produto cartesiano Nomes alternativos (apelidos) Tipos de junção 08/08/ 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 18 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/ 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/ Nomes alternativos para tabelas Exemplo: SELECT numero, p.cpf, pnome FROM pessoa AS p, pessoaconta AS pc WHERE p.cpf = pc.cpf AND p.cpf BETWEEN AND ; 08/08/ 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/ Exemplo SELECT p1.cpf, p1.pnome, p1.mnome, p1.unome, p2.cpf, p2.pnome, p2.mnome, p2.unome FROM pessoa AS p1, pessoa AS p2 WHERE p1.pnome = p2.pnome AND p1.mnome = p2.mnome AND p1.unome = p2.unome; 08/08/ Nomes alternativos para tabelas No primeiro caso temos um problema causado pela presença de valor nulo no nome do meio A consulta deveria retornar retornou 1000 linhas que representam os 1000 clientes existentes, mas retornou somente 888 Remova a condição que iguala o nome do meio e execute a consulta 08/08/ Exemplo SELECT p1.cpf, p1.pnome, p1.mnome, p1.unome, p2.cpf, p2.pnome, p2.mnome, p2.unome FROM pessoa AS p1, pessoa AS p2 WHERE p1.pnome = p2.pnome AND p1.unome = p2.unome; 08/08/ Nomes alternativos para tabelas Considerando somente o primeiro e segundo nome, a consulta retornou 1022 linhas, ou seja, 22 linhas a mais que a quantidade de pessoas Queremos apresentar somente as 22 linhas cujos clientes são homônimos considerando o primeiro e último nome, para isso devemos considerar o cpf na comparação 08/08/ Exemplo SELECT p1.cpf, p1.pnome, p1.mnome, p1.unome, p2.cpf, p2.pnome, p2.mnome, p2.unome FROM pessoa AS p1, pessoa AS p2 WHERE p1.pnome = p2.pnome AND p1.unome = p2.unome AND p1.cpf p2.cpf; 08/08/ Nomes alterativos para tabelas Versões mais atuais dos SGBD permitem omitirmos a palavra-chave (AS) Exiba o(s) nome(s) do(s) cliente(s) da gerente Sara Na tabela pessoa x gerente posso encontrar informações da gerente Sara Na tabela pessoa x gerente x gerenteconta posso encontrar as contas da gerente Sara 28 Exemplo SELECT g.registro, p.cpf, p.pnome, gc.numero FROM pessoa p, gerente g, gerenteconta gc WHERE p.cpf = g.cpf AND g.registro = gc.registro AND p.pnome = 'Sara'; 29 Exemplo Encontrando os clientes (cpf) da gerente Sara SELECT g.registro, p.cpf, p.pnome, pc.numero, pc.cpf FROM pessoa p, gerente g, gerenteconta gc, pessoaconta pc WHERE p.cpf = g.cpf AND g.registro = gc.registro AND gc.numero = pc.numero AND p.pnome = 'Sara'; 30 Exemplo Buscando o nome dos clientes da gerente Sara SELECT g.registro, p.cpf, p.pnome, pc.numero, pc.cpf, p2.pnome FROM pessoa p, gerente g, gerenteconta gc, pessoaconta pc, pessoa p2 WHERE p.cpf = g.cpf AND g.registro = gc.registro AND gc.numero = pc.numero AND pc.cpf = p2.cpf AND p.pnome = 'Sara'; 31 Exemplo Projetando somente os nomes dos clientes SELECT p.pnome, p2.pnome, p2.mnome, p2.unome FROM pessoa p, gerente g, gerenteconta gc, pessoaconta pc, pessoa p2 WHERE p.cpf = g.cpf AND g.registro = gc.registro AND gc.numero = pc.numero AND pc.cpf = p2.cpf AND p.pnome = 'Sara'; 32 Exercício de fixação Exiba uma lista com o número e o tipo da conta e o nomes dos titulares ordenada pelo primeiro nome do cliente Exiba o(s) nome(s) do(s) cliente(s) dos gerentes que moram em Miami Exiba uma lista com o número da conta, tipo da conta, número da transação, tipo da transação, abreviação e o valor da transação para as contas 500 e 777 (cuidado na construção) 33 Erro na construção da consulta Exiba uma lista com o número da conta, tipo da conta, número da transação, tipo da transação, abreviação e o valor da transação para as contas 500 e Exercício de fixação Exiba os cliente das contas corrente tipo 1 da agência Lane Existem transações realizadas pelo cliente Aaron Gregory Weaver? Mostre os clientes que realizaram pelo menos uma transação Mostre as pessoas cadastradas que são clientes na agência Street ou Circle 35 SQL Introdução Produto cartesiano Nomes alternativos (apelidos) Tipos de junção 08/08/ 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 37 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 38 Exemplo SELECT numero, p.cpf, pnome FROM pessoa p CROSS JOIN pessoaconta pc WHERE p.cpf = pc.cpf AND p.cpf = ; SELECT pc.numero, p.cpf, pnome, c.limite FROM pessoa p CROSS JOIN pessoaconta pc CROSS JOIN conta c WHERE p.cpf = pc.cpf AND c.numero = pc.numero AND p.cpf = ; 39 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 O MySQL permite o uso da clausula ON no CROSS JOIN 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 40 MySQL SELECT numero, p.cpf, pnome FROM pessoa p CROSS JOIN pessoaconta pc ON p.cpf = pc.cpf WHERE p.cpf = ; SELECT c.numero, p.cpf, pnome, c.limite FROM pessoa p CROSS JOIN pessoaconta pc ON p.cpf = pc.cpf CROSS JOIN conta c ON c.numero = pc.numero WHERE p.cpf = ; 41 Exemplo Exiba uma lista com o número da conta, tipo da conta, número da transação, tipo da transação, abreviação e o valor da transação para as contas 500 e 777 SELECT c.numero, c.tipo, t.numero, t.tipo, t.abreviacao, t.valor FROM conta c CROSS JOIN transacaoconta tc ON c.numero = tc.numeroc CROSS JOIN transacao t ON tc.numerot = t.numero WHERE tc.numeroc = 500 OR tc.numeroc = 777; 42 Exercícios Exiba a quantidade de clientes do sexo feminino que possuem conta poupança (tipo = 2) Exiba a soma dos salários dos cliente que possuem conta corrente (tipo = 1) Exiba a soma de todas as transações realizadas pela agencia Hoffman Exiba todos os clientes do gerente Peter Willian Gray 43 INNER JOIN O tipo padrão de junção no SQL é 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 44 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 45 INNER JOIN SELECT * FROM pessoa p INNER JOIN pessoaconta pc ON p.cpf = pc.cpf WHERE p.pnome LIKE 'Andre%'; Obs.: note a coluna cpf que aparece duplicada no resultado, isto ocorre porque ela existe em ambas as tabelas 46 INNER JOIN SELECT p.cpf, CONCAT(pnome, ' ', mnome, ' ', unome) AS nomecompleto, numero, dataabertura FROM pessoa p INNER JOIN pessoaconta pc ON p.cpf = pc.cpf WHERE p.pnome LIKE 'Andre%'; 47 MySQL O MySQL permite o uso da palavra USING para indicar qual atributo será usado como predicado de junção 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 48 INNER JOIN SELECT * FROM pessoa p INNER JOIN pessoaconta pc USING(cpf) WHERE p.pnome LIKE 'Andre%'; 49 Exercícios de fixação Exiba as transações dos cliente com cpf entre e Exiba a soma de todas as transações obtidas na consulta anterior Exiba todos os depósitos da agência Center Exiba a soma de todas as transações de crédito dos clientes do gerente Eric Shawn Knight 50 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 51 Exemplo SELECT 'Gerente:', p.pnome, 'Cliente: ', p2.pnome, p2.mnome, p2.unome FROM pessoa p INNER JOIN gerente g INNER JOIN gerenteconta gc INNER JOIN pessoaconta pc INNER JOIN pessoa p2 ON p.cpf = g.cpf AND g.registro = gc.registro AND gc.numero = pc.numero AND pc.cpf = p2.cpf; 52 Exemplo SELECT 'Gerente:', p.pnome, 'Cliente: ', p2.pnome, p2.mnome, p2.unome FROM pessoa p INNER JOIN gerente g ON p.cpf = g.cpf INNER JOIN gerenteconta gc ON g.registro = gc.registro INNER JOIN pessoaconta pc ON gc.numero = pc.numero INNER JOIN pessoa p2 ON pc.cpf = p2.cpf; 53 Exemplo Exemplo de estilo geralmente usado: SELECT 'Gerente:', p.pnome, 'Cliente: ', p2.pnome, p2.mnome, p2.unome FROM pessoa p INNER JOIN gerente g ON p.cpf = g.cpf INNER JOIN gerenteconta gc ON g.registro = gc.registro INNER JOIN pessoaconta pc ON gc.numero = pc.numero INNER JOIN pessoa p2 ON pc.cpf = p2.cpf; 54 Exemplo Clientes da gerente Diana SELECT 'Gerente:', p.pnome, 'Cliente: ', p2.pnome, p2.mnome, p2.unome FROM pessoa p INNER JOIN gerente g ON p.cpf = g.cpf INNER JOIN gerenteconta gc ON g.registro = gc.registro INNER JOIN pessoaconta pc ON gc.numero = pc.numero INNER JOIN pessoa p2 ON pc.cpf = p2.cpf WHERE p.pnome = 'Diana'; 55 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 56 NATURAL JOIN SELECT p.cpf, p.pnome, pc.numero FROM pessoa p NATURAL JOIN pessoaconta pc; - (atributo em comum cpf) SELECT p.cpf, p.pnome, pc.numero, c.limite FROM pessoa p NATURAL JOIN pessoaconta pc NATURAL JOIN conta c; - (atributo em comum cpf e número) 57 NATURAL JOIN Cuidado ao usar o NATURAL JOIN Exiba todos os gerentes SELECT * FROM pessoa p NATURAL JOIN gerente g; (atributos em comum?) 58 NATURAL JOIN Exibindo todos os gerentes usando INNER JOIN SELECT p.cpf, g.cpf, p.salario, g.salario FROM pessoa p INNER JOIN gerente g USING(cpf); 59 NATURAL JOIN Execute a seguinte atualização UPDATE pessoa SET salario = WHERE cpf = ; Busque novamente os gerentes SELECT * FROM pessoa p NATURAL JOIN gerente g; 60 Exercício de fixação Mostre o número da conta dos clientes que tem 30 anos completos ou mais e cujo esteja nulo Mostre o número da conta, o tipo da conta e o cpf dos clientes nascidos entre 01/01/1980 e 31/12/1982 Mostre o nome da agência, o número da conta, o cpf e o nome completo do dos clientes que não informaram seu endereço ou telefone 61 Exercícios Mostre os nomes dos clientes da agência Pass Selecione todas as contas da agência número 2 Selecione as transações da agência número 2 Mostre o montante de depósitos em caderneta de poupança da agência 1 62 Exercícios Mostre o montante de saques em caderneta de poupança da agência Center Mostre o montante de depósitos em conta corrente de homens Mostre o montante de saques em conta corrente de mulheres 63 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) 64 LEFT OUTER JOIN Combina todas as tuplas da tabela à esquerda da junção com as tuplas cujos valores combinam na tabela a direita adicionando as tuplas da tabela à esquerda que não possuem ligação na tabela à direita Suponha que precisamos criar um relatório como nome de todos os clientes e suas respectivas contas 65 LEFT OUTER JOIN Para ter os dados dos clientes e sua conta precisamos realizar uma junção entre as tabelas pessoa e pessoaconta SELECT cpf, pnome, numero FROM pessoa p INNER JOIN pessoaconta pc USING(cpf); 66 LEFT OUTER JOIN Note que temos algumas inconsistências: Existem 1000 registros em pessoa Existem 800 registros em conta O resultado da consulta retornou 998 Parece que 2 pessoas não possuem ligação com contas 67 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 (OUTER) SELECT p.cpf, pnome, numero FROM pessoa p LEFT OUTER JOIN pessoaconta pc ON p.cpf = pc.cpf; 68 LEFT OUTER JOIN SELECT cpf, pnome, numero FROM pessoa p LEFT OUTER JOIN pessoaconta pc USING(cpf); SELECT cpf, pnome, numero FROM pessoa p NATURAL LEFT OUTER JOIN pessoaconta pc; 69 LEFT OUTER JOIN Note que temos agora: 998 são retornados com a junção interna (INNER JOIN) 1223 linhas no resultado? = 225 pessoas não possuem relação com alguma conta Como saber quem são? 70 LEFT OUTER JOIN SELECT cpf, pnome, numero FROM pessoa p NATURAL LEFT OUTER JOIN pessoaconta pc; (todas as pessoas com nenhuma, uma ou mais ocorrências de cpf em pessoaconta) SELECT cpf, pnome, numero FROM pessoa p NATURAL LEFT OUTER JOIN pessoaconta pc WHERE numero IS NULL; (todas as pessoas com nenhuma ocorrências de cpf em pessoaconta) 71 Exercícios de fixação Existem contas que não estão vinculadas a nenhum cliente? Existem contas que não estão vinculadas a nenhuma agencia? Existem transações que não estão relacionadas à nenhuma conta? Exiba o quantidade e o valor total das transações que que não estão relacionadas à nenhuma conta Existem contas que não possuem nenhuma transação? 72 RIGHT OUTER JOIN Combina todas as tuplas da tabela à direita da junção com as tuplas cujos valores combinam na tabela a esquerda adicionando as tuplas da tabela à direita que não possuem ligação dos valores na tabela à esquerda Repita os exemplo e exercícios do LEFT OUTER JOIN usando RIGHT OUTER JOIN 73 FULL OUTER JOIN Combina o resultado obtido com LEFT OUTER JOIN e RIGHT OUTER JOIN Retorna todas as linhas existentes nas tabela envolvidas SELECT cpf, pnome, numero FROM pessoa p FULL OUTER JOIN pessoaconta pc WHERE pnome LIKE 'A%'; 74 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 externa 75 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 76 Exemplo Exiba uma lista com os nomes dos clientes e de agências sem repetições SELECT pnome FROM pessoa UNION SELECT nome FROM agencia; 77 Exemplo Exiba uma lista com os nomes dos clientes e de agências com repetições SELECT pnome FROM pessoa UNION ALL SELECT nome FROM agencia; 78 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 79 MySQL SELECT numero, tipo FROM conta UNION ALL SELECT numero FROM transacao; SELECT numero, tipo FROM conta UNION ALL SELECT numero, abreviacao FROM transacao; 80 MySQL SELECT numero, tipo, 'CONTA' FROM conta UNION ALL SELECT numero, abreviacao, 'TRANS' FROM transacao; Obs.: podemos usar textos marcando as linhas 81 FULL OUTER JOIN SELECT p.cpf,pc.* FROM pessoa p LEFT OUTER JOIN pessoaconta pc ON p.cpf = pc.cpf UNION ALL SELECT p.cpf,pc.* FROM pessoa p RIGHT OUTER JOIN pessoaconta pc ON p.cpf = pc.cpf; Obs.: todos os registros da primeira seleção mais os registros da segunda seleção com as duplicidades 82 FULL OUTER JOIN SELECT p.cpf,pc.* FROM pessoa p LEFT OUTER JOIN pessoaconta pc ON p.cpf = pc.cpf UNION SELECT p.cpf,pc.* FROM pessoa p RIGHT OUTER JOIN pessoaconta pc ON p.cpf = pc.cpf; Obs.: todos os registros da primeira seleção mais os registros da segunda seleção sem as duplicidades 83 Exercícios Exiba uma lista com repetições contendo os nomes de pessoas e agências que comecem com a sequencia 'Pa' Exiba uma lista sem repetições dos
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks