一、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=Tom
2、大于(>)
查询:
年龄大于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),不加括号容易导致逻辑歧义。企业开发中通过加括号明确逻辑边界,提高可读性并避免业务错误。