创建时间: 2026-09-01最后更新: 2026-09-01作者: yangbo(2d5d2525a)
1. 基础查询
写入让数据进入表,查询则把业务需要的数据取出来。SQL 查询的核心是 SELECT:它描述要读取哪些列、从哪里读取、保留哪些行,以及以什么顺序返回。
最简单的查询是读取任务表的全部列:
select-all.sql
1SELECT *2FROM tasks;
* 适合在 psql 中临时观察数据,但接口代码更应该明确列名:
select-columns.sql
1SELECT id, title, status, priority2FROM tasks;
明确列名有三个好处:返回结构稳定、减少不必要的数据传输,并让读者直接看出这段查询依赖哪些字段。
查询结果也可以使用别名:
select-alias.sql
1SELECT2id AS task_id,3title AS task_title,4due_at AS deadline5FROM tasks;
AS 不会修改表结构,只改变这次结果中的列名。查询多张表时,还需要使用表名或表别名限定字段来源,再通过列别名区分结果中可能重名的 id、name;后面的多表查询文章会展示完整写法。
2. 筛选
WHERE 只保留条件满足的行:
filter-status.sql
1SELECT id, title, priority2FROM tasks3WHERE status = 'done'4AND archived_at IS NULL;
如果没有任何行满足条件,SELECT 会返回空结果,而不是报错。对于每一行,WHERE 条件只有得到 true 才会保留;结果为 false 或 NULL 都会被过滤掉。
常用比较和条件包括:
| 写法 | 含义 |
|---|---|
priority >= 2 | 大于等于 2 |
status <> 'done' | 不等于 done |
status IN ('todo', 'doing') | 位于给定集合中 |
priority BETWEEN 1 AND 3 | 位于闭区间 1 到 3 |
due_at IS NULL | 没有截止时间 |
archived_at IS NOT NULL | 已经归档 |
多个条件通过 AND 和 OR 组合:
combined-filter.sql
1SELECT id, title, status, priority2FROM tasks3WHERE archived_at IS NULL4AND (status = 'doing' OR priority >= 2);
AND 的优先级高于 OR,但涉及混合条件时仍然应该使用括号明确意图。查询条件能运行,不代表下一位维护者一定能正确理解。
NULL 不能使用 = NULL 判断,因为包括 NULL = NULL 在内的这类比较结果都是未知,而不是 true。判断空值应该使用 IS NULL 或 IS NOT NULL;需要比较两个可能为空的值时,可以使用 IS DISTINCT FROM 和 IS NOT DISTINCT FROM。它们一定返回 true 或 false,并且会把两个 NULL 视为没有差异。
正在验证登录状态
请稍候,验证完成后将继续显示文章内容