---
# System prepended metadata

title: "\n BD Essencial - Aula 3\n"

---

<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>




