数据库系统原理与应用教程(056)—— MySQL 查询(十八):其他类型函数的用法
目录
- 数据库系统原理与应用教程(056)—— MySQL 查询(十八):其他类型函数的用法
- 一、判断类函数
- 1、IF() 函数
- 2、IFNULL() 函数
- 3、CASE() 函数
- 二、数据类型转换函数
- 1、cast() 函数
- 2、convert() 函数
- 三、系统信息函数
- 1、返回当前数据库名称函数
- 2、返回 MySQL 版本号函数
- 3、查询当前用户信息函数
- 四、加密函数
- 1、PASSWORD() 函数
- 2、MD5() 函数
一、判断类函数
1、IF() 函数
根据逻辑表达式的不同取值返回不同的表达式结果。
语法结构如下:
-- 如果 逻辑表达式 结果为真,返回 结果表达式1 的值,如果 逻辑表达式 结果为假,则返回 结果表达式2 的值
IF(逻辑表达式, 结果表达式1, 结果表达式2)
例如:
(1)基本用法举例
mysql> select if(mod(100,2) = 0,'偶数','奇数') from dual;
+--------------------------------------+
| if(mod(100,2) = 0,'偶数','奇数') |
+--------------------------------------+
| 偶数 |
+--------------------------------------+
1 row in set (0.00 sec)
(2)有如下数据表,查询工资信息时,如果 salary 为 NULL 显示为 0
mysql> select * from t12;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | Jack | 5200 |
| 2 | Tom | 4800 |
| 3 | Black | 3700 |
| 4 | Mark | NULL |
| 5 | Kate | NULL |
+----+-------+--------+
5 rows in set (0.00 sec)mysql> select id,name,if(salary is null,0, salary) salary from t12;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | Jack | 5200 |
| 2 | Tom | 4800 |
| 3 | Black | 3700 |
| 4 | Mark | 0 |
| 5 | Kate | 0 |
+----+-------+--------+
5 rows in set (0.00 sec)
2、IFNULL() 函数
判断一个表达式是否为空。
语法格式如下:
-- 判断 表达式1 的值是否为空,如果不为空,就返回【表达式1】的值,否则返回【表达式2】的值。
IFNULL(表达式1,表达式2)
例如:有如下数据表,查询工资信息时,如果 salary 为 NULL 显示为 0
mysql> select id,name,ifnull(salary,0) salary from t12;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | Jack | 5200 |
| 2 | Tom | 4800 |
| 3 | Black | 3700 |
| 4 | Mark | 0 |
| 5 | Kate | 0 |
+----+-------+--------+
5 rows in set (0.00 sec)
3、CASE() 函数
用于多分支判断,有两种用法。个人认为,第二种用法较为灵活,完全可以代替第一种用法。
语法格式如下:
第一种用法:
/*
说明:
(1)判断 CASE 后面的 "表达式0" 和 WHEN 后面的 "valuei" 是否相等。
(2)如果 "value1" 的值和 "表达式0" 的值相等,就返回 "表达式1" 的值。
(3)如果 "value2" 的值和 "表达式0" 的值相等,就返回 "表达式2" 的值,以此类推。
(4)如果所有的 "value" 都不等于 "表达式0" 的值,就返回 ELSE 后面的 "表达式n" 的值。
(5)如果所有的 "value" 都不等于 "表达式0" 的值,并且没有 ELSE 就返回 NULL 值。
*/
CASE 表达式0 WHEN [value1] THEN 表达式1 [WHEN [value2] THEN 表达式2 ...][ELSE 表达式n]
END
第二种用法:
/*
说明:
(1)直接判断 "逻辑表达式i" 的值,哪个为真就返回对应的 "表达式i" 的值。
(2)如果所有的 "逻辑表达式i" 的值均为假,返回 ELSE 后面的 "表达式n" 的值。
(3)如果所有的 "逻辑表达式i" 的值均为假,并且没有 ELSE,则返回 NULL 值。
*/
CASE WHEN [逻辑表达式1] THEN 表达式1 [WHEN [逻辑表达式2] THEN 表达式2 ...][ELSE 表达式n]
END
例如:有如下的成绩表,请查询学生成绩,并显示成绩的等级:优秀(>= 90)、良好(80 - 90)、中等(70 - 80)、及格(60 - 70)和不及格(< 60)。
/*
select s.s_id, s.s_name, c.c_id, c.c_name, sc.score
from student s, score sc, course c
where s.s_id = sc.s_id and c.c_id = sc.c_id;
*/
mysql> select s.s_id, s.s_name, c.c_id, c.c_name, sc.score-> from student s, score sc, course c -> where s.s_id = sc.s_id and c.c_id = sc.c_id;
+-------+-----------+------+--------------+-------+
| s_id | s_name | c_id | c_name | score |
+-------+-----------+------+--------------+-------+
| S2011 | 张晓刚 | C102 | 高等数学 | 84 |
| S2011 | 张晓刚 | C105 | 传染病学 | 90 |
| S2012 | 刘小青 | C101 | 古代文学 | 67 |
| S2012 | 刘小青 | C102 | 高等数学 | 52 |
| S2012 | 刘小青 | C103 | 线性代数 | 55 |
| S2012 | 刘小青 | C104 | 临床医学 | 86 |
| S2012 | 刘小青 | C105 | 传染病学 | 87 |
| S2013 | 曹梦德 | C102 | 高等数学 | 97 |
| S2013 | 曹梦德 | C103 | 线性代数 | 68 |
| S2013 | 曹梦德 | C104 | 临床医学 | 66 |
| S2013 | 曹梦德 | C105 | 传染病学 | 68 |
| S2014 | 刘艳 | C102 | 高等数学 | 90 |
| S2014 | 刘艳 | C103 | 线性代数 | 85 |
| S2014 | 刘艳 | C104 | 临床医学 | 77 |
| S2014 | 刘艳 | C105 | 传染病学 | 96 |
| S2015 | 刘艳 | C101 | 古代文学 | 69 |
| S2015 | 刘艳 | C102 | 高等数学 | 66 |
| S2015 | 刘艳 | C103 | 线性代数 | 88 |
| S2015 | 刘艳 | C104 | 临床医学 | 69 |
| S2015 | 刘艳 | C105 | 传染病学 | 66 |
| S2016 | 刘若非 | C101 | 古代文学 | 65 |
| S2016 | 刘若非 | C102 | 高等数学 | 69 |
| S2021 | 董雯花 | C102 | 高等数学 | 72 |
| S2021 | 董雯花 | C103 | 线性代数 | 90 |
| S2021 | 董雯花 | C104 | 临床医学 | 90 |
| S2021 | 董雯花 | C105 | 传染病学 | 57 |
| S2022 | 周华建 | C102 | 高等数学 | 88 |
| S2022 | 周华建 | C103 | 线性代数 | 93 |
| S2023 | 特朗普 | C102 | 高等数学 | 68 |
| S2023 | 特朗普 | C103 | 线性代数 | 86 |
| S2024 | 奥巴马 | C102 | 高等数学 | 87 |
| S2024 | 奥巴马 | C103 | 线性代数 | 97 |
| S2025 | 周健华 | C102 | 高等数学 | 61 |
| S2025 | 周健华 | C105 | 传染病学 | 62 |
| S2026 | 张学有 | C102 | 高等数学 | 59 |
| S2026 | 张学有 | C105 | 传染病学 | 48 |
+-------+-----------+------+--------------+-------+
36 rows in set (0.01 sec)
(1)使用第一种方法构造查询
/*
select s.s_id, s.s_name, c.c_id, c.c_name, sc.score,
case floor(score/10)when 9 then '优秀'when 8 then '良好'when 7 then '中等'when 6 then '及格'else '不及格'
end grade
from student s, score sc, course c
where s.s_id = sc.s_id and c.c_id = sc.c_id;
*/
mysql> select s.s_id, s.s_name, c.c_id, c.c_name, sc.score,-> case floor(score/10)-> when 9 then '优秀'-> when 8 then '良好'-> when 7 then '中等'-> when 6 then '及格'-> else '不及格'-> end grade-> from student s, score sc, course c -> where s.s_id = sc.s_id and c.c_id = sc.c_id;
+-------+-----------+------+--------------+-------+-----------+
| s_id | s_name | c_id | c_name | score | grade |
+-------+-----------+------+--------------+-------+-----------+
| S2011 | 张晓刚 | C102 | 高等数学 | 84 | 良好 |
| S2011 | 张晓刚 | C105 | 传染病学 | 90 | 优秀 |
| S2012 | 刘小青 | C101 | 古代文学 | 67 | 及格 |
| S2012 | 刘小青 | C102 | 高等数学 | 52 | 不及格 |
| S2012 | 刘小青 | C103 | 线性代数 | 55 | 不及格 |
| S2012 | 刘小青 | C104 | 临床医学 | 86 | 良好 |
| S2012 | 刘小青 | C105 | 传染病学 | 87 | 良好 |
| S2013 | 曹梦德 | C102 | 高等数学 | 97 | 优秀 |
| S2013 | 曹梦德 | C103 | 线性代数 | 68 | 及格 |
| S2013 | 曹梦德 | C104 | 临床医学 | 66 | 及格 |
| S2013 | 曹梦德 | C105 | 传染病学 | 68 | 及格 |
| S2014 | 刘艳 | C102 | 高等数学 | 90 | 优秀 |
| S2014 | 刘艳 | C103 | 线性代数 | 85 | 良好 |
| S2014 | 刘艳 | C104 | 临床医学 | 77 | 中等 |
| S2014 | 刘艳 | C105 | 传染病学 | 96 | 优秀 |
| S2015 | 刘艳 | C101 | 古代文学 | 69 | 及格 |
| S2015 | 刘艳 | C102 | 高等数学 | 66 | 及格 |
| S2015 | 刘艳 | C103 | 线性代数 | 88 | 良好 |
| S2015 | 刘艳 | C104 | 临床医学 | 69 | 及格 |
| S2015 | 刘艳 | C105 | 传染病学 | 66 | 及格 |
| S2016 | 刘若非 | C101 | 古代文学 | 65 | 及格 |
| S2016 | 刘若非 | C102 | 高等数学 | 69 | 及格 |
| S2021 | 董雯花 | C102 | 高等数学 | 72 | 中等 |
| S2021 | 董雯花 | C103 | 线性代数 | 90 | 优秀 |
| S2021 | 董雯花 | C104 | 临床医学 | 90 | 优秀 |
| S2021 | 董雯花 | C105 | 传染病学 | 57 | 不及格 |
| S2022 | 周华建 | C102 | 高等数学 | 88 | 良好 |
| S2022 | 周华建 | C103 | 线性代数 | 93 | 优秀 |
| S2023 | 特朗普 | C102 | 高等数学 | 68 | 及格 |
| S2023 | 特朗普 | C103 | 线性代数 | 86 | 良好 |
| S2024 | 奥巴马 | C102 | 高等数学 | 87 | 良好 |
| S2024 | 奥巴马 | C103 | 线性代数 | 97 | 优秀 |
| S2025 | 周健华 | C102 | 高等数学 | 61 | 及格 |
| S2025 | 周健华 | C105 | 传染病学 | 62 | 及格 |
| S2026 | 张学有 | C102 | 高等数学 | 59 | 不及格 |
| S2026 | 张学有 | C105 | 传染病学 | 48 | 不及格 |
+-------+-----------+------+--------------+-------+-----------+
36 rows in set (0.00 sec)
(2)使用第二种方法构造查询
/*
select s.s_id, s.s_name, c.c_id, c.c_name, sc.score,
case when score >= 90 then '优秀'when score >= 80 then '良好'when score >= 70 then '中等'when score >= 60 then '及格'else '不及格'
end grade
from student s, score sc, course c
where s.s_id = sc.s_id and c.c_id = sc.c_id;
*/
mysql> select s.s_id, s.s_name, c.c_id, c.c_name, sc.score,-> case -> when score >= 90 then '优秀'-> when score >= 80 then '良好'-> when score >= 70 then '中等'-> when score >= 60 then '及格'-> else '不及格'-> end grade-> from student s, score sc, course c -> where s.s_id = sc.s_id and c.c_id = sc.c_id;
+-------+-----------+------+--------------+-------+-----------+
| s_id | s_name | c_id | c_name | score | grade |
+-------+-----------+------+--------------+-------+-----------+
| S2011 | 张晓刚 | C102 | 高等数学 | 84 | 良好 |
| S2011 | 张晓刚 | C105 | 传染病学 | 90 | 优秀 |
| S2012 | 刘小青 | C101 | 古代文学 | 67 | 及格 |
| S2012 | 刘小青 | C102 | 高等数学 | 52 | 不及格 |
| S2012 | 刘小青 | C103 | 线性代数 | 55 | 不及格 |
| S2012 | 刘小青 | C104 | 临床医学 | 86 | 良好 |
| S2012 | 刘小青 | C105 | 传染病学 | 87 | 良好 |
| S2013 | 曹梦德 | C102 | 高等数学 | 97 | 优秀 |
| S2013 | 曹梦德 | C103 | 线性代数 | 68 | 及格 |
| S2013 | 曹梦德 | C104 | 临床医学 | 66 | 及格 |
| S2013 | 曹梦德 | C105 | 传染病学 | 68 | 及格 |
| S2014 | 刘艳 | C102 | 高等数学 | 90 | 优秀 |
| S2014 | 刘艳 | C103 | 线性代数 | 85 | 良好 |
| S2014 | 刘艳 | C104 | 临床医学 | 77 | 中等 |
| S2014 | 刘艳 | C105 | 传染病学 | 96 | 优秀 |
| S2015 | 刘艳 | C101 | 古代文学 | 69 | 及格 |
| S2015 | 刘艳 | C102 | 高等数学 | 66 | 及格 |
| S2015 | 刘艳 | C103 | 线性代数 | 88 | 良好 |
| S2015 | 刘艳 | C104 | 临床医学 | 69 | 及格 |
| S2015 | 刘艳 | C105 | 传染病学 | 66 | 及格 |
| S2016 | 刘若非 | C101 | 古代文学 | 65 | 及格 |
| S2016 | 刘若非 | C102 | 高等数学 | 69 | 及格 |
| S2021 | 董雯花 | C102 | 高等数学 | 72 | 中等 |
| S2021 | 董雯花 | C103 | 线性代数 | 90 | 优秀 |
| S2021 | 董雯花 | C104 | 临床医学 | 90 | 优秀 |
| S2021 | 董雯花 | C105 | 传染病学 | 57 | 不及格 |
| S2022 | 周华建 | C102 | 高等数学 | 88 | 良好 |
| S2022 | 周华建 | C103 | 线性代数 | 93 | 优秀 |
| S2023 | 特朗普 | C102 | 高等数学 | 68 | 及格 |
| S2023 | 特朗普 | C103 | 线性代数 | 86 | 良好 |
| S2024 | 奥巴马 | C102 | 高等数学 | 87 | 良好 |
| S2024 | 奥巴马 | C103 | 线性代数 | 97 | 优秀 |
| S2025 | 周健华 | C102 | 高等数学 | 61 | 及格 |
| S2025 | 周健华 | C105 | 传染病学 | 62 | 及格 |
| S2026 | 张学有 | C102 | 高等数学 | 59 | 不及格 |
| S2026 | 张学有 | C105 | 传染病学 | 48 | 不及格 |
+-------+-----------+------+--------------+-------+-----------+
36 rows in set (0.02 sec)
二、数据类型转换函数
1、cast() 函数
把表达式的数据类型转换为另一种数据类型。
语法格式如下:
cast(表达式 as 数据类型)
2、convert() 函数
把表达式的数据类型转换为另一种数据类型。
语法格式如下:
convert(表达式, 数据类型)
三、系统信息函数
1、返回当前数据库名称函数
返回当前使用的数据库名。
语法格式如下:
DATABASE()
SCHEMA()
例如:
mysql> select DATABASE() from dual;
+------------+
| DATABASE() |
+------------+
| mydb |
+------------+
1 row in set (0.00 sec)
2、返回 MySQL 版本号函数
返回 MySQL 的版本号。
语法格式如下:
VERSION()
例如:
mysql> select VERSION() from dual;
+-----------+
| VERSION() |
+-----------+
| 5.7.25 |
+-----------+
1 row in set (0.00 sec)
3、查询当前用户信息函数
查询用户信息使用如下函数:
CURRENT_USER()
SESSION_USER()
SYSTEM_USER()
USER()
例如:
mysql> select CURRENT_USER(),SESSION_USER(),SYSTEM_USER(),USER() from dual;
+----------------+----------------+---------------+---------------+
| CURRENT_USER() | SESSION_USER() | SYSTEM_USER() | USER() |
+----------------+----------------+---------------+---------------+
| wgx@localhost | wgx@localhost | wgx@localhost | wgx@localhost |
+----------------+----------------+---------------+---------------+
1 row in set (0.00 sec)
四、加密函数
1、PASSWORD() 函数
对字符串进行加密。一般情况下,PASSWORD() 函数主要是用来给用户的密码加密。
语法格式如下:
PASSWORD(str)
例如:
mysql> select PASSWORD('123') from dual;
+-------------------------------------------+
| PASSWORD('123') |
+-------------------------------------------+
| *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
2、MD5() 函数
对字符串进行加密。MD5() 函数主要对普通的数据进行加密。
语法格式如下:
MD5(str)
例如:
mysql> select MD5('123') from dual;
+----------------------------------+
| MD5('123') |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
1 row in set (0.00 sec)