<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 é capacitar o aluno a entrar no mercado de trabalho executando as atividades primordiais que são solicitadas no desenvolvimento, manutenção, ou atualização de bancos de dados dos mais diferentes tipos de sistemas.</p>
<p>Focamos na execução, e não em criação de diagramas - atividade essa que é 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 é gratuita e de fácil utilização - entretanto, todo o nosso conteúdo pode ser aplicado em qualquer Gerenciador de Bancos de Dados Relacionais, apenas com algumas mínimas diferenç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âmetros;</li>
<li>str_to_date;</li>
<li>importação e exportaçã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> </p>
<h3>Criptografia</h3>
<p>Criptografia é o ato de codificar dados em informações aparentemente sem sentido, para que pessoas não consigam ter acesso às informações que foram cifradas. Há vários usos para a criptografia em nosso dia-a-dia: proteger documentos secretos, transmitir informações confidenciais pela Internet ou por uma rede local, etc.</p>
<p>A técnica usada em Criptografia envolve pura e simples matemática. O sistema de criptografia usado atualmente é extremamente seguro. Especialistas estimam que para algué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 é tão seguro? Simples, uma chave de 2 bits terá 4 combinações possíveis. Uma chave de 4 bits, terá 16 combinações possíveis e assim por diante. Agora, vejamos a grande diferença: uma chave de apenas 8 bits terá 65.356 combinações possíveis e, em uma chave de 32 bits existem mais de 4 bilhões de combinaçõ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ção (login).</p>
<h3>MD5</h3>
<p>O MD5 (Message-Digest algorithm 5) é 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ção de integridade e logins. Foi desenvolvido para suceder ao MD4 que tinha alguns problemas de segurança.</p>
<p>Por ser um algoritmo unidirecional, um hash MD5 não pode ser transformado novamente na password (ou texto) que lhe deu origem. O método de verificação é, então, feito pela comparação das duas hash (uma da base de dados, e a outra da tentativa de login). O MD5 também é usado para verificar a integridade de um ficheiro através, por exemplo, do programa md5sum, que cria a hash de um ficheiro. Isto pode-se tornar muito útil para downloads de ficheiros grandes, para programas P2P que constroem o ficheiro através de pedaços e estão sujeitos à corrupção de ficheiros.</p>
<p>O MD5 é de domínio pú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, é computacionalmente impraticável descobrir duas mensagens que gerem o mesmo valor, bem como reproduzir uma mensagem a partir do seu digest. O algoritmo MD5 é utilizado como mecanismo de integridade em vários protocolos de padrão Internet (RFC1352, RFC1446, etc.), bem como pelo CERT e CIAC.</p>
<h3>Se o MD5 não pode ser descriptografado, qual é então sua utilidade?</h3>
<p>Message Digests são funções hash que geram código de tamanho fixo, em uma única direção, a partir de dados de tamanho arbitrário. Esses códigos hash são extremamente úteis para segurança de senhas. Como ele não pode ser descriptografado, o código hash precisa ser re-gerado e comparado com a seqüência disponível anteriormente. Se ambos se igualarem, o acesso é 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>

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