url: /posts/887809b3e0375f5956873cd442f516d8/
title: 想解锁PostgreSQL查询从基础到进阶的核心知识点?你都get了吗?
date: 2025-09-26T07:52:14+08:00
lastmod: 2025-09-26T07:52:14+08:00
author: cmdragon
summary:
PostgreSQL查询的核心操作包括SELECT
、WHERE
、ORDER BY
、LIMIT
、JOIN
、聚合函数和子查询。SELECT
用于从表中提取数据,WHERE
用于过滤条件,ORDER BY
用于排序,LIMIT
和OFFSET
用于分页。JOIN
用于关联多个表,聚合函数如COUNT
、SUM
等用于数据计算,GROUP BY
用于分组统计,HAVING
用于过滤分组结果。子查询用于嵌套查询逻辑。常见报错包括语法错误、数据类型不匹配和表名错误,需注意SQL执行顺序和数据类型一致性。
categories:
- postgresql
tags:
- 基础入门
- PostgreSQL
- SQL查询
- SELECT语句
- JOIN操作
- 聚合函数
- 子查询
- 常见报错

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
一、SELECT:查询的基础语句
查询是PostgreSQL中最常用的操作,核心是SELECT
语句。它的作用是从表中提取指定的数据,就像从书架上挑选你需要的书——你可以选全部,也可以选特定几本,还能按顺序排列。
1.1 SELECT的基本结构
SELECT
语句的基础结构如下:
SELECT 列1, 列2, ... -- 要返回的列(或*表示所有列)
FROM 表名 -- 数据来源的表
WHERE 条件 -- 过滤行的条件(可选)
GROUP BY 分组列 -- 按列分组(可选)
HAVING 分组条件 -- 过滤分组结果(可选)
ORDER BY 排序列 -- 排序结果(可选)
LIMIT 数量 -- 限制返回行数(可选)
OFFSET 偏移量 -- 跳过前N行(可选)
如果要选所有列,可以用*
代替列名:
-- 选students表的所有数据
SELECT * FROM students;
但注意:*
会返回表的所有列,实际开发中尽量指定需要的列(避免多余数据传输,提高性能)。
1.2 选择特定列与别名
如果只需要“姓名”和“专业”,可以明确指定列名:
-- 选学生的姓名和专业
SELECT name, major FROM students;
如果觉得列名不够直观,可以用AS
给列起别名(alias):
-- 给列起别名,结果中的列名会变成"学生姓名"和"年龄"
SELECT name AS "学生姓名", age FROM students;
二、WHERE:过滤查询结果
WHERE
子句用于筛选符合条件的行,相当于给查询加了一个“过滤条件”。它必须放在FROM
之后、ORDER BY
之前(记住执行顺序:FROM → WHERE → SELECT → ORDER BY
)。
2.1 比较运算符
最常用的比较有:等于(=
)、不等于(!=
或<>
)、大于(>
)、小于(<
)、大于等于(>=
)、小于等于(<=
)。
示例:
-- 选"计算机科学"专业的学生
SELECT * FROM students WHERE major = 'Computer Science';
-- 选年龄大于20岁的学生
SELECT * FROM students WHERE age > 20;
2.2 范围与模糊查询
- 范围查询:用
BETWEEN ... AND ...
表示“在某个区间内”(包含边界); - 模糊查询:用
LIKE
匹配字符串(%
代表任意字符,_
代表单个字符); - 多条件:用
AND
(并且)、OR
(或者)组合条件。
示例:
-- 选年龄在19到21岁之间的学生
SELECT * FROM students WHERE age BETWEEN 19 AND 21;
-- 选名字以"A"开头的学生(比如Alice)
SELECT * FROM students WHERE name LIKE 'A%';
-- 选"计算机科学"或"数学"专业、年龄大于20岁的学生
SELECT * FROM students WHERE (major = 'Computer Science' OR major = 'Mathematics') AND age > 20;
2.3 NULL值的处理
NULL
代表“未知”或“不存在”,不能用=
或!=
判断,必须用IS NULL
或IS NOT NULL
:
-- 选没有填写入学日期的学生(假设enrollment_date有NULL值)
SELECT * FROM students WHERE enrollment_date IS NULL;
-- 选填写了入学日期的学生
SELECT * FROM students WHERE enrollment_date IS NOT NULL;
三、ORDER BY:给结果排序
ORDER BY
用于按指定列排序,默认是升序(ASC),可以用DESC
指定降序。支持多列排序(先按第一列排,再按第二列排)。
示例:
-- 按年龄降序排列( oldest first )
SELECT name, age FROM students ORDER BY age DESC;
-- 先按专业升序,再按年龄降序(同专业内年龄大的排前面)
SELECT name, major, age FROM students ORDER BY major ASC, age DESC;
四、LIMIT与OFFSET:限制结果数量与分页
LIMIT