PostgreSQL 语法入门:从零开始掌握数据库核心操作
你是否在开发项目时,遇到过数据存储、查询效率低的问题?或者在使用数据库时,总是对 SQL 语法感到困惑?PostgreSQL 是一个功能强大且高度可靠的开源关系型数据库系统,它不仅支持标准 SQL,还提供了许多高级特性,如 JSON 支持、全文检索、数组类型等。掌握 PostgreSQL 语法,是每一位开发者提升数据处理能力的关键一步。
在本文中,我将带你从基础语法开始,逐步深入,通过真实场景和可运行代码,让你真正理解 PostgreSQL 语法的逻辑与用法。无论你是刚接触数据库的初学者,还是有一定经验的中级开发者,都能从中获得实用价值。
数据定义语言(DDL):创建与管理数据库对象
在使用数据库之前,我们首先要学会如何定义它。DDL(Data Definition Language)是用于创建、修改和删除数据库结构的语言。它就像盖房子前的图纸设计,决定了后续所有数据的“居住空间”。
创建数据库与模式
在 PostgreSQL 中,数据库是最高级别的容器,一个实例可以管理多个数据库。我们先创建一个名为 shop_db 的数据库:
-- 创建数据库,名字为 shop_db
CREATE DATABASE shop_db;
注释:这条命令会创建一个名为 shop_db 的新数据库。如果已存在同名数据库,会报错。使用
CREATE DATABASE IF NOT EXISTS shop_db;可避免重复创建。
接着,我们可以创建一个模式(Schema),它相当于数据库内的“文件夹”,用于组织表和视图。例如,为电商系统创建一个 products 模式:
-- 创建名为 products 的模式
CREATE SCHEMA products;
注释:模式用于逻辑隔离不同业务模块的表。比如
products用于商品信息,orders用于订单记录。
创建数据表
有了数据库和模式,接下来就是创建表。我们以一个商品表为例:
-- 创建商品表,使用 products 模式
CREATE TABLE products.product_info (
product_id SERIAL PRIMARY KEY, -- 自增主键,唯一标识商品
name VARCHAR(100) NOT NULL, -- 商品名称,不能为空
price DECIMAL(10,2) CHECK (price >= 0), -- 价格,必须大于等于 0
stock_quantity INT DEFAULT 0, -- 库存数量,默认为 0
created_at TIMESTAMP DEFAULT NOW() -- 创建时间,默认为当前时间
);
注释:
SERIAL是 PostgreSQL 的自增类型,等价于BIGSERIAL(64 位自增)PRIMARY KEY确保product_id唯一且不为空CHECK (price >= 0)保证价格不能为负数DEFAULT NOW()自动插入当前时间戳- 表名使用
模式名.表名格式,确保在指定模式下创建
数据操作语言(DML):插入、查询、更新与删除数据
DDL 定义了结构,DML 则负责数据的增删改查。这部分是日常开发中最常接触的语法,掌握它,就等于掌握了数据库的核心操作。
插入数据(INSERT)
向 product_info 表中插入几条商品数据:
-- 插入三条商品记录
INSERT INTO products.product_info (name, price, stock_quantity)
VALUES
('iPhone 15', 6999.00, 50),
('MacBook Air', 9999.00, 30),
('AirPods Pro', 1899.00, 100);
注释:
INSERT INTO ... VALUES是标准插入语法- 指定了列名,可以避免遗漏或顺序错误
- 未指定
product_id,由 SERIAL 自动分配price使用DECIMAL(10,2)类型,精确到小数点后两位
查询数据(SELECT)
查询是最常用的数据库操作。我们从表中取出所有商品信息:
-- 查询所有商品信息
SELECT * FROM products.product_info;
注释:
*表示选择所有列。生产环境中建议明确写出列名,提高可读性和性能。
进一步,我们只查看价格高于 5000 的商品:
-- 查询价格大于 5000 的商品
SELECT name, price, stock_quantity
FROM products.product_info
WHERE price > 5000;
注释:
WHERE用于条件筛选- 只返回需要的列,避免不必要的数据传输
- 条件表达式
price > 5000是布尔逻辑判断
更新与删除数据(UPDATE & DELETE)
当商品价格调整或库存变动时,需要更新数据:
-- 将 iPhone 15 的价格调整为 6799
UPDATE products.product_info
SET price = 6799.00
WHERE name = 'iPhone 15';
注释:
SET指定要修改的列和新值WHERE精准定位目标行,避免误改所有数据- 若省略
WHERE,所有行都会被更新,非常危险!
删除已下架商品:
-- 删除库存为 0 的商品
DELETE FROM products.product_info
WHERE stock_quantity = 0;
注释:
DELETE从表中移除行- 建议先用
SELECT验证WHERE条件是否准确,避免误删
数据类型与约束:让数据更“健康”
PostgreSQL 支持丰富的数据类型,合理选择类型不仅能节省存储空间,还能提升查询效率。同时,约束确保了数据的完整性。
常用数据类型对比
| 类型 | 用途 | 示例 |
|---|---|---|
INTEGER |
32 位整数 | 100, -50 |
BIGINT |
64 位整数 | 9223372036854775807 |
DECIMAL(p,s) |
精确小数,适合金额 | 9999.99 |
VARCHAR(n) |
可变长度字符串 | 'iPhone 15' |
TEXT |
长文本,不限长度 | '详细商品描述...' |
TIMESTAMP |
时间戳,带时区 | '2025-04-05 10:30:00' |
JSON |
存储 JSON 数据 | '{"brand": "Apple"}' |
注释:
VARCHAR(100)最多存储 100 个字符,适合商品名称DECIMAL(10,2)保证金额精度,避免浮点误差JSON类型支持嵌套结构,适合存储配置或日志
约束类型详解
约束是保障数据质量的“守门员”。常见的约束有:
PRIMARY KEY:主键,唯一且非空UNIQUE:唯一性,允许空值NOT NULL:不能为空CHECK:自定义条件校验FOREIGN KEY:外键,引用其他表主键
示例:为订单表添加外键约束
-- 创建订单表,引用商品表
CREATE TABLE products.order_info (
order_id SERIAL PRIMARY KEY,
product_id INT NOT NULL,
quantity INT NOT NULL CHECK (quantity > 0),
total_amount DECIMAL(10,2) NOT NULL,
FOREIGN KEY (product_id) REFERENCES products.product_info(product_id)
ON DELETE CASCADE -- 删除商品时,自动删除相关订单
);
注释:
FOREIGN KEY建立表间关系ON DELETE CASCADE表示当商品被删除时,关联订单也自动删除CHECK (quantity > 0)防止下单数量为负
高级语法特性:让查询更智能
PostgreSQL 不止是“会写 SQL”,它还能让你写出更优雅、高效的查询语句。
使用别名简化复杂查询
当表名过长或查询复杂时,使用别名可以提升可读性:
-- 使用别名简化查询
SELECT p.name, o.quantity, o.total_amount
FROM products.product_info p
JOIN products.order_info o ON p.product_id = o.product_id
WHERE o.total_amount > 5000;
注释:
p和o是表的别名,后续引用更简洁JOIN用于连接两个表,基于product_id匹配
聚合函数与分组查询
统计每类商品的总销售额:
-- 按商品名称分组,计算总销售额
SELECT
p.name,
SUM(o.quantity * o.total_amount) AS total_revenue
FROM products.product_info p
JOIN products.order_info o ON p.product_id = o.product_id
GROUP BY p.name
ORDER BY total_revenue DESC;
注释:
SUM()计算总和GROUP BY按商品名称分组ORDER BY降序排列,最赚钱的商品排前面
实用技巧与最佳实践
在实际开发中,掌握一些小技巧能极大提升效率和稳定性。
- 使用事务:多个操作应包裹在
BEGIN; ... COMMIT;中,确保数据一致性 - 创建索引:对频繁查询的列(如
product_id)创建索引,加速查询 - 避免
SELECT *:只取需要的列,减少网络传输 - 定期备份:使用
pg_dump工具备份数据库,防止数据丢失
总结
本文系统讲解了 PostgreSQL 语法的核心内容,从数据库创建、表定义,到数据操作、类型约束,再到高级查询技巧,层层递进,适合初学者快速入门,也适合中级开发者查漏补缺。
掌握 PostgreSQL 语法,不只是学会写 SQL,更是建立起对数据结构与逻辑的深刻理解。它能让你在处理复杂业务时,写出高效、安全、可维护的代码。
无论你是做 Web 开发、数据分析,还是构建微服务,PostgreSQL 都是一个值得深入学习的工具。从今天开始,动手写几条 SQL,让数据真正为你服务。