kb.erickguedes.com
SQL: Domínio de Bancos Relacionais

SELECT, FROM, WHERE — Fundamentos

Aula 1 de 8

Estrutura Básica

SELECT coluna1, coluna2
FROM tabela
WHERE condicao;

Ordem de Execução Lógica

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
  1       2        3        4        5        6          7

SELECT

-- Colunas específicas
SELECT nome, email FROM usuarios;

-- Todas as colunas (evitar em produção)
SELECT * FROM usuarios;

-- Distinct (valores únicos)
SELECT DISTINCT cidade FROM clientes;

-- Aliases
SELECT nome AS "Nome Completo", salario * 12 AS "Salário Anual" FROM funcionarios;

-- Expressões
SELECT 
    nome,
    salario,
    salario * 1.1 AS salario_reajustado,
    CASE 
        WHEN salario > 10000 THEN 'Senior'
        WHEN salario > 5000 THEN 'Pleno'
        ELSE 'Junior'
    END AS nivel
FROM funcionarios;

WHERE — Filtros

-- Comparação
SELECT * FROM produtos WHERE preco > 100;
SELECT * FROM produtos WHERE preco BETWEEN 50 AND 200;
SELECT * FROM produtos WHERE categoria IN ('Eletrônicos', 'Informática');
SELECT * FROM clientes WHERE nome LIKE 'Jo%';           -- começa com Jo
SELECT * FROM clientes WHERE nome LIKE '%Silva%';       -- contém Silva
SELECT * FROM clientes WHERE nome LIKE 'A_ão';          -- A + 1 char + ão

-- Nulos
SELECT * FROM clientes WHERE telefone IS NULL;
SELECT * FROM clientes WHERE telefone IS NOT NULL;

-- Lógicos
SELECT * FROM produtos 
WHERE preco > 50 
  AND categoria = 'Eletrônicos'
  AND (estoque > 0 OR disponivel = true);

-- Datas
SELECT * FROM pedidos WHERE data_pedido >= '2024-01-01';
SELECT * FROM pedidos 
WHERE data_pedido BETWEEN '2024-01-01' AND '2024-06-30';

ORDER BY — Ordenação

SELECT nome, salario
FROM funcionarios
WHERE departamento = 'TI'
ORDER BY salario DESC;          -- maior para menor

SELECT nome, data_contratacao
FROM funcionarios
ORDER BY departamento ASC, nome ASC;  -- múltiplos critérios

-- Por posição (não recomendado)
SELECT nome, salario FROM funcionarios ORDER BY 2 DESC;

LIMIT / OFFSET — Paginação

SELECT * FROM produtos
ORDER BY id
LIMIT 20 OFFSET 0;    -- página 1

SELECT * FROM produtos
ORDER BY id
LIMIT 20 OFFSET 20;   -- página 2

-- Sintaxe alternativa (MySQL, PostgreSQL)
SELECT * FROM produtos ORDER BY id LIMIT 20 OFFSET 20;
SELECT * FROM produtos ORDER BY id LIMIT 20, 20;  -- MySQL (offset, limit)

Lab: CRUD Clientes

-- Criação
CREATE TABLE clientes (
    id SERIAL PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(200) UNIQUE NOT NULL,
    telefone VARCHAR(20),
    data_cadastro DATE DEFAULT CURRENT_DATE
);

-- Inserção
INSERT INTO clientes (nome, email, telefone) VALUES
    ('João Silva', '[email protected]', '11999999999'),
    ('Maria Santos', '[email protected]', '11988888888'),
    ('Carlos Lima', '[email protected]', '11977777777');

-- Consultas
SELECT * FROM clientes ORDER BY nome;
SELECT * FROM clientes WHERE data_cadastro >= CURRENT_DATE - INTERVAL '30 days';
SELECT COUNT(*) AS total, DATE_TRUNC('month', data_cadastro) AS mes
FROM clientes GROUP BY mes ORDER BY mes;

WHERE filtra linhas antes do GROUP BY. HAVING filtra grupos depois. ORDER BY é a última operação (exceto LIMIT). Use LIMIT + OFFSET para paginação (mas prefira keyset pagination para performance).