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).