Introdução ao SQL
Tags: mysql, sql, beginners, braziliandevs
Published: 2022-02-21 21:14:31

## Tabela de Conteúdos

- [SQL](#sql)
- [Constraints](#constraints)
- [Entidade](#entidade)
- [Vinculando Dados](#vinculando-dados)
- [MySQL - Linha de Comando](#mysql---linha-de-comando)
- [Links Úteis](#links-úteis)

---

## SQL

### O que é?
É a linguagem oficial de todo o banco de dados Relacional, ela nos permite interagir com o banco, selecionando, excluindo, alterando e adicionando informações.

### Estrutura
Todo banco de dados relacional tem sua estrutura baseada em __tabelas__, essas que são muito similares as tabelas do Excel. Porém em DB relacionais toda linha representa uma [entidade](#entidade) e toda a coluna uma característica dessa entidade.

| id | nome | idade |
|---|---|---|
|1|Gabriel|21|
|2|Lulu|1|

![sql table examplo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c5igeodd9m7m8zuvjwkb.png)

<small><sub>Curiosidade: Lulu é minha gata</sub></small>

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Constraints

### O que são?

São restrições que podemos impor a determinadas colunas da tabela do DB.

### O que fazem?
Definem restrições para as colunas, limitando as características de uma entidade.

### Quais são?
Existem diversos tipos de constraints (restrições) que podemos aplicar as nossas colunas, algumas delas são:

- __`NOT NULL`__: O campo com essa restrição nunca poderá ser nulo.

- __`UNIQUE`__: Faz com que o valor inserido na coluna seja único, nunca poderá haver outro valor igual.

- __`PRIMARY KEY`__: Garante com que a coluna seja usada como identificador único da tabela, também faz com que a coluna não possa receber valores nulos ou repetidos.

- __`FOREIGN KEY`__: Faz referência a chave primária de outra tabela, permitindo assim o relacionamento entre entidades.

- __`DEFAULT`__: Garante que um valor padrão seja definido, caso não passemos nenhum valor a coluna.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Entidade

### O que é?
É a representação de algo do mundo real dentro de nosso banco de dados, sendo que cada entidade possui suas próprias características _(colunas)_, podendo ser individuais ou compartilhadas.

### Exemplo
Vamos imaginar que tenhamos uma tabela de carros, onde cada carro é uma entidade _(linha)_ e suas características _(colunas)_ são cor, ano, modelo e marca.

Neste exemplo diversas informações podem se repetir, logo podemos criar tabelas separadas para armazenar esses dados e relacioná-los a partir das __FOREIGN KEYs__.

*Obs: _Não iremos abordar aqui quando as características de um entidade podem ser subdivididas em outras tabelas, esse conteúdo está no artigo de [Normalização de Tabelas](https://dev.to/gabrielhsilvestre/introducao-a-modelagem-de-banco-de-dados-sql-2h04)_.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Vinculando Dados

### O que é?
É um  relacionamento entre entidades de diferentes tabelas, dentro de um mesmo banco de dados.

### Tipos de Relacionamento

#### Um para Um `1:1`
Uma linha _(entidade)_ da Tabela A só deve corresponder a uma linha _(entidade)_ da Tabela B.

#### Um para Muitos `1:N`
Uma linha _(entidade)_ da Tabela A pode corresponder a diversas linhas _(entidades)_ na Tabela B.

#### Muitos para Um `N:1`
Diversas linhas _(entidades)_ da Tabela A podem corresponder a uma única linha _(entidade)_ na Tabela B.

#### Muitos para Muitos `N:N`
Diversas linhas _(entidades)_ da Tabela A podem corresponder a diversas linhas _(entidades)_ na Tabela B.

A forma mais comum é quando temos diversas ligações Um para Um `1:1:1`.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## MySQL - Linha de Comando

### O que é?
É a ferramenta via linha de comando para a utilização do MySQL dentro do terminal.

### Como fazer?
Para termos acesso ao banco de dados via terminal, primeiro precisamos logar, podemos nos autenticar através do usuário root ou qualquer outro usuário previamente cadastrado.

```
mysql -u root -p
mysql -u <usuário> -p
```

### Comandos
Após termos nos autenticado, fomos redirecionados para dentro do terminal do MySQL.

Para utilizar os comandos aqui precisamos utilizar as palavras chaves em caixa alta e fechar cada comando com ponto e vírgula `;`.


- __`USE`__

Serve para referenciar o DB que será utilizados por todas as queries a partir desse ponto.

``` sql
USE <banco de dados a ser conectado>;
```

- __`SELECT * FROM`__

Seleciona todos os dados de determinada tabela em determinado DB.

``` sql
SELECT * FROM <banco de dados>.<tabela>;
```

- __`SHOW TABLES`__

Retorna todas as tabelas iniciadas no servidor.

``` sql
SHOW TABLES;
```

- __`DESCRIBE`__

Visualiza a estrutura da tabela.

``` sql
DESCRIBE <nome da tabela>;
```

- __`CREATE DATABASE`__

Cria um novo banco de dados

``` sql
CREATE DATABASE <nome do banco de dados>;
```

### Observação
> Apesar de ser possível interagir com DB a partir do terminal, essa prática não é nem um pouco recomendada, o melhor a se fazer é utilizar alguma interface gráfica, seja uma IDE ou uma extensão do VsCode.

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

---

## Links Úteis

- [Documentação - MySQL Command Line](https://mariadb.com/kb/en/mysql-command-line-client/)
- [Manual de Referência - MySQL 8.0](https://dev.mysql.com/doc/refman/8.0/en/)
- [Cheat Sheet - MySQL](https://overapi.com/mysql)

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>