Voltar para a lista de artigos Artigos
10 minutos de leitura

Entendendo Tipos de Dados Numéricos em SQL

Trabalhar com bancos de dados de qualquer tipo significa trabalhar com dados. Estes dados podem ter alguns formatos pré-definidos. Ao iniciar sua trilha de aprendizado no LearnSQL.com.br, você conhecerá os diferentes tipos de dados existentes em SQL. Neste artigo, vamos abordar os diferentes tipos de dados numéricos em SQL, além de analisar algumas funções que convertem dados de um tipo para outro.

A criação de tabelas é o primeiro passo em qualquer projeto de codificação em SQL. Para isso, usamos declarações DDL (Data Definition Language) como CREATE e DROP. Você pode aprender sobre elas em nosso curso Criando Tabelas em SQL. Uma vez configurada a tabela, você deve listar nomes de colunas e tipos de dados. Os tipos de dados dizem a seu banco de dados quais informações esperar daquela coluna.

Digamos que você tenha uma tabela de "usuarios”. Cada usuário tem informações em uma coluna de nomes e uma coluna de números de telefone. Os nomes seriam armazenados em uma coluna de caracteres. Um número de telefone estaria em uma coluna numérica. Então, as colunas numéricas armazenam números e todos os números são os mesmos, certo? Não exatamente.

Há diferentes tipos de números e diferentes tipos de colunas numéricas. Qualquer pessoa com formação em estatística sabe que existem quatro escalas diferentes que se aplicam aos números: nominal, ordinal, intervalo e razão. Ao contrário de outros tipos de dados, os tipos numéricos podem representar todas essas escalas (por isso, em vez de falarmos de tipo de dados numéricos SQL, falamos em tipos, no plural). Mas como estas escalas diferem entre si?

  • Valores nominais se diferenciam apenas pelo "nome". Os valores nominais não são tratados como números; não é possível adicioná-los ou subtraí-los e eles não têm ordem inerente. Por exemplo, números de identificação de estudante e números de telefone são valores nominais. Eles funcionam mais como uma etiqueta do que como um número. Podemos dizer que nossos números de telefone são iguais (mesma importância, mesmo comprimento), mas não podemos compará-los ou dizer que um é o primeiro. Não podemos adicioná-los e obter um número de telefone significativo.
  • Valores ordinais fornecem ordem ou classificação. Em valores ordinais, o que importa é a ordem entre eles. Suponha que você tem uma escala de 1 a 3 que classifica seu humor. Infeliz é representado por um "1", contente, por um "2", e feliz tem um valor de "3". Você sabe que feliz está acima de contente ou infeliz, mas nada além disso. Você não pode somar "contente" e "infeliz" e obter um "feliz".
  • Valores de intervalo mostram diferenças exatas. Em uma escala de intervalo, o que importa são as diferenças entre os valores. Se você subtrair 90 graus centígrados de 100 graus centígrados, você obtém uma diferença de 10 graus. Anos, datas e a maioria das medidas de personalidade são medidas de intervalo. Os valores de intervalo são numéricos e são representados como numéricos no banco de dados.
  • Valores de razão são intervalos com um valor zero definido. Assim como uma escala de intervalo, uma razão tem diferenças mensuráveis entre os valores. Em uma escala de razão, porém, um valor zero significa que não há nada a ser medido. Por exemplo, pense em massa, comprimento e duração. Se algum destes tem um valor zero, não há nada ali. As escalas de razão são muito importantes na ciência.

Cada tipo de dado numérico em SQL é usado para representar todos os valores acima, especialmente intervalos e razões. É possível comparar valores de caracteres em SQL, portanto, pode-se argumentar que os valores de caracteres também podem representar dados de intervalo. No entanto, este é um assunto para outro artigo.

Em SQL, os números são definidos como exatos ou aproximados.

Os tipos exatos de dados numéricos são SMALLINT, INTEGER, BIGINT, NUMERIC(p,s) e DECIMAL(p,s). O tipo exato de dados numéricos SQL significa que o valor é armazenado como uma representação literal do valor do número.

Os tipos de dados numéricos aproximados são FLOAT(p), REAL e DOUBLE PRECISION. Estes representam números reais, mas não são representados como números exatos no banco de dados. Em vez disso, eles são uma aproximação do número real devido à forma como os sistemas de computador representam os números. Se você está achando confuso, não se preocupe; explicaremos em detalhes mais adiante.

Vamos começar nossa análise dos tipos numéricos em SQL com os dados exatos ou numéricos.

Tipo de dados numéricos em SQL

Os tipos de dados exatos numéricos do SQL consistem nos subtipos NUMERIC(p,s) e DECIMAL(p,s). Eles são exatos e definimos por precisão (p) e escala (s). A precisão é um inteiro que representa o número total de dígitos permitidos nesta coluna. Estes dígitos estão em um determinado radix, ou base numérica - isto é, binário (base 2) ou decimal (base 10). Eles são geralmente definidos com um ponto decimal. A escala, também um valor inteiro, representa o número de casas decimais à direita (se positivo) ou à esquerda (se negativo; isto raramente é usado) do ponto decimal.

Vejamos um exemplo. Suponha que você tenha definido uma coluna "saldo" como NUMERIC com uma precisão de 8 e uma escala de 2.

O DDL ficaria assim:

CREATE TABLE conta (
contaNo integer,
saldo numeric(8,2)
);

A coluna "saldo" pode armazenar com segurança o número 173226.62.

Tipos de dados numéricos, decimais em SQL

P representa o número total de todos os dígitos e s representa os dois dígitos após o decimal.

Há uma pequena diferença entre os tipos de dados numériso NUMERIC(p,s) e DECIMAL(p,s). NUMERIC determina a precisão e a escala exata. DECIMAL especifica apenas a escala exata; a precisão é igual ou maior que a especificada pelo codificador. As colunas DECIMAL podem ter uma precisão maior que a especificada se isto for mais conveniente ou eficiente para o sistema de banco de dados.

Em outras palavras, DECIMAL lhe dá alguma margem de manobra.

Tenha em mente que dados financeiros tais como saldos de contas devem ser armazenados como tipos de dados NUMÉRICOS ou DECIMAIS.

Além disso, lembre-se de que muitos sistemas de gerenciamento de banco de dados de alto nível possuem representações específicas de tipos numéricos (por exemplo, o tipo de dados NUMBER da Oracle). Estas implementações geralmente não fazem distinção entre os tipos NUMERIC e DECIMAL (em Oracle, ambos são do tipo NUMBER ).

Erros Comuns Relacionados a Tipos Numéricos

Ao inserir dados em uma coluna numeric, lembre-se de seus limites de precisão. Se você tentar inserir um número muito grande, poderá receber um erro. Por exemplo, queremos inserir o seguinte:

INSERT INTO conta(contaNo, saldo) VALUES(1313,12331411.23);

Isto irá gerar um erro. Por quê? Vamos tentar novamente com um número semelhante:

INSERT INTO conta(contaNo, saldo) VALUES(1313,123314.1123);

A segunda tentativa funciona. Isto porque o RDBMS arredonda o número inserido, descartando qualquer dígito "extra" à direita do ponto decimal. Neste caso, ele manteve ".11", mas descartou o "23" seguinte. Observe que, se o primeiro dígito descartado for igual ou maior que 5, o RDBMS arredonda para cima o dígito mais à esquerda.

Em nosso exemplo, isso significaria que, se você inseriu:

INSERT INTO conta(contaNo, saldo) VALUES(1313,123314.1153);

o saldo no banco de dados seria de 123314,12.

Para saber mais sobre arredondamento e funções numéricas comuns, confira o curso SQL para Iniciantes.

Tipos de Dados Inteiros

Tipos de dados inteiros contêm números que são inteiros ou sem um ponto decimal (em latim, integer significa inteiro). O ANSI SQL define SMALLINT, INTEGER e BIGINT como tipos de dados inteiros. A diferença entre estes é o tamanho do número que eles podem armazenar.

Abaixo, podemos ver a definição da Microsoft SQL sobre os diferentes tipos de dados inteiros:

Tipo de dado Faixa Armazenamento
bigint -2^63 (-9,223,372,036,854,775,808) até 2^63-1 (9,223,372,036,854,775,807) 8 Bytes
int -2^31 (-2,147,483,648) até 2^31-1 (2,147,483,647) 4 Bytes
smallint -2^15 (-32,768) até 2^15-1 (32,767) 2 Bytes
tinyint 0 até 255 1 Byte

Para estes tipos, o tamanho padrão da coluna importa. A definição de um tamanho de coluna menor para tipos inteiros menores (se você souber com antecedência o tamanho máximo) pode ajudar a manter suas tabelas com o menor tamanho possível.

Erros Comuns Relacionados a Tipos Inteiros

As colunas do tipo INTEGER arredondam os pontos decimais. Para explicar, vamos modificar um pouco a nossa tabela:

CREATE TABLE conta (
contaNo integer,
saldo integer
);

Se executarmos esta linha:

INSERT INTO conta(contaNo, saldo) VALUES(1313,123314.3153);

... os valores inseridos serão arredondados para o primeiro dígito antes da casa decimal. Suponhamos que inserimos 123314,5 na coluna de saldo:

INSERT INTO conta(contaNo, saldo) VALUES(1313,123314.5);

Como alteramos o valor após a casa decimal para um valor igual ou maior que 5, obteríamos 123315.

Se você estiver usando tipos de dados inteiros em fórmulas, saiba que o arredondamento pode causar inconsistências nas fórmulas. Se você subtrair 123314,3153+123314,3153:

INSERT INTO conta(contaNo, saldo)    VALUES(1313,123314.3153+123314.3153);

... o valor inserido seria 123314. Se você subtrair os mesmos valores que nós adicionamos anteriormente do saldo:

SELECT SALDO - 123314.3153 FROM CONTA; 

... o resultado, agora um número decimal, seria 123314.3147. Um erro claro. Para evita-lo, você poderia definir os tipos de dados apropriados para as colunas de acordo com as operações que serão feitas nelas.

Tipos de Dados de Ponto Flutuante

O tipo de dados numéricos flutuantes e relacionados a dados flutuantes em SQL contêm valores numéricos aproximados. Eles consistem em um valor numérico significativo (um valor numérico com sinal) e um expoente (um inteiro com sinal que especifica a magnitude do significativo). Estes tipos de dados têm uma precisão, ou um inteiro positivo que define o número de dígitos significativos (expoente da base do número).

Este tipo de representação de dados é comumente chamado de representação em ponto flutuante.

Se fossemos representar 173226,62 nesta notação (com uma base de 10), ficaria assim:

tipo de dado decimal sql

O valor de um tipo numérico aproximado é seu significativo multiplicado por 10 ao expoente.

Para realmente entender o tipo de dados numéricos de ponto flutuante em SQL, você terá que se aprofundar um pouco em ciência da computação. Pode ser divertido mas, nesta fase de sua jornada SQL, acredito que não é necessário. Por enquanto, basta lembrar que existem três tipos padrão ANSI em SQL: FLOAT(p), REAL e DOUBLE PRECISION.

A diferença entre FLOAT(p) e REAL é que FLOAT tem uma precisão binária (não decimal) igual ou maior que o valor definido. REAL tem uma precisão pré-definida baseada no banco de dados implementado. Na dia a dia de trabalho, FLOAT é raramente utilizado; REAL e DOUBLE PRECISION estão relacionados a implementações de sistemas específicos e os desenvolvedores tendem a passar o trabalho de implementação do sistema para os DBAs e Sysadmins.

A diferença entre REAL e DOUBLE PRECISION é que REAL representa números em 34 bits e DOUBLE PRECISION de 64 bits.

Trabalhando com Tipos Aproximados

É muito importante lembrar que este tipo de dado numérico SQL sacrifica a precisão em favor do alcance e, portanto, é chamado aproximado.

Nos cálculos, os tipos aproximados podem dar resultados estranhos - como 204.000000056, onde o resultado exato deveria ser 204. Se você estiver construindo seu banco de dados para uso na área de engenharia ou ciências, os tipos de dados flutuantes funcionam bem. Existe também diferença na velocidade; se você estiver realizando muitos cálculos complicados (por exemplo, funções trigonométricas, etc.), os tipos FLOAT devem ser muito mais rápidos do que outros tipos de dados numéricos. Por outro lado, se você estiver trabalhando em uma aplicação financeira, bancária ou outra aplicação comercial, o uso de representação decimal é mais apropriado.

O catálogo de tipos de dados numéricos em SQL não se limita aos inteiros e aos decimais. Eles são reflexos da necessidade de armazenar dados de uma forma segura, previsível e utilizável. Como em qualquer linguagem de programação, eles nos lembram o aspecto informático das bases de dados e do SQL.

Para praticar cada tipo de dado numérico SQL e conhecer suas possibilidades, usos, restrições e erros comuns, acesse LearnSQL.com.br e divirta-se!