Início / Trilha 1 / Conteúdo / Tópico 9
9

Operadores SQL

Operadores aritméticos, de comparação, lógicos e especiais

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
TRUETRUETRUE
TRUEFALSEFALSE
FALSETRUEFALSE
FALSEFALSEFALSE

OR

A B A OR B
TRUETRUETRUE
TRUEFALSETRUE
FALSETRUETRUE
FALSEFALSEFALSE

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:

  1. Parênteses ( ) - Maior prioridade
  2. *, / - Multiplicação e divisão
  3. +, - - Adição e subtração
  4. =, !=, <, >, <=, >=, LIKE, IN, BETWEEN, IS NULL - Comparação
  5. NOT - Negação lógica
  6. AND - E lógico
  7. 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

Anterior: Data Types Oracle Próximo: Tópico 10