# 从一张表开始：看懂表结构，写出第一条 SELECT

行、列、字段名分别是什么，以及怎样把自己要的那几列取出来

> SELECT 基础 · 表结构 · 取数入门 · 约 6 分钟 · 10 月 04 日

## 本篇要点

1. 表是数据库里存数据的基本单位，一行是一条具体记录，一列是一个字段，代表这类记录上被记录的一项信息。
2. 字段名就是列的名字，写查询时你唯一能点名的就是表名和字段名，写错一个字母就会报错。
3. 每个字段都有自己的数据类型，它决定这一列以后能不能做加减、比大小、按时间排序。
4. `SELECT 列1, 列2 FROM 表名;` 的含义是：从这张表里把我点名的这几列取出来，结果是一张新的结果集。
5. 结果表的列顺序由你写的顺序决定，行的顺序在没有明确排序要求时不被保证。
6. `SELECT *` 会把所有列取回，适合第一次看陌生表；实际干活时把列名写清楚，才不会取回一堆用不上的字段。
7. 用 `AS` 可以给结果表的列起别名，方便交给别人看，数据本身不变。
8. 不知道字段名时，可以问数据团队或看字段说明、参考现成报表，或用取数工具查看表结构。

---

你大概已经习惯了这样的流程：有个问题，找数据同学跑一下，过一会儿收到一个 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` 是文本。数据类型平时不显眼，但它决定了以后你能不能对这一列做加减、比大小、按时间排序，所以看表时值得一并留意。

<figure>

```mermaid
flowchart LR
  DB["一个数据库"] --> T1["表 orders"]
  DB --> T2["表 users"]
  T1 --> R["行：一次下单记录"]
  T1 --> C["列：一个字段，如 amount"]
```

</figure>

## 把需要的列取出来

现在你想知道每笔订单的订单号、金额和下单时间。这三样东西对应三个字段，写出来是：

```sql
SELECT order_id, amount, created_at
FROM 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` 这类关键字写成大写，是为了让人一眼分清哪些是语法、哪些是你的字段名。分号是语句结束的标志，写多句时必须靠它断开。

## 只想“先看一眼”的时候

如果你还不知道这张表里有哪些字段，最直接的探路方式是：

```sql
SELECT * FROM orders;
```

`*` 表示“所有列”。它会把这几十列全部返回给你，是熟悉一张陌生表最快的办法。

但在真正干活时，建议还是把列名一个个写清楚。原因不是“规范”，而是实际后果：表和列一多，返回一大堆你用不上的字段，读起来费劲、传输也慢。把列名写死，等于明确讲清楚你要什么。

## 给列起个别人看得懂的名字

结果表里的列名默认跟你写的字段名一样，也就是 `order_id`、`amount` 这种。要交给同事或者放进看板时，可以用 `AS` 换一个名字：

```sql
SELECT order_id AS 订单号,
       amount   AS 订单金额
FROM 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 和城市，并把结果列名改成中文。

<details>
<summary>参考答案</summary>

```sql
SELECT order_id AS 订单号,
       user_id  AS 用户ID,
       city     AS 城市
FROM orders;
```

只取这三列、不取其他列，是这题的重点；`AS` 起到的是改表头的作用。

</details>

下一篇会接着讲：如果你不想要全部订单，只想要某个城市、或者某个金额以上的订单，该怎么把这些行筛掉。

## 术语表

- 表（table）：数据库里存数据的基本单位，每张表负责一类事情，比如订单、用户。
- 行（row）：表里的一条记录，代表一个具体的对象或事件，比如一次下单。
- 列／字段（column／field）：表里的一类信息，整列记录的是同一件事，比如所有订单的金额。
- 字段名：给某一列起的名字，写查询时靠它指定要取哪一列。
- 数据类型：一个字段里存的是数字、文本还是日期时间，决定这一列能做哪些操作。
- SELECT … FROM：取数语句的两个部分，`SELECT` 后面写要哪些列，`FROM` 后面写从哪张表取。
- 结果集：执行查询后返回的那张表，只包含你点名的列，是查询的产出。
- 别名（AS）：给结果表的某一列换个显示名字，不影响数据本身。

## 来源

1. [W3Schools: SQL SELECT Statement — SELECT 基本语法与列别名的最小示例](https://www.w3schools.com/sql/sql_select.asp)
2. [MySQL Reference Manual: SHOW COLUMNS — 查看一张表有哪些字段的官方说明](https://dev.mysql.com/doc/refman/8.4/en/show-columns.html)
3. [PostgreSQL Documentation: The Information Schema — 用 information_schema 查询表与字段元数据](https://www.postgresql.org/docs/current/information-schema.html)

---

原文：https://pangzhengboyin.com/articles/reading-a-table-and-first-select-85a4f16a

> **庞征博引** · 想学的，慢慢都会
>
> 庞征博引是把想学的东西写成连载的 AI 学习工具。说出想学什么，它会先了解你的基础，再把主题写成一篇篇 5–10 分钟能读完的文章；边读边问，接下来学什么跟着你走。这篇就是这样写出来的。
>
> 开始你自己的连载 → https://pangzhengboyin.com
