Baixe o app para aproveitar ainda mais
Prévia do material em texto
Fundamentos de Banco de Dados SQL - Parte 2 Profa.: Luana Dantas Chagas 2 PostgreSQL – Relembrando ● Comandos já utilizados: ● create table; ● insert into … values; ● select * from; ● update … set … where; ● delete from … where; ● alter table … drop column; ● delete from; 3 PostgreSQL – Relembrando ● Comandos já utilizados: ● drop table; ● Operadores de comparação: >, <, >=, <=, =, !=. ● Operadores para o predicado: and, or. ● Operações aritméticas: sum, min, max, avg, count. 4 PostgreSQL - Observação ● Quando criamos uma tabela, devemos determinar uma chave primária. ● No entanto, é possível que isso seja esquecido no momento da criação da tabela. ● Para adicionar a chave primária após a criação da tabela utilizamos: alter table nome_da_tabela add primary key nome_atributo 5 PostgreSQL - Observação ● Vamos criar uma tabela teste! ● Ela terá somente uma coluna que recebe valores do tipo inteiro. ● Para tal, fazemos: create table teste ( coluna int ) 6 PostgreSQL - Observação ● Como não há chave primária, podemos adicionar valores repetidos sem problemas: insert into teste values (1), (2), (1), (2) 7 PostgreSQL - Observação ● Vamos adicionar a restrição de chave primária! ● No entanto, antes, necessitamos retirar as linhas duplicadas. ● Isso se faz necessário para que não existam chaves repetidas! delete from teste alter table teste add primary key (coluna) 8 PostgreSQL - Observação ● Agora, se tentarmos inserir valores repetidos teremos um erro: insert into teste values (1), (2), (1), (2) 9 PostgreSQL - Observação ● Em oposição, também pode ser atribuída a restrição ao atributo errado. ● Assim, é possível retirar a restrição de chave primária. ● Para tal, utilizamos: alter table nomeDaTabela drop constraint nomeDaTabela_pkey 10 PostgreSQL - Observação ● Vamos retirar a restrição da tabela teste! ● Após, será possível inserir valores repetidos. alter table teste drop constraint teste_pkey insert into teste values (3), (3), (3) 11 PostgreSQL - Observação ● Para renomear colunas, utilizamos o comando: alter table nome_da_tabela rename nome_coluna to novo_nome_coluna ● Por exemplo, vamos renomear a coluna da tabela teste para coluna_teste: alter table teste rename coluna to coluna_teste 12 PostgreSQL - Observação ● Também é possível renomear a própria tabela. Para tal: alter table nome_da_tabela rename to novo_nome_tabela ● Por exemplo, vamos renomear a tabela teste para minha_tabela: alter table teste rename to minha_tabela 13 PostgreSQL ● Podemos renomear também os nomes dos aributos retornados na seleção. ● Por exemplo, considere a consulta: select max(preço) from Produto ● O atributo retornado fica nomeado com ''max''. 14 PostgreSQL ● Para que o mesmo apareça como ''Maior preço'', fazemos: select max(preço) as "Maior preço" from Produto 15 PostgreSQL ● Para ver o nome e o preço do produto mais caro, precisamos fazer uso do in: select nome, preço from produto where preço in (select max(preço) from Produto) PostgreSQL - Select ● O operador in é utilizado quando queremos retornar valores que estão dentro de um conjunto de valores. Por exemplo: select nome from Produto where setor in ('Frutas', 'Cereais') ● No caso, vão ser buscados todos os nomes cujo atributo setor esteja dentro da lista passada ao operador in. 18 PostgreSQL ● Para as próximas cláusulas vamos criar três tabelas: BD, API e SO. ● Estas devem possuir os seguintes atributos: ● matricula: int ● nome: varchar ● nota1: real ● nota2: real ● nota3: real ● media: real ● faltas: smallint. 19 PostgreSQL 20 PostgreSQL ● Insira, pelo menos, 4 registros em cada tabela. ● No campo media não coloque valor e utilize o null. ● Repita alunos entre as disciplinas. (...) 21 PostgreSQL – Observação ● Na coluna média, é possível solicitar que o SGBD realize o cálculo. ● Após as inserções de registros na tabela, fazemos: alter table BD alter column media type real using (nota1+nota2+nota3)/3 22 PostgreSQL – Union ● Utilizando as tabelas criadas, podemos unir todos os alunos aprovados nas disciplinas. No caso, select nome from BD where media>7 union select nome from API where media>7 union select nome from SO where media>7 23 PostgreSQL – Instersect ● Com a cláusula intersect podemos encontrar os alunos que estão nas mesmas disciplinas. ● Por exemplo, para descobrir os alunos que estão cursando Banco de Dados e Algoritmos fazemos: select nome from BD intersect select nome from API 24 PostgreSQL – Instersect ● Outra forma de realizar a mesma consulta é utilizando o ''in'' e aninhando consultas. ● Para tal: select nome from BD where nome in (select nome from API) 25 PostgreSQL – Except ● Com a cláusula except podemos encontrar o que tem em uma tabela excetuando o que tem em comum com outra. ● Por exemplo, os alunos que estão em Banco de Dados mas não estão cursando Sistemas Operacionais. Assim: select nome from BD except select nome from SO 26 PostgreSQL – Instersect ● Outra forma de realizar a mesma consulta é utilizando o ''not in'' e aninhando consultas. ● Para tal: select nome from BD where nome not in (select nome from SO) 27 PostgreSQL – Alterando Valores ● Já utilizamos update para atualizar um registro trocando-o por um novo valor. ● Podemos utilizá-lo também combinando-o com alguma operação matemática. ● Por exemplo, suponha que os alunos de Banco de Dados irão ganhar 1,0 ponto extra na média final. ● Para acrescentar a pontuação na média teríamos que atualizar linha a linha. 28 PostgreSQL – Alterando Valores ● Para não ter todo esse trabalho, podemos utilizar uma operação matemática. ● No caso, faríamos: update BD set media=media+1 where media<=9 29 PostgreSQL – Junção ● Uma das operações mais utilizadas em BD são as junções. ● Elas permitem relacionar dados de duas ou mais tabelas, estabelecendo uma relação lógica entre elas. ● As junções disponíveis são: ● Inner join; ● Cross join; ● Left join; ● Right join; ● Full join. 30 PostgreSQL – Junção ● Para entender cada junção, vamos criar duas tabelas: tabela_A e tabela_B. ● Essas tabelas terão apenas uma coluna chamada nome. 31 PostgreSQL – Junção ● Criadas as tabelas, necessitamos fazer a inserção de dados. ● Vamos deixar alguns nomes em comum: insert into tabela_A values ('Maria'), ('Gomes'), ('João'), ('Márcia') insert into tabela_B values ('Priscila'), ('Gomes'), ('Cláudio'), ('Márcia') 32 PostgreSQL – Junção ● A junção inner join retorna os registros em comum entre as duas tabelas: ● Para tal, precisamos acrescentar na consulta a restrição de igualdade: select * from tabela_A inner join tabela_B on tabela_A.nome=tabela_B.nome OBS: colunas de nomes iguais recebem o nome da tabela. 33 PostgreSQL – Junção ● A operação combina todas as linhas das tabelas: Nome Maria Gomes João Márcia Nome Priscila Gomes Cláudio Márcia Tabela A Tabela B Nome Nome Maria Priscila Maria Gomes Maria Cláudio Maria Márcia Gomes Priscila Gomes Gomes Gomes Cláudio Gomes Márcia João Priscila João Gomes João Cláudio João Márcia Márcia Priscila Márcia Gomes Márcia Cláudio Márcia Márcia 34 PostgreSQL – Junção ● E retorna somente as linhas em que os dados são iguais. Nome Nome Maria Priscila Maria Gomes Maria Cláudio Maria Márcia Gomes Priscila Gomes Gomes Gomes Cláudio Gomes Márcia João Priscila João Gomes João Cláudio João Márcia Márcia Priscila Márcia Gomes Márcia Cláudio Márcia Márcia 35 PostgreSQL – Junção ● Para facilitar, podemos renomear as tabelas (na consulta!) utilizando as. ● Por exemplo: select * from tabela_A as A inner join tabela_B as on A.nome=B.nome 36 PostgreSQL – Junção ● A junção left join retorna todos os registros da tabela da esquerda, mesmo não estando na outra tabela… ● Maisos registros em comum com a tabela da direita. ● No caso: select * from tabela_A left join tabela_B on tabela_A.nome=tabela_B.nome 37 PostgreSQL – Junção ● A consulta retornará todos os atributos da tabela_A mais os atributos em comum com a tabela_B: 38 PostgreSQL – Junção ● A junção right join retorna todos os registros da tabela da direita, mesmo não estando na outra tabela… ● Mais os registros em comum com a tabela da esquerda. ● No caso: select * from tabela_A right join tabela_B on tabela_A.nome=tabela_B.nome 39 PostgreSQL – Junção ● A consulta retornará todos os atributos da tabela_B mais os atributos em comum com a tabela_A: 40 PostgreSQL – Junção ● A junção full join retorna todos os registros das tabelas, mostrando os registros associados. ● No caso: select * from tabela_A full join tabela_B on tabela_A.nome=tabela_B.nome 41 PostgreSQL – Junção ● A consulta retornará todos os atributos da tabela_A e da tabela_B: 42 PostgreSQL – Junção ● E a junção cross join também retorna todos os registros das tabelas, mas fazendo a combinação entre eles. ● Nesse caso, não há necessidade de restrições utilizando o on: select * from tabela_A cross join tabela_B 43 PostgreSQL – Junção ● A consulta retornará todos os atributos da tabela_A combinados com os atributos da tabela_B: 44 PostgreSQL – Junção Natural ● Nessa disciplina vamos focar nas junções naturais... ● Para praticá-la, vamos criar três tabelas: Imóvel, Aluguel e Cliente. Imóvel (codImovel, tipo, endereço) Cliente (codCliente, nome, idade) Aluguel (codImovel, codCliente, preço) ● As colunas codImovel e codCliente são chaves primárias nas tabelas Imóvel e Cliente, e chaves estrangeiras na tabela Aluguel. 45 PostgreSQL – Junção Natural ● Criação da tela Imóvel: ● Criação da tabela Aluguel: 46 PostgreSQL – Junção Natural ● Criação da tela Aluguel: ● As colunas codImovel e codCliente são declaradas como chaves estrangeiras. ● Para tal, é explicitado a qual coluna e a qual tabela essas chaves fazem referência. 47 PostgreSQL – Junção Natural ● Agora vamos inserir valores: 48 PostgreSQL – Junção Natural ● Para descobrir quem locou imóveis cujo aluguel seja maior que 1000 reais, fazemos: ● A consulta irá combinar os dados das tabelas do inner join... ● E retornar as linhas que atendem as restrições, determinadas pelo on e pelo and. 49 PostgreSQL – Junção Natural ● Para descobrir os tipos e endereços dos imóveis cujo aluguel é menor que 500 reais, fazemos: ● Para descobrir os endereços e valores dos alugueis, ordenados em ordem crescente de valor de aluguel, fazemos: 50 PostgreSQL – Junção Natural ● Para descobrir os nomes dos clientes que locaram o imóvel, o tipo do imóvel e o valor do aluguel, precisamos fazer a junção de 3 tabelas. ● Para tal, basta fazer um inner join após o outro: 51 PostgreSQL – Junção Natural ● Vamos a outro exemplo! Vamos criar mais três tabelas: Veículo, Motorista e Viagem. create table Veiculo ( id_vec varchar(5), placa char(7), ano smallint, modelo varchar(20), marca varchar(20), primary key (id_vec) ) create table Motorista ( id_motorista varchar(5), nome varchar (20), primary key(id_motorista) ) 52 PostgreSQL – Junção Natural create table Viagem ( id_viagem varchar(5), data_ida date, data_volta date, hora_ida time, solicitante varchar(25), destino varchar(30), id_motorista varchar(5), id_vec varchar(5), primary key(id_viagem), foreign key (id_motorista) references Motorista (id_motorista), foreign key (id_vec) references Veiculo(id_vec) ) 53 PostgreSQL – Junção Natural ● E vamos popular as tabelas: ● Motorista: insert into Motorista values ('M01', 'Mario Falcão'), ('M02', 'Alex Oliveira'), ('M03', 'Pedro Farias') ● Veículo: insert into Veiculo values ('VE01', 'NNM1234', 2012, 'Corsa', 'Chevrolet'), ('VE02', 'BRA8767', 2014, 'Hilux', 'Toyota'), ('VE03', 'NOE3223', 2010, 'Sentra', 'Nissan'), ('VE04', 'GOL6545', 2011, 'Ônibus', 'Maxbus') 54 PostgreSQL – Junção Natural ● E, por fim, a tabela Viagem. insert into Viagem values ('V01', '03/06/2018', '03/06/2018', '05:30', 'Marcos Oliveira', 'Mossoró', 'M01', 'VE04'), ('V02', '05/06/2018', '06/06/2018', '08:00', 'Patrícia Laura', 'Natal', 'M03', 'VE02'), ('V03', '07/06/2018', '09/06/2018', '04:30', 'Letícia Espinele', 'Fortaleza', 'M03', 'VE03'), ('V04', '07/06/2018', '07/06/2018', '08:00', 'Péricles Souza', 'Mossoró', 'M02', 'VE01') 55 PostgreSQL – Junção Natural insert into Viagem values ('V05', '08/06/2018', '08/06/2018', '12:30', 'Fábio Gurgel', 'Mossoró', 'M01', 'VE03'), ('V06', '08/06/2018', '10/06/2018', '15:00', 'Marcos Oliveira', 'Natal', 'M01', 'VE01'), ('V07', '10/06/2018', '12/06/2018', '09:30', 'Patrícia Laura', 'Natal', 'M02', 'VE04'), ('V08', '11/06/2018', '11/06/2018', '07:00', 'Felipe Borges', 'Mossoró', 'M03', 'VE04') 56 PostgreSQL – Junção Natural ● Com tais tabelas, podemos descobrir os nomes dos motoristas que realizaram viagens solicitadas pela servidora Patrícia Laura. ● Para realizar a junção natural fazemos: select nome from Motorista as M inner join Viagem as V on M.id_motorista = V.id_motorista where solicitante='Patrícia Laura' 57 PostgreSQL – Junção Natural ● Para descobrir os modelos dos carros utilizados nas viagens solicitadas por Fábio Gurgel, fazemos: select modelo from Veiculo inner join Viagem on Veiculo.id_vec=Viagem.id_vec and solicitante='Fábio Gurgel' 58 PostgreSQL – Junção Natural ● Para descobrir os nomes dos motoristas e as placas dos carros utilizados nas viagens solicitadas por Marcos Oliveira, fazemos: select nome, placa from Motorista as M inner join Viagem as V on M.id_motorista=V.id_motorista inner join Veiculo as Vec on V.id_vec=Vec.id_vec and solicitante='Marcos Oliveira' 59 PostgreSQL – Exercício ● Considerando as tabelas Motorista, Veiculo e Viagem, determine um comando SQL para: ● Retornar os nomes de todos os solicitantes que realizaram viagens com ''Alex Oliveira''. ● Retornar as datas das viagens realizadas com o carro modelo Corsa. ● Retornar os nomes dos motoristas que realizaram viagens no dia 05/06/2014. ● Retornar as marcas dos carros que foram usados em viagens com horário de saída às 8h. ● Retornar os nomes dos solitantes que tiveram viagens realizadas em carro da marca Toyota e com o Motorista ''Pedro Farias''. 60 PostgreSQL – Visões ● É possível que ocorra a necessidade de fazer consultas mais de uma vez. ● E essas consultas podem ser complexas ou trabalhosas, sendo oneroso repeti-las toda vez que necessário. ● Para sanar esse problema foram criadas view (visões). ● Tratam-se de tabelas virtuais, que são geradas dinamicamente toda vez que a view é chamada. 61 PostgreSQL – Visões ● Assim, o SGBD armazena somente a definição da view. ● Ou seja, seu nome e o comando select. ● Quando o usuário chama uma view, o SGBD seleciona os dados apropriados a ela. ● As operações que podem ser realizadas nas visões são: ● criar (create view); ● selecionar (select); ● excluir (drop view). 62 PostgreSQL – Visões ● Considerando as tabelas Motorista, Veículo e Viagem, podemos determinar diversas visões. ● Por exemplo, podemos criar uma visão para guardar os nomes de todos os solicitantes de viagens: create view solicitante as select solicitante from Viagem ● Se fizermos o seguinte comando: select * from solicitante Veremos todos os dados que fazem parte da visão. 63 PostgreSQL – Visões ● Repare que os nomes dos atributos da visão são os atributos selecionados na definição da view. ● Por exemplo, criando uma view para armazenar as datas de ida e volta, fazemos: create view datas as select data_ida, data_volta from Viagem ● Quando selecionamos os dados, vemos que os atributos são data_ida e data_volta select * from datas 64 PostgreSQL – Visões ● Podemos realizar consultas envolvendo a view e outras tabelas. ● Por exemplo,vamos criar uma view com o id dos motoristas que realizaram viagens e os destinos: create view destinos as select id_motorista, destino from Viagem ● Agora vamos realizar uma consulta para descobrir os nomes dos motoristas que realizaram viagens para Fortaleza. 65 PostgreSQL – Visões ● Assim, temos select nome from Motorista inner join destinos on Motorista.id_motorista = destinos.id_motorista and destino = 'Fortaleza' ● Nesse caso, é interessante utilizar a view, pois precisamos de somente dois atributos da tabela Viagem. ● Assim, diminui a quantidade de dados do inner join. 67 PostgreSQL – Funções Data/Hora ● Um tipo de informação comum do nosso dia a dia são as datas e as horas. ● Em diversos sistemas, por exemplo, é necessário registrar o momento em que usuários realizam acessos. ● Os SGBDs disponibilizam diversas funções de data/hora. São elas: ● select current_date ● Seleciona a data corrente. 68 PostgreSQL – Funções Data/Hora ● select current_time ● Seleciona a hora corrente (considerando até milisegundos). ● select current_timestamp ● Seleciona a data e a hora corrente. ● Pode ser também ''Select now()'' 69 PostgreSQL – Funções Data/Hora ● Podemos ainda selecionar somente partes da data. Por exemplo, para selecionar somente o dia: select date_part('day',current_timestamp) ● Para selecionar somente o mês: select date_part('month',current_timestamp) 70 PostgreSQL – Funções Data/Hora ● Para selecionar somente o ano: select date_part('year',current_timestamp) ● Para selecionar o século: select date_part('century',current_timestamp) 71 PostgreSQL – Funções Data/Hora ● Para retornar o dia da semana e o mês fazemos: select timeofday() ● Quando solicitamos uma data ao SGBD, este retorna no padrão dos Estados Unidos: ano-mês-dia. ● No entanto, é possível solicitar ao SGDB que exiba a data no padrão brasileiro. Ou seja, dia-mês-ano. 72 PostgreSQL – Funções Data/Hora ● Para tal, utilizamos a função to_char. ● No caso, fazemos: select to_char (current_date,'DD-MM-YYYY') 73 PostgreSQL – Funções Data/Hora ● Ainda trabalhando com datas, podemos adicionar ou subtrair dias às datas. ● Por exemplo, podemos adicionar à data atual um prazo de 45 dias: select to_char (current_date + interval '45 days', 'DD-MM-YYYY') 74 PostgreSQL – Funções Data/Hora ● Podemos também querer saber quantos dias já se passaram desde uma determinada data. ● Para tal, precisamos subtrair datas. No caso: select current_date – date'2014-09-15' 75 PostgreSQL – Funções Data/Hora ● Perceba que o postgreSQL não atribui um nome à coluna retornada. ● Para tal, utilizamos a cláusula 'as'. ● No caso, vamos chamar a coluna de diasPassados select current_date – date'2014-09-15' as diasPassados 76 PostgreSQL ● A chave primária é de grande importância para o gerenciamento dos dados. ● Pois permite identificar unicamente uma tupla. ● Muitas vezes, esse código não necessita ser uma palavra específica. ● Basta somente que seja valores diferentes. ● Nesse caso é possível utilizar o tipo de dado serial. 77 PostgreSQL ● Os dados seriais são números inteiros. ● Nos quais o SGBD se responsabiliza de fazer um incremento. ● No caso, a cada entrada em uma linha, esse número receberá um incremento de x unidades. ● Por padrão, o incremento é de uma unidade. 78 PostgreSQL ● Por exemplo, suponha que você irá criar uma tabela denominada Nomes. ● E essa deve conter os atributos id_nome e nome, onde o primeiro é do tipo serial. ● Assim, fazemos: create table Teste ( id_nome serial, nome varchar(40), primary key(id_nome) ) 79 PostgreSQL ● Na inserção de valores, para o dado serial, passamos como parâmetro a palavra-chave ''default''. ● Assim, temos: insert into Teste values (default, 'Paloma'), (default, 'Ricardo') ● Quando selecionamos o conteúdo da tabela, vemos que os valores do id_nome foram criados automaticamente. 80 PostgreSQL ● Outra forma de inserir os valores, sem utilizar o ''default'', é determinar em qual atributo o valor será inserido. ● No caso, faremos: insert into Teste (nome) values ('Fátima'), ('Francisco') ● Selecionando os valores da tabela temos: 81 PostgreSQL ● É possível determinar como queremos a sequência da coluna que será auto-incrementada. ● Para tal, utilizamos a seguinte sintaxe: create sequence nome_da_sequencia increment by valor minvalue valor_minímo maxvalue valor_máximo start with início ● Vamos supor que queremos criar uma sequência que comece do 2 e contabilize de 2 em 2. 82 PostgreSQL ● Para tal, faremos: create sequence exemplo increment by 2 minvalue 2 maxvalue 10000 start with 2 ● Para criar uma tabela utilizando a sequência criada, fazemos: create table tabela ( colTeste int default nextval('exemplo'), nome varchar(30) ) 83 PostgreSQL ● Para inserir valores na tabela fazemos: insert into tabela values (default, 'Marta'), (default, 'Ricardo') ● Através do comando select vemos que a sequência começou do número 2 e está incrementando de 2 em 2. select * from tabela 84 PostgreSQL ● Se apagarmos os dados da tabela e inserirmos novos, veremos que a sequência continua de onde parou: delete from tabela insert into tabela values (DEFAULT, 'Patrícia'), (DEFAULT, 'Martins') ● Se for necessário que a sequência retorne ao primeiro valor, utilizamos o comando ''alter sequence'' combinado com o ''restart'': alter sequence exemplo restart with 2 85 PostgreSQL ● Podemos usar dados seriais para criar chaves primárias. ● Inclusive combinando letras e números. ● Nesse caso, inserimos os valores na tabela concatenando o número serial gerado mais uma letra. ● Por exemplo, vamos criar a seguinte tabela: create table Aluno ( id_aluno varchar(5), nome varchar(40), primary key (id_aluno) ) 86 PostgreSQL ● Iremos utilizar a sequência ''exemplo'' criada anteriormente e a função netxval(). ● Para concatenar uma letra com o número da sequência, iremos utilizar a função concat(). ● Assim, faremos: insert into Aluno values (concat('A', nextval('exemplo')), 'Paula'), (concat('A', nextval('exemplo')), 'Marcos') 87 PostgreSQL ● A concatenação pode ser feita não só na inserção de um valor como também nas consultas de dados. ● Por exemplo, com a tabela BD criada anteriormente, podemos exibir o nome e a média do aluno. ● No entanto, queremos exibir esses dados na seguinte frase: ''O aluno (nome) ficou com a média (média)''. ● Dessa forma, teremos: select concat ('O aluno ', nome, ' ficou com média ', media) from BD 88 PostgreSQL ● A concatenação também pode ser realizada com o operador II. ● Utilizando esse operador, o SGBD não atribui nenhum nome à coluna retornada. ● Utilizando o operador 'as', iremos nomear a coluna de Alunos. ● Nesse caso, faríamos: select 'O aluno ' || nome || ' ficou com média ' || media as Alunos from BD 89 Contato: luana.dantas@ufersa.edu.br Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58 Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 67 Slide 68 Slide 69 Slide 70 Slide 71 Slide 72 Slide 73 Slide 74 Slide 75 Slide 76 Slide 77 Slide 78 Slide 79 Slide 80 Slide 81 Slide 82 Slide 83 Slide 84 Slide 85 Slide 86 Slide 87 Slide 88 Slide 89
Compartilhar