# P15 15. 基础-SQL-DQL-基础查询

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P15 15. 基础-SQL-DQL-基础查询

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=15（p=15），时长 14:26
- 讲义：2.6.1 基本语法 / 2.6.2 基础查询 p41–42（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p15.sql（先执行，再对照小例）

### 一句话理解

从这一集开始查数据。基础查询解决三件事：查哪些列、列名怎么显示、重复值要不要去掉。

### 步骤

1. 语法骨架是 `SELECT 字段列表 FROM 表名;`。字段列表写具体列名，或写 `*` 表示所有列；`*` 方便，但会把不需要的大字段也查出来。
2. 起别名用 `AS`：`SELECT name AS 姓名 FROM ...`，结果表头就变成“姓名”。AS 可以省略，写个空格也行，但显式写更好读。
3. 去重是在字段前加 `DISTINCT`：`SELECT DISTINCT dept_id FROM employee;`，相同的值只留一行。它作用于整个字段列表，不是只作用于紧挨着的那一列。
4. 画面里的例子是 `select name, workno, age from emp;`，只取三列，结果按建表时的列顺序显示。

### SQL 示例

```
SELECT name AS 姓名, salary AS 月薪
FROM employee;
```

说明：结果两列，表头是“姓名”和“月薪”，共 4 行。第 4 行小李的月薪显示 NULL——NULL 表示“没有值”，不是 0；这也是后面 COUNT 要区分“数行”和“数列”的原因。

### 易错点

- 以为 `SELECT *` 更快。它往往更慢，因为多读了用不到的列，还多传了网络数据。
- 把 NULL 当 0 或空字符串。它参与运算结果还是 NULL。
- 以为 DISTINCT 只去重一列。`DISTINCT a, b` 去重的是 (a,b) 组合。

### 30 秒速记

SELECT 列 FROM 表；`*` 是所有列；AS 起别名；DISTINCT 去重；NULL 不是 0。

### 自测

1. `SELECT name AS 姓名` 里的 AS 改变了数据吗？
   - 答：没有。它只改结果集的列标题，表里的列名和数据都不变。别名的作用是让输出更好读，或在导出、报表时给出业务名称。
2. `SELECT DISTINCT dept_id, salary` 会得到什么？
   - 答：得到不重复的 (dept_id, salary) 组合。同一部门但薪水不同算两条；只有两列都相同才合并。

### 材料与来源

- [平台视频页] B站原视频 P15《15. 基础-SQL-DQL-基础查询》 https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=15
- [平台视频页] 本集采样画面 p15_t20.jpg（约 173s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=15
- [平台视频页] 本集采样画面 p15_t70.jpg（约 605s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=15

证据说明：以同版讲义公开镜像核对：讲义 2.6.1 基本语法 / 2.6.2 基础查询（p38–41）。原声字幕未取得（匿名接口字幕轨为空且需登录），讲师逐句讲解未核；本页示例、表与数字为站内原创，不是课堂原表。
