讲解
整张表往往有成千上万行,真正需要的只是其中一部分。WHERE 子句给查询加条件:SELECT ... FROM ... WHERE 条件,只有让条件为真的行才会出现在结果里。条件由比较运算(=、>、< 等)和逻辑运算(AND、OR、NOT)组成,比如 WHERE age >= 20 筛出 20 岁及以上的学生。
比较字符串要用单引号把值包起来:WHERE city = '北京'。SQL 里的等号就是一个 =(不是编程语言里的 ==),不等号写作 != 或 <>。多个条件组合时,AND 表示「并且」、OR 表示「或者」:WHERE city = '北京' AND age > 20 两个条件都要满足;WHERE city = '北京' OR city = '上海' 满足其一即可。
AND 的优先级高于 OR,混合使用时建议一律加括号把意图写清楚:WHERE a OR b AND c 实际等价于 a OR (b AND c),未必是你想要的。WHERE 在逻辑上是对表里的每一行单独求值,行与行之间互不影响——想基于「整组数据」做筛选(比如「人数超过 2 的城市」)需要后面的 GROUP BY 和 HAVING。
示例
筛选成年且在北京的学生:
SELECT name, age, city FROM students WHERE age >= 20 AND city = '北京';
用 OR 组合多个条件,括号明确优先级(一班或二班里 20 岁以下的学生):
SELECT name, age, class_name FROM students WHERE (class_name = '一班' OR class_name = '二班') AND age < 20;
筛选价格不低于 60 元的课程:
SELECT title, price FROM courses WHERE price >= 60;
常见坑
- 字符串值用双引号:SQL 标准里双引号是给表名、列名等标识符用的,字符串必须用单引号。SQLite 对双引号字符串做了容错,但 MySQL、PostgreSQL 会直接报错或给出意外结果,从一开始就养成单引号的习惯。
- 把等号写成 ==:SQL 的相等比较就是一个 =,写 == 会报语法错误。反过来在编程语言里写 SQL 字符串时也容易混,注意切换。
- AND/OR 混用不加括号:WHERE a OR b AND c 的优先级结果常常和直觉相反。组合条件超过两个就老老实实加括号,可读性和正确性都更好。
- 在 WHERE 里引用 SELECT 的列别名:SELECT price * 0.8 AS sale_price ... WHERE sale_price > 50 会报错,因为逻辑上 WHERE 比 SELECT 先执行,那时别名还不存在。要么把表达式在 WHERE 里重写一遍,要么用子查询。
小结
WHERE 按条件筛行:比较用 =、>、!=,组合用 AND、OR、NOT,混合条件加括号。字符串值用单引号。下一节学习给结果排序和限量:ORDER BY 与 LIMIT。