Banco de Dados: O Poder do SQL

Do Zero ao Join em um Único Dia

O que é SQL?

SQL (Structured Query Language) não é uma linguagem de programação comum (como Python), mas sim uma Linguagem Declarativa.

  • Linguagem Declarativa: Você diz ao banco de dados o que você quer, e não como ele deve processar os arquivos internos para buscar.
  • Padronização: Criada nos anos 70 pela IBM e padronizada pela ANSI, é a linguagem universal para Bancos de Dados Relacionais (RDBMS).

O Ecossistema de Dados

Embora o SQL seja o padrão, existem diferentes "sotaques" chamados de Dialetos.

SGBDs Famosos

  • PostgreSQL: O mais avançado e open-source.
  • MySQL/MariaDB: Popular para web e muito rápido.
  • Oracle/SQL Server: Gigantes corporativos.
  • SQLite: Um banco leve que vive dentro de um único arquivo (comum em apps mobile).

Anatomia de uma Tabela

Antes de digitar, precisamos entender onde os dados moram.

  • Tabela (Entidade): Representa um objeto do mundo real (ex: Cliente).
  • Coluna (Atributo): Características do objeto (ex: Nome, CPF).
  • Linha (Tupla/Registro): Um dado específico inserido.
  • Chave Primária (PK): O RG da linha. Um valor único que nunca se repete.

Categorias de Comandos SQL

O SQL é dividido em "famílias" para organizar as responsabilidades:

  1. DDL (Definition): Cria e altera a estrutura (as gavetas).
  2. DML (Manipulation): Insere, altera ou apaga o conteúdo (os papéis dentro das gavetas).
  3. DQL (Query): Faz as perguntas e gera relatórios.
  4. DCL/TCL: Controla acessos e a segurança das transações.

1. DDL: Definindo a Estrutura (CREATE)

Para criar uma tabela, precisamos definir os tipos de dados.

CREATE TABLE produto (
    id_produto INT PRIMARY KEY,         -- Inteiro e Identificador Único
    nome VARCHAR(100) NOT NULL,        -- Texto de até 100 caracteres, obrigatório
    preco DECIMAL(10, 2),              -- 10 dígitos totais, 2 após a vírgula
    data_cadastro DATE DEFAULT CURRENT_DATE
);

Alterando e Removendo (ALTER / DROP)

  • ALTER TABLE produto ADD COLUMN estoque INT; (Adiciona coluna)
  • DROP TABLE produto; (Apaga a tabela e todos os dados para sempre).

2. DML: Manipulando Dados (INSERT)

Inserir dados requer atenção à ordem das colunas ou a especificação delas.

-- Inserção Simples
INSERT INTO produto (id_produto, nome, preco) 
VALUES (1, 'Notebook Gamer', 4500.00);

-- Inserção Múltipla (Mais performática)
INSERT INTO produto (id_produto, nome, preco) VALUES 
(2, 'Mouse Sem Fio', 150.00),
(3, 'Teclado Mecânico', 300.00);

3. DML: O Perigo do UPDATE e DELETE

Estes comandos alteram ou removem dados existentes. Nunca esqueça o WHERE!

Update (Atualizar)

UPDATE produto 
SET preco = preco * 1.10 
WHERE id_produto = 2; -- Sem o WHERE, todos os produtos subiriam 10%

Delete (Remover)

DELETE FROM produto 
WHERE preco < 50.00; -- Remove apenas produtos baratos

4. DQL: Consultando Dados (SELECT)

O coração do SQL. A estrutura básica é:
SELECT [colunas] FROM [tabela] WHERE [filtros] ORDER BY [ordem]

Exemplos:

  • SELECT * FROM produto; (Traz tudo)
  • SELECT nome, preco FROM produto; (Apenas o necessário - melhor performance)

5. Refinando buscas: WHERE e LIKE

O WHERE filtra linhas. O LIKE permite buscas textuais flexíveis usando o caractere curinga %.

-- Busca produtos entre 100 e 500 reais que começam com 'Teclado'
SELECT * FROM produto
WHERE preco BETWEEN 100 AND 500
AND nome LIKE 'Teclado%';

  • LIKE 'A%': Começa com A.
  • LIKE '%A': Termina com A.
  • LIKE '%A%': Contém A em qualquer lugar.

6. Agrupamento: GROUP BY e Funções

Quando precisamos de estatísticas, usamos funções de agregação:

  • COUNT(): Conta registros.
  • SUM(): Soma valores.
  • AVG(): Média aritmética.
-- Quantos produtos temos em cada faixa de preço?
SELECT categoria, COUNT(*), AVG(preco)
FROM produtos
GROUP BY categoria;

7. O Filtro Pós-Agrupamento: HAVING

O WHERE não funciona para resultados de funções de agregação (como um COUNT). Para isso, usamos o HAVING.

-- Mostrar apenas categorias que possuem mais de 10 produtos
SELECT categoria, COUNT(*)
FROM produtos
GROUP BY categoria
HAVING COUNT(*) > 10;

Regra de Ouro: WHERE filtra a matéria-prima. HAVING filtra o produto acabado (o grupo).

8. Relacionamentos: O Poder do JOIN

Bancos relacionais evitam repetição de dados separando-os em tabelas. O JOIN as une na hora da consulta.

Tipos de JOIN:

  1. INNER JOIN: Só traz quem tem par nas duas tabelas.
  2. LEFT JOIN: Traz todos da esquerda, mesmo que não tenham par na direita (ex: Clientes que nunca compraram).
  3. RIGHT JOIN: Traz todos da direita.

Exemplo de JOIN na Prática

Vamos unir Pedido e Cliente.

SELECT 
    c.nome AS cliente, 
    p.data_pedido, 
    p.valor_total
FROM cliente AS c
INNER JOIN pedido AS p ON c.id_cliente = p.id_cliente
WHERE p.valor_total > 1000
ORDER BY p.data_pedido DESC;

  • c e p são Aliases (apelidos) para evitar digitar o nome da tabela toda hora.
  • ON define qual coluna faz a ponte entre as tabelas (geralmente PK e FK).

Desafio Final: O Relatório Mestre

Crie uma consulta que mostre o nome dos clientes, a soma total gasta por cada um, mas apenas para aqueles que gastaram mais de R$ 5.000,00 no total, ordenando do maior para o menor.

SELECT 
    c.nome, 
    SUM(p.valor_total) AS total_gasto
FROM cliente c
INNER JOIN pedido p ON c.id_cliente = p.id_cliente
GROUP BY c.nome
HAVING SUM(p.valor_total) > 5000
ORDER BY total_gasto DESC;

Exercícios Práticos

Utilizando o banco da locadora:

  • Listar todos os filmes

  • Buscar clientes cujo nome começa com A

  • Mostrar quantidade de clientes por cidade

  • Mostrar filmes alugados mais de 3 vezes

  • Listar clientes e suas locações usando JOIN

https://gist.github.com/oAllanWeb/70fec5d5e896706d9d3d9cb25350d95f