MySQL 查询过滤之WHERE 子句与运算符实战技巧
作者:cyforkk
本文将系统讲解WHERE子句的用法及常用运算符(算术、比较)的规则与实战技巧,帮你掌握数据筛选的精髓,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
MySQL 查询过滤:WHERE 子句与运算符全解析
在 MySQL 中,WHERE子句是数据过滤的核心工具,通过搭配不同运算符,能精准筛选出符合条件的记录。本文将系统讲解WHERE子句的用法及常用运算符(算术、比较)的规则与实战技巧,帮你掌握数据筛选的精髓。
一、WHERE 子句基础:定位核心数据
WHERE子句的作用是从表中筛选出满足指定条件的行,其位置固定在FROM子句之后,是 SQL 查询中实现 “精准提取” 的关键。
1. 基本语法结构
SELECT 字段1, 字段2, ... FROM 表名 WHERE 过滤条件; -- 条件由运算符连接字段或值组成
2. 核心作用
- 减少返回结果量,提升查询效率;
- 聚焦目标数据,避免无关信息干扰。
3. 示例
-- 查询薪资大于5000的员工姓名和薪资 SELECT last_name, salary FROM employees WHERE salary > 5000;
二、算术运算符:数值计算的基础工具
算术运算符用于对数值型字段或表达式进行计算,常见包括+(加)、-(减)、*(乘)、/(除)、%(取模),主要用于WHERE子句中的条件计算。
1. 核心规则与示例
| 运算符 | 作用 | 规则与注意事项 | 示例(基于employees表) |
|---|---|---|---|
| + | 加法 | 仅做数值加法,字符串会尝试转为数值(失败则按 0 计算),与 Java 的字符串拼接不同 | WHERE salary + 1000 > 6000(薪资 + 1000 后大于 6000) |
| - | 减法 | 整数减整数结果为整数,整数减浮点数结果为浮点数 | WHERE salary - bonus > 4000 |
| * | 乘法 | 结果类型随操作数变化(整数 × 浮点数 = 浮点数) | WHERE salary * 1.2 > 8000(薪资涨 20% 后大于 8000) |
| / | 除法 | 结果始终为浮点数,除以 0 返回NULL | WHERE salary / 12 > 500(月薪 / 12 后大于 500) |
| % | 取模(余数) | 返回除法余数,符号与被除数一致 | WHERE employee_id % 2 = 0(员工 ID 为偶数) |
2. 关键说明
- 优先级:*、/、% 高于 +、-,可通过括号()调整顺序;
- 字符串参与运算时,MySQL 会自动尝试转换为数值(如’123’→123,'abc’→0)。
三、比较运算符:条件判断的核心武器
比较运算符用于判断值或表达式的关系,返回结果为1(真)、0(假)或NULL(未知),是WHERE子句中最常用的条件构建工具。
1. 基础比较运算符(=、<=>、<>/!=)
| 运算符 | 作用 | 规则与注意事项 | 示例 |
|---|---|---|---|
| = | 等于 | 不能判断NULL(NULL = NULL返回NULL);字符串按 ANSI 编码比较,数字按数值比较 | WHERE department_id = 30(部门 ID 等于 30) |
| <=> | 安全等于 | 可判断NULL(NULL <=> NULL返回 1),其他与=一致 | WHERE commission_pct <=> NULL(佣金率为 NULL) |
| <>/!= | 不等于 | 不能判断NULL(任意操作数为NULL则返回NULL) | WHERE salary != 5000(薪资不等于 5000) |
2. NULL 相关运算符(IS NULL、IS NOT NULL)
专门用于判断NULL值(=无法胜任):
-- 查询没有上级的员工(manager_id为NULL) SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL; -- 等价于 ISNULL(manager_id) -- 查询有上级的员工 SELECT last_name, manager_id FROM employees WHERE manager_id IS NOT NULL;
3. 范围与集合运算符(BETWEEN AND、IN、NOT IN)
- BETWEEN AND:判断值是否在指定区间(闭区间,包含边界)
-- 查询薪资在5000-8000之间的员工(包含5000和8000) SELECT last_name, salary FROM employees WHERE salary BETWEEN 5000 AND 8000;
- IN / NOT IN:判断值是否在指定集合中
-- 查询部门ID为30、50、70的员工 SELECT last_name, department_id FROM employees WHERE department_id IN (30, 50, 70); -- 查询部门ID不在30、50、70的员工 SELECT last_name, department_id FROM employees WHERE department_id NOT IN (30, 50, 70);
注意:集合中包含NULL时,IN/NOT IN返回NULL。
4. 极值运算符(LEAST、GREATEST)
- LEAST(值1, 值2, …):返回参数中的最小值
- GREATEST(值1, 值2, …):返回参数中的最大值
-- 查询薪资、奖金、补贴中的最小值大于2000的员工 SELECT last_name, salary, bonus, subsidy FROM employees WHERE LEAST(salary, bonus, subsidy) > 2000; -- 查询三个业绩指标中的最大值大于90的员工 SELECT last_name, kpi1, kpi2, kpi3 FROM employees WHERE GREATEST(kpi1, kpi2, kpi3) > 90;
注意:参数包含NULL时,返回NULL。
5. 模糊匹配(LIKE、REGEXP)
用于字符串的模糊匹配,适合不确定完整值的场景。
(1)LIKE 与通配符
- %:匹配 0 个或多个任意字符;
- _:匹配 1 个任意字符;
- ESCAPE:指定转义符,处理包含%或_的字符串。
-- 1. 查询姓名以"张"开头的员工(%匹配后续任意字符) SELECT last_name FROM employees WHERE last_name LIKE '张%'; -- 2. 查询姓名第二个字是"小"的员工(_匹配1个字符) SELECT last_name FROM employees WHERE last_name LIKE '_小%'; -- 3. 查询岗位包含"_IT"的员工(用$转义_) SELECT job_id FROM jobs WHERE job_id LIKE '%$\_IT%' ESCAPE '$'; -- ESCAPE指定$为转义符
(2)REGEXP 与正则匹配
支持更复杂的字符串模式匹配,常用元字符:
- ^:匹配开头;$:匹配结尾;
- .:匹配任意单个字符;
- [abc]:匹配 a、b、c 中的任意一个;[0-9]:匹配任意数字;
- *:匹配前面字符 0 次或多次。
-- 1. 查询邮箱以"a"开头的员工
SELECT email
FROM employees
WHERE email REGEXP '^a';
-- 2. 查询姓名包含"李"或"王"的员工
SELECT last_name
FROM employees
WHERE last_name REGEXP '[李王]';
-- 3. 查询手机号以138开头且后8位全为数字的员工
SELECT phone_number
FROM employees
WHERE phone_number REGEXP '^138[0-9]{8}$';四、核心注意事项
- NULL 的特殊性:
- 不能用=/!=判断NULL,必须用IS NULL/IS NOT NULL或<=>;
- 任何包含NULL的运算结果都为NULL。
- 字符串与数值的比较:
- 字符串会自动转为数值(如’123’ = 123返回 1),转换失败按 0 处理(如’abc’ = 0返回 1)。
- 运算符优先级:
- 算术运算符 > 比较运算符;
- 不确定时用括号()明确顺序(如WHERE (salary + bonus) > 10000)。
- 性能建议:
- 避免在WHERE子句中对字段做运算(如WHERE salary*1.2 > 8000),可能导致索引失效;
- 模糊匹配时,%放在开头(如LIKE ‘%abc’)会导致索引失效,尽量用LIKE ‘abc%’。
五、总结:运算符使用速查表
| 类别 | 运算符 | 核心用途 | 关键特点 |
|---|---|---|---|
| 算术运算符 | +、-、*、/、% | 数值计算 | +仅做加法,/结果为浮点数 |
| 基础比较 | =、<=>、<>/!= | 判断等于 / 不等于,<=>支持 NULL | =不支持 NULL,<=>是安全等于 |
| NULL 判断 | IS NULL、IS NOT NULL | 判断 NULL 值 | 唯一能可靠判断 NULL 的方式 |
| 范围集合 | BETWEEN AND、IN | 判断值在区间 / 集合内 | BETWEEN是闭区间,IN集合含 NULL 返回 NULL |
| 极值判断 | LEAST、GREATEST | 取多个值中的最小 / 最大值 | 含 NULL 则返回 NULL |
| 模糊匹配 | LIKE、REGEXP | 字符串模糊匹配,REGEXP支持正则 | LIKE用%/_,REGEXP用元字符 |
掌握这些运算符,能让你写出更精准、高效的WHERE子句,轻松应对各种数据筛选场景。实际使用时,建议结合具体业务需求选择合适的运算符,并注意避免常见的性能陷阱。
到此这篇关于MySQL 查询过滤之WHERE 子句与运算符实战技巧的文章就介绍到这了,更多相关mysql where子句与运算符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
