<p><img src="https://i.imgur.com/D01Fpky.png" alt="" title="Entre no nosso site e veja nossos cursos"></p> <h1> <img class="emoji" alt="" src="https://image.flaticon.com/icons/png/128/2906/2906274.png"> BD Essencial - Aula 3 </h1> <p>O objetivo desse curso &eacute; capacitar o aluno a entrar no mercado de trabalho executando as atividades primordiais que s&atilde;o solicitadas no desenvolvimento, manuten&ccedil;&atilde;o, ou atualiza&ccedil;&atilde;o de bancos de dados dos mais diferentes tipos de sistemas.</p> <p>Focamos na execu&ccedil;&atilde;o, e n&atilde;o em cria&ccedil;&atilde;o de diagramas - atividade essa que &eacute; desenvolvida por profissionais mais experientes.</p> <p>Nas nossas prieiras aulas, utilizamos o Gerenciador de Bancos de Dados Relacionais <strong>MySQL</strong> nesse nosso curso de Banco de Dados Essencial, porque essa ferramenta &eacute; gratuita e de f&aacute;cil utiliza&ccedil;&atilde;o - entretanto, todo o nosso conte&uacute;do pode ser aplicado em qualquer Gerenciador de Bancos de Dados Relacionais, apenas com algumas m&iacute;nimas diferen&ccedil;as.</p> <p>Na segunda parte do curso, utilizamos o Gerenciador de Bancos de Dados Relacionais <strong>PostgreSQL</strong>.</p> <blockquote style="border-left-color: red;"> <p><span class="color" data-color="red"></span><span> </span><small><i class="fa fa-user"></i> Prof Fernando Gomes - fernandojnr@gmail.com</small></p></blockquote> <h2 id="-Tema-da-aula" data-id="-Tema-da-aula"><a class="anchor hidden-xs" href="#-Tema-da-aula" title="-Tema-da-aula"><span class="octicon octicon-link"></span></a><img class="emoji" alt=":book:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/book.png"> <span> Tema da aula:</span></h2><span> <p>Nessa terceira aula, vamos falar sobre</p> <ul> <li>autocommit, commit, rollback;</li> <li>substring;</li> <li>like;</li> <li>regexp;</li> <li>create function;</li> <li>DATE_FORMAT() e seus par&acirc;metros;</li> <li>str_to_date;</li> <li>importa&ccedil;&atilde;o e exporta&ccedil;&atilde;o de dados de arquivo CSV;</li> <li>MD5 e salt;</li> <li>CONCAT strings;</li> <li>UPDATE;</li> <li>IF, THEN, ELSEIF, ELSE;</li> </ul> <p>&nbsp;</p> <h3>Criptografia</h3> <p>Criptografia &eacute; o ato de codificar dados em informa&ccedil;&otilde;es aparentemente sem sentido, para que pessoas n&atilde;o consigam ter acesso &agrave;s informa&ccedil;&otilde;es que foram cifradas. H&aacute; v&aacute;rios usos para a criptografia em nosso dia-a-dia: proteger documentos secretos, transmitir informa&ccedil;&otilde;es confidenciais pela Internet ou por uma rede local, etc.</p> <p>A t&eacute;cnica usada em Criptografia envolve pura e simples matem&aacute;tica. O sistema de criptografia usado atualmente &eacute; extremamente seguro. Especialistas estimam que para algu&eacute;m conseguir quebrar uma criptografia usando chaves de 64 bits na base da tentativa e erro, levaria cerca de 100.000 anos usando um PC comum.</p> <p>Mas porque &eacute; t&atilde;o seguro? Simples, uma chave de 2 bits ter&aacute; 4 combina&ccedil;&otilde;es poss&iacute;veis. Uma chave de 4 bits, ter&aacute; 16 combina&ccedil;&otilde;es poss&iacute;veis e assim por diante. Agora, vejamos a grande diferen&ccedil;a: uma chave de apenas 8 bits ter&aacute; 65.356 combina&ccedil;&otilde;es poss&iacute;veis e, em uma chave de 32 bits existem mais de 4 bilh&otilde;es de combina&ccedil;&otilde;es, que para serem decifradas levariam mais de 2 meses (levando em conta 1000 tentativas por segundo, por parte do computador).</p> <p>Neste artigo veremos como implementar um sistema de criptografia usando MD5. Implementaremos uma classe que criptografa os dados de uma senha usada em uma autentica&ccedil;&atilde;o (login).</p> <h3>MD5</h3> <p>O MD5 (Message-Digest algorithm 5) &eacute; um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verifica&ccedil;&atilde;o de integridade e logins. Foi desenvolvido para suceder ao MD4 que tinha alguns problemas de seguran&ccedil;a.</p> <p>Por ser um algoritmo unidirecional, um hash MD5 n&atilde;o pode ser transformado novamente na password (ou texto) que lhe deu origem. O m&eacute;todo de verifica&ccedil;&atilde;o &eacute;, ent&atilde;o, feito pela compara&ccedil;&atilde;o das duas hash (uma da base de dados, e a outra da tentativa de login). O MD5 tamb&eacute;m &eacute; usado para verificar a integridade de um ficheiro atrav&eacute;s, por exemplo, do programa md5sum, que cria a hash de um ficheiro. Isto pode-se tornar muito &uacute;til para downloads de ficheiros grandes, para programas P2P que constroem o ficheiro atrav&eacute;s de peda&ccedil;os e est&atilde;o sujeitos &agrave; corrup&ccedil;&atilde;o de ficheiros.</p> <p>O MD5 &eacute; de dom&iacute;nio p&uacute;blico para uso em geral. A partir de uma mensagem de um tamanho qualquer, ele gera um valor hash de 128 bits; com este algoritmo, &eacute; computacionalmente impratic&aacute;vel descobrir duas mensagens que gerem o mesmo valor, bem como reproduzir uma mensagem a partir do seu digest. O algoritmo MD5 &eacute; utilizado como mecanismo de integridade em v&aacute;rios protocolos de padr&atilde;o Internet (RFC1352, RFC1446, etc.), bem como pelo CERT e CIAC.</p> <h3>Se o MD5 n&atilde;o pode ser descriptografado, qual &eacute; ent&atilde;o sua utilidade?</h3> <p>Message Digests s&atilde;o fun&ccedil;&otilde;es hash que geram c&oacute;digo de tamanho fixo, em uma &uacute;nica dire&ccedil;&atilde;o, a partir de dados de tamanho arbitr&aacute;rio. Esses c&oacute;digos hash s&atilde;o extremamente &uacute;teis para seguran&ccedil;a de senhas. Como ele n&atilde;o pode ser descriptografado, o c&oacute;digo hash precisa ser re-gerado e comparado com a seq&uuml;&ecirc;ncia dispon&iacute;vel anteriormente. Se ambos se igualarem, o acesso &eacute; liberado.</p> ```sql= DROP database IF EXISTS banco4; CREATE database banco4; use banco4; show tables; create table produto(idProduto int primary key, nome varchar (35) unique, preco double); create table estoque(idEstoque int primary key, quantidade int, data datetime, fkidproduto int, foreign key(fkidproduto) references produto(idProduto) on delete cascade); set autocommit=0; insert into produto values (1000,'dvd machete',3); insert into produto values (1001,'dvd falcao negro em perigo',25); insert into produto values (1002,'dvd 13 horas benghazi',30); insert into produto values (1003,'dvd miami vice',32); insert into produto values (1004,'dvd swat',28); insert into produto values (1005,'dvd o ultimo heroi',25); insert into estoque values (10,1,now(),1000); insert into estoque values (15,5,now(),1001); insert into estoque values (17,8,now(),1002); insert into estoque values (20,3,now(),1003); insert into estoque values (25,2,'2016-03-10 12:20:00',1004); insert into estoque values (30,5,'2016-01-10 12:00:00',1005); -- rollback e commit -- select * from produto; -- select * from estoque; -- qual vai ser meu faturamento se eu vender TODOS os produtos? select sum(p.preco*e.quantidade) as total from produto p, estoque e where p.idProduto = e.fkidproduto; MariaDB [banco4]> select sum(p.preco*e.quantidade) as total -> from produto p, estoque e -> where p.idProduto = e.fkidproduto; +-------+ | total | +-------+ | 645 | +-------+ select sum(p.preco*e.quantidade) as total, p.nome from produto p, estoque e where p.idProduto = e.fkidproduto and substring(p.nome,1,5)='dvd m' group by (nome); +-------+----------------+ | total | nome | +-------+----------------+ | 3 | dvd machete | | 96 | dvd miami vice | +-------+----------------+ --outra maneira de obter o mesmo resultado select sum(p.preco*e.quantidade) as total, p.nome from produto p, estoque e where p.idProduto = e.fkidproduto and p.nome like '%dvd m%' group by (nome); -- fazendo uso de espressao regular select * from produto where nome regexp 'miami|swat'; +-----------+----------------+-------+ | idProduto | nome | preco | +-----------+----------------+-------+ | 1003 | dvd miami vice | 32 | | 1004 | dvd swat | 28 | +-----------+----------------+-------+ drop procedure if exists totalProduto; drop function if exists totalProduto; delimiter $$ create function totalProduto(vproduto char(35)) returns double begin declare vtotal double; set vtotal = 0; select sum(p.preco*e.quantidade) into vtotal from produto p, estoque e where p.idProduto = e.fkidproduto -- and p.nome like '%vproduto%'; and p.nome regexp vproduto; return vtotal; end; $$ delimiter ; select totalProduto('falcao'); -- call totalProduto('falcao'); +------------------------+ | totalProduto('falcao') | +------------------------+ | 125 | +------------------------+ -- opcional: datas escritas em portugues SELECT @@lc_time_names; +-----------------+ | @@lc_time_names | +-----------------+ | en_US | +-----------------+ SET lc_time_names = 'pt_BR'; SELECT @@lc_time_names; +-----------------+ | @@lc_time_names | +-----------------+ | pt_BR | +-----------------+ -- parametros do comando DATE_FORMAT() /* %a Abbreviated weekday name (Sun to Sat) %b Abbreviated month name (Jan to Dec) %c Numeric month name (0 to 12) %D Day of the month as a numeric value, followed by suffix (1st, 2nd ...) %d Day of the month as a numeric value (01 to 31) %e Day of the month as a numeric value (0 to 31) %f Microseconds (000000 to 999999) %H Hour (00 to 23) %h Hour (00 to 12) %I Hour (00 to 12) %i Minutes (00 to 59) %j Day of the year (001 to 366) %k Hour (0 to 23) %l Hour (1 to 12) %M Month name in full (January to December) %m Month name as a numeric value (00 to 12) %p AM or PM %r Time in 12 hour AM or PM format (hh:mm:ss AM/PM) %S Seconds (00 to 59) %s Seconds (00 to 59) %T Time in 24 hour format (hh:mm:ss) %U Week where Sunday is the first day of the week (00 to 53) %u Week where Monday is the first day of the week (00 to 53) %V Week where Sunday is the first day of the week (01 to 53). Used with %X %v Week where Monday is the first day of the week (01 to 53). Used with %x %W Weekday name in full (Sunday to Saturday) %w Day of the week where Sunday=0 and Saturday=6 %X Year for the week where Sunday is the first day of the week. Used with %V %x Year for the week where Monday is the first day of the week. Used with %v %Y Year as a numeric, 4-digit value %y Year as a numeric, 2-digit value */ select date_format(now(),'%d/%m/%y - %W'); select date_format(now(),'%T %p'); select date_format('10-01-1996','%d/%m/%y'); +--------------------------------------+ | date_format('10-01-1996','%d-%m-%y') | +--------------------------------------+ | NULL | +--------------------------------------+ select date_format('2020-12-30','%d/%m/%y'); +--------------------------------------+ | date_format('2020-12-30','%d/%m/%y') | +--------------------------------------+ | 30/12/20 | +--------------------------------------+ create table datas(id int primary key, nome varchar (50), dataNascimento date); insert into datas values (100,'paulo', '1996-01-10'); insert into datas values (101,'lu', '1976-01-21'); insert into datas values (102,'gabriel', '1997-02-12'); insert into datas values (103,'belem', '1973-01-28'); select * from datas; set @data=date_format('2003-08-21','%d-%m-%Y'); select @data; insert into datas values (104,'isabelle', str_to_date(@data,'%d-%m-%Y')); select * from datas; +-----+----------+----------------+ | id | nome | dataNascimento | +-----+----------+----------------+ | 100 | paulo | 1996-01-10 | | 101 | lu | 1976-01-21 | | 102 | gabriel | 1997-02-12 | | 103 | belem | 1973-01-28 | | 104 | isabelle | 2003-08-21 | +-----+----------+----------------+ select date_format(dataNascimento,'%Y') ano, date_format(dataNascimento,'%M') mes, date_format(dataNascimento,'%d') dia, nome from datas; +------+-----------+------+----------+ | ano | mes | dia | nome | +------+-----------+------+----------+ | 1996 | janeiro | 10 | paulo | | 1976 | janeiro | 21 | lu | | 1997 | fevereiro | 12 | gabriel | | 1973 | janeiro | 28 | belem | | 2003 | agosto | 21 | isabelle | +------+-----------+------+----------+ -- exportando dados para um arquivo CSV select * into outfile 'C:\\BD\\datas.csv' fields terminated by ';' lines terminated by '\n' from datas; --depois de ver o arquivo e apaga-lo select id,nome,dataNascimento into outfile 'C:\\BD\\datas.csv' fields terminated by ';' lines terminated by '\n'; create table dataCSV(id int primary key, nome varchar (50), dataNascimento date); load data infile 'C:\\BD\\datas.csv' into table dataCSV fields terminated by ';' lines terminated by '\n'; select * from dataCSV; -- alterar CSV e rodar de novo -- registros novos sao adicionados drop database IF EXISTS banco5; create database banco5; use banco5; create table banco(numeroAgencia int primary key AUTO_INCREMENT, nomeAgencia varchar (15) not null); create table correntista (idCorrentista bigint primary key auto_increment, nome varchar (35), email varchar (50) unique, senha varchar (100), saldo double, numero_agencia int, foreign key(numero_agencia) references banco(numeroAgencia)); insert into banco values (1000,'bradesco'); insert into banco values (2000,'itau'); set @salt=MD5('Use e$$e text0 p@ra aprimor@r o MD5!!!'); select @salt; -- b36dDdUeJCPRLMNUEd3hL4rtgNNg8SrUZd1 select concat("123", @salt); -- 12gncAkwvqNgDmopiKPR1Hh81qzT7mTZeb1 select MD5(CONCAT("123", @salt)); -- b6c58da492d326e0542b5fb2600b73e7 insert into correntista values (null, 'luis','louis@gmail.com',MD5(CONCAT("123", @salt)), 5000, 2000); select * from correntista; /* idCorrentista | nome | email | 3 | luis | louis@gmail.com | senha | b6c58da492d326e0542b5fb2600b73e7 | saldo | numero_agencia | 5000 | 2000 | */ create table movimentacao(idMovimentacao bigint primary key auto_increment, operacao varchar (20), deposito double, retirada double, horario datetime, id_Correntista bigint, foreign key(id_correntista) references correntista(idCorrentista)); set autocommit = 0; drop procedure if exists procmovimentacao; delimiter $$ create procedure procmovimentacao( voperacao varchar (35), vvalor double, vidcorrentista int) begin declare vsaldo double; set vsaldo =0; if (voperacao='deposito') then -- busco o saldo em vsaldo select saldo into vsaldo from correntista where idCorrentista = vidcorrentista; insert into movimentacao values (null,'deposito',vvalor,0, now(), vidcorrentista); update correntista set saldo = vsaldo + vvalor where idCorrentista = vidcorrentista; commit; elseif (voperacao='retirada') then select saldo into vsaldo from correntista where idCorrentista = vidcorrentista; select 'parte1'; if ( vsaldo>=vvalor ) then select 'parte2'; insert into movimentacao values (null,'retirada',0, vvalor, now(),vidcorrentista); update correntista set saldo = vsaldo - vvalor where idCorrentista = vidcorrentista; commit; else select concat('Saldo Insuficiente para Retirada :', vidcorrentista); rollback; end if; end if; end; $$ delimiter ; call procmovimentacao('deposito',2500, 1); call procmovimentacao('deposito',2500, 1); select * from correntista; select * from movimentacao; call procmovimentacao('retirada',1000, 1); ``` <!-- <h3> Tipos de Dados Numéricos do MySQL </h3> <p> Na tabela abaixo vemos os tipos da dados numéricos aceitos no MySQL. Utilizamos, BIT ou TINYINT(1) para armazenar um campo booleano. Além dessa situação, os mais utilizados são TINYINT, INT, e DOUBLE. Por padrão, os campos admitem números com sinal, portanto, o padrão [default] é SIGNED. </p> ![](https://i.imgur.com/ctbQVW0.png) --> <blockquote style="border-left-color: red;"> <p><span class="color" data-color="red"></span><span> </span><small><i class="fa fa-user"></i> Prof Fernando Gomes - fernandojnr@gmail.com</small></p></blockquote> <br> <div class="alert alert-info"> <blockquote style="border-left-color: blue;"> <p><span class="color" data-color="blue"></span><span> </span><small><i class="fa fa-user"></i> E.B. Cursos https://www.cursoseb.com.br/</small><br> <span class="color" data-color="blue"></span><span> </span><small><i class="fa fa-user"></i> E.B. Cursos EAD https://edsonbelemtreinamento.com.br/ead/</small></p> </blockquote> </div>