云计算百科
云计算领域专业知识百科平台

数据库系列2——简单查询:把数据“拿出来”(SELECT 基础能力一次讲透)

数据库系列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:子查询:把查询拆成“中间结果”的工程思维

赞(0)
未经允许不得转载:网硕互联帮助中心 » 数据库系列2——简单查询:把数据“拿出来”(SELECT 基础能力一次讲透)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!