Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql where子句与运算符

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 返回NULLWHERE salary / 12 > 500(月薪 / 12 后大于 500)
%取模(余数)返回除法余数,符号与被除数一致WHERE employee_id % 2 = 0(员工 ID 为偶数)

2. 关键说明

三、比较运算符:条件判断的核心武器

比较运算符用于判断值或表达式的关系,返回结果为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)

-- 查询薪资在5000-8000之间的员工(包含5000和8000)
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 5000 AND 8000;
-- 查询部门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)

-- 查询薪资、奖金、补贴中的最小值大于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 与通配符
-- 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 与正则匹配

支持更复杂的字符串模式匹配,常用元字符:

-- 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}$';

四、核心注意事项

  1. NULL 的特殊性
  1. 字符串与数值的比较
  1. 运算符优先级
  1. 性能建议

五、总结:运算符使用速查表

类别运算符核心用途关键特点
算术运算符+、-、*、/、%数值计算+仅做加法,/结果为浮点数
基础比较=、<=>、<>/!=判断等于 / 不等于,<=>支持 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子句与运算符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文