一、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);

数据如下:

idnameagegenderscore
1Tom20M88.5
2Jack22M91
3Lucy19F95.5
4Rose21F86
5Mike20M78.5

三、比较运算符

这是 WHERE 最基础的内容。


1、等于(=)

查询:

Tom。


SELECT *
FROM student
WHERE name = 'Tom';

结果:

idname
1Tom

再例如:

查询:

20 岁。


SELECT *
FROM student
WHERE age = 20;

结果:

nameage
Tom20
Mike20

注意:

字符串必须使用单引号 ' '

正确:


WHERE name='Tom'

错误:


WHERE name=Tom

2、大于(>)

查询:

年龄大于20。


SELECT *
FROM student
WHERE age > 20;

结果:

nameage
Jack22
Rose21

3、小于(<)

查询:

年龄小于20。


SELECT *
FROM student
WHERE age < 20;

结果:

Lucy。


4、大于等于(>=)


SELECT *
FROM student
WHERE score >= 90;

结果:

namescore
Jack91
Lucy95.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;

结果:

nameage
Tom20
Lucy19
Rose21
Mike20

注意:

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 NULLIS 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 NULLIS NOT NULL
并且AND
或者OR
取反NOT

本节思考题(企业面试高频)

请尝试回答下面五个问题:

  1. BETWEEN 18 AND 20age >= 18 AND age <= 20 有什么关系?有没有区别?
    BETWEEN 18 AND 20 本质等价于 age >= 18 AND age <= 20,都是范围查询,区别主要在语法表达形式,BETWEEN 更简洁,但底层逻辑一致。
  2. 为什么 IN 比多个 OR 更推荐?
    IN 本质是集合查询,比多个 OR 更简洁、可读性更强,同时数据库优化器通常能更高效处理集合匹配,因此企业开发中更推荐使用 IN
  3. %_ 的区别是什么?请分别举一个例子。
    % 表示任意长度字符,_ 表示单个字符占位。% 用于模糊匹配整体结构,_ 用于精确控制字符位置。
  4. 为什么 SQL 判断 NULL 必须使用 IS NULL,而不能使用 = NULL
    因为 NULL 表示未知值,不是具体数据,无法使用 = 比较。SQL 使用 IS NULL 专门判断空值,本质上是三值逻辑(TRUE / FALSE / UNKNOWN)导致的设计。
  5. 为什么企业开发中建议复杂的 ANDOR 条件一定要加括号,即使 SQL 可以正常执行?
    因为 SQL 存在 AND/OR 优先级问题(AND 优先级高于 OR),不加括号容易导致逻辑歧义。企业开发中通过加括号明确逻辑边界,提高可读性并避免业务错误。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐