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):
Operador |
Nome |
Expressão |
Valor |
---|---|---|---|
|
soma |
|
13 |
|
subtração |
|
1 |
|
multiplicação |
|
12 |
|
divisão |
|
1 |
|
resto da divisão |
|
2 |
|
potenciação |
|
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 é:
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.