MySQL 比较运算符详解
(1)符号类型运算符
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
= | 等于运算符 | 判断两个值、字符串或表达式是否相等 | SELECT * FROM users WHERE age = 25 SELECT name FROM products WHERE category = 'Electronics' |
<=> | 安全等于运算符 | 安全地判断两个值、字符串或表达式是否相等(兼容NULL值) | SELECT * FROM employees WHERE salary <=> NULL SELECT * FROM orders WHERE coupon_code <=> 'DISCOUNT' |
<> | 不等于运算符 | 判断两个值、字符串或表达式是否不相等 | SELECT * FROM students WHERE gender <> 'F' SELECT id FROM logs WHERE status <> 200 |
!= | 不等于运算符 | 判断两个值、字符串或表达式是否不相等 | SELECT * FROM inventory WHERE quantity != 0 SELECT email FROM users WHERE deleted_at != NULL |
< | 小于运算符 | 判断前面的值是否小于后面的值 | SELECT * FROM products WHERE price < 100 SELECT * FROM events WHERE start_time < '2023-01-01' |
<= | 小于等于运算符 | 判断前面的值是否小于等于后面的值 | SELECT * FROM members WHERE age <= 18 SELECT * FROM tasks WHERE priority <= 3 |
> | 大于运算符 | 判断前面的值是否大于后面的值 | SELECT * FROM employees WHERE salary > 5000 SELECT * FROM articles WHERE views > 1000 |
>= | 大于等于运算符 | 判断前面的值是否大于等于后面的值 | SELECT * FROM candidates WHERE score >= 60 SELECT * FROM reservations WHERE guests >= 4 |
1. 等于运算符 =
- 作用:判断两个值、字符串或表达式是否相等
- 特点:
- 严格比较(NULL = NULL 返回NULL)
- 区分大小写(取决于数据库配置)
- 示例:
-- 数值比较 SELECT * FROM employees WHERE salary = 5000;-- 字符串比较 SELECT * FROM products WHERE name = 'Laptop';
2. 安全等于运算符 <=>
- 作用:安全地判断两个值/字符串/表达式是否相等(含NULL值)
- 特点:
- NULL <=> NULL 返回TRUE
- 其他情况与
=
相同
- 示例:
-- NULL值安全比较 SELECT * FROM customers WHERE phone_number <=> NULL;-- 常规比较 SELECT * FROM orders WHERE status <=> 'completed';
3. 不等于运算符 <>
或 !=
- 作用:判断两个值/字符串/表达式是否不相等
- 特点:
<>
是标准SQL语法!=
是兼容性语法- 两者功能完全相同
- 示例:
-- 使用<> SELECT * FROM students WHERE grade <> 'F';-- 使用!= SELECT * FROM inventory WHERE stock_quantity != 0;
4. 小于运算符 <
- 作用:判断前面的值是否小于后面的值
- 数据类型支持:
- 数值:
3 < 5
→ TRUE - 字符串:按字典序比较
- 日期:
'2023-01-01' < '2023-02-01'
→ TRUE
- 数值:
- 示例:
-- 数值比较 SELECT * FROM products WHERE price < 1000;-- 日期比较 SELECT * FROM events WHERE start_date < CURRENT_DATE;
5. 小于等于运算符 <=
- 作用:判断前面的值是否小于或等于后面的值
- 边界情况:
5 <= 5
→ TRUENULL <= 5
→ NULL
- 示例:
-- 年龄筛选 SELECT * FROM users WHERE age <= 18;-- 库存检查 SELECT * FROM warehouse WHERE quantity <= reorder_level;
6. 大于运算符 >
- 作用:判断前面的值是否大于后面的值
- 字符串比较规则:
'Apple' > 'Banana'
→ FALSE(按字符编码比较)- 大小写敏感(‘A’ > ‘a’ 结果取决于排序规则)
- 示例:
-- 薪资查询 SELECT name FROM employees WHERE salary > 10000;-- 时间范围 SELECT * FROM logs WHERE timestamp > '2023-06-01 00:00:00';
7. 大于等于运算符 >=
- 作用:判断前面的值是否大于或等于后面的值
- 特殊注意:
- 对NULL值的比较总是返回NULL
- 适用于范围查询的闭合区间
- 示例:
-- 分数筛选 SELECT student_id FROM exams WHERE score >= 60;-- 日期范围 SELECT * FROM reservations WHERE end_date >= '2023-12-31';
8.综合比较表
运算符 | NULL处理 | 适用场景 | 典型用例 |
---|---|---|---|
= | 返回NULL | 精确匹配查询 | 用户登录验证 |
<=> | 返回TRUE | 需要包含NULL值的比较 | 可选字段检查 |
<>/!= | 返回NULL | 排除特定值的查询 | 过滤无效记录 |
< | 返回NULL | 范围查询(开区间) | 查找历史数据 |
<= | 返回NULL | 范围查询(闭区间) | 统计截止某日期的数据 |
> | 返回NULL | 下限筛选 | 查找高价值客户 |
>= | 返回NULL | 下限筛选(含边界) | 达标数据筛选 |
(2)非符号类型运算符
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
IS NULL | 为空运算符 | 判断值/字符串/表达式是否为空 | SELECT B FROM table WHERE A IS NULL |
IS NOT NULL | 不为空运算符 | 判断值/字符串/表达式是否不为空 | SELECT B FROM table WHERE A IS NOT NULL |
LEAST | 最小值运算符 | 在多个值中返回最小值 | SELECT D FROM table WHERE C = LEAST(A,B) |
GREATEST | 最大值运算符 | 在多个值中返回最大值 | SELECT D FROM table WHERE C = GREATEST(A,B) |
BETWEEN | 区间运算符 | 判断值是否在两个值之间 | SELECT D FROM table WHERE C BETWEEN A AND B |
IN | 属于运算符 | 判断值是否为列表中的任意一个 | SELECT D FROM table WHERE C IN (A,B) |
NOT IN | 不属于运算符 | 判断值是否不在列表中 | SELECT D FROM table WHERE C NOT IN (A,B) |
LIKE | 模糊匹配运算符 | 判断值是否符合模糊匹配规则 | SELECT C FROM table WHERE A LIKE B |
REGEXP /RLIKE | 正则表达式运算符 | 判断值是否符合正则表达式 | SELECT C FROM table WHERE A REGEXP B |
一、空值判断运算符
1. IS NULL
- 功能:判断值/字符串/表达式是否为空
- 语法:
WHERE column IS NULL
- 特点:
- 唯一正确的NULL值判断方式(
= NULL
是错误语法) - 适用于所有数据类型
- 唯一正确的NULL值判断方式(
- 示例:
-- 查找未填写电话号码的用户 SELECT * FROM users WHERE phone IS NULL;
2. IS NOT NULL
- 功能:判断值/字符串/表达式是否不为空
- 语法:
WHERE column IS NOT NULL
- 应用场景:
- 数据完整性检查
- 有效记录筛选
- 示例:
-- 查找已激活的用户(email不为空) SELECT * FROM accounts WHERE email IS NOT NULL;
二、极值运算符
3. LEAST
- 功能:返回参数列表中的最小值
- 特点:
- 支持2个及以上参数
- 可比较数值/字符串/日期等类型
- 示例:
-- 获取最早日期 SELECT LEAST('2023-01-01', '2022-12-31', '2023-05-15');
4. GREATEST
- 功能:返回参数列表中的最大值
- 典型应用:
- 价格上限控制
- 有效期计算
- 示例:
-- 计算最终价格(不超过建议零售价) SELECT product_id, LEAST(price, msrp) AS final_price FROM products;
三、范围运算符
5. BETWEEN
- 功能:判断值是否在指定范围内(闭区间)
- 等效写法:
WHERE x >= a AND x <= b
- 注意事项:
- 总是先写小值再写大值
- 日期范围查询时包含边界
- 示例:
-- 查询2023年Q2订单 SELECT * FROM orders WHERE order_date BETWEEN '2023-04-01' AND '2023-06-30';
四、集合运算符
6. IN
- 功能:判断值是否在指定列表中
- 性能建议:
- 列表项超过100时考虑临时表
- 支持子查询
- 示例:
-- 查找特定品类商品 SELECT * FROM products WHERE category_id IN (1, 3, 5);
7. NOT IN
- 功能:判断值是否不在指定列表中
- NULL值陷阱:
- 当列表包含NULL时,所有比较返回NULL
- 建议配合
IS NOT NULL
使用
- 示例:
-- 排除测试账户 SELECT * FROM users WHERE user_id NOT IN (999, 1000);
五、模式匹配运算符
8. LIKE
- 通配符:
符号 功能 %
匹配任意数量字符 _
匹配单个字符 - 大小写敏感:取决于数据库配置
- 示例:
-- 查找J开头的姓名 SELECT * FROM employees WHERE name LIKE 'J%';
9. REGEXP
/RLIKE
- 功能:正则表达式匹配(两者完全等效)
- 常用模式:
^
:字符串开始$
:字符串结束[0-9]
:数字字符
- 示例:
-- 验证邮箱格式 SELECT * FROM contacts WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
六、特殊说明
10. ISNULL
(MySQL特有)
- 注意:与
IS NULL
功能相同,但非SQL标准 - 建议:优先使用标准语法
IS NULL