数据库系列2——简单查询:把数据“拿出来”(SELECT 基础能力一次讲透)
本文是【数据库工程系列】的一部分。
在上一篇中给 AI 工程师的 SQL 入门(工程级理解版),我们明确了 SQL 在工程中的角色。 从这一篇开始,进入真正的实操阶段。
这一篇只解决一件事: 如何在工程中,安全、可控地把数据拿出来。
0. 开篇:这篇文章解决什么问题?
这篇文章只解决一个问题:
在真实工程里,如何用一条“安全、可控、可复用”的 SELECT,把数据正确地拿出来。
很多人学过 SQL,但一写查询就会出现这些情况:
- SELECT * 直接全表返回
- 不知道哪些字段是“对外接口字段”
- 把 DISTINCT 当成“按某一列去重整行”
- 用 = NULL 判断空值
- AS 只当成“改个好看名字”
这些在课件里能跑通,但在 业务系统 / Agent / 工作流 里,都是隐患。
下面我们按课堂 6.2.1 的顺序,一条一条讲清楚。
1. 查询所有:SELECT * 的正确姿势(只用于调试)
最基础的查询:
SELECT * FROM student;
它的真实含义是:
从 student 表中,把每一行、每一列,原样返回。
工程视角
- SELECT * 不是“规范写法”
- 它只适合调试阶段(看表结构、看数据样子)
为什么不能在正式查询里用?
工程提示:
- 字段一旦新增,返回结构就变了
- Agent / 后端 / 前端容易被“多余字段”干扰
- 性能不可控(你不知道返回了多少数据)
正确做法
SELECT id, name, age
FROM student;
SELECT 本质是在“定义返回结构”,而不是“随便查”。
2. 查询部分列:把 SQL 当“接口返回字段定义”
当你明确写出列名时,你做的事情其实是:
在 SQL 层,定义了一次“数据接口返回格式”。
SELECT name, age
FROM student;
工程视角
- SQL 本身就可以完成 字段裁剪
- 下游(Python / Java / Agent)不需要再 pick 一次
工程提示:
- 返回字段越稳定,系统越稳
- 数据“在哪一层被裁剪”,非常重要
常见坑
- ❌ 全表查出来再在代码里删字段
- ❌ Agent 拿到一堆无关字段,理解成本飙升
3. 去重:DISTINCT 是“枚举维度值”的工具
最常见的用法:
SELECT DISTINCT city
FROM student;
含义非常明确:
我关心的是:有哪些城市,而不是有多少学生。
常见误解(一定要澄清)
❌ 错误理解:
“按 city 去重整行”
✅ 正确理解:
SELECT DISTINCT city, class_id
FROM student;
这是在对 (city, class_id) 这个组合去重。
工程视角
DISTINCT 最适合做的事:
- 枚举状态值
- 枚举分类维度
- 给前端 / Agent 提供“可选项列表”
工程提示:
DISTINCT = 枚举维度值,而不是清洗脏数据。
4. 四则运算:SQL 里先算一步,少写一层代码
SQL 不只是“查数据”,它可以直接做计算。
SELECT
order_id,
price * quantity AS total_amount
FROM orders;
工程视角
- 能在 SQL 算的,就别留到代码层
- 少一层计算,就少一层出错点
典型业务场景
- 订单总价
- 分数加权
- 余额计算
工程提示:
SQL 里的计算 = 数据层的“预处理”。
5. 空值处理:NULL 不是 0,也不是空字符串
这是最容易写错、也最危险的一点。
错误写法(非常常见)
SELECT *
FROM employee
WHERE bonus = NULL;
正确写法
SELECT *
FROM employee
WHERE bonus IS NULL;
或者:
SELECT *
FROM employee
WHERE bonus IS NOT NULL;
工程视角
- NULL 表示:未知 / 不存在
- 它不等于任何值,包括它自己
常见坑:
- ❌ = NULL
- ❌ != NULL
工程提示:
判断 NULL,只能用 IS / IS NOT。
6. 别名:AS 不是美化,是“对外语义”
很多人以为 AS 只是改个名字,其实不是。
SELECT
name AS 姓名,
age AS 年龄
FROM student;
工程视角
- 数据库字段名 ≠ 对外语义
- SQL 本身就可以完成“语义映射”
为什么这在工程里很重要?
- 返回结果可直接给前端
- 可直接给 Agent 作为上下文
- 少一层字段翻译逻辑
表别名(提前养成习惯)
SELECT s.name, s.age
FROM student AS s;
工程提示:
表别名不是简写,是为了结构清晰和可维护。
7. 本篇小结:把 6.2.1 压成一个“查询模板”
安全查询模板(工程推荐)
SELECT
s.id AS student_id,
s.name AS student_name,
s.age,
s.city
FROM student AS s
WHERE s.city IS NOT NULL
LIMIT 10;
一句话总结
SELECT 决定你“返回什么结构”, FROM 决定你“数据来自哪里”, AS 决定你“对外怎么理解”, DISTINCT 决定你“要不要重复”, LIMIT 决定你“工程是否安全”。
到这里,你已经具备了一个非常重要、但常被低估的能力:
- 能控制返回字段
- 能避免 SELECT * 的工程风险
- 能正确处理 NULL、DISTINCT、AS
这意味着: 你已经可以写“不会拖垮系统”的基础查询了。
但真实问题往往不是“能不能查出来”,而是:
查出来的,是不是你真正想要的那一批数据?
👉 下一篇:《数据库系列3——条件查询:把数据“筛对、排对”》
数据库系列3:条件查询:把数据“筛对、排对”(WHERE/逻辑/范围/null/LIKE 一次讲透) 数据库系列4:高级查询:排序 分页 聚合 分组 过滤一次讲透
数据库系列5:子查询:把查询拆成“中间结果”的工程思维
网硕互联帮助中心





评论前必须登录!
注册