<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 1 </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 primeira aula, vamos falar sobre</p> <ul> <li>Cria&ccedil;&atilde;o de tabelas;</li> <li>Chave prim&aacute;ria;</li> <li>Chave estrangeira (foreign key);</li> <li>Relacionamento 1-1;</li> <li>Relacionamento 1-n;</li> <li>INNER JOIN;</li> <li>LEFT JOIN;</li> <li>RIGHT JOIN;</li> <li>not null, unique, auto_increment;</li> <li>alter table, modify;</li> <li>order by, em ordem normal ou descendente;</li> <li>desc table;</li> <li>IS NULL;</li> <li>delete;</li> </ul> <!-- <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) --> ```sql= --abrindo o MySql: usuario root e ele abre p/vc digitar a senha mysql -u root -p --mostrar todos os bancos de dados ja criados show databases; +--------------------+ | Database | +--------------------+ | bdauladois | | bdorm1 | | bdtres | | information_schema | | mysql | | performance_schema | | phpmyadmin | | test | +--------------------+ 8 rows in set (0.056 sec) MariaDB [(none)]> show databases like 'te%'; +----------------+ | Database (te%) | +----------------+ | test | +----------------+ 1 row in set (0.001 sec) drop database if exists banco1; create database banco1; use banco1; show tables; create table cliente( idCliente int primary key AUTO_INCREMENT, nome varchar (50) not null, email varchar (50) unique ); -- Relacionamento One To Many 1-n -- primeira forma normal create table telefone ( idTelefone int primary key AUTO_INCREMENT, numero varchar (20), operadora varchar (15), id_cliente int, foreign key(id_cliente) references cliente(idCliente) ); insert into cliente(nome, email) values ('fernando', 'fernando@gmail'), ('belem', 'belem@gmail.com'), ('luciana', 'lu@gmail.com'); MariaDB [banco1]> select * from cliente; +-----------+----------+-----------------+ | idCliente | nome | email | +-----------+----------+-----------------+ | 1 | fernando | fernando@gmail | | 2 | belem | belem@gmail.com | | 3 | luciana | lu@gmail.com | +-----------+----------+-----------------+ insert into telefone(numero, operadora, id_cliente) values ('21989878780', 'tim', 1), ('21912378780', 'nextel', 1), ('21334878780', 'oi', 2), ('21556878780', 'claro', 2), ('21989877770', 'vivo', 3); MariaDB [banco1]> select * from telefone -> ; +------------+-------------+-----------+------------+ | idTelefone | numero | operadora | id_cliente | +------------+-------------+-----------+------------+ | 1 | 21989878780 | tim | 1 | | 2 | 21912378780 | nextel | 1 | | 3 | 21334878780 | oi | 2 | | 4 | 21556878780 | claro | 2 | | 5 | 21989877770 | vivo | 3 | +------------+-------------+-----------+------------+ MariaDB [banco1]> select * from telefone order by operadora; +------------+-------------+-----------+------------+ | idTelefone | numero | operadora | id_cliente | +------------+-------------+-----------+------------+ | 4 | 21556878780 | claro | 2 | | 2 | 21912378780 | nextel | 1 | | 3 | 21334878780 | oi | 2 | | 1 | 21989878780 | tim | 1 | | 5 | 21989877770 | vivo | 3 | +------------+-------------+-----------+------------+ select * from telefone order by operadora desc; select cliente.nome, telefone.numero from cliente INNER JOIN telefone ON telefone.id_cliente = cliente.idCliente; MariaDB [banco1]> select cliente.nome, telefone.numero from cliente INNER JOIN telefone ON telefone.id_cliente = cliente.idCliente; +----------+-------------+ | nome | numero | +----------+-------------+ | fernando | 21989878780 | | fernando | 21912378780 | | belem | 21334878780 | | belem | 21556878780 | | luciana | 21989877770 | +----------+-------------+ select c.nome, t.numero from cliente as c INNER JOIN telefone as t ON t.id_cliente = c.idCliente; -- relacionamento 1-1 One To One create table endereco ( idEndereco int primary key AUTO_INCREMENT, bairro varchar (50), cidade varchar (50), id_cliente int unique, foreign key(id_cliente) references cliente(idCliente) ); -- id_cliente int unique Isso garante que so poderei -- ter UM endereco para cada cliente desc cliente; MariaDB [banco1]> desc cliente; +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | idCliente | int(11) | NO | PRI | NULL | auto_increment | | nome | varchar(50) | NO | | NULL | | | email | varchar(50) | YES | UNI | NULL | | +-----------+-------------+------+-----+---------+----------------+ desc endereco; MariaDB [banco1]> desc endereco; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | idEndereco | int(11) | NO | PRI | NULL | auto_increment | | bairro | varchar(50) | YES | | NULL | | | cidade | varchar(50) | YES | | NULL | | | id_cliente | int(11) | YES | UNI | NULL | | +------------+-------------+------+-----+---------+----------------+ desc telefone; MariaDB [banco1]> desc telefone; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | idTelefone | int(11) | NO | PRI | NULL | auto_increment | | numero | varchar(20) | YES | | NULL | | | operadora | varchar(15) | YES | | NULL | | | id_cliente | int(11) | YES | MUL | NULL | | +------------+-------------+------+-----+---------+----------------+ -- MUL e UNI marcando 1-1 e 1-N insert into endereco (bairro, cidade, id_cliente) values ('Ilha do Gov.', 'Rio de Janeiro', 1), ('Barra', 'Rio de Janeiro', 2), ('Grajau', 'Sao Paulo', 3); insert into endereco (bairro, cidade, id_cliente) values ('Tijuca', 'Rio de Janeiro', 1); /* MariaDB [banco1]> insert into endereco (bairro, cidade, id_cliente) values -> ('Tijuca', 'Rio de Janeiro', 1); ERROR 1062 (23000): Duplicate entry '1' for key 'id_cliente' */ -- inserindo cliente sem endereco insert into cliente(nome, email) values ('joao', 'joao@gmail.com'); -- lista de clientes com endereco select c.nome, e.* from cliente as c INNER JOIN endereco as e ON c.idCliente = e.id_cliente; -- simplificando select c.nome, e.bairro, e.cidade from cliente as c INNER JOIN endereco as e ON c.idCliente = e.id_cliente; MariaDB [banco1]> select c.nome, e.* from cliente as c -> INNER JOIN endereco as e -> ON c.idCliente = e.id_cliente; +----------+------------+--------------+----------------+------------+ | nome | idEndereco | bairro | cidade | id_cliente | +----------+------------+--------------+----------------+------------+ | fernando | 1 | Ilha do Gov. | Rio de Janeiro | 1 | | belem | 2 | Barra | Rio de Janeiro | 2 | | luciana | 3 | Grajau | Sao Paulo | 3 | +----------+------------+--------------+----------------+------------+ 3 rows in set (0.002 sec) MariaDB [banco1]> select c.nome, e.bairro, e.cidade from cliente as c -> INNER JOIN endereco as e -> ON c.idCliente = e.id_cliente; +----------+--------------+----------------+ | nome | bairro | cidade | +----------+--------------+----------------+ | fernando | Ilha do Gov. | Rio de Janeiro | | belem | Barra | Rio de Janeiro | | luciana | Grajau | Sao Paulo | +----------+--------------+----------------+ 3 rows in set (0.000 sec) -- listando clientes COM OU SEM ENDERECO select c.nome, e.bairro, e.cidade from cliente as c LEFT JOIN endereco as e ON c.idCliente = e.id_cliente; MariaDB [banco1]> select c.nome, e.bairro, e.cidade from cliente as c -> LEFT JOIN endereco as e -> ON c.idCliente = e.id_cliente; +----------+--------------+----------------+ | nome | bairro | cidade | +----------+--------------+----------------+ | fernando | Ilha do Gov. | Rio de Janeiro | | belem | Barra | Rio de Janeiro | | luciana | Grajau | Sao Paulo | | joao | NULL | NULL | +----------+--------------+----------------+ -- listando clientes SEM ENDERECO select c.nome, e.* from cliente as c LEFT JOIN endereco as e ON c.idCliente = e.id_cliente; MariaDB [banco1]> select c.nome, e.* from cliente as c -> LEFT JOIN endereco as e -> ON c.idCliente = e.id_cliente; +----------+------------+--------------+----------------+------------+ | nome | idEndereco | bairro | cidade | id_cliente | +----------+------------+--------------+----------------+------------+ | fernando | 1 | Ilha do Gov. | Rio de Janeiro | 1 | | belem | 2 | Barra | Rio de Janeiro | 2 | | luciana | 3 | Grajau | Sao Paulo | 3 | | joao | NULL | NULL | NULL | NULL | +----------+------------+--------------+----------------+------------+ select c.nome, e.bairro, e.cidade from cliente as c LEFT JOIN endereco as e ON c.idCliente = e.id_cliente where e.id_cliente IS NULL; MariaDB [banco1]> select c.nome, e.bairro, e.cidade from cliente as c -> LEFT JOIN endereco as e -> ON c.idCliente = e.id_cliente -> where e.id_cliente IS NULL; +------+--------+--------+ | nome | bairro | cidade | +------+--------+--------+ | joao | NULL | NULL | +------+--------+--------+ -- endereco sem cliente - CUIDADO!!! insert into endereco (bairro, cidade, id_cliente) values ('lugar nenhum', 'cidade fantasma', null), ('lugar vazio', 'cidade deserta', null); -- listando os enderecos "orfaos" select c.nome, e.bairro, e.cidade from cliente as c RIGHT JOIN endereco as e ON c.idCliente = e.id_cliente where c.idCliente IS NULL; MariaDB [banco1]> select c.nome, e.bairro, e.cidade from cliente as c -> RIGHT JOIN endereco as e -> ON c.idCliente = e.id_cliente -> where c.idCliente IS NULL; +------+--------------+-----------------+ | nome | bairro | cidade | +------+--------------+-----------------+ | NULL | lugar nenhum | cidade fantasma | | NULL | lugar vazio | cidade deserta | +------+--------------+-----------------+ /* porem, nao nos interessa enderecos SEM clientes precisamos alterar a tabela endereco para nao aceitar mais insercoes de enderecos sem clientes e TAMBEM precisamos apagar esses enderecos da tabela endereco */ select * from endereco where id_cliente IS NULL; MariaDB [banco1]> select * from endereco where id_cliente IS NULL; +------------+--------------+-----------------+------------+ | idEndereco | bairro | cidade | id_cliente | +------------+--------------+-----------------+------------+ | 5 | lugar nenhum | cidade fantasma | NULL | | 6 | lugar vazio | cidade deserta | NULL | +------------+--------------+-----------------+------------+ delete from endereco where id_cliente IS NULL; MariaDB [banco1]> delete from endereco where id_cliente IS NULL; Query OK, 2 rows affected (0.006 sec) select * from endereco where id_cliente IS NULL; MariaDB [banco1]> select * from endereco where id_cliente IS NULL; Empty set (0.000 sec) ALTER TABLE endereco MODIFY id_cliente int unique NOT NULL; MariaDB [banco1]> ALTER TABLE endereco MODIFY id_cliente int unique NOT NULL; Query OK, 0 rows affected, 1 warning (0.125 sec) Records: 0 Duplicates: 0 Warnings: 1 MariaDB [banco1]> desc endereco; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | idEndereco | int(11) | NO | PRI | NULL | auto_increment | | bairro | varchar(50) | YES | | NULL | | | cidade | varchar(50) | YES | | NULL | | | id_cliente | int(11) | NO | UNI | NULL | | +------------+-------------+------+-----+---------+----------------+ -- precisamos alterar a tabela telefone para não haver -- telefone sem cliente select * from telefone where id_cliente IS NULL; MariaDB [banco1]> select * from telefone where id_cliente IS NULL; Empty set (0.001 sec) ALTER TABLE telefone MODIFY id_cliente int NOT NULL; MariaDB [banco1]> ALTER TABLE telefone MODIFY id_cliente int NOT NULL; Query OK, 0 rows affected (0.103 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [banco1]> desc telefone; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | idTelefone | int(11) | NO | PRI | NULL | auto_increment | | numero | varchar(20) | YES | | NULL | | | operadora | varchar(15) | YES | | NULL | | | id_cliente | int(11) | NO | MUL | NULL | | +------------+-------------+------+-----+---------+----------------+ /* listando tudo de todas as tabelas lembrando q nao ha nem telefone nem endereco sem cliente mas ha cliente sem endereco e/ou sem telefone */ select * from endereco e right join cliente c on c.idCliente = e.id_cliente left join telefone t on t.id_cliente = c.idCliente; MariaDB [banco1]> select * from endereco e -> right join cliente c -> on c.idCliente = e.id_cliente -> left join telefone t -> on t.id_cliente = c.idCliente; ``` <h4> Resultado da última consulta do painel acima: </h4> ```sql= select * from endereco e right join cliente c on c.idCliente = e.id_cliente left join telefone t on t.id_cliente = c.idCliente; MariaDB [banco1]> select * from endereco e -> right join cliente c -> on c.idCliente = e.id_cliente -> left join telefone t -> on t.id_cliente = c.idCliente; +------------+--------------+----------------+------------+-----------+----------+-----------------+------------+-------------+-----------+------------+ | idEndereco | bairro | cidade | id_cliente | idCliente | nome | email | idTelefone | numero | operadora | id_cliente | +------------+--------------+----------------+------------+-----------+----------+-----------------+------------+-------------+-----------+------------+ | 1 | Ilha do Gov. | Rio de Janeiro | 1 | 1 | fernando | fernando@gmail | 1 | 21989878780 | tim | 1 | | 1 | Ilha do Gov. | Rio de Janeiro | 1 | 1 | fernando | fernando@gmail | 2 | 21912378780 | nextel | 1 | | 2 | Barra | Rio de Janeiro | 2 | 2 | belem | belem@gmail.com | 3 | 21334878780 | oi | 2 | | 2 | Barra | Rio de Janeiro | 2 | 2 | belem | belem@gmail.com | 4 | 21556878780 | claro | 2 | | 3 | Grajau | Sao Paulo | 3 | 3 | luciana | lu@gmail.com | 5 | 21989877770 | vivo | 3 | | NULL | NULL | NULL | NULL | 4 | joao | joao@gmail.com | NULL | NULL | NULL | NULL | +------------+--------------+----------------+------------+-----------+----------+-----------------+------------+-------------+-----------+------------+ 6 rows in set (0.001 sec) ``` <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>