# SQL/Banco de dados Relacional

Antes de aprender SQL, bancos de dados relacional possuem diversos conceitos que devem ser aprendidos e compreendidos primeiro.

### Motivação

A unidade principal por trás de um banco de dados relacional tem como função aumentar a precisão, aumentando a eficiência com que os dados são armazenados. Por exemplo, os nomes de cada uma das milhões de pessoas que imigraram para os Estados Unidos através das Ilhas Ellis durante o século XX foram escritos à mão e guardados em uma grande quantidade de folhas de papel; pessoas da cidade de Londres tiveram seu país de origem definido como Inglaterra, ou Grã-Bretanha, ou Reino Unido ou ainda de alguma dessas formas abreviadas. Múltiplas maneiras de guardar a mesma informação geram confusão quando houver necessidade de saber algo simples como quantas pessoas vieram do país hoje conhecido como Reino.
A solução moderna para esse problema é o banco de dados. Um único registro é dado para cada país, por exemplo, em uma lista de referência que deve ser chamada de tabela de país. Quando alguém precisar indicar o Reino Unido, será necessário apenas ter uma escolha disponível para ela a partir da lista: uma simples lista de letras (ou string), "Reino Unido" como única representação do país, e qualquer outra informação que precisar desse país pode usar o mesmo termo a partir da lista para se referir ao mesmo país. Por exemplo, uma lista com os códigos de telefone do país e uma lista dos castelos europeus, ambos precisam se referir ao país; pelo uso da mesma lista de países para prover informações idênticas para as duas novas listas. Nós estabelecemos um novo relacionamento entre listas diferentes, com apenas um ítem em comum: país. Um banco de dados relacional, assim, é simplesmente uma coleção de listas que distribuem alguma parte da informação.

### Bancos de dados relacionais

Bancos de dados armazenam dados de um sistema de informação. Nós reagrupamos dados através de grupos de dados comparáveis (todos os empregados, todos os projetos, todos os escritórios, por exemplo). Para cada grupo de dados comparáveis, é criada uma tabela. Essa tabela é especialmente desenhada para atender esses tipos de dados (seus atributos). Por exemplo, uma tabela nomeada empregados que guarda todos os empregados seria feita assim:
empregados $^{atabela}$ :
| id_empregado $^{achaveprimária}$ | um número inteiro |
| primeiro nome $^{umacoluna}$ | uma string de caracteres $^{umacolunatipo}$ |
| último nome | uma string de caracteres |
| telefone | 10 numeros |
| endereço | uma string de caracteres |
E os funcionários da empresa seriam armazenados assim:
empregado :
| id_empregado | primeiro-nome | último-nome | telefone | endereço |
| 1 $^{umvalordecoluna}$ | Big | BOSS | 936854270 | big.boss@company.com |
| 2 | Jonas | Xavier | 936854271 | jonas.xavier@company.com |
| 3 | Linus | TORVALDS | 936854272 | linus.torvalds@company.com |
| 4 | Jimmy | WALES | 936854273 | jimmy.wales@company.com |
| 5 | Larry | PAGE | 936854274 | larry.page@company.com |
Os dados guardados em uma tabela são chamados entidades. Como uma tabela é usualmente representada como uma matriz, os atributos do dados (primeiro nome, último nome, ...) são chamados colunas e os registros (cada um dos empregados) são chamadas linhas. Uma chave primária é normalmente sublinhada. Qualquer atributo único (por exemplo, o endereço) ou grupo de atributos (como o primeiro nome e o último nome) podem ser a chave primária de uma tabela, mas isso é recomendado para a técnica do id, como no exemplo id_empregado como chave primária. A função da chave primária é simplesmente diferenciar uma das linhas, ou registros, que fazem parte de uma tabela.
Vamos criar um segunda tabela chamada projeto que guardará os projetos da empresa:
| empregado id_empregadoum inteiro primeiro-nomeuma string de caracteres último-nomeuma string de caracteres phone10 números endereçouma string de caracteres | projeto id_projetoum inteiro nomeuma string de caracteres data-da-criaçãouma data data-términouma data # gerenteum inteiro |
E os projetos da companhia seriam armazenados no banco da seguinte forma:
| empregado id_empregadoprimeiro-nomeúltimo-nometelefoneendereço 1BigBOSS936854270big.boss@company.com 2JohnDOE936854271john.doe@company.com 3LinusTORVALDS936854272linus.torvalds@company.com 4JimmyWALES936854273jimmy.wales@company.com 5LarryPAGE936854274larry.page@company.com | projetos id_projectnomedata-criaçãodata-término# gerente 1Google1998-09-08NULL5 2Linux1991-01-01NULL3 3Wikipedia2001-01-01NULL4 4 CRM 2015-09-14 NULL 5 |
id_project é a chave primária da tabela projeto e #gerente é a chave estrangeira. Uma chave estrangeira é uma chave primária de uma tabela, fazendo referência ou ligação com algum valor de outra tabela. Fazendo isso, o projeto Google está conectado ao empregado Larry PAGE. Essa ligação, ou conexão, se chama relacionamento. Uma chave estrangeira é usualmente precedida por um símbolo sharp (cerquilha ou jogo-da-velha '#'). Note que diversos projetos podem apontar para o mesmo gerente (no caso em tela o empregado Larry, id_empregado n.º 5 é gerente dos projetos 1 e 4), então um mesmo empregado pode ser gerente de vários projetos.
Agora, nós queremos criar, não apenas uma única ligação, mas múltiplas. Então criamos uma tabela de junção. Uma tabela de junção é uma tabela que não é usada para guardar dados, mas as ligações entre entidades de outras tabelas. É a tabela onde as ligações, ou relacionamentos, entre as tabelas são guardadas. Vamos criar uma tabela chamada membros que liga empregados com projeto:
| empregado id_empregadoum inteiro primeiro-nomeuma string de caracteres último-nomeuma string de caracteres telefone10 numeros endereçouma string de caracteres | membros # id_empregadoum inteiro # id_projetoum inteiro | projeto id_projetoum inteiro nomeuma string de caracteres data-criaçãouma data data-términouma data # gerenteum inteiro |
E os empregados e os projetos podem ser ligados assim:
| empregado id_employeeprimeiro-nomeúltimo-nometelefoneendereço 1BigBOSS936854270big.boss@company.com 2AugustoXAVIER936854271augusto.xavier@company.com 3LinusTORVALDS936854272linus.torvalds@company.com 4JimmyWALES936854273jimmy.wales@company.com 5LarryPAGE936854274larry.page@company.com 6MaxTHE GOOGLER936854275max.the-googler@company.com 7JennyTHE WIKIPEDIAN936854276jenny.the-wikipedian@company.com | projeto id_projectnomedata-criaçãodata-término# gerente 1Google1998-09-08NULL5 2Linux1991-01-01NULL3 3Wikipedia2001-01-01NULL4 4 CRM 2015-09-14 NULL 5 |
| membros # id_empregado# id_projeto 32 21 43 51 23 61 73 5 4 ||
Um empregado pode estar ligado com vários projetos e um projeto pode ser associado a vários empregados, o que é impossível com apenas uma chave estrangeira. Uma tabela de junção não tem chave primária próprias. Sua chave primária é o par de chaves estrangeiras, pois esse casal é único. Uma tabela de junção pode ligar mais de duas tabelas contendo entidade por mais colunas.

## Relacionamentos

Então vamos listar os diferentes tipos de relacionamento:
* Um para um,
* Um para muitos (como exemplo, o gerente de um projeto),
* Muitos para muitos (como exemplo, os membros de um projeto).