提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
运算符
算数运算符
| 运算符 | 说明 |
|---|---|
| + | 求和,MySQL中 + 没有字符串拼接功能 |
| - | 减 |
| * | 乘 |
| / | 除 |
| div | 整除,只保留整数部分 |
| % mod | 模,取余 |
示例:
python
select 2+3;
select 9/2,9 div 2;
select 10.1/2.1,10.1 div 2.1;
select 9%2,9 mod 2;
select "hello"+"world";# 结果为0
-- NULL与其他数据类型的运算结果为NULL
select 2+null;
select "hello"+null;
select date("2020-01-01")+null;
比较运算符
| 运算符 | 说明 |
|---|---|
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| = | 等于,不能用于NULL判断(使用is来判断是否为null) |
| != 或 <> | 不等于,不能用于NULL判断 |
示例:
python
use atguigu;
-- 查询薪资高于15000的员工姓名和薪资
select ename,salary from t_employee where salary>15000;
-- 查询薪资为9000的员工的姓名和薪资
select ename,salary from t_employee where salary=9000;
-- 查询地址不在北苑的
select * from t_employee where address!="北苑";
select * from t_employee where address<>"北苑";
区间或集合范围比较运算符
| 运算符 | 说明 |
|---|---|
| between x and y | 处于区间内 |
| not between x and y | 不处于区间内 |
| in(x,y,z) | 处于集合内 |
| not in (x,y,z) | 不处于集合内 |
示例
python
use atguigu;
-- 查询薪资在[10000,15000]
select * from t_employee where salary>=10000 && salary<=15000;
select * from t_employee where salary between 10000 and 15000;
-- 查询薪资不在[10000,15000]
select * from t_employee where salary not between 10000 and 15000;
-- 查询地址在这几个地方的
select * from t_employee where address in ('北苑', '望京', '龙泽');
-- 查询地址不在这几个地方的
select * from t_employee where address not in ('北苑', '望京', '龙泽');
模糊匹配比较运算符
| 运算符 | 说明 |
|---|---|
| % | 代表任意个字符 |
| _ | 代表1个字符,如果2个下划线就代表2个字符 |
示例:
python
use atguigu;
-- 查询名字有 冰 字的
select * from t_employee where ename like '%冰%';
-- 查询名字以 雨 结尾的
select * from t_employee where ename like '%雨';
-- 查询名字以 李 开头的
select * from t_employee where ename like '李%';
-- 查询名字有 红 这个字,但是 红 的前面只能有1个字
select * from t_employee where ename like '_红%';
-- 查询当前MySQL数据库的字符集情况
show variables like '%character%';
逻辑运算符
| 运算符 | 说明 |
|---|---|
| && 或 and | 逻辑与 |
| 或 or | 逻辑或 |
| ! 或 not | 逻辑非 |
| xor | 逻辑异或 |
示例:
python
use atguigu;
-- 查询薪资高于15000,并且性别是男的员工
select * from t_employee where salary>15000 and gender='男';
-- 查询薪资高于15000,或者did为1的员工
select * from t_employee where salary>15000 || did = 1;
-- 查询薪资不在[15000,20000]范围的
select * from t_employee where !(salary between 15000 and 20000);
-- 查询薪资高于15000,或者did为1的员工,两者只能满足其一
select * from t_employee where salary>15000 xor did = 1;
select * from t_employee where (salary>15000) ^ (did = 1);
关于NULL值的问题
| 运算符 | 说明 |
|---|---|
| is null或 <=>null | 是NULL |
| is not null | 不是NULL |
| ifnull(x,y) | 当x是NULL时,用y代替 |
示例:
python
use atguigu;
-- 查询奖金比例为null的员工
select * from t_employee where commission_pct is null;
select * from t_employee where commission_pct <=> null;
-- 查询奖金比例不为null的员工
select * from t_employee where commission_pct is not null;
-- 查询员工的实发工资,实发工资 = 薪资 + 薪资 * 奖金比例
select ename ,salary , commission_pct, salary + salary * ifnull(commission_pct,0) "实发工资" from t_employee;
《MySQL 运算符》学习笔记最终总结版
一、运算符总览
MySQL 中的运算符主要分为以下六类:
- 算术运算符
- 比较运算符
- 区间与集合运算符
- 模糊匹配运算符(LIKE)
- 逻辑运算符
- NULL 值相关运算符
下面按类别整理核心知识点和典型示例。
二、各类运算符详解
1. 算术运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
+ |
加法(不能拼接字符串) | SELECT 2+3; → 5 |
- |
减法 | SELECT 10-3; → 7 |
* |
乘法 | SELECT 5*4; → 20 |
/ |
除法(保留小数) | SELECT 9/2; → 4.5000 |
DIV |
整除(只保留整数部分) | SELECT 9 DIV 2; → 4 |
% 或 MOD |
取模(取余数) | SELECT 10%3; → 1 |
示例:
sql
SELECT "hello" + "world"; -- 结果为 0(+不能拼接字符串)
SELECT 2 + NULL; -- 结果为 NULL
2. 比较运算符
| 运算符 | 说明 | 注意事项 |
|---|---|---|
>、<、>=、<= |
大于、小于、大于等于、小于等于 | 常规比较 |
= |
等于 | 不能用于判断 NULL |
!= 或 <> |
不等于 | 不能用于判断 NULL |
示例:
sql
SELECT * FROM t_employee WHERE salary > 15000;
SELECT * FROM t_employee WHERE address != '北苑';
SELECT * FROM t_employee WHERE address <> '北苑';
3. 区间与集合运算符
| 运算符 | 说明 |
|---|---|
BETWEEN x AND y |
处于区间内(闭区间) |
NOT BETWEEN x AND y |
不处于区间内 |
IN (x,y,z) |
在集合内 |
NOT IN (x,y,z) |
不在集合内 |
示例:
sql
SELECT * FROM t_employee
WHERE salary BETWEEN 10000 AND 15000;
SELECT * FROM t_employee
WHERE address IN ('北苑', '望京', '龙泽');
4. 模糊匹配运算符(LIKE)
| 通配符 | 说明 |
|---|---|
% |
代表任意个字符(包括0个) |
_ |
代表1个字符 |
示例:
sql
SELECT * FROM t_employee WHERE ename LIKE '%冰%'; -- 包含"冰"
SELECT * FROM t_employee WHERE ename LIKE '李%'; -- 以"李"开头
SELECT * FROM t_employee WHERE ename LIKE '_红%'; -- 红前面只有一个字
查看字符集:
sql
SHOW VARIABLES LIKE '%character%';
5. 逻辑运算符
| 运算符 | 说明 | 替代写法 |
|---|---|---|
AND |
逻辑与 | && |
OR |
逻辑或 | ` |
NOT |
逻辑非 | ! |
XOR |
逻辑异或 | ^ |
示例:
sql
SELECT * FROM t_employee
WHERE salary > 15000 AND gender = '男';
SELECT * FROM t_employee
WHERE salary > 15000 XOR did = 1; -- 两者只能满足一个
6. NULL 值相关处理
| 写法 | 说明 |
|---|---|
IS NULL 或 <=> NULL |
判断是否为 NULL |
IS NOT NULL |
判断是否不为 NULL |
IFNULL(字段, 默认值) |
如果字段为 NULL,则返回默认值 |
示例:
sql
SELECT * FROM t_employee WHERE commission_pct IS NULL;
SELECT ename, salary, commission_pct,
salary * (1 + IFNULL(commission_pct, 0)) AS 实发工资
FROM t_employee;
三、易错点总结
以下是学习本章时最容易出错的地方,按严重程度排序:
-
使用
+拼接字符串- 错误:
SELECT 'hello' + 'world'; - 正确:MySQL 中
+只能做加法 ,字符串拼接要用CONCAT()函数。
- 错误:
-
用
=判断 NULL- 错误:
WHERE commission_pct = NULL - 正确:必须使用
IS NULL或<=> NULL
- 错误:
-
BETWEEN是闭区间BETWEEN 10000 AND 15000包含 10000 和 15000 两个边界值,新手容易误以为是开区间。
-
LIKE中%和_的含义混淆%= 任意多个字符(包括0个)_= 严格1个字符,容易写错个数。
-
DIV和/的区别/返回小数,DIV只保留整数部分(向下取整)。
-
忘记处理 NULL 值导致计算结果为 NULL
- 薪资×奖金比例时,如果
commission_pct是 NULL,整个结果会变成 NULL,必须用IFNULL()处理。
- 薪资×奖金比例时,如果
-
IN和NOT IN对 NULL 的处理- 当集合中包含
NULL时,NOT IN的结果可能不符合预期,需特别小心。
- 当集合中包含
-
XOR(异或)使用不熟练- 逻辑异或表示"两者只能满足一个",实际开发中使用频率较低,但考试常考。
-
字符串比较时字符集影响
- 中文比较结果可能受字符集和排序规则(Collation)影响,建议统一使用
utf8mb4。
- 中文比较结果可能受字符集和排序规则(Collation)影响,建议统一使用
-
逻辑运算符优先级问题
NOT>AND>OR,复杂条件建议使用括号明确优先级。