➕
Operadores Aritméticos
Operadores Matemáticos Básicos
| Operador | Descrição | Exemplo | Resultado |
|---|---|---|---|
| + | Adição | 10 + 5 | 15 |
| - | Subtração | 10 - 5 | 5 |
| * | Multiplicação | 10 * 5 | 50 |
| / | Divisão | 10 / 4 | 2.5 |
| MOD() | Resto (módulo) | MOD(10, 3) | 1 |
-- Exemplos práticos de operadores aritméticos
SELECT
-- Operações básicas
10 + 5 AS adicao, -- 15
10 - 5 AS subtracao, -- 5
10 * 5 AS multiplicacao, -- 50
10 / 4 AS divisao, -- 2.5
MOD(10, 3) AS resto, -- 1
-- Expressões compostas
(10 + 5) * 2 AS com_parenteses, -- 30
10 + 5 * 2 AS sem_parenteses, -- 20 (multiplicação primeiro)
-- Operações com NULL
10 + NULL AS soma_null, -- NULL
10 * NULL AS multiplicacao_null, -- NULL
-- Usando com colunas
salario * 1.10 AS salario_reajustado, -- Reajuste de 10%
salario / 12 AS salario_mensal, -- Salário mensal
MOD(id, 2) AS par_ou_impar -- 0=par, 1=ímpar
FROM funcionarios;
Exemplos Práticos do Mundo Real
-- Calculando descontos progressivos
SELECT
produto,
preco_original,
CASE
WHEN quantidade >= 100 THEN preco_original * 0.80 -- 20% desconto
WHEN quantidade >= 50 THEN preco_original * 0.90 -- 10% desconto
ELSE preco_original
END AS preco_com_desconto,
quantidade * preco_original AS total_bruto,
quantidade * (preco_original * 0.85) AS total_liquido -- 15% desconto médio
FROM produtos;
-- Calculando comissão de vendedores
SELECT
vendedor,
total_vendas,
CASE
WHEN total_vendas > 100000 THEN total_vendas * 0.05 -- 5%
WHEN total_vendas > 50000 THEN total_vendas * 0.03 -- 3%
ELSE total_vendas * 0.01 -- 1%
END AS comissao
FROM vendas;
-- Dividindo valores igualmente (com resto)
SELECT
total_valor,
num_parcelas,
TRUNC(total_valor / num_parcelas, 2) AS valor_parcela,
MOD(total_valor, num_parcelas) AS resto_centavos
FROM pedidos;
⚖️
Operadores de Comparação
Operadores Relacionais
| Operador | Descrição | Exemplo |
|---|---|---|
| = | Igual a | salario = 5000 |
| != ou <> | Diferente de | status != 'ATIVO' |
| > | Maior que | idade > 18 |
| < | Menor que | preco < 100 |
| >= | Maior ou igual a | nota >= 7 |
| <= | Menor ou igual a | desconto <= 0.5 |
-- Exemplos de operadores de comparação
SELECT * FROM funcionarios WHERE salario = 5000; -- Exatamente 5000
SELECT * FROM funcionarios WHERE salario != 5000; -- Diferente de 5000
SELECT * FROM funcionarios WHERE salario <> 5000; -- Diferente de 5000 (mesmo que !=)
SELECT * FROM funcionarios WHERE salario > 5000; -- Maior que 5000
SELECT * FROM funcionarios WHERE salario < 5000; -- Menor que 5000
SELECT * FROM funcionarios WHERE salario >= 5000; -- 5000 ou mais
SELECT * FROM funcionarios WHERE salario <= 5000; -- 5000 ou menos
-- Comparação com datas
SELECT * FROM eventos WHERE data_evento = DATE '2025-01-15';
SELECT * FROM eventos WHERE data_evento > SYSDATE; -- Eventos futuros
SELECT * FROM eventos WHERE data_evento < SYSDATE - 30; -- Mais de 30 dias atrás
-- Comparação com strings (ordem alfabética)
SELECT * FROM clientes WHERE nome > 'M'; -- Nomes de M a Z
SELECT * FROM produtos WHERE codigo >= 'A100';
Cuidados com Comparações
NULL em Comparações
NULL não é igual a nada, nem mesmo a NULL!
-- ERRADO: Não funciona
SELECT * FROM funcionarios WHERE comissao = NULL;
-- CORRETO: Use IS NULL
SELECT * FROM funcionarios WHERE comissao IS NULL;
-- Comparações com NULL sempre retornam NULL (não TRUE nem FALSE)
SELECT
NULL = NULL AS teste1, -- NULL (não TRUE!)
NULL <> 5 AS teste2, -- NULL
5 > NULL AS teste3 -- NULL
FROM dual;
Strings Case-Sensitive
Oracle diferencia maiúsculas e minúsculas em strings!
-- Estes são DIFERENTES
SELECT * FROM clientes WHERE nome = 'João'; -- Encontra 'João'
SELECT * FROM clientes WHERE nome = 'JOÃO'; -- Encontra 'JOÃO'
SELECT * FROM clientes WHERE nome = 'joão'; -- Encontra 'joão'
-- Para busca case-insensitive, use UPPER ou LOWER
SELECT * FROM clientes WHERE UPPER(nome) = 'JOÃO';
🔗
Operadores Lógicos
AND, OR, NOT
AND
Todas as condições devem ser verdadeiras
SELECT * FROM funcionarios
WHERE salario > 5000
AND departamento = 'TI';
OR
Pelo menos uma condição deve ser verdadeira
SELECT * FROM funcionarios
WHERE departamento = 'TI'
OR departamento = 'RH';
NOT
Inverte o resultado da condição
SELECT * FROM funcionarios
WHERE NOT departamento = 'TI';
-- Equivalente a:
WHERE departamento != 'TI';
-- Combinando operadores lógicos
SELECT * FROM funcionarios
WHERE (departamento = 'TI' OR departamento = 'Financeiro')
AND salario > 5000
AND comissao IS NOT NULL;
-- Condições complexas
SELECT * FROM produtos
WHERE (categoria = 'Eletrônicos' AND preco < 1000)
OR (categoria = 'Livros' AND estoque > 0);
-- NOT com outros operadores
SELECT * FROM clientes
WHERE NOT (cidade = 'São Paulo' AND estado = 'SP');
-- Tabela verdade
SELECT
1 = 1 AND 2 = 2 AS and_true, -- TRUE
1 = 1 AND 2 = 3 AS and_false, -- FALSE
1 = 1 OR 2 = 3 AS or_true, -- TRUE
1 = 2 OR 2 = 3 AS or_false, -- FALSE
NOT (1 = 1) AS not_true -- FALSE
FROM dual;
Tabela Verdade
AND
| A | B | A AND B |
|---|---|---|
| TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE |
| FALSE | TRUE | FALSE |
| FALSE | FALSE | FALSE |
OR
| A | B | A OR B |
|---|---|---|
| TRUE | TRUE | TRUE |
| TRUE | FALSE | TRUE |
| FALSE | TRUE | TRUE |
| FALSE | FALSE | FALSE |
⭐
Operadores Especiais
BETWEEN - Intervalo de Valores
-- BETWEEN: valor está entre mínimo e máximo (inclusive)
SELECT * FROM funcionarios
WHERE salario BETWEEN 3000 AND 7000;
-- Equivalente a:
WHERE salario >= 3000 AND salario <= 7000;
-- NOT BETWEEN: valor fora do intervalo
SELECT * FROM funcionarios
WHERE salario NOT BETWEEN 3000 AND 7000;
-- BETWEEN com datas
SELECT * FROM vendas
WHERE data_venda BETWEEN DATE '2025-01-01' AND DATE '2025-01-31';
-- BETWEEN com strings (ordem alfabética)
SELECT * FROM clientes
WHERE nome BETWEEN 'A' AND 'M';
IN - Lista de Valores
-- IN: valor está na lista
SELECT * FROM funcionarios
WHERE departamento IN ('TI', 'RH', 'Financeiro');
-- Equivalente a:
WHERE departamento = 'TI'
OR departamento = 'RH'
OR departamento = 'Financeiro';
-- NOT IN: valor não está na lista
SELECT * FROM funcionarios
WHERE departamento NOT IN ('TI', 'RH');
-- IN com números
SELECT * FROM produtos
WHERE categoria_id IN (1, 3, 5, 7);
-- IN com subconsulta
SELECT * FROM funcionarios
WHERE departamento_id IN (
SELECT id FROM departamentos WHERE orcamento > 100000
);
CUIDADO com NULL em IN/NOT IN:
-- Se a lista contém NULL, NOT IN pode não retornar nada!
SELECT * FROM funcionarios
WHERE departamento NOT IN ('TI', 'RH', NULL); -- Pode não retornar registros!
-- Solução: remover NULLs da lista ou usar IS NULL separadamente
LIKE - Padrões de Texto
Curingas:
- % - Qualquer sequência de caracteres (zero ou mais)
- _ - Exatamente um caractere
-- LIKE com %
SELECT * FROM clientes WHERE nome LIKE 'João%'; -- Começa com 'João'
SELECT * FROM clientes WHERE nome LIKE '%Silva'; -- Termina com 'Silva'
SELECT * FROM clientes WHERE nome LIKE '%Santos%'; -- Contém 'Santos'
-- LIKE com _
SELECT * FROM produtos WHERE codigo LIKE 'A___'; -- A seguido de exatamente 3 caracteres
SELECT * FROM produtos WHERE codigo LIKE '_B__'; -- Segundo caractere é B
-- Combinando % e _
SELECT * FROM emails WHERE email LIKE '_a%@gmail.com'; -- Segundo caractere é 'a', termina com @gmail.com
-- NOT LIKE
SELECT * FROM clientes WHERE nome NOT LIKE '%Test%'; -- Não contém 'Test'
-- LIKE é case-sensitive!
SELECT * FROM clientes WHERE UPPER(nome) LIKE '%SILVA%'; -- Case-insensitive
-- Escapando caracteres especiais
SELECT * FROM produtos WHERE descricao LIKE '%50\%%' ESCAPE '\'; -- Busca '50%'
IS NULL / IS NOT NULL
-- IS NULL: verifica se é nulo
SELECT * FROM funcionarios WHERE comissao IS NULL;
-- IS NOT NULL: verifica se não é nulo
SELECT * FROM funcionarios WHERE comissao IS NOT NULL;
-- NUNCA use = NULL ou != NULL
SELECT * FROM funcionarios WHERE comissao = NULL; -- ERRADO! Sempre retorna 0 linhas
SELECT * FROM funcionarios WHERE comissao != NULL; -- ERRADO! Sempre retorna 0 linhas
-- Combinando com outros operadores
SELECT * FROM funcionarios
WHERE comissao IS NOT NULL
AND comissao > 1000;
-- Função NVL para substituir NULL
SELECT
nome,
NVL(comissao, 0) AS comissao_tratada, -- Se NULL, usa 0
salario + NVL(comissao, 0) AS total
FROM funcionarios;
🎯
Precedência de Operadores
Ordem de Avaliação
Da maior para menor precedência:
- Parênteses ( ) - Maior prioridade
- *, / - Multiplicação e divisão
- +, - - Adição e subtração
- =, !=, <, >, <=, >=, LIKE, IN, BETWEEN, IS NULL - Comparação
- NOT - Negação lógica
- AND - E lógico
- OR - OU lógico (menor prioridade)
-- Precedência em expressões aritméticas
SELECT
10 + 5 * 2 AS sem_parenteses, -- 20 (5*2=10, depois 10+10=20)
(10 + 5) * 2 AS com_parenteses -- 30 (10+5=15, depois 15*2=30)
FROM dual;
-- Precedência em condições lógicas
SELECT * FROM funcionarios
WHERE departamento = 'TI'
OR departamento = 'RH'
AND salario > 5000;
-- Avaliado como: departamento = 'TI' OR (departamento = 'RH' AND salario > 5000)
-- AND tem precedência sobre OR!
-- Use parênteses para deixar claro
SELECT * FROM funcionarios
WHERE (departamento = 'TI' OR departamento = 'RH')
AND salario > 5000;
-- Agora avalia: (TI OU RH) E (salário > 5000)
-- Exemplo complexo
SELECT * FROM produtos
WHERE (categoria = 'Eletrônicos' OR categoria = 'Informática')
AND preco < 1000
AND estoque > 0
AND NOT descontinuado = 'S';
-- Sempre use parênteses quando tiver dúvida!
SELECT * FROM vendas
WHERE (status = 'APROVADO' AND valor > 1000)
OR (status = 'PENDENTE' AND valor > 5000);
Boas Práticas
Recomendado
- Use parênteses para clareza
- Quebre condições longas em linhas
- Indente condições complexas
- Agrupe condições relacionadas
Evite
- Confiar apenas em precedência
- Condições muito complexas
- Múltiplos ORs sem parênteses
- Misturar AND e OR sem clareza
✅
Resultado Esperado
O que você deve dominar após este tópico:
✓
Operadores aritméticos
+, -, *, /, MOD em cálculos
✓
Operadores de comparação
=, !=, <>, >, <, >=, <=
✓
Operadores lógicos
AND, OR, NOT e precedência
✓
Operadores especiais
BETWEEN, IN, LIKE, IS NULL
✓
Tratamento de NULL
IS NULL, IS NOT NULL, NVL
✓
Boas práticas
Parênteses, clareza, performance