Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Resumo de "SQL" para Prova
Mesma situação: não consigo anexar PDF diretamente aqui. Segue o resumo completo e
organizado, com formas de baixar em PDF no final.
1. O que é SQL?
SQL = Structured Query Language (Linguagem de Consulta Estruturada)
Linguagem padrão para bancos de dados relacionais (SGBD)
Criada nos anos 1970 (IBM), padronizada pela ANSI/ISO
Declarativa: você diz o quê quer, não como buscar
Não é case-sensitive para palavras-chave (SELECT = select), mas dados podem ser
Principais SGBDs: MySQL, PostgreSQL, Oracle, SQL Server, SQLite, MariaDB.
2. Sublinguagens do SQL
Sigla Nome Função Comandos
DDL Data Definition Language
Define
estrutura
CREATE, ALTER, DROP,
TRUNCATE
DML
Data Manipulation
Language
Manipula
dados
INSERT, UPDATE, DELETE
DQL Data Query Language Consulta SELECT
DCL Data Control Language Permissões GRANT, REVOKE
TCL
Transaction Control
Language
Transações
COMMIT, ROLLBACK,
SAVEPOINT
3. DDL — Definição de Estrutura
CREATE TABLE
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
CREATE TABLE cliente (
 id INT PRIMARY KEY AUTO_INCREMENT,
 nome VARCHAR(100) NOT NULL,
 email VARCHAR(150) UNIQUE,
 idade INT CHECK (idade >= 0),
 ativo BOOLEAN DEFAULT TRUE,
 criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE
ALTER TABLE cliente ADD COLUMN telefone VARCHAR(20);
ALTER TABLE cliente DROP COLUMN telefone;
ALTER TABLE cliente MODIFY COLUMN nome VARCHAR(200);
DROP vs TRUNCATE vs DELETE
Comando Tipo O que faz
DROP TABLE DDL Remove a tabela inteira (estrutura + dados)
TRUNCATE TABLE DDL
Remove todos os dados, mantém estrutura; não pode ser
desfeito
DELETE FROM DML Remove linhas (pode ter WHERE e ROLLBACK)
4. DML — Manipulação de Dados
INSERT
INSERT INTO cliente (nome, email, idade)
VALUES ('Ana', 'ana@email.com', 30);
-- múltiplas linhas
INSERT INTO cliente (nome, email) VALUES
('João', 'joao@email.com'),
('Maria', 'maria@email.com');
UPDATE
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
UPDATE cliente
SET idade = 31, ativo = TRUE
WHERE id = 1;
⚠ Sem WHERE, atualiza TODAS as linhas!
DELETE
DELETE FROM cliente WHERE ativo = FALSE;
⚠ Sem WHERE, apaga TODAS as linhas!
5. DQL — Consultas (SELECT)
Estrutura básica
SELECT colunas
FROM tabela
WHERE condição
GROUP BY colunas
HAVING condição_agregada
ORDER BY colunas
LIMIT n;
Ordem lógica de execução (cai em prova!)
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
Importante: o SELECT é avaliado depois do WHERE/GROUP BY, por isso não se pode usar
alias do SELECT no WHERE (mas pode no ORDER BY).
Exemplos
SELECT nome, idade FROM cliente WHERE idade >= 18;
SELECT * FROM cliente ORDER BY nome ASC;
SELECT DISTINCT cidade FROM cliente;
SELECT nome FROM cliente WHERE nome LIKE 'A%'; -- começa com A
SELECT nome FROM cliente WHERE nome LIKE '%silva%'; -- contém silva
SELECT nome FROM cliente WHERE nome LIKE '_na'; -- _ = 1 caractere
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
SELECT * FROM cliente WHERE idade BETWEEN 18 AND 30;
SELECT * FROM cliente WHERE cidade IN ('SP', 'RJ', 'MG');
SELECT * FROM cliente WHERE email IS NULL;
SELECT * FROM cliente WHERE email IS NOT NULL;
LIMIT / OFFSET (paginação)
SELECT * FROM cliente ORDER BY id LIMIT 10 OFFSET 20;
6. Funções de Agregação
Função O que faz
COUNT() Conta linhas
SUM() Soma
AVG() Média
MIN() Mínimo
MAX() Máximo
SELECT COUNT(*) FROM cliente;
SELECT AVG(idade) FROM cliente;
SELECT cidade, COUNT(*) FROM cliente GROUP BY cidade;
7. GROUP BY e HAVING
GROUP BY: agrupa linhas para agregação
HAVING: filtra grupos (depois da agregação)
WHERE filtra linhas (antes da agregação)
SELECT cidade, COUNT(*) AS total
FROM cliente
WHERE ativo = TRUE -- filtra linhas
GROUP BY cidade
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
HAVING COUNT(*) > 5 -- filtra grupos
ORDER BY total DESC;
Regra de ouro: toda coluna no SELECT que não está em função de agregação deve estar no
GROUP BY.
8. JOINs (Junções)
-- INNER JOIN: só registros que casam nas duas tabelas
SELECT c.nome, p.valor
FROM cliente c
INNER JOIN pedido p ON p.cliente_id = c.id;
-- LEFT JOIN: todos da esquerda + correspondentes da direita
SELECT c.nome, p.valor
FROM cliente c
LEFT JOIN pedido p ON p.cliente_id = c.id;
-- RIGHT JOIN: todos da direita + correspondentes da esquerda
SELECT c.nome, p.valor
FROM cliente c
RIGHT JOIN pedido p ON p.cliente_id = c.id;
-- FULL OUTER JOIN: tudo dos dois lados
SELECT c.nome, p.valor
FROMcliente c
FULL OUTER JOIN pedido p ON p.cliente_id = c.id;
-- CROSS JOIN: produto cartesiano (todas as combinações)
SELECT * FROM cliente CROSS JOIN pedido;
Resumo visual dos JOINs
JOIN Retorna
INNER Só quem tem par nos dois lados
LEFT Todos da esquerda (+ par da direita quando existe)
RIGHT Todos da direita (+ par da esquerda quando existe)
FULL Todos dos dois lados
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
JOIN Retorna
CROSS Todas as combinações (produto cartesiano)
SELF JOIN
SELECT f.nome AS funcionario, g.nome AS gerente
FROM funcionario f
LEFT JOIN funcionario g ON f.gerente_id = g.id;
9. Subconsultas (Subqueries)
-- no WHERE
SELECT nome FROM cliente
WHERE id IN (SELECT cliente_id FROM pedido WHERE valor > 100);
-- escalar (retorna 1 valor)
SELECT nome FROM cliente
WHERE idade > (SELECT AVG(idade) FROM cliente);
-- no FROM (tabela derivada)
SELECT cidade, media
FROM (SELECT cidade, AVG(idade) AS media FROM cliente GROUP BY cidade) t
WHERE media > 30;
EXISTS vs IN
SELECT nome FROM cliente c
WHERE EXISTS (SELECT 1 FROM pedido p WHERE p.cliente_id = c.id);
EXISTS costuma ser mais eficiente quando a subconsulta retorna muitas linhas.
10. Constraints (Restrições)
Constraint Função
PRIMARY KEY Identifica unicamente a linha (NOT NULL + UNIQUE)
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
Constraint Função
FOREIGN KEY Referência a outra tabela (integridade referencial)
UNIQUE Valor único na coluna
NOT NULL Não aceita nulo
CHECK Valida condição
DEFAULT Valor padrão
CREATE TABLE pedido (
 id INT PRIMARY KEY AUTO_INCREMENT,
 cliente_id INT NOT NULL,
 valor DECIMAL(10,2) NOT NULL CHECK (valor >= 0),
 FOREIGN KEY (cliente_id) REFERENCES cliente(id)
 ON DELETE CASCADE
 ON UPDATE CASCADE
);
Ações de FK: CASCADE , SET NULL , RESTRICT , NO ACTION , SET DEFAULT .
11. Índices
Aceleram buscas (SELECT) mas tornam escritas (INSERT/UPDATE/DELETE) mais
lentas
Criados em colunas usadas em WHERE, JOIN, ORDER BY
CREATE INDEX idx_cliente_email ON cliente(email);
DROP INDEX idx_cliente_email ON cliente;
Tipos: B-tree (padrão), hash, full-text, único, composto.
Primary Key cria índice automaticamente.
12. Views
Tabela virtual baseada em uma consulta
Não armazena dados (em geral), simplifica consultas complexas
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
CREATE VIEW vw_clientes_ativos AS
SELECT id, nome, email FROM cliente WHERE ativo = TRUE;
SELECT * FROM vw_clientes_ativos;
DROP VIEW vw_clientes_ativos;
Vantagens: reutilização, segurança (esconde colunas), simplificação. Desvantagens: pode ter
performance ruim se mal usada.
13. Transações (TCL)
Transação: conjunto de operações que devem ser executadas atomicamente
Propriedades ACID:
Letra Significado
A Atomicidade — tudo ou nada
C Consistência — respeita regras
I Isolamento — transações não se atrapalham
D Durabilidade — persiste após COMMIT
START TRANSACTION;
UPDATE conta SET saldo = saldo - 100 WHERE id = 1;
UPDATE conta SET saldo = saldo + 100 WHERE id = 2;
COMMIT; -- confirma
-- ou
ROLLBACK; -- desfaz
Níveis de isolamento
READ UNCOMMITTED (menor isolamento)
READ COMMITTED
REPEATABLE READ
SERIALIZABLE (maior isolamento)
Problemas evitados: dirty read, non-repeatable read, phantom read.
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
14. DCL — Permissões
GRANT SELECT, INSERT ON cliente TO 'usuario'@'localhost';
REVOKE INSERT ON cliente FROM 'usuario'@'localhost';
15. Funções Nativas Úteis
String
UPPER(nome), LOWER(nome), TRIM(nome), LENGTH(nome),
CONCAT(nome, ' ', sobrenome),
SUBSTRING(nome, 1, 3),
REPLACE(nome, 'a', 'b')
Data/Hora
NOW(), CURDATE(), CURTIME(),
YEAR(data), MONTH(data), DAY(data),
DATEDIFF(d1, d2),
DATE_FORMAT(data, '%d/%m/%Y')
Numéricas
ROUND(valor, 2), CEIL(), FLOOR(), ABS(), MOD(a, b)
Condicionais
-- CASE
SELECT nome,
 CASE
 WHEN idadeT
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
-- NULLIF
SELECT NULLIF(a, b) FROM t;
16. Normalização (cai em prova!)
Processo de organizar dados para reduzir redundância e anomalias
Forma Regra
1FN Valores atômicos (sem listas em célula)
2FN 1FN + sem dependência parcial da chave composta
3FN
2FN + sem dependência transitiva (atributo não-chave depende de outro não-
chave)
BCNF Versão mais rigorosa da 3FN
4FN /
5FN
Dependências multivaloradas / de junção
Desnormalização: às vezes feita de propósito para performance (leitura).
17. Modelagem — Conceitos
Entidade → tabela
Atributo → coluna
Relacionamento → FK / tabela associativa
Cardinalidade: 1:1, 1:N, N:N
N:N exige tabela intermediária (associativa)
-- N:N entre aluno e curso
CREATE TABLE aluno_curso (
 aluno_id INT,
 curso_id INT,
 PRIMARY KEY (aluno_id, curso_id),
 FOREIGN KEY (aluno_id) REFERENCES aluno(id),
 FOREIGN KEY (curso_id) REFERENCES curso(id)
);
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
Chave estrangeira garante integridade referencial.
18. Window Functions (funções de janela)
SELECT nome, cidade, idade,
 ROW_NUMBER() OVER (PARTITION BY cidade ORDER BY idade DESC) AS pos
FROM cliente;
Principais: ROW_NUMBER() , RANK() , DENSE_RANK() , SUM() OVER , AVG() OVER , LAG() , LEAD() .
Diferença:
ROW_NUMBER() → 1, 2, 3, 4 (sem empates)
RANK() → 1, 2, 2, 4 (pula após empate)
DENSE_RANK() → 1, 2, 2, 3 (não pula)
19. Otimização e Boas Práticas
Evitar SELECT * em produção
Usar índices em colunas de WHERE/JOIN/ORDER BY
Evitar funções na coluna do WHERE ( WHERE YEAR(data) = 2024 quebra índice; prefira data
BETWEEN ... )
Usar EXISTS em vez de IN em subconsultas grandes (quando aplicável)
EXPLAIN / EXPLAIN ANALYZE para analisar planos de execução
Limitar resultados ( LIMIT ) em consultas exploratórias
Cuidado com N+1 queries em aplicações
Paginação com LIMIT/OFFSET (ou keyset pagination para grandes volumes)
20. Segurança — SQL Injection
Problema: concatenar entrada do usuário na query.
-- VULNERÁVEL
"SELECT * FROM usuario WHERE nome = '" + input + "'"
Solução: prepared statements / parameterized queries
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
SELECT * FROM usuario WHERE nome = ?; -- parâmetro
Outras práticas: validar entrada, princípio do menor privilégio, escapar corretamente.
21. Diferenças entre SGBDs (noções)
Aspecto MySQL PostgreSQL SQL Server Oracle
Licença Open source Open source Proprietária Proprietária
AUTO_INCREMENT AUTO_INCREMENT SERIAL / IDENTITY IDENTITY SEQUENCE
LIMIT LIMIT LIMIT TOP
FETCH
FIRST / ROWNUM
Boolean TINYINT(1) BOOLEAN BIT NUMBER(1)
String concat CONCAT() ` `
SQL é padrão, mas cada SGBD tem dialeto próprio.
22. Pontos-Chave para a Prova
1. Sublinguagens: DDL, DML, DQL, DCL, TCL
2. Ordem lógica do SELECT (FROM → WHERE → GROUP BY → HAVING → SELECT →
ORDER BY → LIMIT)
3. WHERE vs HAVING (linhas vs grupos)
4. DELETE vs TRUNCATE vs DROP
5. JOINs e o que cada um retorna
6. ACID e transações
7. Constraints (PK, FK, UNIQUE, CHECK, NOT NULL)
8. Normalização (1FN, 2FN, 3FN)
9. Índices (benefícios e custos)
10. SQL Injection e prepared statements
11. Agregação com GROUP BY
12. Subqueries e EXISTS
13. NULL e três valores lógicos ( TRUE , FALSE , UNKNOWN )
14. Cardinalidade e tabela associativa (N:N)
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
15. Window functions (ROW_NUMBER, RANK, DENSE_RANK)
23. Pegadinhas comuns
NULL não é igual a NULL → use IS NULL , não = NULL
COUNT(*) conta linhas; COUNT(coluna) ignora NULL
AVG ignora NULL (cuidado com médias)
WHERE idade = NULL nunca retorna nada
ORDER BY é o único que pode usar alias do SELECT
GROUP BY não pode usar alias do SELECT no MySQL (em alguns SGBDs pode)
HAVING sem GROUP BY funciona, mas é raro e confuso
INNER JOIN com WHERE pode se comportar como filtro adicional
LEFT JOIN + condição na tabela da direita no WHERE vira INNER JOIN — coloque a
condição no ON
24. Exemplo integrador (prova prática)
-- Clientes ativos com total de pedidos > 500, ordenados por total
SELECT c.nome,
 COUNT(p.id) AS qtd_pedidos,
 SUM(p.valor) AS total
FROM cliente c
INNER JOIN pedido p ON p.cliente_id = c.id
WHERE c.ativo = TRUE
 AND p.data >= '2024-01-01'
GROUP BY c.id, c.nome
HAVING SUM(p.valor) > 500
ORDER BY total DESC
LIMIT 10;
A
R
M
A
R
K
 W
A
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
M
A
R
K
 W
A
T
ER
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W
A
T
E
R
M
A
R
K
 W

Mais conteúdos dessa disciplina