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