<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 é 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 primeira aula, vamos falar sobre</p>
<ul>
<li>Criação de tabelas;</li>
<li>Chave primá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>

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