# P16 16. 基础-SQL-DQL-条件查询

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

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

## P16 16. 基础-SQL-DQL-条件查询

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=16（p=16），时长 17:57
- 讲义：2.6.3 条件查询 p42–45（公开镜像；按主题对应，切点 notexact）

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

### 一句话理解

只查需要的行，就要在 WHERE 里写条件。这一集把比较运算符、逻辑运算符和几个特殊写法过一遍。

### 步骤

1. 基本比较有六个：`=`、`>`、`>=`、`<`、`<=`、`<>` 或 `!=`（不等于）。字符串和日期加引号，数字不用。
2. 范围和列表：`BETWEEN 15 AND 20` 含两端，等价于 `>=15 AND <=20`；`IN (18,20,40)` 是多选一，比一串 OR 短。
3. 模糊与空值：`LIKE` 配 `%`（任意多个字符）和 `_`（一个字符）；空值只能写 `IS NULL` 或 `IS NOT NULL`。
4. 多条件用 `AND`/`&&`、`OR`/`||`、`NOT`/`!` 组合。AND 先算、OR 后算，混用加括号最稳。

### SQL 示例

```
SELECT id, name, age, salary
FROM employee
WHERE age BETWEEN 22 AND 30
  AND salary IS NOT NULL;
```

说明：两个条件同时成立才留下：年龄在 22–30（含 22、30），并且薪水不为空。结果是小林（22）、小周（25）、小陈（30）三行；小李年龄 21 不在范围，薪水又是 NULL，被两条条件分别挡掉。

### 易错点

- 写 `salary = NULL`，结果永远查不到。NULL 的比较要用 IS NULL。
- BETWEEN 写反（30 AND 22）不报错，只返回空结果，容易误判成“没数据”。
- `LIKE '%林'` 匹配结尾，`LIKE '林%'` 匹配开头，方向写反就查不到。
- AND 和 OR 混用不加括号。默认 AND 先算，结果常和预期不一致。

### 30 秒速记

六个比较符；BETWEEN 含端点；IN 多选一；LIKE 的 % 和 _；空值用 IS NULL；AND 先于 OR。

### 自测

1. 为什么 `WHERE salary = NULL` 查不到任何行？
   - 答：NULL 表示“未知”，任何与 NULL 的相等比较结果都是 UNKNOWN，不是 TRUE，所以行不会被选中。判断空值必须用 IS NULL 或 IS NOT NULL。
2. `BETWEEN 15 AND 20` 和 `>= 15 AND <= 20` 等价吗？
   - 答：对数字和日期等价，都包含两端。注意 BETWEEN 的下界必须写在前面，写反了虽然不报错，但会得到空结果。

### 材料与来源

- [平台视频页] B站原视频 P16《16. 基础-SQL-DQL-条件查询》 https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=16
- [平台视频页] 本集采样画面 p16_t30.jpg（约 322s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=16
- [平台视频页] 本集采样画面 p16_t80.jpg（约 861s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=16
- [官方文档] MySQL 8.0 Reference Manual: Comparison Operators https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html

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