As funções matemáticas no SQL são usadas para realizar diferentes cálculos sobre dados numéricos. Elas permitem arredondar valores, encontrar valores mínimos e máximos, calcular restos de divisão e muito mais. Nesta lição, são apresentadas as funções matemáticas mais usadas, com exemplos na base de dados Sakila.
Importante: dados numéricos em SQL podem ter tipos diferentes (INTEGER, REAL/FLOAT, DECIMAL/NUMERIC). A mesma fórmula pode gerar resultados diferentes dependendo do tipo de dado (por exemplo, por causa de divisão inteira, arredondamento e precisão). Se o tipo não for considerado, o resultado final pode ser diferente do esperado.
ABS() - Retorna o valor absoluto de um número.Sintaxe:
ABS(number)
Exemplo:
SELECT ABS(amount - 5) AS abs_difference
FROM payment
LIMIT 3;
Resultado: Retorna a diferença absoluta entre amount e 5.
CEIL() / CEILING() - Arredonda um número para cima (para o inteiro mais próximo).Sintaxe:
CEIL(number)
CEILING(number)
Exemplo:
SELECT CEIL(amount) AS rounded_up
FROM payment
LIMIT 3;
Resultado: Arredonda amount para cima até o inteiro mais próximo.
FLOOR() - Arredonda um número para baixo (para o inteiro mais próximo).Sintaxe:
FLOOR(number)
Exemplo:
SELECT FLOOR(amount) AS rounded_down
FROM payment
LIMIT 3;
Resultado: Arredonda amount para baixo até o inteiro mais próximo.
ROUND() - Arredonda um número para uma quantidade definida de casas decimais.Sintaxe:
ROUND(number, decimals)
Exemplo:
SELECT ROUND(amount, 1) AS rounded_amount
FROM payment
LIMIT 3;
Resultado: Arredonda amount para uma casa decimal.
POWER() / POW() - Eleva um número a uma potência.Sintaxe:
POWER(number, exponent)
POW(number, exponent)
Exemplo:
SELECT POWER(amount, 2) AS squared_amount
FROM payment
LIMIT 3;
Resultado: Eleva amount ao quadrado.
SQRT() - Retorna a raiz quadrada de um número.Sintaxe:
SQRT(number)
Exemplo:
SELECT SQRT(amount) AS sqrt_amount
FROM payment
LIMIT 3;
Resultado: Retorna a raiz quadrada de amount.
MOD() - Retorna o resto da divisão entre dois números.Sintaxe:
MOD(dividend, divisor)
Exemplo:
SELECT MOD(payment_id, 5) AS mod_result
FROM payment
LIMIT 3;
Resultado: Retorna o resto da divisão de payment_id por 5.
SIGN() - Retorna o sinal de um número (-1, 0 ou 1).Sintaxe:
SIGN(number)
Exemplo:
SELECT SIGN(amount - 5) AS sign_value
FROM payment
LIMIT 3;
Resultado: Retorna -1 se negativo, 0 se zero e 1 se positivo.
GREATEST() - Retorna o maior valor entre os valores informados (MySQL, PostgreSQL).Sintaxe:
GREATEST(value1, value2, ...)
Exemplo:
SELECT GREATEST(amount, 5) AS max_value
FROM payment
LIMIT 3;
Resultado: Retorna o maior valor entre amount e 5.
Importante (NULL): o comportamento de GREATEST() depende do SGBD.
NULL, o resultado geralmente será NULL.NULL são ignorados, e NULL só é retornado se todos os argumentos forem NULL.LEAST() - Retorna o menor valor entre os valores informados (MySQL, PostgreSQL).Sintaxe:
LEAST(value1, value2, ...)
Exemplo:
SELECT LEAST(amount, 5) AS min_value
FROM payment
LIMIT 3;
Resultado: Retorna o menor valor entre amount e 5.
Importante (NULL): para LEAST(), valem as mesmas diferenças entre SGBDs descritas para GREATEST().
Para tornar o comportamento previsível em consultas cross-SGBD, usa-se com frequência COALESCE(), por exemplo:
SELECT GREATEST(COALESCE(value1, 0), COALESCE(value2, 0));
RAND() - Retorna um número aleatório entre 0 e 1.Sintaxe:
RAND()
Exemplo:
SELECT RAND() AS random_value
FROM payment
LIMIT 3;
Resultado: Retorna um número aleatório entre 0 e 1.
Importante: não assuma que RAND() será necessariamente recalculado para cada linha em qualquer contexto. Dependendo do SGBD, plano de execução, uso de CTE/subconsultas e outros fatores, o mesmo valor aleatório pode ser reutilizado em várias linhas.
Se você precisa de valores aleatórios diferentes por linha, valide o comportamento no seu SGBD e no formato específico da consulta.
Arredondar valores de pagamento:
Use ROUND(amount, 0) para arredondar valores para inteiros.
Encontrar registros por resto da divisão:
Use MOD(payment_id, 2) para separar IDs de pagamento pares e ímpares.
Calcular raiz quadrada:
Use SQRT(amount) para analisar a distribuição dos pagamentos.
Comparar valores:
Use GREATEST() e LEAST() para escolher o valor máximo ou mínimo entre vários valores.
Controlar tipo de dado:
Se a precisão for importante, faça conversão explícita para o tipo adequado (por exemplo, CAST(value AS DECIMAL(10,2))) para evitar surpresas causadas por cálculo inteiro e arredondamento.
As funções matemáticas do SQL permitem calcular, analisar e transformar dados numéricos. Domine essas funções para trabalhar com números com eficiência em consultas SQL. Pratique com exemplos baseados em Sakila para consolidar as habilidades.