O que é SQL e como os bancos de dados relacionais funcionam

1. Introdução aos Bancos de Dados e sua Importância

Um banco de dados é um sistema organizado para armazenar, gerenciar e recuperar informações de forma eficiente. Diferente de planilhas como Excel ou Google Sheets, bancos de dados oferecem controle avançado sobre integridade, concorrência e segurança dos dados. Enquanto uma planilha pode ser suficiente para listas simples de contatos ou despesas pessoais, sistemas empresariais como bancos, e-commerce e aplicações web exigem soluções robustas que suportem milhares de transações simultâneas sem perda de dados.

Existem dois grandes grupos de bancos de dados: relacionais e não relacionais (NoSQL). Os relacionais, foco deste artigo, organizam dados em tabelas com relações definidas entre elas. Já os NoSQL são mais flexíveis em estrutura, usados para dados não estruturados ou semi-estruturados, como documentos JSON ou grafos.

No mundo real, sistemas bancários utilizam bancos relacionais para garantir que transferências sejam atômicas e consistentes. E-commerces registram pedidos, clientes e estoque em tabelas interconectadas. Aplicações web modernas, desde redes sociais até ERPs hospitalares, dependem desses bancos para operar com confiabilidade.

2. O Modelo Relacional: Fundamentos

O modelo relacional, proposto por Edgar Codd em 1970, baseia-se no conceito de tabelas (formalmente chamadas de relações). Cada tabela representa uma entidade do mundo real, como "Clientes", "Produtos" ou "Pedidos".

As linhas (tuplas) são registros individuais — por exemplo, um cliente específico. As colunas (atributos) representam características desse registro, como nome, email ou CPF. Cada coluna possui um domínio, que define o tipo de dado permitido (texto, número, data, etc.). Isso garante consistência: você não pode inserir "abc" em uma coluna que espera números inteiros.

Tabela: Clientes
| id_cliente | nome           | email                | data_cadastro |
|------------|----------------|----------------------|---------------|
| 1          | Maria Silva    | maria@email.com      | 2024-01-15    |
| 2          | João Santos    | joao@email.com       | 2024-02-20    |

Cada coluna tem um tipo definido. id_cliente pode ser INTEGER, nome como VARCHAR(100) e data_cadastro como DATE. Essa estruturação evita ambiguidades e facilita consultas.

3. Chaves e Relacionamentos entre Tabelas

Para conectar tabelas, usamos chaves. A chave primária (Primary Key) é um identificador único para cada linha. Na tabela Clientes, id_cliente é a chave primária — garante que não existam dois clientes com o mesmo ID.

A chave estrangeira (Foreign Key) referencia a chave primária de outra tabela, estabelecendo um relacionamento. Por exemplo, uma tabela Pedidos pode ter id_cliente como chave estrangeira, indicando a qual cliente aquele pedido pertence.

Tabela: Pedidos
| id_pedido | id_cliente | data_pedido | valor_total |
|-----------|------------|-------------|-------------|
| 101       | 1          | 2024-03-10  | 250.00      |
| 102       | 2          | 2024-03-12  | 180.00      |

Os tipos de relacionamentos são:
- 1:1 (um para um): Um cliente tem um único perfil. Raro, mas útil para dividir tabelas grandes.
- 1:N (um para muitos): Um cliente pode ter vários pedidos. É o mais comum.
- N:N (muitos para muitos): Um produto pode estar em vários pedidos, e um pedido pode conter vários produtos. Requer uma tabela de junção (ex: itens_pedido) com chaves estrangeiras para ambas as tabelas.

4. O que é SQL (Structured Query Language)

SQL (Structured Query Language) é a linguagem padrão para interagir com bancos de dados relacionais. Criada nos anos 1970 e padronizada pela ANSI, ela é adotada por todos os principais sistemas: PostgreSQL, MySQL, SQL Server, Oracle, entre outros. Cada um possui pequenas variações (dialetos), mas o núcleo da linguagem é universal.

SQL divide-se em subconjuntos:
- DDL (Data Definition Language): Criar e modificar estruturas (CREATE, ALTER, DROP).
- DML (Data Manipulation Language): Manipular dados (INSERT, UPDATE, DELETE).
- DQL (Data Query Language): Consultar dados (SELECT).
- DCL (Data Control Language): Gerenciar permissões (GRANT, REVOKE).

SQL é uma linguagem declarativa: você diz o que deseja obter, não como o banco deve executar. O sistema otimiza internamente a forma de recuperar os dados.

5. Operações Fundamentais com DML e DQL

Vamos criar uma tabela simples e realizar operações básicas.

INSERT: Adiciona registros.

INSERT INTO Clientes (nome, email, data_cadastro)
VALUES ('Ana Costa', 'ana@email.com', '2024-04-01');

SELECT: Consulta dados.

SELECT nome, email FROM Clientes WHERE data_cadastro > '2024-01-01';

Isso retorna nome e email de clientes cadastrados após 1º de janeiro de 2024.

UPDATE: Modifica registros existentes.

UPDATE Clientes SET email = 'ana.novo@email.com' WHERE id_cliente = 3;

DELETE: Remove registros.

DELETE FROM Clientes WHERE id_cliente = 3;

Cuidado: sem cláusula WHERE, DELETE remove todas as linhas da tabela!

6. Consultas com JOIN: Unindo Tabelas

JOINs permitem combinar dados de duas ou mais tabelas baseando-se em uma condição de relação.

INNER JOIN: Retorna apenas registros que têm correspondência em ambas as tabelas.

SELECT Clientes.nome, Pedidos.id_pedido, Pedidos.valor_total
FROM Clientes
INNER JOIN Pedidos ON Clientes.id_cliente = Pedidos.id_cliente;

Resultado: lista de clientes que fizeram pedidos, com os dados dos pedidos.

LEFT JOIN: Retorna todos os registros da tabela à esquerda, mesmo sem correspondência na direita.

SELECT Clientes.nome, Pedidos.id_pedido
FROM Clientes
LEFT JOIN Pedidos ON Clientes.id_cliente = Pedidos.id_cliente;

Aqui, clientes sem pedidos aparecerão com NULL na coluna id_pedido.

RIGHT JOIN é o inverso: todos da tabela direita são mantidos.

Exemplo prático: em um sistema de vendas, queremos saber quais produtos nunca foram vendidos.

SELECT Produtos.nome
FROM Produtos
LEFT JOIN Itens_Pedido ON Produtos.id_produto = Itens_Pedido.id_produto
WHERE Itens_Pedido.id_produto IS NULL;

7. Normalização e Integridade dos Dados

Normalização é o processo de organizar tabelas para reduzir redundância e evitar anomalias. As principais formas normais:

  • 1FN (Primeira Forma Normal): Cada célula contém um único valor atômico. Sem listas ou arrays.
  • 2FN (Segunda Forma Normal): Estar na 1FN e todos os atributos não-chave dependerem completamente da chave primária.
  • 3FN (Terceira Forma Normal): Estar na 2FN e não haver dependências transitivas (um atributo não-chave depender de outro não-chave).

Na prática, a maioria dos sistemas chega até a 3FN, o que já elimina a maior parte dos problemas de redundância.

Restrições (constraints) garantem a integridade dos dados:
- NOT NULL: coluna não pode ficar vazia.
- UNIQUE: valores devem ser únicos na coluna.
- CHECK: valida condição (ex: CHECK (idade >= 18)).
- PRIMARY KEY e FOREIGN KEY: já discutidas.

Exemplo de criação de tabela com constraints:

CREATE TABLE Produtos (
    id_produto INTEGER PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    preco DECIMAL(10,2) CHECK (preco > 0),
    estoque INTEGER DEFAULT 0
);

8. Conclusão e Próximos Passos

SQL e o modelo relacional formam a espinha dorsal de sistemas de dados confiáveis. Com tabelas bem estruturadas, chaves para relacionamentos, consultas com JOIN e práticas de normalização, você pode construir bancos de dados robustos que suportam desde pequenos projetos até aplicações empresariais críticas.

Neste artigo, você aprendeu os fundamentos: o que são bancos relacionais, como organizar dados em tabelas, usar chaves primárias e estrangeiras, escrever comandos SQL básicos e realizar consultas combinando múltiplas tabelas.

No próximo artigo, instalaremos o PostgreSQL e executaremos os primeiros comandos na prática. Para continuar seus estudos, explore a documentação oficial e cursos online recomendados nas referências abaixo.

Referências