当前位置:网站首页>数据库系统原理与应用教程(056)—— MySQL 查询(十八):其他类型函数的用法
数据库系统原理与应用教程(056)—— MySQL 查询(十八):其他类型函数的用法
2022-07-26 01:06:00 【睿思达DBA_WGX】
数据库系统原理与应用教程(056)—— MySQL 查询(十八):其他类型函数的用法
目录
一、判断类函数
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)
边栏推荐
- 南姐的糗事
- Detailed explanation of at and crontab commands of RHCE and deployment of Chrony
- 【RTOS训练营】站在更高的角度学习C语言
- pip install --upgrade can‘t find Rust compiler
- Mmocr usage guide
- jupyter更改主界面并且导入数据集
- Amin's confession
- ORACLE——iSupplier 门户开票错误
- 109. Upload local files using SAP ui5 fileuploader control
- ZABBIX monitoring host and resource alarm
猜你喜欢

How does the proxy IP server ensure its information security in the network
![[RTOS training camp] ring buffer, at instruction, preview arrangement and evening class questions](/img/cb/de38e9f4186c4392ef8832659422ff.jpg)
[RTOS training camp] ring buffer, at instruction, preview arrangement and evening class questions

【RTOS训练营】I2C和UART知识和预习安排 + 晚课提问

腾讯员工晒出薪资:真实985毕业薪资,大家看我还有救吗?网友:日薪?

Win11打不开自带杀毒软件怎么办?win11自带杀毒功能打不开

Save unhappiness! My robot psychologist; KPI tracking of machine learning; Pytorch implementation of Yolo V7; Li Hang's new book "machine learning methods" open trial | showmeai Information Daily

Spine_附件皮肤

Ssd7 | embedded friendly target detection network, product landing

Open download! Alibaba Devops Practice Manual

游戏思考17:寻路引擎recast和detour学习二:recast导航网格生成流程及局限性
随机推荐
【RTOS训练营】I2C和UART知识和预习安排 + 晚课提问
How jupyter changes the default browser
C language_ The use and implementation of string comparison function StrCmp
《nlp入门+实战:第四章:使用pytorch手动实现线性回归 》
【RTOS训练营】课程学习方法和结构体知识复习 + 链表知识
typing‘ has no attribute ‘_ SpecialForm‘
旅行+战略加速落地 捷途新产品矩阵曝光
Data is written into excel and filled with color
web中间件日志分析脚本3.0(shell脚本)
【软件开发规范三】【软件版本命名规范】
Embedded development: tips and tricks -- seven tips for designing powerful boot loader
代理IP服务器如何保证自身在网络中的信息安全呢
1.30 升级bin文件添加后缀及文件长度
RHCE之at和crontab命令详解及chrony部署
数据写入excel并填充颜色
【RTOS训练营】任务调度(续)、任务礼让、调度总结、队列和晚课提问
How does the proxy IP server ensure its information security in the network
pip install --upgrade can‘t find Rust compiler
Four common simple and effective methods for changing IP addresses
【秒杀概念】原反补