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' |

进阶技巧
在模糊查询中,结合 LIKENOT 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. 运算符优先级与括号使用

运算符的优先级决定了表达式执行顺序,可参考以下优先级从高到低排序:

  1. 算术运算符(+, -, *, /, %
  2. 比较运算符(=, >, <, >=, <=, !=, <>
  3. 逻辑运算符(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 NULLIS NOT NULL

四、常见误区与最佳实践

1. 避免隐式类型转换

当比较不同数据类型的字段时,MySQL会自动进行类型转换,可能导致意外结果。例如:

-- 字符串"100"与整数100的比较  
SELECT '100' = 100; -- 返回1(true)  
SELECT '100a' = 100; -- 返回0(false,因字符串无法转为数字)  

建议:在条件中明确指定数据类型,或使用严格模式(STRICT_ALL_TABLES)避免隐式转换。

2. 逻辑运算符的短路特性

ANDOR 运算中,当结果已确定时,后续条件不会执行:

-- 当status为'archived'时,不会执行后面的子查询  
SELECT * FROM orders  
WHERE status = 'active' OR (SELECT COUNT(*) FROM inventory WHERE product_id = orders.product_id) > 0;  

合理利用这一特性可优化查询性能。


结论

通过本文对MySQL 运算符的系统性解析,读者应能掌握各类运算符的核心功能与应用场景。从基础的算术、比较运算,到进阶的位运算和逻辑组合,运算符始终是构建高效SQL查询的关键工具。建议读者通过实际项目练习,逐步理解运算符在复杂业务场景中的灵活运用。随着对运算符的深入掌握,开发者将能够编写出更简洁、高效且健壮的数据库查询语句,为构建高质量的数据库应用奠定坚实基础。

提示:建议读者在本地数据库环境中,根据文中案例自行创建测试表并尝试修改参数,以加深理解。

最新发布