乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

算术运算符

导学

SQL 不仅是查询语言,也具备计算能力。算术运算符让你在查询中直接完成加减乘除、取模等运算,无需将数据拉回程序层再处理。

定义

算术运算符:用于对数值型数据进行数学运算的符号。MySQL 支持 +(加)、-(减)、*(乘)、/(除)、DIV(整除)、% 或 MOD(取模)。

运算符一览

运算符含义示例结果
+加法SELECT 10 + 313
-减法SELECT 10 - 37
*乘法SELECT 10 * 330
/除法SELECT 10 / 33.3333
DIV整数除法SELECT 10 DIV 33
% / MOD取模SELECT 10 % 31

演示数据准备

DROP TABLE IF EXISTS employees;

CREATE TABLE employees (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(20),
    dept VARCHAR(20),
    score DECIMAL(5,2)
);

INSERT INTO employees (emp_name, dept, score) VALUES
('大翔', '技术部', 100),
('白歌', '技术部', NULL);

当前 employees 表中的完整数据如下:

emp_idemp_namedeptscore
1大翔技术部100
2白歌技术部NULL

SQL 示例

场景一:查询中的计算列(加减乘除)

当前数据状态:见上文 employees 表完整数据。

执行语句:

SELECT
    emp_name,
    score,
    score + 10 AS plus_10,
    score - 10 AS minus_10,
    score * 2 AS doubled,
    score / 2 AS halved
FROM employees;

操作后结果:

emp_namescoreplus_10minus_10doubledhalved
大翔1001109020050.0000
白歌NULLNULLNULLNULLNULL

结果解读:score + 10、score - 10、score * 2、score / 2 分别演示了加、减、乘、除四种运算。注意白歌的 score 为 NULL,因此所有计算结果均为 NULL(任何包含 NULL 的算术运算结果都是 NULL)。

场景二:整数除法的陷阱

当前数据状态:无需表数据,直接演示常量运算。

执行语句:

SELECT 10 / 3;      -- 结果:3.3333(浮点数除法)
SELECT 10 DIV 3;    -- 结果:3(整数除法,截断小数)
SELECT 10 / 4;      -- 结果:2.5000
SELECT 10 DIV 4;    -- 结果:2
SELECT -10 DIV 3;   -- 结果:-3

操作后结果:

10 / 310 DIV 310 / 410 DIV 4-10 DIV 3
3.333332.50002-3

结果解读:MySQL 中 / 总是返回浮点数结果,即使两个操作数都是整数。如需整数除法,用 DIV,它会截断小数部分(向零取整)。

场景三:取模运算的应用

当前数据状态:见上文 employees 表完整数据。

执行语句(判断奇偶):

SELECT emp_name, emp_id FROM employees WHERE emp_id % 2 = 0;
-- 等价于
-- SELECT emp_name, emp_id FROM employees WHERE MOD(emp_id, 2) = 0;

操作后结果:

emp_nameemp_id
白歌2

结果解读:% 或 MOD 返回除法的余数。emp_id % 2 = 0 筛选出偶数 ID 的员工。

再看一个分批场景:

SELECT
    emp_id,
    emp_name,
    CASE WHEN emp_id % 3 = 1 THEN '第一批'
         WHEN emp_id % 3 = 2 THEN '第二批'
         ELSE '第三批' END AS batch
FROM employees;

操作后结果:

emp_idemp_namebatch
1大翔第一批
2白歌第二批

结果解读:利用 emp_id % 2 将员工按奇偶分到不同批次中。

场景四:NULL 参与的运算

当前数据状态:见上文 employees 表完整数据。

执行语句:

SELECT
    emp_name,
    score,
    score + NULL AS add_null,
    score * NULL AS mul_null
FROM employees;

操作后结果:

emp_namescoreadd_nullmul_null
大翔100NULLNULL
白歌NULLNULLNULL

结果解读:任何算术运算中只要有一个操作数是 NULL,结果就是 NULL。白歌的 score 为 NULL,因此计算结果均为 NULL。其他员工与 NULL 常量运算,结果同样为 NULL。

在计算列时,应使用 IFNULL() 函数处理:

SELECT
    emp_name,
    score,
    IFNULL(score, 0) AS safe_score,
    IFNULL(score, 0) + 10 AS total_safe
FROM employees;

操作后结果:

emp_namescoresafe_scoretotal_safe
大翔100100110
白歌NULL010

结果解读:IFNULL(score, 0) 将 NULL 替换为 0,因此白歌的 total_safe 正确计算为 10。

场景五:除零的处理

当前数据状态:无需表数据,直接演示常量运算。

执行语句:

SELECT 10 / 0;       -- 结果:NULL
SELECT 10 DIV 0;     -- 结果:NULL
SELECT 10 % 0;       -- 结果:NULL

操作后结果:

10 / 010 DIV 010 % 0
NULLNULLNULL

结果解读:MySQL 中除以零返回 NULL 而非报错。这在某些场景下会导致难以发现的逻辑错误。如需报错,可在 SQL Mode 中启用 ERROR_FOR_DIVISION_BY_ZERO。

验证 SQL Mode:

-- 查看当前 SQL Mode
SELECT @@sql_mode;

-- 启用严格模式(含除零报错)
SET sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE';

运算符优先级

算术运算符优先级与数学一致:

  1. *, /, DIV, %, MOD
  2. +, -
  3. 同优先级从左到右计算

执行语句:

SELECT 10 + 2 * 3;     -- 结果:16(先乘后加)
SELECT (10 + 2) * 3;   -- 结果:36(括号优先)
SELECT 100 / 10 * 2;   -- 结果:20(同优先级从左到右)
SELECT 100 / (10 * 2); -- 结果:5(括号优先)

操作后结果:

10 + 2 * 3(10 + 2) * 3100 / 10 * 2100 / (10 * 2)
163620.00005.0000

结果解读:10 + 2 * 3 先算 2 * 3 = 6,再算 10 + 6 = 16。括号可以强制改变优先级。同优先级(/ 和 *)时从左到右计算,因此 100 / 10 * 2 = 10 * 2 = 20。

常见误区

误区正解
10 / 3 结果是 3/ 返回浮点数,结果是 3.3333。整数除法用 DIV。
除以零会报错MySQL 返回 NULL,不会报错。
字符串参与算术运算会报错MySQL 会尝试将字符串隐式转为数字,转换失败则视为 0。
NULL 参与运算会报错NULL 参与运算结果恒为 NULL,不会报错。

面试考点

Q:MySQL 中 10 / 3 和 10 DIV 3 的区别?

/ 是浮点除法,返回 3.3333;DIV 是整数除法,返回 3(截断小数)。

Q:算术运算中遇到 NULL 会怎样?

任何包含 NULL 的算术运算结果都是 NULL。应使用 IFNULL(column, 0) 或 COALESCE(column, 0) 将 NULL 转为默认值后再计算。

Q:如何在查询中实现"四舍五入保留两位小数"?

使用 ROUND(score / 2, 2)。ROUND 是数值函数,详见第03章《数值函数》文档。

Q:MySQL 中除以零会怎样?

默认返回 NULL。如果 SQL Mode 启用了 ERROR_FOR_DIVISION_BY_ZERO,则会报错。

小结

  • 算术运算符在 SELECT 中直接计算,减少程序层处理
  • / 是浮点除法,DIV 是整数除法
  • NULL 参与的运算结果恒为 NULL
  • 除零在 MySQL 中返回 NULL 而非报错,需特别注意
  • 使用 IFNULL 或 COALESCE 处理 NULL 值,避免计算结果全为 NULL

下一章引子:算术运算符处理数字,但数据库中有一种特殊的"值"——NULL,它不参与普通运算,需要专门的处理方式。

上一页
逻辑运算符
下一页
模式匹配