2.7. Tipos Numéricos

2.7.1. integer

O tipo integer é capaz de representar números inteiros na faixa de valores entre -2147483648 a +2147483647. Portanto, esse tipo possui precisão “finita” e ocupa 4 bytes.

Exemplo de notação:

SELECT 4;

2.7.2. bigint

O tipo bigint é capaz de representar números inteiros na faixa de valores entre -9223372036854775808 a +9223372036854775807. Portanto, esse tipo possui precisão “finita” e ocupa 8 bytes.

Exemplo de notação:

SELECT 2247483647;

2.7.3. double precision

O tipo double precision, ou float8, é capaz de representar números reais (ou números em ponto flutiante) com uma certa precisão numérica (64-bits). Um número em ponto flutuante pode ser expresso da seguinte maneira:

SELECT double precision '5.1';


SELECT double precision '5.';


SELECT double precision '5.2e12';

2.7.4. numeric

O tipo numeric é capaz de representar números reais com grande número de dígitos. Em geral, é usado para representar valores numéricos com a melhor precisão possível. Trata-se do tipo de dados indicado para valores que representam dinheiro. Comparado aos tipos integer e double precision, pode ocupar mais espaço em disco e as operações são mais lentas pois são implementadas em software, enquanto que dos outros dois tipos as operações aritméticas básicas são implementadas em hardware.

SELECT 5.1;


SELECT 5.;


SELECT 5.2e12;

Dica

Utilize a função pg_typeof para verificar se os literais acima realmente são considerados do tipo numeric.

Na criação de colunas de uma tabela, podemos utilizar a seguinte sintaxe:

NUMERIC(precision, scale)

Onde:

  • precison: indica o número total de digitos.

  • scale: indica o número de dígitos dedicado à parte fracionária.

2.7.5. Operações Aritméticas

Para cada tipo de dado, existe um conjunto de operadores disponíveis. No caso das operações aritméticas, para os tipos numéricos, os símbolos utilizados são muito semelhantes aos que usamos na matemática (Tabela 2.2):

Tabela 2.2 - Operadores aritméticos básicos.

Operador

Nome

Expressão

Valor

+

soma

SELECT 5 + 8;

13

-

subtração

SELECT 3 - 2;

1

*

multiplicação

SELECT 3 * 4;

12

/

divisão

SELECT 6 / 4;

1

%

resto da divisão

SELECT 6 % 4;

2

^

potenciação

SELECT 2 ^ 4;

16

Exemplos:

SELECT 5 + 2;     -- adição


SELECT 5 - 2;     -- subtração


SELECT 5 * 2;     -- multiplicação


SELECT 5 / 2;     -- parte inteira da divisão


SELECT 5. / 2;    -- divisão com valor do tipo numeric


SELECT 5 % 2;     -- resto da divisão


SELECT 5 ^ 2;     -- potenciação

2.7.6. Funções Matemáticas

Exemplos:

SELECT log(100);
SELECT pi();
SELECT radians(270);
SELECT sqrt(900);

2.7.7. Trabalhando com Tabelas com Colunas Numéricas

Para ilustrar o uso dos tipos numéricos na definição de colunas de uma tabela, considere um evento de foco de queimada na vegetação. Cada foco será representado por um par de coordenadas (latitude e longitude), o número de dias sem chuva na localização do foco e a potência radiativa do fogo (Fire Radiative Power). Podemos então definir uma tabela denominada foco para armazenar esse tipo de evento através do seguinte comando SQL:

CREATE TABLE foco
(
    latitude            DOUBLE PRECISION,
    longitude           DOUBLE PRECISION,
    num_dias_sem_chuva  INTEGER,
    frp                 NUMERIC(4,1)
);

Dica

Consulte o Portal do Programa Queimadas do INPE para saber mais sobre o significado do atributo do foco FRP (Fire Radiative Power).

Vamos incluir alguns valores na tabela acima:

INSERT INTO foco VALUES(-9.41792, -51.65176, 30, 89),
                       (-6.63565,-51.73956, 28, 103),
                       (-5.40959,-51.04929, 31, 31.9),
                       (-7.04535,-52.24566, 27, 44.2),
                       (-5.67382,-51.89861, 32, 97.8);

Agora, vamos fazer uma consulta para saber a distância euclidiana entre cada um dos focos e a localização da sede municipal de São Félix do Xingu, no Estado do Pará. Para isso adotaremos a localização de latitude -6.645 e longitude -51.995 para a sede municipal e que um grau decimal possui aproximadamente 111 km.

Nota

Lembrando que a fórmula da distância é:

\[d_{AB} = \sqrt{(x_B - x_A)^2 + (y_B - y_A)^2}\]
SELECT sqrt( (-51.995 - longitude)^2 + (-6.645 - latitude)^2 ) * 111 AS "distancia km"
  FROM foco;

Saída:

    distancia km
--------------------
  310.1431973697054
  28.37282811719869
  172.6970687613897
   52.4303841903731
 108.33063322746935
(5 rows)

2.7.8. Exercícios

Exercício 1. Faça uma consulta SQL que calcule o logaritmo do valor de FRP dos focos.

Solução:
SELECT latitude, longitude, log(frp) AS log_frp
  FROM foco;

Saída:

 latitude | longitude |      log_frp
----------+-----------+--------------------
 -9.41792 | -51.65176 | 1.9493900066449128
 -6.63565 | -51.73956 | 2.0128372247051722
 -5.40959 | -51.04929 | 1.5037906830571811
 -7.04535 | -52.24566 | 1.6454222693490919
 -5.67382 | -51.89861 | 1.9903388547876014
(5 rows)

Exercício 2: Qual a média do número de dias sem chuva dos focos?

Solução:
SELECT avg(num_dias_sem_chuva) AS media_sem_chuva
  FROM foco;

Saída:

   media_sem_chuva
---------------------
 29.6000000000000000
(1 row)

Exercício 3: Crie a tabela abaixo com os valores indicados.

populacao_1940

uf

homens

mulheres

Rondônia

7879

6538

Acre

44079

35689

Amazonas

215681

203502

Roraima

5509

5000

Pará

457659

456238

Amapá

15800

14947

Tocantins

82268

82128

Maranhão

613938

621231

Piauí

404989

412612

Solução:

A tabela populacao_1940 poder ser definida através do seguinte comando CREATE TABLE:

CREATE TABLE populacao_1940
(
    uf       VARCHAR(20),
    homens   INTEGER,
    mulheres INTEGER
);

Para inserir valores na tabela populacao_1940 usamos o comando INSERT TABLE, como mostrado abaixo:

INSERT INTO populacao_1940 VALUES ('Rondônia', 7879, 6538),
                                  ('Acre', 44079, 35689),
                                  ('Amazonas', 215681, 203502),
                                  ('Roraima', 5509, 5000),
                                  ('Pará', 457659, 456238),
                                  ('Amapá', 15800, 14947),
                                  ('Tocantins', 82268, 82128),
                                  ('Maranhão', 613938, 621231),
                                  ('Piauí', 404989, 412612);

Exercício 4: Qual o total da população de cada estado?

Solução:
SELECT uf, (homens + mulheres) AS total_populacao
  FROM populacao_1940;

Saída:

    uf     | total_populacao
-----------+-----------------
 Rondônia  |           14417
 Acre      |           79768
 Amazonas  |          419183
 Roraima   |           10509
 Pará      |          913897
 Amapá     |           30747
 Tocantins |          164396
 Maranhão  |         1235169
 Piauí     |          809978
(9 rows)

Exercício 5: Apresente a população de homens e de mulheres na forma de porcentagem?

Solução:
SELECT uf, homens::numeric / (homens + mulheres) * 100 AS pct_homens, mulheres::numeric / (homens + mulheres)* 100 AS pct_mulheres
  FROM populacao_1940;

Saída:

    uf     |       pct_homens        |      pct_mulheres
-----------+-------------------------+-------------------------
 Rondônia  | 54.65075952001109800900 | 45.34924047998890199100
 Acre      | 55.25900110319927790600 | 44.74099889680072209400
 Amazonas  | 51.45270681301484077400 | 48.54729318698515922600
 Roraima   | 52.42173375202207631600 | 47.57826624797792368400
 Pará      | 50.07774399084360710200 | 49.92225600915639289800
 Amapá     | 51.38712719940156763300 | 48.61287280059843236700
 Tocantins | 50.04258011143823450700 | 49.95741988856176549300
 Maranhão  | 49.70477724100912506700 | 50.29522275899087493300
 Piauí     | 50.00000000000000000000 | 50.00000000000000000000
(9 rows)

Dica

Para uma lista completa dos tipos numéricos do PostgreSQL, consulte o seu manual na Seção 8.1. Numeric Types. A documentação das funções e operadores matemáticas pode ser encontrada na Seção 9.3. Mathematical Functions and Operators.