数据库系统原理与应用教程(056)—— MySQL 查询(十八):其他类型函数的用法

news/2024/12/21 18:38:29/

数据库系统原理与应用教程(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)

http://www.ppmy.cn/news/438519.html

相关文章

MySQL讲义第 43 讲——select 查询之查询练习(一)

MySQL讲义第 43 讲——select 查询之查询练习&#xff08;一&#xff09; 文章目录 MySQL讲义第 43 讲——select 查询之查询练习&#xff08;一&#xff09;1、查询【C102】课程比【C103】课程分数低的学生的信息、课程及分数2、查询平均成绩高于80分的学生的学号、姓名和平均…

MySQL讲义第 48 讲——select 查询之查询练习(六)

MySQL讲义第 48 讲——select 查询之查询练习&#xff08;六&#xff09; 文章目录 MySQL讲义第 48 讲——select 查询之查询练习&#xff08;六&#xff09;42、查询【高等数学】课程分数低于 60 分的学生姓名和分数43、查询所有成绩在 90 分以上课程的学生姓名、课程名称和分…

数据库系统原理与应用教程(040)—— MySQL 查询(二):设置要查询的列名或表达式

数据库系统原理与应用教程&#xff08;040&#xff09;—— MySQL 查询&#xff08;二&#xff09;&#xff1a;设置要查询的列名或表达式 目录 数据库系统原理与应用教程&#xff08;040&#xff09;—— MySQL 查询&#xff08;二&#xff09;&#xff1a;设置要查询的列名或…

MySQL讲义第 45 讲——select 查询之查询练习(三)

MySQL讲义第 45 讲——select 查询之查询练习&#xff08;三&#xff09; 文章目录 MySQL讲义第 45 讲——select 查询之查询练习&#xff08;三&#xff09;22、查询有两门及以上课程不及格的学生的信息23、查询选修了编号为【C105】的课程的学生信息&#xff0c;按分数降序排…

MySQL讲义第 53 讲——select 查询之 select 语句执行过程分析

MySQL讲义第 53 讲——select 查询之 select 语句执行过程分析 文章目录 MySQL讲义第 53 讲——select 查询之 select 语句执行过程分析一、数据准备二、SELECT 语句的书写顺序三、SELECT 语句的执行顺序四、SELECT 语句的执行过程分析及验证1、FROM 子句指定查询所使用的表&am…

MySQL讲义第 46 讲——select 查询之查询练习(四)

MySQL讲义第 46 讲——select 查询之查询练习&#xff08;四&#xff09; 文章目录 MySQL讲义第 46 讲——select 查询之查询练习&#xff08;四&#xff09;28、查询每门课程的平均分并按平均分降序排列&#xff0c;显示课程编号、课程名和平均分29、查询每门课程的最高分、课…

数据库系统原理与应用教程(041)—— MySQL 查询(三):设置查询条件

数据库系统原理与应用教程&#xff08;041&#xff09;—— MySQL 查询&#xff08;三&#xff09;&#xff1a;设置查询条件 目录 数据库系统原理与应用教程&#xff08;041&#xff09;—— MySQL 查询&#xff08;三&#xff09;&#xff1a;设置查询条件一、运算符1、比较运…

数据库系统原理与应用教程(049)—— MySQL 查询(十一):子查询

数据库系统原理与应用教程&#xff08;049&#xff09;—— MySQL 查询&#xff08;十一&#xff09;&#xff1a;子查询 目录 数据库系统原理与应用教程&#xff08;049&#xff09;—— MySQL 查询&#xff08;十一&#xff09;&#xff1a;子查询一、标量子查询二、列子查询…