PostgreSQL 基础语法 #

语法概述 #

PostgreSQL 遵循 SQL 标准,同时也有一些独特的语法特性。本章将介绍 PostgreSQL 的基础语法规范。

text
┌─────────────────────────────────────────────────────────────┐
│                    PostgreSQL 语法结构                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   SQL 语句组成:                                             │
│                                                             │
│   SELECT column_name        -- 子句                         │
│   FROM table_name           -- 子句                         │
│   WHERE condition           -- 子句                         │
│   ORDER BY column_name;     -- 子句 + 分号                  │
│                                                             │
│   组成元素:                                                  │
│   ├── 关键字(SELECT, FROM, WHERE)                         │
│   ├── 标识符(column_name, table_name)                     │
│   ├── 常量(数字、字符串)                                   │
│   ├── 运算符(=, <>, AND, OR)                              │
│   └── 分号(语句结束符)                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

注释 #

PostgreSQL 支持两种注释方式:

单行注释 #

sql
-- 这是单行注释
SELECT * FROM users;  -- 行末注释

-- 查询所有用户
SELECT * FROM users;

多行注释 #

sql
/*
 * 这是多行注释
 * 可以跨越多行
 * 用于详细说明
 */
SELECT * FROM users;

/*
  查询活跃用户
  条件:状态为 active
  排序:按创建时间降序
*/
SELECT * FROM users 
WHERE status = 'active' 
ORDER BY created_at DESC;

标识符 #

标识符规则 #

text
┌─────────────────────────────────────────────────────────────┐
│                    标识符命名规则                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  常规标识符(不加引号):                                     │
│  ├── 以字母(a-z, A-Z)或下划线(_)开头                    │
│  ├── 后续可以是字母、数字(0-9)或下划线                    │
│  ├── 最大长度 63 字节                                       │
│  ├── 不区分大小写(自动转为小写)                            │
│  └── 不能是保留关键字                                       │
│                                                             │
│  示例:                                                     │
│  ✅ users, user_id, firstName, _temp                       │
│  ❌ 1table, user-name, select                              │
│                                                             │
│  引号标识符(加双引号):                                     │
│  ├── 可以包含任意字符                                       │
│  ├── 区分大小写                                             │
│  ├── 可以使用保留关键字                                     │
│  └── 双引号需要转义(写两个双引号)                          │
│                                                             │
│  示例:                                                     │
│  ✅ "Users", "user-id", "SELECT", "My""Table"              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

标识符示例 #

sql
-- 常规标识符(不区分大小写)
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    user_name VARCHAR(50),
    created_at TIMESTAMP
);

-- 下面两个查询是等价的
SELECT user_name FROM users;
SELECT USER_NAME FROM USERS;
SELECT user_name FROM USERS;

-- 引号标识符(区分大小写)
CREATE TABLE "Users" (
    "Id" SERIAL PRIMARY KEY,
    "UserName" VARCHAR(50)
);

-- 必须使用双引号且大小写匹配
SELECT "UserName" FROM "Users";
-- 下面会报错
-- SELECT username FROM users;  -- 错误:关系 "users" 不存在
-- SELECT "UserName" FROM "users";  -- 错误:关系 "users" 不存在

-- 包含特殊字符的标识符
CREATE TABLE "order-items" (
    "item-id" SERIAL PRIMARY KEY,
    "item-name" VARCHAR(100)
);

-- 使用保留关键字作为标识符
CREATE TABLE "select" (
    "from" VARCHAR(50),
    "where" VARCHAR(50)
);

命名规范建议 #

sql
-- 推荐命名规范

-- 表名:小写,使用下划线分隔,复数形式
CREATE TABLE users ();
CREATE TABLE order_items ();
CREATE TABLE user_profiles ();

-- 列名:小写,使用下划线分隔
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email_address VARCHAR(100),
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

-- 主键命名:表名_id 或简单使用 id
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,  -- 或 id
    user_id INTEGER REFERENCES users(id)
);

-- 外键命名:关联表名_id
CREATE TABLE order_items (
    id SERIAL PRIMARY KEY,
    order_id INTEGER REFERENCES orders(order_id),
    product_id INTEGER REFERENCES products(id)
);

-- 索引命名:idx_表名_列名
CREATE INDEX idx_users_email ON users(email_address);
CREATE INDEX idx_orders_user_id ON orders(user_id);

-- 唯一约束命名:uq_表名_列名
ALTER TABLE users ADD CONSTRAINT uq_users_email UNIQUE (email_address);

-- 检查约束命名:ck_表名_列名
ALTER TABLE users ADD CONSTRAINT ck_users_age CHECK (age >= 0);

-- 外键约束命名:fk_表名_关联表名
ALTER TABLE orders ADD CONSTRAINT fk_orders_users 
    FOREIGN KEY (user_id) REFERENCES users(id);

关键字 #

保留关键字 #

保留关键字不能作为常规标识符使用:

sql
-- 保留关键字示例(部分)
ALL, ANALYSE, ANALYZE, AND, ANY, ARRAY, AS, ASC,
BETWEEN, BIGINT, BINARY, BIT, BOOLEAN, BOTH, BY,
CASE, CAST, CHAR, CHARACTER, CHECK, COLLATE, COLUMN,
CONSTRAINT, CREATE, CROSS, CURRENT_DATE, CURRENT_TIME,
DATABASE, DECIMAL, DEFAULT, DELETE, DESC, DISTINCT, DO,
ELSE, END, EXCEPT, EXISTS, EXTRACT, FALSE, FLOAT, FOR,
FOREIGN, FROM, FULL, FUNCTION, GRANT, GROUP, HAVING,
IN, INDEX, INNER, INSERT, INT, INTEGER, INTERSECT, INTO,
IS, JOIN, KEY, LEFT, LIKE, LIMIT, NATURAL, NOT, NULL,
NUMERIC, ON, OR, ORDER, OUTER, PRIMARY, REFERENCES, RIGHT,
SELECT, SET, SMALLINT, TABLE, THEN, TO, TRAILING, TRUE,
UNION, UNIQUE, UPDATE, USER, USING, VALUES, VARCHAR, VIEW,
WHEN, WHERE, WITH

非保留关键字 #

非保留关键字可以作为标识符使用:

sql
-- 非保留关键字示例(部分)
NAME, NAMES, STATUS, TYPE, VALUE, YEAR, ZONE

-- 可以作为表名或列名
CREATE TABLE status (
    type VARCHAR(50),
    value VARCHAR(100)
);

数据类型 #

数值类型 #

sql
-- 整数类型
SMALLINT          -- 2字节,-32768 到 +32767
INTEGER (INT)     -- 4字节,-2147483648 到 +2147483647
BIGINT            -- 8字节,-9223372036854775808 到 +9223372036854775807

-- 自增整数
SMALLSERIAL       -- 自增 smallint
SERIAL            -- 自增 integer
BIGSERIAL         -- 自增 bigint

-- 小数类型
DECIMAL(p,s)      -- 精确小数,p为精度,s为小数位
NUMERIC(p,s)      -- 同 DECIMAL
REAL              -- 4字节浮点数
DOUBLE PRECISION  -- 8字节浮点数

-- 示例
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    quantity SMALLINT,
    price DECIMAL(10, 2),
    weight REAL
);

字符类型 #

sql
-- 字符类型
CHAR(n)           -- 定长字符串,不足补空格
VARCHAR(n)        -- 变长字符串,有长度限制
TEXT              -- 变长字符串,无长度限制

-- 示例
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    code CHAR(10),           -- 固定10位编码
    name VARCHAR(100),       -- 最长100字符
    bio TEXT                 -- 无长度限制
);

布尔类型 #

sql
-- 布尔类型
BOOLEAN (BOOL)    -- true/false/null

-- 有效值
-- true: TRUE, 'true', 't', 'yes', 'y', '1', 'on'
-- false: FALSE, 'false', 'f', 'no', 'n', '0', 'off'

-- 示例
CREATE TABLE tasks (
    id SERIAL PRIMARY KEY,
    title VARCHAR(200),
    is_completed BOOLEAN DEFAULT FALSE
);

INSERT INTO tasks (title, is_completed) VALUES
    ('Task 1', TRUE),
    ('Task 2', 'yes'),
    ('Task 3', '1'),
    ('Task 4', FALSE);

日期时间类型 #

sql
-- 日期时间类型
DATE              -- 日期
TIME              -- 时间
TIMESTAMP         -- 日期和时间
TIMESTAMPTZ       -- 带时区的日期时间
INTERVAL          -- 时间间隔

-- 示例
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    event_date DATE,
    event_time TIME,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    created_at_tz TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

-- 时间间隔
SELECT 
    '1 year 2 months 3 days'::INTERVAL,
    '2 hours 30 minutes'::INTERVAL,
    CURRENT_TIMESTAMP + INTERVAL '7 days';

运算符 #

算术运算符 #

sql
SELECT 
    10 + 5 AS addition,       -- 加法: 15
    10 - 5 AS subtraction,    -- 减法: 5
    10 * 5 AS multiplication, -- 乘法: 50
    10 / 3 AS division,       -- 除法: 3
    10 % 3 AS modulo,         -- 取模: 1
    2 ^ 3 AS power;           -- 幂运算: 8

比较运算符 #

sql
SELECT 
    5 = 5 AS eq,        -- 等于: true
    5 <> 5 AS neq,      -- 不等于: false
    5 != 5 AS neq2,     -- 不等于: false
    5 < 10 AS lt,       -- 小于: true
    5 > 10 AS gt,       -- 大于: false
    5 <= 10 AS lte,     -- 小于等于: true
    5 >= 10 AS gte;     -- 大于等于: false

-- BETWEEN
SELECT * FROM products WHERE price BETWEEN 10 AND 100;

-- IS NULL / IS NOT NULL
SELECT * FROM users WHERE email IS NULL;
SELECT * FROM users WHERE email IS NOT NULL;

-- IS DISTINCT FROM (处理 NULL 比较)
SELECT NULL = NULL;              -- 结果: NULL
SELECT NULL IS DISTINCT FROM NULL; -- 结果: false

逻辑运算符 #

sql
-- AND, OR, NOT
SELECT * FROM users 
WHERE age >= 18 AND status = 'active';

SELECT * FROM users 
WHERE role = 'admin' OR role = 'moderator';

SELECT * FROM users 
WHERE NOT deleted;

-- IN
SELECT * FROM users WHERE id IN (1, 2, 3);
SELECT * FROM users WHERE role IN ('admin', 'moderator');

-- NOT IN
SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

-- LIKE 模式匹配
SELECT * FROM users WHERE name LIKE 'John%';     -- 以 John 开头
SELECT * FROM users WHERE name LIKE '%son';      -- 以 son 结尾
SELECT * FROM users WHERE name LIKE '%oh%';      -- 包含 oh
SELECT * FROM users WHERE email LIKE '%@gmail.com';

-- ILIKE 不区分大小写
SELECT * FROM users WHERE name ILIKE 'john%';

-- SIMILAR TO 正则模式
SELECT * FROM users WHERE name SIMILAR TO '(John|Jane)%';

SQL 语句分类 #

text
┌─────────────────────────────────────────────────────────────┐
│                    SQL 语句分类                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  DDL (数据定义语言)                                          │
│  ├── CREATE   创建对象                                      │
│  ├── ALTER    修改对象                                      │
│  ├── DROP     删除对象                                      │
│  └── TRUNCATE 清空表                                        │
│                                                             │
│  DML (数据操作语言)                                          │
│  ├── SELECT   查询数据                                      │
│  ├── INSERT   插入数据                                      │
│  ├── UPDATE   更新数据                                      │
│  └── DELETE   删除数据                                      │
│                                                             │
│  DCL (数据控制语言)                                          │
│  ├── GRANT    授予权限                                      │
│  └── REVOKE   撤销权限                                      │
│                                                             │
│  TCL (事务控制语言)                                          │
│  ├── BEGIN    开始事务                                      │
│  ├── COMMIT   提交事务                                      │
│  ├── ROLLBACK 回滚事务                                      │
│  └── SAVEPOINT 保存点                                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

DDL 示例 #

sql
-- CREATE
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE
);

-- ALTER
ALTER TABLE users ADD COLUMN age INTEGER;
ALTER TABLE users ALTER COLUMN name SET NOT NULL;
ALTER TABLE users DROP COLUMN age;

-- DROP
DROP TABLE IF EXISTS users;

-- TRUNCATE
TRUNCATE TABLE users;
TRUNCATE TABLE users RESTART IDENTITY;

DML 示例 #

sql
-- INSERT
INSERT INTO users (name, email) VALUES ('John', 'john@example.com');
INSERT INTO users (name, email) VALUES 
    ('Alice', 'alice@example.com'),
    ('Bob', 'bob@example.com');

-- SELECT
SELECT * FROM users;
SELECT name, email FROM users WHERE id = 1;

-- UPDATE
UPDATE users SET name = 'John Doe' WHERE id = 1;

-- DELETE
DELETE FROM users WHERE id = 1;

DCL 示例 #

sql
-- GRANT
GRANT SELECT, INSERT ON users TO web_user;
GRANT ALL PRIVILEGES ON DATABASE mydb TO admin_user;

-- REVOKE
REVOKE INSERT ON users FROM web_user;

TCL 示例 #

sql
-- BEGIN
BEGIN;

-- SAVEPOINT
SAVEPOINT my_savepoint;

-- COMMIT
COMMIT;

-- ROLLBACK
ROLLBACK;
ROLLBACK TO SAVEPOINT my_savepoint;

NULL 值处理 #

sql
-- NULL 表示未知或缺失的值
SELECT NULL = NULL;    -- 结果: NULL(不是 true)
SELECT NULL IS NULL;   -- 结果: true

-- COALESCE 返回第一个非 NULL 值
SELECT COALESCE(NULL, NULL, 'default');  -- 结果: 'default'

-- NULLIF 如果相等返回 NULL
SELECT NULLIF(5, 5);   -- 结果: NULL
SELECT NULLIF(5, 3);   -- 结果: 5

-- 处理 NULL 排序
SELECT * FROM users ORDER BY email NULLS FIRST;
SELECT * FROM users ORDER BY email NULLS LAST;

学习路径 #

text
入门阶段
├── PostgreSQL简介
├── 安装与配置
├── 基础语法(本文)
└── 数据类型

下一步 #

了解了基础语法后,接下来学习 数据类型,深入了解 PostgreSQL 丰富的数据类型!

最后更新:2026-03-29