<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=":coffee:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/coffee.png"> BD Essencial - Aula 2 </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 segunda aula, vamos falar sobre</p> <ul> <li>Enum;</li> <li>Chave composta;</li> <li>Relacionamento Many to Many;</li> <li>VIEW;</li> <li>STORED PROCEDURE;</li> <li>TRIGGER;</li> <li>before, old;</li> <li>backup de uma tabela;</li> <li>Count(*);</li> <li>sum, max e min;</li> <li>group by;</li> <li>union all;</li> <li>date_format;</li> <li>limit;</li> <li>time_format</li> </ul> <p>Estamos aprendendo <strong>SQL</strong>. A linguagem SQL &eacute; uma s&oacute;, por&eacute;m ela &eacute; dividida em tipos de acordo com a funcionalidade dos comandos.</p> <p>Os tipos da linguagem <strong>SQL</strong> s&atilde;o:</p> <p><strong>DDL</strong> - Data Definition Language - Linguagem de Defini&ccedil;&atilde;o de Dados. Possui comandos que interagem com os elementos do banco. S&atilde;o comandos DDL - CREATE, ALTER e DROP</p> <p><strong>DML</strong> - Data Manipulation Language - Linguagem de Manipula&ccedil;&atilde;o de Dados. Possui comandos que interagem com os dados dentro das tabelas. S&atilde;o comandos DML: INSERT, DELETE e UPDATE</p> <p><strong>DQL</strong> - Data Query Language - Linguagem de Consulta de dados. Possui o comando de consulta. SELECT &eacute; o comando de consulta. Aqui cabe uma observa&ccedil;&atilde;o: em alguns livros o SELECT fica na DML em outros tem esse grupo pr&oacute;prio.</p> <p><strong>DTL</strong> - Data Transaction Language - Linguagem de Transa&ccedil;&atilde;o de Dados. S&atilde;o os comandos para controle de transa&ccedil;&atilde;o.<br />S&atilde;o comandos DTL: BEGIN TRANSACTION, COMMIT E ROLLBACK</p> <p><strong>DCL</strong> - Data Control Language - Linguagem de Controle de Dados. Serve para controlar a parte de seguran&ccedil;a do banco de dados (dar e retirar permiss&otilde;es). S&atilde;o comandos DCL o GRANT, REVOKE E DENY.</p> <p>&nbsp;</p> ```sql= -- Many to Many drop database if exists banco2; create database banco2; use banco2; show tables; create table aluno( idAluno int primary key AUTO_INCREMENT, nome varchar (35), email varchar (50) unique, sexo enum ('m','f') ); create table professor( idProf int primary key AUTO_INCREMENT, nome varchar (35), email varchar (50) unique, sexo enum ('m','f') ); -- nao pode haver unique em id_prof -- porque um mesmo professor pode ter mais de uma turma create table turma( idTurma int primary key AUTO_INCREMENT, disciplina varchar (50), id_prof int not null, foreign key (id_prof) references professor(idProf) ); insert into aluno(nome, email, sexo) values ('joao', 'joao@gmail.com', 'm'), ('jose', 'jose@gmail.com', 'm'), ('maria', 'maria@gmail.com', 'f'), ('marcia', 'marcia@gmail.com', 'f'), ('pedro', 'pedro@gmail.com', 'm'), ('patricia', 'patricia@gmail.com', 'f'); insert into professor(nome, email, sexo) values ('belem', 'belem@gmail.com', 'm'), ('luciana', 'luciana@gmail.com', 'f'), ('fernando', 'fernando@gmail.com', 'm'); MariaDB [banco2]> select * from aluno; +---------+----------+--------------------+------+ | idAluno | nome | email | sexo | +---------+----------+--------------------+------+ | 1 | joao | joao@gmail.com | m | | 2 | jose | jose@gmail.com | m | | 3 | maria | maria@gmail.com | f | | 4 | marcia | marcia@gmail.com | f | | 5 | pedro | pedro@gmail.com | m | | 6 | patricia | patricia@gmail.com | f | +---------+----------+--------------------+------+ 6 rows in set (0.001 sec) MariaDB [banco2]> select * from professor; +--------+----------+--------------------+------+ | idProf | nome | email | sexo | +--------+----------+--------------------+------+ | 1 | belem | belem@gmail.com | m | | 2 | luciana | luciana@gmail.com | f | | 3 | fernando | fernando@gmail.com | m | +--------+----------+--------------------+------+ 3 rows in set (0.000 sec) insert into turma(disciplina, id_prof) values ('JAVA', 3), ('Angular', 2), ('JAVA FULL STACK', 1); MariaDB [banco2]> select * from turma; +---------+-----------------+---------+ | idTurma | disciplina | id_prof | +---------+-----------------+---------+ | 1 | JAVA | 3 | | 2 | Angular | 2 | | 3 | JAVA FULL STACK | 1 | +---------+-----------------+---------+ -- nesse caso, nao pode haver unique nas chaves estrangeiras -- chave composta create table aluno_turma( id_turma int not null, foreign key (id_turma) references turma(idTurma), id_aluno int not null, foreign key (id_aluno) references aluno(idAluno), primary key (id_turma, id_aluno) ); insert into aluno_turma(id_turma, id_aluno) values (1, 1), (1, 2), (1, 3), (2, 4), (2, 5), (2, 6), (3, 2), (3, 4), (3, 6); -- todos os alunos do belem select a.nome, t.disciplina, p.nome from aluno a inner join aluno_turma att on a.idAluno = att.id_aluno inner join turma t on att.id_turma = t.idTurma inner join professor p on p.idProf = t.id_prof where p.nome = 'belem'; MariaDB [banco2]> select a.nome, t.disciplina, p.nome -> from aluno a -> inner join aluno_turma att -> on a.idAluno = att.id_aluno -> inner join turma t -> on att.id_turma = t.idTurma -> inner join professor p -> on p.idProf = t.id_prof -> where p.nome = 'belem'; +----------+-----------------+-------+ | nome | disciplina | nome | +----------+-----------------+-------+ | jose | JAVA FULL STACK | belem | | marcia | JAVA FULL STACK | belem | | patricia | JAVA FULL STACK | belem | +----------+-----------------+-------+ -- mais uma turma para o belem insert into turma(disciplina, id_prof) values ('ORACLE', 1); -- mais alunos para essa nova turma insert into aluno_turma(id_turma, id_aluno) values (4, 1), (4, 3), (4, 5); MariaDB [banco2]> select a.nome, t.disciplina, p.nome -> from aluno a -> inner join aluno_turma att -> on a.idAluno = att.id_aluno -> inner join turma t -> on att.id_turma = t.idTurma -> inner join professor p -> on p.idProf = t.id_prof -> where p.nome = 'belem'; +----------+-----------------+-------+ | nome | disciplina | nome | +----------+-----------------+-------+ | jose | JAVA FULL STACK | belem | | marcia | JAVA FULL STACK | belem | | patricia | JAVA FULL STACK | belem | | joao | ORACLE | belem | | maria | ORACLE | belem | | pedro | ORACLE | belem | +----------+-----------------+-------+ 6 rows in set (0.001 sec) -- todos os professores de joao select a.nome, t.disciplina, p.nome from aluno a inner join aluno_turma att on a.idAluno = att.id_aluno inner join turma t on att.id_turma = t.idTurma inner join professor p on p.idProf = t.id_prof where a.nome = 'joao'; MariaDB [banco2]> select a.nome, t.disciplina, p.nome -> from aluno a -> inner join aluno_turma att -> on a.idAluno = att.id_aluno -> inner join turma t -> on att.id_turma = t.idTurma -> inner join professor p -> on p.idProf = t.id_prof -> where a.nome = 'joao'; +------+------------+----------+ | nome | disciplina | nome | +------+------------+----------+ | joao | ORACLE | belem | | joao | JAVA | fernando | +------+------------+----------+ -- VIEW create or replace view V$AlunoProf as select a.nome as ALUNO, t.disciplina, p.nome as PROF from aluno a inner join aluno_turma att on a.idAluno = att.id_aluno inner join turma t on att.id_turma = t.idTurma inner join professor p on p.idProf = t.id_prof order by p.nome, t.disciplina, a.nome; select * from V$AlunoProf where ALUNO='joao'; select * from V$AlunoProf where PROF='belem'; -- STORED PROCEDURE drop procedure if exists mostraLista; delimiter $$ create procedure mostraLista(nivel varchar(30), nome varchar(30)) begin case nivel when 'aluno' then select * from V$AlunoProf where ALUNO=nome; when 'prof' then select * from V$AlunoProf where PROF=nome; else select 'ERRO na passagem de parametros'; end case; end; $$ delimiter ; call mostraLista('prof','belem'); call mostraLista('aluno','joao'); -- TRIGGER create table alunobackup as select * from aluno where 1=0; MariaDB [banco2]> desc alunobackup; +---------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+-------+ | idAluno | int(11) | NO | | 0 | | | nome | varchar(35) | YES | | NULL | | | email | varchar(50) | YES | | NULL | | | sexo | enum('m','f') | YES | | NULL | | +---------+---------------+------+-----+---------+-------+ 4 rows in set (0.047 sec) MariaDB [banco2]> desc aluno; +---------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+----------------+ | idAluno | int(11) | NO | PRI | NULL | auto_increment | | nome | varchar(35) | YES | | NULL | | | email | varchar(50) | YES | UNI | NULL | | | sexo | enum('m','f') | YES | | NULL | | +---------+---------------+------+-----+---------+----------------+ 4 rows in set (0.049 sec) ALTER TABLE alunobackup MODIFY idAluno int primary key; MariaDB [banco2]> ALTER TABLE alunobackup MODIFY idAluno int primary key; Query OK, 0 rows affected (0.096 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [banco2]> desc alunobackup; +---------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+-------+ | idAluno | int(11) | NO | PRI | NULL | | | nome | varchar(35) | YES | | NULL | | | email | varchar(50) | YES | | NULL | | | sexo | enum('m','f') | YES | | NULL | | +---------+---------------+------+-----+---------+-------+ delimiter $$ create trigger beforeDel before delete on aluno for each row begin insert into alunobackup values (old.idAluno, old.nome, old.email, old.sexo); end; $$ delimiter ; insert into aluno values (1000,'exemplo','exemplo@gmail.com','m'); select * from aluno; select * from alunobackup; delete from aluno where idAluno = 1000; select * from alunobackup; insert into aluno values (1001,'exemplo1','exemplo1@gmail.com','f'), (1002,'exemplo2','exemplo2@gmail.com','f'), (1003,'exemplo3','exemplo3@gmail.com','f'), (1004,'exemplo4','exemplo4@gmail.com','f'); delete from aluno where idAluno>1000; select * from alunobackup; drop database if exists banco3; create database banco3; use banco3; show tables; create table supervisao( id int primary key auto_increment, vendedor varchar (50), valor double, dataVenda date, supervisao varchar (35), sexo enum ('m','f') ); insert into supervisao values (null,'gabriel',10000,'2015/01/10','luciana','m'); insert into supervisao values (null,'gabriel',5000,'2015/02/20','luciana','m'); insert into supervisao values (null,'gabriel',7000,'2015/03/10','luciana','m'); insert into supervisao values (null,'isabel',6000,'2015/01/10','luciana','f'); insert into supervisao values (null,'isabel',8000,'2015/02/20','luciana','f'); insert into supervisao values (null,'isabel',9000,'2015/03/10','luciana','f'); insert into supervisao values (null,'marcelo',10000,'2015/01/10', 'chaves','m'); insert into supervisao values (null,'marcelo',12000,'2015/02/20','chaves', 'm'); insert into supervisao values (null,'marcelo',14000,'2015/03/10','chaves', 'm'); select * from supervisao; --conta o numero de registros da tabela select count(*) from supervisao; +----------+ | count(*) | +----------+ | 9 | +----------+ -- max(valor): maior valor da coluna -- com o nome entre parenteses select max(valor) maiorValor from supervisao; +------------+ | maiorValor | +------------+ | 14000 | +------------+ select min(valor) menorValor from supervisao; +------------+ | menorValor | +------------+ | 5000 | +------------+ -- agrupa por vendedor e conta -- o numero de registros para cada um select count(*), vendedor from supervisao group by vendedor; +----------+----------+ | count(*) | vendedor | +----------+----------+ | 3 | gabriel | | 3 | isabel | | 3 | marcelo | +----------+----------+ -- agrupamos por vendedor e realizamos uma totalizacao -- calculamos quanto cada um vendeu somando -- os valores do campo 'valor' select sum(valor) as soma, vendedor from supervisao group by (vendedor); +-------+----------+ | soma | vendedor | +-------+----------+ | 22000 | gabriel | | 23000 | isabel | | 36000 | marcelo | +-------+----------+ -- total de vendas realizadas pelos -- vendedores de cada supervisor select sum(valor) as soma, supervisao from supervisao group by (supervisao); +-------+------------+ | soma | supervisao | +-------+------------+ | 36000 | chaves | | 45000 | luciana | +-------+------------+ -- para exibir os dois resultados numa consulta -- precisamos fazer a uniao dos dos conjuntos -- cada conjunto representado por uma das consultas acima -- também precisamos apresentar os resultados -- em colunas com nomes diferentes select sum(valor) as soma, vendedor, '' as supervisao from supervisao group by (vendedor) union all select sum(valor) as soma, '' as vendedor, supervisao from supervisao group by (supervisao); +-------+----------+------------+ | soma | vendedor | supervisao | +-------+----------+------------+ | 22000 | gabriel | | | 23000 | isabel | | | 36000 | marcelo | | | 36000 | | chaves | | 45000 | | luciana | +-------+----------+------------+ -- formatando datas e colocando em ordem descrescente -- selecionando apenas as 5 primeiras datas select date_format(dataVenda,'%d/%m/%y') as data from supervisao order by data desc limit 5; +----------+ | data | +----------+ | 20/02/15 | | 20/02/15 | | 20/02/15 | | 10/03/15 | | 10/03/15 | +----------+ -- union all novamente; dessa vez, -- agrupamos e totalizamos -- por vendedor e por mes select sum(valor) as soma, vendedor, '' as mes from supervisao group by (vendedor) union all select sum(valor) as soma, '' as vendedor, date_format(dataVenda,'%m') as mes from supervisao group by (mes); +-------+----------+------+ | soma | vendedor | mes | +-------+----------+------+ | 22000 | gabriel | | | 23000 | isabel | | | 36000 | marcelo | | | 26000 | | 01 | | 25000 | | 02 | | 30000 | | 03 | +-------+----------+------+ MariaDB [banco3]> select now(); +---------------------+ | now() | +---------------------+ | 2021-03-21 23:09:31 | +---------------------+ select time_format(now(),'%h:%i:%s %p'); +----------------------------------+ | time_format(now(),'%h:%i:%s %p') | +----------------------------------+ | 11:16:07 PM | +----------------------------------+ /* %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) %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) */ ``` <!-- <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>