O SQLite tem mais matemática do que você imagina
O SQLite tem fama de ser minimalista, mas vem com um conjunto completo de funções numéricas: arredondamento, valor absoluto, teto e piso, potências, raízes, logaritmos, trigonometria e números aleatórios. A maior parte dessas funções matemáticas foi adicionada no SQLite 3.35 (2021), então qualquer instalação razoavelmente atual — seja a que vem embutida no Python, no Node, na antiga WebSQL do navegador ou na CLI oficial — já tem tudo isso pronto pra usar.
Antes de mergulhar nos detalhes, dá uma olhada nesse aperitivo:
Seis funções, uma linha de resultado. O restante desta página explica para que serve cada família e quais pegadinhas vale a pena conhecer.
ROUND: a função que você mais vai usar
ROUND(valor, casas) arredonda para um determinado número de casas decimais. O segundo argumento é opcional — se você omitir, o valor é arredondado para o inteiro mais próximo (mas ainda retornado como ponto flutuante):
Alguns detalhes que vale notar:
ROUND(3.14159)devolve3.0, e não3. Se você quer um inteiro de fato, useCAST(ROUND(x) AS INTEGER)— ou simplesmenteCAST(x AS INTEGER)para truncar.- O SQLite usa "round half away from zero" (arredondamento para longe do zero):
2.5vira3e-2.5vira-3. Alguns bancos usam o arredondamento bancário (round half to even); o SQLite não. - O argumento
digitsaceita valores negativos:ROUND(1234.5, -2)arredonda para a centena mais próxima, retornando1200.
Na prática, o uso mais comum no dia a dia é ROUND(price, 2) para exibir valores monetários.
ROUND vs CAST: não são a mesma coisa
É comum recorrer a CAST(x AS INTEGER) achando que está arredondando — e aí vem a pegadinha:
CAST trunca em direção ao zero — simplesmente joga fora a parte fracionária. Já o ROUND arredonda para o inteiro mais próximo. No caso do 2.9, a diferença entre os dois é de uma unidade inteira. Escolha o que realmente faz o que você quer.
ABS, SIGN e o sinal de um número
A função ABS(x) devolve o valor absoluto. Já SIGN(x) retorna -1, 0 ou 1 conforme o sinal do número:
ABS é o burro de carga — ótima para responder "qual a distância entre esses dois valores". Já SIGN aparece menos, mas resolve bem quando você quer agrupar linhas por direção (débito vs crédito, ganho vs perda) sem precisar escrever um CASE explícito.
CEIL, FLOOR e TRUNC no SQLite
Essas funções devolvem valores inteiros (ou quase isso) sem arredondar para o mais próximo. CEIL sempre arredonda para cima, FLOOR sempre para baixo e TRUNC corta em direção ao zero:
Cuidado com os números negativos. FLOOR(-2.9) resulta em -3 (mais distante do zero), enquanto TRUNC(-2.9) dá -2 (em direção ao zero). Quando o assunto é negativo, FLOOR e TRUNC discordam — e escolher o errado é um clássico bug de off-by-one.
CEILING é um apelido para CEIL. Use a grafia que achar mais legível.
A divisão inteira no SQLite é a verdadeira pegadinha
Aqui não estamos falando de uma função, e sim do operador /. Mesmo assim, ele confunde mais os iniciantes do que qualquer função matemática de verdade:
Quando os dois lados da operação são inteiros, o SQLite faz divisão inteira e descarta a parte fracionária. Basta um dos lados ser REAL para que a expressão inteira passe a ser real. A solução é garantir que pelo menos um dos operandos seja float — ou escrevendo 2.0 no lugar de 2, ou usando CAST.
Esse problema aparece com força quando você referencia colunas: total_cents / 100 devolve um inteiro. Já total_cents / 100.0 devolve o valor em reais que você realmente queria.
MOD e o operador %
MOD(x, y) retorna o resto de x / y. O operador % faz exatamente a mesma coisa:
MOD(17, 5) e 17 % 5 retornam 2 nos dois casos. Já o módulo por zero devolve NULL no SQLite — ele não lança erro, o que destoa da maioria das linguagens. Se isso for relevante pra você, valide o divisor antes ou envolva a chamada num CASE WHEN y = 0 THEN ... END.
A função e o operador são intercambiáveis. Na prática, quase todo mundo usa % porque é mais curto.
POWER, SQRT, EXP e LOG no SQLite
Para potências e raízes:
Algumas pegadinhas que costumam confundir:
POWé apenas um apelido paraPOWER.- No SQLite,
LOG(x)é log na base 10. JáLN(x)é o logaritmo natural. Com dois argumentos,LOG(b, x)calcula o log na baseb. (Isso é diferente de muitas linguagens, ondelogsignifica logaritmo natural — aqui prevaleceu a convenção do SQL.) SQRTde um número negativo devolveNULL, não dispara erro.POWER(0, 0)retorna1, por convenção.
Esses detalhes são úteis em juros compostos, normalização para decibéis, cálculo de distâncias — basicamente em qualquer cenário com matemática geométrica ou exponencial.
RANDOM e RANDOMBLOB
A função RANDOM() devolve um inteiro de 64 bits com sinal, podendo cair em qualquer ponto do intervalo:
Para obter um número dentro de uma faixa específica, use ABS (já que RANDOM() retorna valores com sinal) junto com o operador %. Se quiser um número real entre 0 e 1, é só dividir pelo maior inteiro de 64 bits. O SQLite não tem uma função RAND() nativa que devolva valores entre 0 e 1 — você mesmo monta isso na mão.
Já o RANDOMBLOB(n) devolve n bytes de dados aleatórios, ótimo para gerar tokens de sessão ou massa de dados para testes. Combine com HEX() para ter uma string legível:
Cada chamada gera um valor novo. Não espere que RANDOM() devolva o mesmo número duas vezes na mesma linha — mesmo dentro de uma única expressão, cada invocação é independente.
Juntando tudo na prática
Um exemplo prático: calcular distâncias e arredondar preços em uma tabela de produtos.
O detalhe importante é o price_cents / 100.0 — aquele .0 força a divisão a virar real, e aí o ROUND formata com duas casas decimais. Sem ele, 1299 / 100 retornaria 12, não 12.99.
A seguir: data e hora
As funções numéricas resolvem a parte da matemática. Datas e horários pedem um conjunto próprio de ferramentas — o SQLite armazena esses valores como text, real ou integer, e oferece um conjunto enxuto, mas eficiente, de funções para fazer parsing, formatação e cálculos com eles. É justamente isso que vem na próxima parte.
Perguntas frequentes
Como arredondar para 2 casas decimais no SQLite?
Use ROUND(valor, 2). O segundo argumento é a quantidade de casas decimais que você quer manter — ROUND(3.14159, 2) devolve 3.14. Detalhe que pega muita gente: com apenas um argumento, ROUND(x) arredonda para o inteiro mais próximo, mas o retorno continua sendo um valor de ponto flutuante.
O SQLite tem CEIL e FLOOR?
Tem sim. Desde a versão 3.35 (lançada em 2021), as funções matemáticas vêm embutidas: CEIL(x), FLOOR(x), SQRT(x), POWER(x, y), LOG(x), EXP(x) e companhia. Em builds mais antigas elas só funcionam com a extensão de matemática carregada — mas, na prática, quase toda instalação moderna (Python, Node, navegadores) já vem com elas habilitadas.
Por que 5 / 2 retorna 2 no SQLite?
Porque os dois operandos são inteiros, então o SQLite faz divisão inteira e trunca o resultado. Para obter 2.5, basta forçar um lado para REAL: 5 / 2.0 ou CAST(5 AS REAL) / 2. Isso não é peculiaridade de nenhuma função numérica — é o comportamento padrão do operador / quando os dois lados são inteiros.