MySQL 运算符
在 MySQL 数据库操作中,运算符是构建查询条件、处理数据关系的基础组件。无论是简单的数值比较,还是复杂的逻辑判断,都离不开运算符的支持。
一、MySQL 运算符是什么
MySQL 运算符是用于执行数据计算或比较的特殊符号或关键字,它可以连接表达式中的操作数,实现数值运算、条件判断、逻辑组合等功能。合理使用运算符能让 SQL 语句更精准地筛选数据、处理业务逻辑,是编写高效查询的必备知识。
运算符按功能可分为算术运算符、比较运算符、逻辑运算符、字符串运算符、赋值运算符等,每种类型都有其特定的应用场景。
二、常用运算符类型及示例
(一)算术运算符
算术运算符用于执行数值计算,包括加、减、乘、除等基本运算,适用于数值类型的列或常量。
1.+(加法):计算两个数值的和。
示例:查询学生的语文和数学成绩总和
SELECT name, chinese + math AS total_score FROM score;
若表中某学生语文 80 分、数学 90 分,结果中 total_score 为 170。
2.-(减法):计算两个数值的差。
示例:查询商品原价与折扣价的差额
SELECT product_name, original_price - discount_price AS price_diff FROM products;
3.*(乘法):计算两个数值的积。
示例:计算订单总金额(单价 × 数量)
SELECT order_id, price * quantity AS total_amount FROM order_details;
4./(除法):计算两个数值的商(结果为浮点数)。
示例:计算平均分(总分 ÷ 科目数)
SELECT name, (chinese + math + english) / 3 AS avg_score FROM score;
5.%(取余):返回两个数值相除的余数。
示例:查询学号为奇数的学生
SELECT * FROM student WHERE student_id % 2 = 1;
(二)比较运算符
比较运算符用于判断两个操作数的关系,返回布尔值(1 表示真,0 表示假,NULL 表示未知),常用于 WHERE 子句筛选数据。
- =(等于):判断两个值是否相等(注意与赋值运算符区分)。
示例:查询数学成绩为 100 分的学生
SELECT name, math FROM score WHERE math = 100;
2.<> 或 !=(不等于):判断两个值是否不相等。
示例:查询不是三班的学生
SELECT name, class FROM student WHERE class <> 3;
3.>(大于)、<(小于)、>=(大于等于)、<=(小于等于):比较数值大小。
示例:查询语文成绩大于 90 分的学生
SELECT name, chinese FROM score WHERE chinese > 90;
4.BETWEEN ... AND ...:判断值是否在指定范围内(包含边界)。
示例:查询数学成绩在 80 到 90 分之间的学生
SELECT name, math FROM score WHERE math BETWEEN 80 AND 90;
5.IN:判断值是否在指定的列表中。
示例:查询班级为 1 班、3 班或 5 班的学生
SELECT name, class FROM student WHERE class IN (1, 3, 5);
6.LIKE:用于模糊匹配字符串(%匹配任意长度字符,_匹配单个字符)。
示例:查询姓 “张” 的学生
SELECT name FROM student WHERE name LIKE '张%';
示例:查询第二个字是 “明” 的学生(如 “李明”“王明”)
SELECT name FROM student WHERE name LIKE '_明%';
7.IS NULL / IS NOT NULL:判断值是否为 NULL(NULL 不能用=判断)。
示例:查询未填写邮箱的用户
SELECT username FROM user WHERE email IS NULL;
(三)逻辑运算符
逻辑运算符用于组合多个条件,实现复杂的逻辑判断,常用的有 AND、OR、NOT。
1.AND(与):所有条件同时满足时返回真。
示例:查询数学 > 90 且语文 > 90 的学生
SELECT name FROM score WHERE math > 90 AND chinese > 90;
2.OR(或):任意一个条件满足时返回真。
示例:查询数学 > 90 或语文 > 90 的学生
SELECT name FROM score WHERE math > 90 OR chinese > 90;
3.NOT(非):否定条件的结果。
示例:查询不在 1 班且年龄不是 18 岁的学生
SELECT name, class, age FROM student WHERE NOT (class = 1 OR age = 18);
(四)字符串运算符
字符串运算符主要用于字符串的拼接操作,MySQL 中常用CONCAT()函数实现,也可使用||(需开启PIPES_AS_CONCAT模式)。
- CONCAT(str1, str2, ...):连接多个字符串(与字符串函数中的 CONCAT 功能一致)。
示例:拼接姓名和班级为 “姓名(班级)” 格式
SELECT CONCAT(name, '(', class, '班)') AS student_info FROM student;
结果类似 “张三 (2 班)”。
(五)赋值运算符
赋值运算符用于为变量或列赋值,最常用的是=。
- =:在 SET 或 UPDATE 语句中为变量或列赋值。
示例:更新学生的年龄
UPDATE student SET age = 19 WHERE name = '张三';
示例:定义用户变量并赋值
SET @total = 0;SELECT @total := 10 + 20; -- 变量total赋值为30
(六)位运算符
位运算符用于对二进制数进行位级操作,适用于整数类型,实际开发中较少使用,主要包括&(与)、|(或)、^(异或)、~(非)、<<(左移)、>>(右移)。
示例:计算 3(二进制 11)和 5(二进制 101)的位与结果
SELECT 3 & 5 AS result; -- 结果为1(二进制001)
三、运算符的优先级
当一个表达式中包含多个运算符时,MySQL 会按优先级依次执行,优先级高的先运算。若优先级相同,按从左到右的顺序执行。常见运算符的优先级从高到低为:
- 算术运算符(*、/、%高于+、-)
- 比较运算符(=、>、<等)
- 逻辑运算符(NOT高于AND,AND高于OR)
- 赋值运算符
可通过括号()改变运算顺序,将需要优先执行的部分括起来。
示例:先计算加法再比较(不加括号会先算乘法)
SELECT * FROM score WHERE (chinese + math) > 180;
四、使用注意事项
- NULL 值的处理:任何运算符与 NULL 运算的结果都为 NULL,需用IS NULL或IS NOT NULL判断。
- 字符串与数值的比较:MySQL 会自动将字符串转换为数值后比较,若转换失败则视为 0。例如'123' = 123返回 1,'abc' = 0返回 1。
- LIKE 的性能:对大表使用%开头的模糊查询(如LIKE '%abc')会导致全表扫描,效率较低,建议结合索引或使用全文检索。
- IN 与子查询:当 IN 的列表值较多时,可考虑用子查询替代,如WHERE class IN (SELECT class FROM top_class)。
- 避免连续比较错误:例如1 < x < 3在 MySQL 中会解析为(1 < x) < 3,结果可能不符合预期,应写成x > 1 AND x < 3。