你大概已经习惯了这样的流程:有个问题,找数据同学跑一下,过一会儿收到一个 Excel 或者表格链接。你会看结果,但不一定知道它是怎么来的。自己取数的第一步,其实比想象中窄:先看懂一张表长什么样,然后把自己要的那几列挑出来。
这一篇就只做这两件事。
一张表长什么样
数据库里存数据的基本单位是 表(table)。你可以先把它当成一张电子表格:有表头,有数据行。区别在于,数据库里有很多张表,每张表负责一类事情——订单一张表,用户一张表,商品一张表。
拿一张订单表举例,它的名字叫 orders:
| order_id | user_id | city | amount | created_at |
|---|---|---|---|---|
| 1001 | 8823 | 杭州 | 129.00 | 2024-03-01 10:23:11 |
| 1002 | 9107 | 上海 | 58.50 | 2024-03-01 11:07:42 |
| 1003 | 8823 | 杭州 | 320.00 | 2024-03-02 09:15:03 |
这张表里,每一行是一条记录,代表一次具体的下单行为。1001 那一行说的是:订单号 1001,用户 8823,收货城市杭州,金额 129 元,下单时间是 3 月 1 日 10 点 23 分。
每一列是一个字段,代表这类记录上被记录下来的某一项信息。amount 这一列整列都是金额,created_at 整列都是下单时间。字段名就是给这一列起的名字,数据库靠它找到你要的东西。
字段名很重要,因为写查询时你唯一能点名的就是它们。表名和字段名写错一个字母,查询就会报错。
顺手记一下:每个字段都有自己的数据类型。amount 是数字,created_at 是日期时间,city 是文本。数据类型平时不显眼,但它决定了以后你能不能对这一列做加减、比大小、按时间排序,所以看表时值得一并留意。
把需要的列取出来
现在你想知道每笔订单的订单号、金额和下单时间。这三样东西对应三个字段,写出来是:
1SELECT order_id, amount, created_at
2FROM orders;这条语句可以拆成两半看。SELECT 后面接的是 你要哪些列,逗号分隔,写几个取几个。FROM 后面接的是 去哪张表取。整句以分号结尾。
它的意思是:从 orders 表里,把 order_id、amount、created_at 这三列取出来。
跑完你得到的是一个 结果集,也是一张表,只有三列:
| order_id | amount | created_at |
|---|---|---|
| 1001 | 129.00 | 2024-03-01 10:23:11 |
| 1002 | 58.50 | 2024-03-01 11:07:42 |
| 1003 | 320.00 | 2024-03-02 09:15:03 |
有几个细节值得记住。
列的顺序由你写的顺序决定。 如果你写成 SELECT amount, order_id FROM orders;,结果表第一列就是金额。数据库不会替你按原表顺序排好。
行的顺序不作保证。 上面结果看起来和原表一致,但这是巧合。除非你明确要求排序(那是后面 ORDER BY 的事),否则不要假设结果一定按某种顺序返回。
大小写和换行都不影响执行。 select 和 SELECT 一样能跑,一条语句拆成三行写也没问题。习惯上把 SELECT、FROM 这类关键字写成大写,是为了让人一眼分清哪些是语法、哪些是你的字段名。分号是语句结束的标志,写多句时必须靠它断开。
只想“先看一眼”的时候
如果你还不知道这张表里有哪些字段,最直接的探路方式是:
1SELECT * FROM orders;* 表示“所有列”。它会把这几十列全部返回给你,是熟悉一张陌生表最快的办法。
但在真正干活时,建议还是把列名一个个写清楚。原因不是“规范”,而是实际后果:表和列一多,返回一大堆你用不上的字段,读起来费劲、传输也慢。把列名写死,等于明确讲清楚你要什么。
给列起个别人看得懂的名字
结果表里的列名默认跟你写的字段名一样,也就是 order_id、amount 这种。要交给同事或者放进看板时,可以用 AS 换一个名字:
1SELECT order_id AS 订单号,
2 amount AS 订单金额
3FROM orders;结果表的表头就变成了“订单号”和“订单金额”。数据没变,只是给这一列贴了个新标签。这一步看着无关紧要,但当你把结果导出去给别人看时,它省掉的是对方逐个问你“这个字段是啥”的时间。
不知道字段名怎么办
新手最先撞上的墙是:想取金额,可这一列到底叫 amount 还是 total_amount?
最靠谱的办法是问数据团队,或者翻他们维护的字段说明——有些字段名看着差不多,算法却不一样。其次可以看别人已经做好的报表,那里用到的字段就是对的。如果你手上的取数工具能查看表结构,直接打开它,就能看到这张表所有字段名和它们各自的数据类型。思路都一样:先拿到字段清单,再动手写 SELECT。
新手最容易碰到的几个报错
- 最后一个列名后面多写了逗号。
SELECT order_id, amount, FROM orders;会报语法错误。逗号只夹在两项中间。 - 两个列名之间漏了逗号。
SELECT order_id amount FROM orders;数据库会理解成你在给order_id起别名叫amount,结果不对但不报错,这种更难发现。 - 字段名或表名拼错。 通常提示“unknown column”或“column does not exist”。照着表结构一个字母一个字母对。
- 用了中文标点。 中文逗号、中文分号看起来几乎一样,但数据库不认识。
小结和练习
走到这一步,你已经能自己回答“这张表有什么、我要哪几列”了。核心就一句:SELECT 选列,FROM 选表,列名写清楚比写 * 稳。
练习题:orders 表里还有 user_id 和 city。请写一条查询,取出每笔订单的订单号、用户 ID 和城市,并把结果列名改成中文。
参考答案
1SELECT order_id AS 订单号,
2 user_id AS 用户ID,
3 city AS 城市
4FROM orders;只取这三列、不取其他列,是这题的重点;AS 起到的是改表头的作用。
下一篇会接着讲:如果你不想要全部订单,只想要某个城市、或者某个金额以上的订单,该怎么把这些行筛掉。