一、WHERE 是什么?
语法:
SELECT 字段 FROM 表名 WHERE 条件;例如:
SELECT * FROM student WHERE age > 20;可以理解为:
student(所有数据) ↓ WHERE 进行筛选 ↓ 只留下符合条件的数据 ↓ SELECT 返回所以:
WHERE 的作用就是:
过滤数据。
二、准备测试数据
以后这一章我们都使用下面这张表。
CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(30), age INT, gender CHAR(1), score DECIMAL(5,2) );插入数据:
INSERT INTO student(name,age,gender,score) VALUES ('Tom',20,'M',88.5), ('Jack',22,'M',91), ('Lucy',19,'F',95.5), ('Rose',21,'F',86), ('Mike',20,'M',78.5);数据如下:
| id | name | age | gender | score |
|---|---|---|---|---|
| 1 | Tom | 20 | M | 88.5 |
| 2 | Jack | 22 | M | 91 |
| 3 | Lucy | 19 | F | 95.5 |
| 4 | Rose | 21 | F | 86 |
| 5 | Mike | 20 | M | 78.5 |
三、比较运算符
这是 WHERE 最基础的内容。
1、等于(=)
查询:
Tom。
SELECT * FROM student WHERE name = 'Tom';结果:
| id | name |
|---|---|
| 1 | Tom |
再例如:
查询:
20 岁。
SELECT * FROM student WHERE age = 20;结果:
| name | age |
|---|---|
| Tom | 20 |
| Mike | 20 |
注意:
字符串必须使用单引号
' '。
正确:
WHERE name='Tom'错误:
WHERE name=Tom2、大于(>)
查询:
年龄大于20。
SELECT * FROM student WHERE age > 20;结果:
| name | age |
|---|---|
| Jack | 22 |
| Rose | 21 |
3、小于(<)
查询:
年龄小于20。
SELECT * FROM student WHERE age < 20;结果:
Lucy。
4、大于等于(>=)
SELECT * FROM student WHERE score >= 90;结果:
| name | score |
|---|---|
| Jack | 91 |
| Lucy | 95.5 |
5、小于等于(<=)
SELECT * FROM student WHERE score <=80;结果:
Mike。
6、不等于
MySQL 支持两种写法。
第一种:
!=例如:
SELECT * FROM student WHERE gender != 'M';第二种:
<>SELECT * FROM student WHERE gender <> 'M';结果一样:
| name |
|---|
| Lucy |
| Rose |
企业建议:
<>是 SQL 标准写法,!=是 MySQL 也支持的写法,两者都很常见。
四、逻辑运算符
实际开发中,一个条件往往不够。
例如:
查询20 岁以上的男生。
AND(并且)
SELECT * FROM student WHERE age > 20 AND gender='M';结果:
| name |
|---|
| Jack |
必须:
条件1 并且 条件2都成立。
OR(或者)
查询:
女生
或者
成绩大于90。
SELECT * FROM student WHERE gender='F' OR score>90;结果:
| name |
|---|
| Jack |
| Lucy |
| Rose |
NOT(取反)
查询:
不是女生。
SELECT * FROM student WHERE NOT gender='F';结果:
| name |
|---|
| Tom |
| Jack |
| Mike |
也可以写:
WHERE gender <> 'F'五、BETWEEN
例如:
查询:
年龄:
19~21。
SELECT * FROM student WHERE age BETWEEN 19 AND 21;结果:
| name | age |
|---|---|
| Tom | 20 |
| Lucy | 19 |
| Rose | 21 |
| Mike | 20 |
注意:
BETWEEN 包含两端。
即:
19 ≤ age ≤ 21等价于:
WHERE age>=19 AND age<=21六、IN
查询:
Tom
Mike
Lucy
很多人:
写:
WHERE name='Tom' OR name='Mike' OR name='Lucy'其实:
推荐:
SELECT * FROM student WHERE name IN ('Tom','Mike','Lucy');结果:
| name |
|---|
| Tom |
| Lucy |
| Mike |
IN 本质上就是多个等值判断的简洁写法。
七、LIKE(重点)
这是企业开发中最常用的模糊查询。
例如:
搜索用户名。
%
表示:
任意多个字符(包括 0 个字符)。
查询:
T 开头。
SELECT * FROM student WHERE name LIKE 'T%';结果:
Tom。
查询:
e 结尾。
SELECT * FROM student WHERE name LIKE '%e';结果:
Rose
Mike
查询:
包含 o。
SELECT * FROM student WHERE name LIKE '%o%';结果:
Tom
Rose
_
表示:
任意一个字符。
例如:
SELECT * FROM student WHERE name LIKE '_o%';解释:
第一位:任意字符 第二位:o 后面:任意多个字符符合:
Tom不符合:
Mike八、NULL 判断
这是 SQL 新手最容易犯错的地方。
错误写法:
WHERE name = NULL;永远查不到结果。
正确写法:
WHERE name IS NULL;查询:
不是 NULL。
WHERE name IS NOT NULL;原因:
NULL表示"未知值",不是普通的数据,因此不能使用=比较,必须使用IS NULL或IS NOT NULL。
九、逻辑运算符优先级
例如:
WHERE age>20 OR gender='F' AND score>90很多人认为:
从左到右执行。
实际上:
SQL 优先级:
NOT ↓ AND ↓ OR所以:
实际上相当于:
WHERE age>20 OR ( gender='F' AND score>90 )企业开发建议:
复杂条件一定加括号。
例如:
WHERE (age>20 OR gender='F') AND score>90可读性更好,也避免歧义。
十、企业开发规范
推荐:
SELECT id, name, score FROM student WHERE age >= 20 AND gender = 'M';不推荐:
select * from student where age>=20 and gender='M';推荐原因:
- SQL 关键字统一大写
- 不使用
SELECT * - 条件清晰
- 复杂表达式使用括号
- 字段按需查询
本节知识总结
| 类型 | 常用语法 |
|---|---|
| 等于 | = |
| 不等于 | !=、<> |
| 大于 | > |
| 小于 | < |
| 大于等于 | >= |
| 小于等于 | <= |
| 范围 | BETWEEN ... AND ... |
| 多值匹配 | IN (...) |
| 模糊查询 | LIKE |
| 空值判断 | IS NULL、IS NOT NULL |
| 并且 | AND |
| 或者 | OR |
| 取反 | NOT |
本节思考题(企业面试高频)
请尝试回答下面五个问题:
BETWEEN 18 AND 20和age >= 18 AND age <= 20有什么关系?有没有区别?BETWEEN 18 AND 20本质等价于age >= 18 AND age <= 20,都是范围查询,区别主要在语法表达形式,BETWEEN 更简洁,但底层逻辑一致。- 为什么
IN比多个OR更推荐?IN本质是集合查询,比多个OR更简洁、可读性更强,同时数据库优化器通常能更高效处理集合匹配,因此企业开发中更推荐使用IN。 %和_的区别是什么?请分别举一个例子。%表示任意长度字符,_表示单个字符占位。%用于模糊匹配整体结构,_用于精确控制字符位置。- 为什么 SQL 判断
NULL必须使用IS NULL,而不能使用= NULL?
因为 NULL 表示未知值,不是具体数据,无法使用=比较。SQL 使用IS NULL专门判断空值,本质上是三值逻辑(TRUE / FALSE / UNKNOWN)导致的设计。 - 为什么企业开发中建议复杂的
AND、OR条件一定要加括号,即使 SQL 可以正常执行?
因为 SQL 存在 AND/OR 优先级问题(AND 优先级高于 OR),不加括号容易导致逻辑歧义。企业开发中通过加括号明确逻辑边界,提高可读性并避免业务错误。