MySQL基础6-常用数据库函数

数据库,MySQL,常用,基础 · 浏览次数 : 155

小编点评

**需求:在学生成绩表中,根据成绩展示优秀,良好一般。** **学生成绩表(test)原始数据mysql> select * from test;+------+---------+--------------+-----------+| id | stu_num | stu_name | stu_score |+------+---------+--------------+-----------+| 1 | 00001 | 张三 | 90 || 2 | 00002 | 李四 | 87 || 3 | 00003 | 王五 | 78 || 4 | 00014 | 赵六 | 83 || 5 | 00025 | 王二麻子 | 94 |+------+---------+--------------+-----------+5 rows in set (0.00 sec)mysql> select stu_name, (case when stu_score>=90 then \"优秀\" when stu_score >80 then \"良好\" when stu_score >70 then\"一般\" when stu_score >60 then \"及格\" else \"不及格\" end) as \"成绩\" from test;+--------------+--------+| stu_name | 成绩 |+--------------+--------+| 张三 | 优秀 || 李四 | 良好 || 王五 | 一般 || 赵六 | 良好 || 王二麻子 | 优秀 |+--------------+--------+5 rows in set (0.00 sec)** **代码:** ```python import mysql.connector #连接数据库 db_connector = mysql.connector.connect( #数据库连接信息 database_url="mysql://root@localhost/test" ) #创建游标 cursor = db_connector.cursor() #执行查询 cursor.execute("select name ,(case when stu_score>=90 then \"优秀\" when stu_score >80 then \"良好\" when stu_score >70 then\"一般\" when stu_score >60 then \"及格\" else \"不及格\" end) as \"成绩\" from test") #获取结果 results = cursor.fetchall() #关闭游标 cursor.close() #关闭数据库连接 db_connector.close() ``` **排版说明:** ``` name | 特色 | --------+--------------| 张三 | 肉夹馍 | 李四 | 良好 || 王五 | 一般 || 赵六 | 良好 || 王二麻子 | 优秀 || ```

正文

一、字符串函数

  1、常见MySQL内置字符串函数

    • concat(s1,s2,s3,...):字符串拼接,将s1,s2,s3...等拼接成一个字符串
    • lower(str):将字符串str全部转为小写
    • upper(str):将字符串str全部转为大写
    • lpad(str,n,pad):左填充,将字符串pad对str的左边进行填充,达到n个字符串长度
    • rpad(str,n,pad):右填充,将字符串pad对str的右边进行填充,达到n个字符串长度
    • trim(str):去掉字符串头部和尾部的空格
    • substring(str,start,len):返回字符串str从start位置起的len长度的字符串 

  2、函数示例    

    示例1:concat(s1,s2,s3,...) 函数

mysql> select concat("hello","world");
+-------------------------+
| concat("hello","world") |
+-------------------------+
| helloworld              |
+-------------------------+
1 row in set (0.00 sec)

    示例2:lower(str)> select lower("Hello");

+----------------+
| lower("Hello") |
+----------------+
| hello          |
+----------------+
1 row in set (0.00 sec)

    示例3:upper(str)

mysql> select upper("Hello");
+----------------+
| upper("Hello") |
+----------------+
| HELLO          |
+----------------+
1 row in set (0.00 sec)

    示例4:lpad(str,n,pad)|

    情况一:n小于原始字符串str的长度,只显示原始字符串的长度n的字符 

mysql> select lpad("张三",1,"靓仔");
+---------------------------+
| lpad("张三",1,"靓仔")     |
+---------------------------+
||
+---------------------------+
1 row in set (0.00 sec)

    情况二:当长度n大于str字符串的原始长度,小于拼接后的字符串长度后,显示原来的字符串str+pad继续补齐到n个字符串

mysql> select lpad("张三",3,"靓仔");
+---------------------------+
| lpad("张三",3,"靓仔")     |
+---------------------------+
| 靓张三                    |
+---------------------------+
1 row in set (0.00 sec)

   情况三:如果n大于拼接后的字符串长度,会重复拼接pad字符串

mysql> select lpad("张三",6,"靓仔");
+---------------------------+
| lpad("张三",6,"靓仔")     |
+---------------------------+
| 靓仔靓仔张三              |
+---------------------------+
1 row in set (0.00 sec)

    示例5:rpad(str,n,pad)

mysql> select rpad("张三",1,"靓仔");
+---------------------------+
| rpad("张三",1,"靓仔")     |
+---------------------------+
||
+---------------------------+
1 row in set (0.00 sec)

mysql> select rpad("张三",3,"靓仔");
+---------------------------+
| rpad("张三",3,"靓仔")     |
+---------------------------+
| 张三靓                    |
+---------------------------+
1 row in set (0.00 sec)

mysql> select rpad("张三",6,"靓仔");
+---------------------------+
| rpad("张三",6,"靓仔")     |
+---------------------------+
| 张三靓仔靓仔              |
+---------------------------+
1 row in set (0.00 sec)

    情况处理:同lpad情况

    示例6:trim(str)

mysql> select trim(" Hello world ");
+-----------------------+
| trim(" Hello world ") |
+-----------------------+
| Hello world           |
+-----------------------+
1 row in set (0.00 sec)

    注意:trim只会取出开始和结尾的空格,不会去除中间的空格。

    示例7:substring(str,start,len)

mysql> select substring("hello world", 1, 5);
+--------------------------------+
| substring("hello world", 1, 5) |
+--------------------------------+
| hello                          |
+--------------------------------+
1 row in set (0.00 sec)

    注意:截取字符串的索引从1开始

    示例8:在table_test中对id重新编号,统一显示五位数,不足五位数的前面补0

    原始表test数据

mysql> select * from test;
+------+---------+--------------+-----------+
| id   | stu_num | stu_name     | stu_score |
+------+---------+--------------+-----------+
|    1 | 1       | 张三         | 90        |
|    2 | 2       | 李四         | 87        |
|    3 | 3       | 王五         | 78        |
|    4 | 14      | 赵六         | 83        |
|    5 | 25      | 王二麻子     | 94        |
+------+---------+--------------+-----------+
5 rows in set (0.00 sec)

    修改后的数据

mysql> update test set stu_num = lpad(stu_num,5,'0');
Query OK, 5 rows affected (0.01 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> select * from test;
+------+---------+--------------+-----------+
| id   | stu_num | stu_name     | stu_score |
+------+---------+--------------+-----------+
|    1 | 00001   | 张三         | 90        |
|    2 | 00002   | 李四         | 87        |
|    3 | 00003   | 王五         | 78        |
|    4 | 00014   | 赵六         | 83        |
|    5 | 00025   | 王二麻子     | 94        |
+------+---------+--------------+-----------+
5 rows in set (0.00 sec)

 

二、数值函数

  1、常见数值函数

    • ceil(x):向上取整
    • floor(x):向下取整
    • mod(x,y):返回x/y的模
    • rand():返回0-1内的随机数
    • round(x,y):求参数x的四舍五入的值,保留y位小数

  2、函数示例

    示例1:ceil(x):向上取整

mysql> select ceil(1.1);
+-----------+
| ceil(1.1) |
+-----------+
|         2 |
+-----------+
1 row in set (0.00 sec)

    示例2:floor(x):向下取整

mysql> select floor(1.9);
+------------+
| floor(1.9) |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

    示例3:mod(x,y):返回x/y的模

mysql> select mod(5,2);
+----------+
| mod(5,2) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

    示例4:rand():返回0-1内的随机数

mysql> select rand();
+---------------------+
| rand()              |
+---------------------+
| 0.20385351237268515 |
+---------------------+
1 row in set (0.00 sec)

    示例5:round(x,y):求参数x的四舍五入的值,保留y位小数

mysql> select round(3.1415926,2);
+--------------------+
| round(3.1415926,2) |
+--------------------+
|               3.14 |
+--------------------+
1 row in set (0.00 sec)

    示例6:综合案例:通过数据库函数,生成一个六位数的随机验证码

mysql> select rpad(round(rand()*1000000, 0),6,'0');
+--------------------------------------+
| rpad(round(rand()*1000000, 0),6,'0') |
+--------------------------------------+
| 192803                               |
+--------------------------------------+
1 row in set (0.00 sec)

    说明:

      1、rand()生成的小数,乘以1000000,才有可能是有六位整数的小数,所以这个时候需要市容round()四舍五入取整数

      2、因为rand()生成的小数有可能是0.999999这样的乘以1000000就是6位整数,也有可能生成的小数是0.000009这样的小数就算乘以1000000也不够六位整数

      3、所以还需要使用rpad()函数,如果整数不足六位,就在后面补0

三、日期函数

  1、常见日期函数

    • curdate():返回当前日期
    • curtime():返回当前时间
    • now():返回当前日期和时间
    • year(date):获取指定date的年份
    • month(date):获取指定date的月份
    • day(date):获取指定date的日期
    • date_add(date,interval expr type):返回一个日期/时间值加上一个时间间隔expr后的时间值
    • datediff(date1,date2):返回起始时间date1和结束时间date2之间的天数

  2、函数示例

    示例1:curdate():返回当前日期

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2023-07-18 |
+------------+
1 row in set (0.00 sec)

    示例2:curtime():返回当前时间

mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 21:52:43  |
+-----------+
1 row in set (0.00 sec)

    示例3:now():返回当前日期和时间

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2023-07-18 21:53:10 |
+---------------------+
1 row in set (0.00 sec)

    示例4:year(date):获取指定date的年份

mysql> select year("2023-07-18 21:53:10");
+-----------------------------+
| year("2023-07-18 21:53:10") |
+-----------------------------+
|                        2023 |
+-----------------------------+
1 row in set (0.01 sec)

    示例5:month(date):获取指定date的月份

mysql> select month("2023-07-18 21:53:10");
+------------------------------+
| month("2023-07-18 21:53:10") |
+------------------------------+
|                            7 |
+------------------------------+
1 row in set (0.00 sec)

    示例6:day(date):获取指定date的日期

mysql> select day("2023-07-18 21:53:10");
+----------------------------+
| day("2023-07-18 21:53:10") |
+----------------------------+
|                         18 |
+----------------------------+
1 row in set (0.00 sec)

    示例7:date_add(date,interval expr type):返回一个日期/时间值加上一个时间间隔expr后的时间值

mysql> select date_add("2023-07-18 21:53:10", interval 2 day);
+-------------------------------------------------+
| date_add("2023-07-18 21:53:10", interval 2 day) |
+-------------------------------------------------+
| 2023-07-20 21:53:10                             |
+-------------------------------------------------+
1 row in set (0.01 sec)

mysql> select date_add("2023-07-18 21:53:10", interval 2 month);
+---------------------------------------------------+
| date_add("2023-07-18 21:53:10", interval 2 month) |
+---------------------------------------------------+
| 2023-09-18 21:53:10                               |
+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> select date_add("2023-07-18 21:53:10", interval 2 year);
+--------------------------------------------------+
| date_add("2023-07-18 21:53:10", interval 2 year) |
+--------------------------------------------------+
| 2025-07-18 21:53:10                              |
+--------------------------------------------------+
1 row in set (0.00 sec)

    示例8:datediff(date1,date2):返回起始时间date1和结束时间date2之间的天数

mysql> select datediff("2023-07-18 21:53:10", "2023-07-28 21:53:10");
+--------------------------------------------------------+
| datediff("2023-07-18 21:53:10", "2023-07-28 21:53:10") |
+--------------------------------------------------------+
|                                                    -10 |
+--------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select datediff("2023-07-28 21:53:10", "2023-07-18 21:53:10");
+--------------------------------------------------------+
| datediff("2023-07-28 21:53:10", "2023-07-18 21:53:10") |
+--------------------------------------------------------+
|                                                     10 |
+--------------------------------------------------------+
1 row in set (0.00 sec)

 

四、流程函数

  1、常见流程函数

    • if(value, t, f):如果value为true,则返回t,否则返回f
    • ifnull(value1,value2):如果value1不为空,返回value1,否则返回value2
    • case when [val1] then [res1]...else[default] end:如果val1为true,则返回res1,否则返回default默认值
    • case[expr] when [val1] then [res1]...else[default] end:如果expr的值等于val1,返回res1,否则返回默认值

  2、函数示例

    示例1:if(value, t, f):如果value为true,则返回t,否则返回f

mysql> select if(1>2,"ok","no");
+-------------------+
| if(1>2,"ok","no") |
+-------------------+
| no                |
+-------------------+
1 row in set (0.00 sec)

    示例2:ifnull(value1,value2):如果value1不为空,返回value1,否则返回value2

mysql> select ifnull("ok","default");
+------------------------+
| ifnull("ok","default") |
+------------------------+
| ok                     |
+------------------------+
1 row in set (0.00 sec)

mysql> select ifnull("","default");
+----------------------+
| ifnull("","default") |
+----------------------+
|                      |              注意:空字符串不是null
+----------------------+
1 row in set (0.00 sec)

mysql> select ifnull(null,"default");
+------------------------+
| ifnull(null,"default") |
+------------------------+
| default                |
+------------------------+
1 row in set (0.00 sec)

    示例3:case  [expr] when [val1] then [res1]...else[default] end:如果val1为true,则返回res1,否则返回default默认值

    需求:在table_test中,展示姓名和特色一栏,特色根据address的值来设定,北京特色烤鸭,上海特色蟹黄包,西安特色肉夹馍,其他地方都是红烧肉

    table_test表原始数据

mysql> select * from table_test;
+------+--------+------+---------+
| id   | name   | age  | address |
+------+--------+------+---------+
|    1 | 刘一   |   18 | 西安    |
|    2 | 陈二   |   19 | 上海    |
|    3 | 张三   |   21 | 北京    |
|    4 | 李四   |   18 | 北京    |
|    5 | 王五   |   21 | 西安    |
|    6 | 赵六   |   22 | NULL    |
+------+--------+------+---------+
6 rows in set (0.00 sec)
mysql> select name ,(case address when "北京" then "烤鸭" when "上海" then "蟹黄包" when "西安" then "肉夹馍" else "红烧肉" end) as "特色" from table_test;
+--------+--------------+
| name   | 特色         |
+--------+--------------+
| 刘一   | 肉夹馍       |
| 陈二   | 蟹黄包       |
| 张三   | 烤鸭         |
| 李四   | 烤鸭         |
| 王五   | 肉夹馍       |
| 赵六   | 红烧肉       |
+--------+--------------+
6 rows in set (0.00 sec)

 

    示例4:需求:在学生成绩表中,根据成绩展示优秀,良好一般。

    学生成绩表(test)原始数据

mysql> select * from test;
+------+---------+--------------+-----------+
| id   | stu_num | stu_name     | stu_score |
+------+---------+--------------+-----------+
|    1 | 00001   | 张三         | 90        |
|    2 | 00002   | 李四         | 87        |
|    3 | 00003   | 王五         | 78        |
|    4 | 00014   | 赵六         | 83        |
|    5 | 00025   | 王二麻子     | 94        |
+------+---------+--------------+-----------+
5 rows in set (0.00 sec)
mysql> select stu_name, (case when stu_score>=90 then "优秀" when stu_score >=80 then "良好" when stu_score >=70 then
"一般" when stu_score >=60 then "及格" else "不及格" end) as "成绩" from test;
+--------------+--------+
| stu_name     | 成绩   |
+--------------+--------+
| 张三         | 优秀   |
| 李四         | 良好   |
| 王五         | 一般   |
| 赵六         | 良好   |
| 王二麻子     | 优秀   |
+--------------+--------+
5 rows in set (0.00 sec)

 

与MySQL基础6-常用数据库函数相似的内容:

MySQL基础6-常用数据库函数

一、字符串函数 1、常见MySQL内置字符串函数 concat(s1,s2,s3,...):字符串拼接,将s1,s2,s3...等拼接成一个字符串 lower(str):将字符串str全部转为小写 upper(str):将字符串str全部转为大写 lpad(str,n,pad):左填充,将字符串pa

【升职加薪秘籍】我在服务监控方面的实践(6)-业务维度的mysql监控

>大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接下来这段时间我将在之前内容的基础上,结合自己在公司生产上构建监控系统的经验,详细的展示如何对线上服

[转帖]在 TiDB 中正确使用索引,性能提升 666 倍

https://tidb.net/book/tidb-monthly/2022/2022-04/usercase/index-666 背景​ 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行。 这个规模不算

[转帖]实测:云RDS MySQL性能是自建的1.6倍

https://www.cnblogs.com/zhoujinyi/p/16392223.html 1. 摘要 基于之前写的「云厂商 RDS MySQL 怎么选」的文章,为了进一步了解各云厂商在RDS MySQL数据库性能上的差异,本文将对自建MySQL、阿里云、腾讯云、华为云和AWS 的 RDS

[转帖]mysql中innodb创建表的一些限制

https://www.cnblogs.com/jackssybin/p/16258953.html 1、 背景 在新创建mysql数据表的时候。不太确定表能创建多少个字段,多少个索引。索引多少有限制么?mysql的数据是怎么存储的存在在哪里。 2、基本个数限制 在MySQL5.6.9以后的版本,一

MySQL基础7-约束

一、约束的基本概念 1、概念:约束是作用于表中字段上的规则,用于限制储存在表中的数据 2、目的:保证数据库中的数据的正确性,有效性和完整性 3、分类 非空约束(not null):限制该字段的数据不能为null 唯一约束(unique):保证该字段的所有数据都是唯一,不重复的 主键约束(primar

MySQL基础8-多表查询

一、多表关系 一对多或者多对一 案例:部门与员工的关系 关系:一个部门对应多个员工,一个员工对应一个部门(不考虑跨部门的特殊情况) 实现:在多的一方建立外键,指向一的一方的主键,这里员工表是多的的一方,部门表是一的一方 多对多 案例:学生与课程的关系 关系:一个学生可以选修多门课程,一门课程也可以供

MySQL基础9-事务基础

一、事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败。mysql的事务默认是自动提交的,也就是说,当执行一条DML语句,Mysql会立即隐式的提交事务 二、事务操作 2.1 查看事务提交方式

MySQL基础4-数据查询

一、DQL介绍 DQL全称:Data Query Language(数据查询语言),用来查询数据库中表的记录。 关键字:select 二、DQL语法 select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序

MySQL基础5-用户及权限管理

一、介绍 DCL:Data Control Language(数据控制语言),用来管理数据库用户,控制数据库的访问,权限。 二、用户管理 1、查询用户 语法: 1、use MySQL; 2、select * from user; 默认只有四个账户。 2、创建用户 语法:create user '用户