数据类型与运算符

本章将详细介绍PostgreSQL支持的各种数据类型和运算符,帮助您正确选择和使用数据类型,以及掌握各种运算符的使用方法。

4.1 数值类型

整数类型

类型 大小 范围 说明
SMALLINT 2字节 -32768 到 32767 小范围整数
INTEGER 4字节 -2147483648 到 2147483647 常用整数类型
BIGINT 8字节 -9223372036854775808 到 9223372036854775807 大范围整数
SERIAL 4字节 1 到 2147483647 自增整数
BIGSERIAL 8字节 1 到 9223372036854775807 大范围自增整数

精确数值类型

类型 说明 示例
DECIMAL(p,s) 精确小数,p为总位数,s为小数位数 DECIMAL(10,2)
NUMERIC(p,s) 与DECIMAL相同 NUMERIC(8,3)

浮点数类型

类型 大小 说明 示例
REAL 4字节 单精度浮点数 3.14
DOUBLE PRECISION 8字节 双精度浮点数 3.14159265358979

数值类型使用示例

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    price DECIMAL(10,2),      -- 价格,保留2位小数
    quantity INTEGER,         -- 数量
    weight REAL,              -- 重量
    rating NUMERIC(3,2)       -- 评分,如4.95
);

4.2 字符串类型

字符类型

类型 说明 示例
CHAR(n) 固定长度字符,不足时用空格填充 CHAR(10)
VARCHAR(n) 可变长度字符,最大长度n VARCHAR(255)
TEXT 可变长度文本,无长度限制 TEXT

字符串类型使用示例

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username CHAR(20),        -- 用户名,固定20字符
    email VARCHAR(255),       -- 邮箱,最大255字符
    bio TEXT                  -- 个人简介,无长度限制
);

4.3 日期/时间类型

日期时间类型

类型 大小 说明 示例
DATE 4字节 日期(无时间) '2023-10-15'
TIME 8字节 时间(无日期) '14:30:00'
TIMESTAMP 8字节 日期和时间 '2023-10-15 14:30:00'
TIMESTAMPTZ 8字节 带时区的时间戳 '2023-10-15 14:30:00+08'
INTERVAL 16字节 时间间隔 '1 day 2 hours'

日期时间使用示例

CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    event_name VARCHAR(255),
    start_date DATE,                    -- 开始日期
    start_time TIME,                    -- 开始时间
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 创建时间
    updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, -- 更新时间(带时区)
    duration INTERVAL                   -- 持续时间
);

4.4 布尔类型

布尔类型

类型 大小 说明 允许值
BOOLEAN 1字节 布尔值 TRUE, FALSE, NULL

布尔类型使用示例

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50),
    is_active BOOLEAN DEFAULT TRUE,     -- 是否激活
    is_admin BOOLEAN DEFAULT FALSE      -- 是否管理员
);

4.5 JSON类型

JSON数据类型

类型 说明 特点
JSON 文本形式存储JSON数据 保持原始输入格式
JSONB 二进制形式存储JSON数据 更快的处理速度,支持索引

JSON类型使用示例

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    attributes JSON,        -- JSON格式属性
    metadata JSONB          -- JSONB格式元数据
);

-- 插入JSON数据
INSERT INTO products (name, attributes, metadata) VALUES 
('智能手机', 
 '{"color": "black", "storage": "128GB", "camera": "48MP"}',
 '{"category": "electronics", "brand": "XYZ", "warranty": "2 years"}'
);

4.6 数组类型

数组类型

PostgreSQL支持所有数据类型的数组:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    scores INTEGER[],           -- 整数数组
    tags TEXT[],                -- 文本数组
    schedule TIMESTAMPTZ[][]    -- 二维时间戳数组
);

-- 插入数组数据
INSERT INTO students (name, scores, tags) VALUES 
('张三', ARRAY[85, 92, 78, 96], ARRAY['优秀', '努力']),
('李四', ARRAY[90, 88, 95], ARRAY['勤奋', '聪明']);

4.7 网络地址类型

网络地址类型

类型 说明 示例
INET IPv4或IPv6主机地址 '192.168.1.1', '2001:4f8:3:ba::/64'
CIDR IPv4或IPv6网络地址 '192.168.1.0/24', '2001:4f8:3:ba::/64'
MACADDR MAC地址 '08:00:2b:01:02:03'

网络地址类型使用示例

CREATE TABLE network_devices (
    id SERIAL PRIMARY KEY,
    device_name VARCHAR(100),
    ip_address INET,        -- IP地址
    network CIDR,           -- 网络地址
    mac_address MACADDR     -- MAC地址
);

4.8 算术运算符

基本算术运算符

运算符 说明 示例 结果
+ 加法 5 + 3 8
- 减法 5 - 3 2
* 乘法 5 * 3 15
/ 除法 5 / 2 2.5
% 取模 5 % 2 1
^ 幂运算 2 ^ 3 8
|/ 平方根 |/ 25 5

算术运算示例

SELECT 
    10 + 5 AS addition,
    10 - 5 AS subtraction,
    10 * 5 AS multiplication,
    10 / 3 AS division,
    10 % 3 AS modulo,
    2 ^ 3 AS power,
    |/ 16 AS square_root;

4.9 比较运算符

比较运算符

运算符 说明 示例 结果
< 小于 5 < 10 TRUE
> 大于 5 > 10 FALSE
<= 小于等于 5 <= 5 TRUE
>= 大于等于 5 >= 10 FALSE
= 等于 5 = 5 TRUE
<> 或 != 不等于 5 <> 10 TRUE

比较运算示例

SELECT 
    name, 
    price 
FROM products 
WHERE price > 100 AND price <= 1000;

4.10 逻辑运算符

逻辑运算符

运算符 说明 示例
AND 逻辑与 price > 100 AND category = 'electronics'
OR 逻辑或 category = 'electronics' OR category = 'books'
NOT 逻辑非 NOT is_active

逻辑运算示例

SELECT * FROM products 
WHERE (category = 'electronics' OR category = 'books') 
  AND price BETWEEN 50 AND 500 
  AND NOT discontinued;

4.11 字符串运算符

字符串运算符

运算符 说明 示例 结果
|| 字符串连接 'Hello' || ' ' || 'World' 'Hello World'
LIKE 模式匹配 name LIKE 'A%' 匹配以A开头的名称
ILIKE 不区分大小写模式匹配 name ILIKE 'a%' 匹配以a或A开头的名称

字符串运算示例

SELECT 
    first_name || ' ' || last_name AS full_name,
    email
FROM users 
WHERE email LIKE '%@gmail.com'
   OR first_name ILIKE 'john%';

4.12 数组运算符

数组运算符

运算符 说明 示例
= 数组相等 ARRAY[1,2,3] = ARRAY[1,2,3]
@> 包含 ARRAY[1,2,3] @> ARRAY[1,2]
<@ 被包含 ARRAY[1,2] <@ ARRAY[1,2,3]
&& 重叠 ARRAY[1,2] && ARRAY[2,3]

数组运算示例

SELECT * FROM students 
WHERE tags @> ARRAY['优秀']
   OR scores && ARRAY[95, 96, 97, 98, 99, 100];

4.13 JSON运算符

JSON运算符

运算符 说明 示例
-> 获取JSON对象字段 metadata->'category'
->> 获取JSON对象字段为文本 metadata->>'category'
@> 包含 metadata @> '{"brand": "XYZ"}'
? 是否存在键 metadata ? 'brand'

JSON运算示例

SELECT 
    name,
    attributes->>'color' AS color,
    metadata->>'brand' AS brand
FROM products 
WHERE metadata @> '{"category": "electronics"}'
   AND attributes ? 'camera';

提示:选择合适的数据类型对于数据库性能和存储效率非常重要。在设计表结构时,应根据实际需求选择最合适的数据类型。