🗄️ 第三章 操作数据库-SQL的使用方法
📄 一句话概括

WHERE 是横切的筛子——按条件只留符合条件的行;AND 是【并且】、OR 是【或者】,两个连用时的优先级坑是本节最大的雷。

📝 本节和前面几节的关系

3-7 学了竖切(挑列);本节补上横切(挑行)——WHERE 是查询章节的发动机,3-9、3-10 的所有比较符号都装在它的槽里。

一、WHERE:只留符合条件的行

-- 准备块(没建表先跑 3-6 的准备块)

SELECT * FROM students WHERE class = 1;

输出(只留 1 班):

id  name  class  score
1   张三  1      85
2   李四  1      92

二、AND / OR:条件的乘法和加法

-- AND:两边都真才留(1 班且 80 分以上)
SELECT * FROM students WHERE class = 1 AND score >= 80;

-- OR:一边真就留(2 班或 60 分以下)
SELECT * FROM students WHERE class = 2 OR score < 60;
行 class=1 score>=80 AND 结果
张三 85 真 真 留
李四 92 真 真 留
王五 78 假 假 丢
赵六 64 假 假 丢

三、⚠️ 本节最大的雷:AND 比 OR 优先

想查【1 班的所有人,或者 80 分以上的人(不管班级)】:

-- 错误写法
SELECT * FROM students WHERE class = 1 OR score >= 80 AND class = 2;

-- 实际被解析成:class=1 OR (score>=80 AND class=2) —— AND 先抱团!

AND 相当于乘法、OR 相当于加法——乘法先算。 拿不准就加括号:

-- 明确写法
SELECT * FROM students WHERE class = 1 OR (score >= 80 AND class = 2);

职业习惯:AND OR 混用时永远加括号,哪怕你知道优先级——读代码的人不一定知道。

四、动手 Demo:三个条件各跑一遍

-- ① 单条件
SELECT * FROM students WHERE score >= 78;

-- ② AND:2 班 70 分以上
SELECT * FROM students WHERE class = 2 AND score >= 70;

-- ③ OR:1 班或 90 分以上
SELECT * FROM students WHERE class = 1 OR score >= 90;

-- ④ 优先级验证:比较加括号前后
SELECT * FROM students WHERE class = 1 OR score >= 80 AND class = 2;
SELECT * FROM students WHERE (class = 1 OR score >= 80) AND class = 2;

看到什么算成功:④两句话结果不同——不加分号前那句把【李四(92,1 班)】也放进来了(OR 左边单独成立),加括号后只剩 2 班 80 分以上的人(本表为空)。亲眼看到括号改变命运。

五、30 秒实验

把条件里的列换成不存在的列:SELECT * FROM students WHERE gender = '男';——报错【no such column】。WHERE 里只能用这张表真实存在的列(以及现算的表达式),写错列名 DBMS 立刻翻脸——这是它帮你抓笔误。

六、常见误区

  1. "判断相等写 ==" —— SQL 里一个 = 就是判等;写 == 部分 DBMS 报错。
  2. "AND 和 OR 谁先谁后无所谓" —— 有所谓!AND 先算(乘法先于加法),本节雷区就是它;混用必加括号。
  3. "WHERE 后面可以直接跟列别名" —— 多数数据库不允许(WHERE 先于 SELECT 执行,别名还没出生);WHERE 里写原列名。
自测三问(点开对答案) 1. WHERE 做的是横切还是竖切? **横切——按条件留行**;竖切挑列是 SELECT 的活。 2. SQL 判断相等写几个等号? **一个 `=`**。 3. AND 和 OR 谁优先?最稳的写法? **AND 优先(乘法先算);混用永远加括号**。

相关笔记