MySQL 运算符(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在数据库开发中,MySQL 运算符如同程序员手中的工具箱,是构建复杂查询、实现业务逻辑的核心组件。无论是简单的条件筛选,还是复杂的字段计算,运算符都能帮助开发者高效地操作数据。对于编程初学者而言,理解运算符的分类、用法及实际应用场景,是掌握SQL语言的重要一步。本文将从基础概念出发,结合实例深入解析各类运算符的功能,并通过对比和比喻,帮助读者建立直观认知。
一、运算符的分类与基础概念
运算符是SQL语言中用于执行计算或比较的符号,根据功能可分为以下几类:
- 算术运算符:执行加减乘除等数学运算
- 比较运算符:用于比较两个值的大小或相等性
- 逻辑运算符:连接多个条件进行逻辑判断
- 位运算符:对二进制位进行操作
- 字符串运算符:处理文本拼接等操作
- 日期/时间运算符:操作日期和时间字段
比喻理解:
想象运算符是一把瑞士军刀,不同刀片对应不同功能:有的用于切割(比较运算符),有的用于精密操作(逻辑运算符),有的则能组合工具(字符串拼接)。开发者需要根据需求选择合适的“刀片”,才能高效完成任务。
二、核心运算符详解
1. 算术运算符
功能:对数值进行加减乘除等数学计算
常见符号:+
(加)、-
(减)、*
(乘)、/
(除)、%
(取余)
案例演示:
假设有一个订单表 orders
,包含 order_price
(订单金额)和 discount
(折扣率)字段,计算实际支付金额:
SELECT order_id,
order_price * (1 - discount) AS actual_price
FROM orders;
此例中,*
运算符将订单金额与折扣后的系数相乘,直接返回实际支付金额。
2. 比较运算符
功能:比较两个表达式或值的大小关系
常用符号:
| 符号 | 含义 | 示例 |
|------|--------------------|--------------------------|
| =
| 等于 | score = 90
|
| >
| 大于 | price > 1000
|
| <
| 小于 | age < 18
|
| >=
| 大于等于 | quantity >= 50
|
| !=
| 不等于 | status != 'active'
|
| <>
| 不等于(等效于 !=
)| country <> 'CN'
|
进阶技巧:
在模糊查询中,结合 LIKE
和 NOT LIKE
运算符可实现模式匹配,例如:
SELECT * FROM products
WHERE product_name LIKE 'A%' -- 以A开头的名称
AND product_name NOT LIKE '%discontinued'; -- 不包含discontinued
3. 逻辑运算符
功能:连接多个条件,控制查询的逻辑范围
核心符号:
AND
:所有条件必须满足OR
:满足任意一个条件即可NOT
:否定条件
形象比喻:
AND
好比交通信号灯的“绿灯+行人通行”双条件满足OR
相当于“学生证或老年证”任一证件可享优惠
案例对比:
-- 查找年龄在18-30岁且来自北京的用户
SELECT * FROM users
WHERE age BETWEEN 18 AND 30
AND city = 'Beijing';
-- 查找年龄小于18或大于60岁的用户
SELECT * FROM users
WHERE age < 18 OR age > 60;
4. 位运算符
功能:对二进制位进行按位操作,常用于权限管理或状态标记
常用符号:
| 符号 | 含义 | 示例 |
|------|--------------------|--------------------------|
| &
| 按位与 | 5 & 3
→ 1 (二进制01 & 11) |
| |
| 按位或 | 6 | 3
→ 7 (110 | 011) |
| ^
| 按位异或 | 5 ^ 3
→ 6 (101 ^ 011) |
| ~
| 按位取反 | ~1
→ -2 (二进制补码运算)|
实际应用:
在权限系统中,常用位运算符组合权限值。例如:
CREATE TABLE roles (
role_id INT,
permissions INT -- 二进制位代表不同权限
);
-- 查询具有创建(1)和删除(4)权限的角色
SELECT * FROM roles
WHERE permissions & 5 = 5; -- 1 | 4 = 5
5. 字符串运算符
功能:处理文本拼接与模式匹配
核心符号:
CONCAT()
:拼接字符串(支持多个字段)||
:在某些方言中等效于CONCAT
LIKE
/NOT LIKE
:模糊匹配(支持通配符%
和_
)REGEXP
:正则表达式匹配
案例:
-- 拼接用户姓名与邮箱
SELECT CONCAT(first_name, ' ', last_name, ' <', email, '>') AS full_info
FROM users;
-- 查找包含"apple"但不带价格的评论
SELECT * FROM reviews
WHERE content LIKE '%apple%'
AND content NOT LIKE '%$%';
6. 日期/时间运算符
功能:操作日期和时间类型字段
常用函数:
| 函数名 | 功能描述 | 示例 |
|----------------|------------------------------|-------------------------------|
| CURDATE()
| 获取当前日期 | SELECT CURDATE();
→ '2023-10-05' |
| DATEDIFF()
| 计算两个日期的天数差 | DATEDIFF(end_date, start_date)
|
| DATE_ADD()
| 对日期进行加法运算 | DATE_ADD('2023-01-01', INTERVAL 1 MONTH)
→ '2023-02-01' |
| YEAR()
, MONTH()
| 提取日期中的年/月 | YEAR(order_date)
→ 2023 |
业务场景:
计算用户注册满一年的纪念日:
SELECT user_id,
registration_date,
DATE_ADD(registration_date, INTERVAL 1 YEAR) AS anniversary
FROM users;
三、运算符的进阶应用与注意事项
1. 运算符优先级与括号使用
运算符的优先级决定了表达式执行顺序,可参考以下优先级从高到低排序:
- 算术运算符(
+
,-
,*
,/
,%
) - 比较运算符(
=
,>
,<
,>=
,<=
,!=
,<>
) - 逻辑运算符(
NOT
,AND
,OR
)
注意事项:
当表达式复杂时,建议使用括号明确优先级,例如:
-- 错误写法:可能返回不符合预期的记录
SELECT * FROM sales
WHERE amount > 1000 AND region = 'East' OR category = 'Electronics';
-- 正确写法:明确逻辑分组
SELECT * FROM sales
WHERE (amount > 1000 AND region = 'East') OR category = 'Electronics';
2. NULL值的特殊处理
在运算中,任何与 NULL
的运算结果均为 NULL
,需特别注意:
SELECT 10 + NULL; -- 返回NULL
SELECT 'Hello' || NULL; -- 返回NULL
解决方法:
- 使用
COALESCE()
函数将NULL
替换为默认值 - 在条件中使用
IS NULL
或IS NOT NULL
四、常见误区与最佳实践
1. 避免隐式类型转换
当比较不同数据类型的字段时,MySQL会自动进行类型转换,可能导致意外结果。例如:
-- 字符串"100"与整数100的比较
SELECT '100' = 100; -- 返回1(true)
SELECT '100a' = 100; -- 返回0(false,因字符串无法转为数字)
建议:在条件中明确指定数据类型,或使用严格模式(STRICT_ALL_TABLES
)避免隐式转换。
2. 逻辑运算符的短路特性
在 AND
和 OR
运算中,当结果已确定时,后续条件不会执行:
-- 当status为'archived'时,不会执行后面的子查询
SELECT * FROM orders
WHERE status = 'active' OR (SELECT COUNT(*) FROM inventory WHERE product_id = orders.product_id) > 0;
合理利用这一特性可优化查询性能。
结论
通过本文对MySQL 运算符的系统性解析,读者应能掌握各类运算符的核心功能与应用场景。从基础的算术、比较运算,到进阶的位运算和逻辑组合,运算符始终是构建高效SQL查询的关键工具。建议读者通过实际项目练习,逐步理解运算符在复杂业务场景中的灵活运用。随着对运算符的深入掌握,开发者将能够编写出更简洁、高效且健壮的数据库查询语句,为构建高质量的数据库应用奠定坚实基础。
提示:建议读者在本地数据库环境中,根据文中案例自行创建测试表并尝试修改参数,以加深理解。