创建时间: 2026-09-01最后更新: 2026-09-01

1. 基础查询

写入让数据进入表,查询则把业务需要的数据取出来。SQL 查询的核心是 SELECT:它描述要读取哪些列、从哪里读取、保留哪些行,以及以什么顺序返回。

最简单的查询是读取任务表的全部列:

select-all.sql
1
SELECT *
2
FROM tasks;

* 适合在 psql 中临时观察数据,但接口代码更应该明确列名:

select-columns.sql
1
SELECT id, title, status, priority
2
FROM tasks;

明确列名有三个好处:返回结构稳定、减少不必要的数据传输,并让读者直接看出这段查询依赖哪些字段。

查询结果也可以使用别名:

select-alias.sql
1
SELECT
2
id AS task_id,
3
title AS task_title,
4
due_at AS deadline
5
FROM tasks;

AS 不会修改表结构,只改变这次结果中的列名。查询多张表时,还需要使用表名或表别名限定字段来源,再通过列别名区分结果中可能重名的 id、name;后面的多表查询文章会展示完整写法。

2. 筛选

WHERE 只保留条件满足的行:

filter-status.sql
1
SELECT id, title, priority
2
FROM tasks
3
WHERE status = 'done'
4
AND 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
1
SELECT id, title, status, priority
2
FROM tasks
3
WHERE archived_at IS NULL
4
AND (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 视为没有差异。

正在验证登录状态
请稍候,验证完成后将继续显示文章内容