三、MySQL——函数类型

目录

1、字符串函数

2、数值函数

3、日期函数

4、流程函数


窗口函数  是指一段可以直接被另一段程序调用的程序或代码。  也就意味着,这一段程序或代码在MySQL已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。  那么,函数到底在哪儿使用呢?

我们先来看两个场景:

                                                   

  1. 在企业的OA或其他的人力系统中,经常会提供的有这样一个功能,每一个员工登录上来之后都能够看到当前员工入职的天数。  而在数据库中,存储的都是入职日期,如  2000-11-12,那如果快速计算出天数呢?
  2. 在做报表这类的业务需求中,我们要展示出学员的分数等级分布。而在数据库中,存储的是学生的分数值,如98/75,如何快速判定分数的等级呢?

其实,上述的这一类的需求呢,我们通过MySQL中的函数都可以很方便的实现  。

MySQL中的函数主要分为以下四类:  字符串函数、数值函数、日期函数、流程函数。

1、字符串函数

MySQL中内置了很多字符串函数,常用的几个如下:

函数

功能

CONCAT(S1,S2,...Sn)

字符串拼接,将S1S2... Sn拼接成一个字符串

LOWER(str)

将字符串str全部转为小写

UPPER(str)

将字符串str全部转为大写

LPAD(str,n,pad)

左填充,用字符串padstr的左边进行填充,达到n个字符串长度

RPAD(str,n,pad)

右填充,用字符串padstr的右边进行填充,达到n个字符串长度

TRIM(str)

去掉字符串头部和尾部的空格

SUBSTRING(str,start,len)

返回从字符串strstart位置起的len个长度的字符串

演示如下:

1、concat : 字符串拼接

1   select concat('Hello' , ' MySQL');

  2、lower : 全部转小写

1   select lower('Hello');

 

3、upper : 全部转大写

1   select upper('Hello');

4、lpad : 左填充

1   select lpad('01', 5, '-');

5、rpad : 右填充

1   select rpad('01', 5, '-');

 

6、trim : 去除空格

1   select trim(' Hello MySQL ');

 

7、substring : 截取子字符串

1   select substring('Hello MySQL',1,5);

案例:

 

由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:  1号员工的工号应该为00001

1    update emp set workno = lpad(workno, 5, '0');

 

处理完毕后, 具体的数据为:

 

​​​​​​​2、数值函数

常见的数值函数如下:

函数

功能

CEIL(x)

向上取整

FLOOR(x)

向下取整

MOD(x,y)

返回x/y的模

RAND()

返回0~1内的随机数

ROUND(x,y)

求参数x的四舍五入的值,保留y位小数

演示如下:

1、ceil:向上取整

1   select ceil(1.1);

 

2、floor:向下取整

1   select floor(1.9);

 

3、mod:取模

1   select mod(7,4);

 

4、rand:获取随机数

1   select rand();

 

5、round:四舍五入

1   select round(2.344,2);

 

案例:

通过数据库的函数,生成一个六位数的随机验证码。

思路:  获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0

1   select lpad(round(rand()*1000000 , 0), 6, '0');

 

​​​​​​​3、日期函数

常见的日期函数如下:

函数

功能

CURDATE()

返回当前日期

CURTIME()

返回当前时间

NOW()

返回当前日期和时间

YEAR(date)

获取指定date的年份

MONTH(date)

获取指定date的月份

DAY(date)

获取指定date的日期

DATE_ADD(date, INTERVAL expr type)

返回一个日期/时间值加上一个时间间隔expr后的时间值

DATEDIFF(date1,date2)

返回起始时间date1 和 结束时间date2之间的天数

演示如下:

1、curdate:当前日期

1   select curdate();

2、curtime:当前时间

1   select curtime();

 

3、now:当前日期和时间

1   select now();

 

4、YEAR , MONTH , DAY:当前年、月、日

  1. select YEAR(now());

  1. select MONTH(now());

  1. select DAY(now());
 

5、date_add:增加指定的时间间隔

1   select date_add(now(), INTERVAL 70 YEAR );

6、datediff:获取两个日期相差的天数

1   select datediff('2021-10-01', '2021-12-01');

 

案例:

查询所有员工的入职天数,并根据入职天数倒序排序。

思路:  入职天数,就是通过当前日期  - 入职日期,所以需要使用datediff函数来完成。

1   select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by

entrydays desc;

 

​​​​​​​4、流程函数

流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。

函数

功能

IF(value , t , f)

如果valuetrue,则返回t,否则返回

f

IFNULL(value1 , value2)

如果value1不为空,返回value1,否则返回value2

CASE WHEN [ val1 ] THEN [res1] ...

ELSE [ default ] END

如果val1true,返回res1... 否则返回default默认值

CASE [ expr ] WHEN [ val1 ] THEN

[res1] ... ELSE [ default ] END

如果expr的值等于val1,返回

res1... 否则返回default默认值

演示如下:

1、if

1   select if(false, 'Ok', 'Error');

2、ifnull

1   select ifnull('Ok','Default'); 

3   select ifnull('','Default'); 

5   select ifnull(null,'Default');

 

3、case when then else end

需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)

1   selec

        name,

  ( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址'

from emp;

​​​​​​​ 

案例:

 1、 create table score(

        id int comment 'ID',

        name varchar(20) comment '姓名',

        math int comment '数学',

        english int comment '英语',

        chinese int comment '语文'

         comment '学员成绩表';

2、insert into score(id, name, math, english, chinese) VALUES (1, 'Tom', 67, 88, 95), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);

 

具体的SQL语句如下:

1   select

        id,

        name,

        (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ) '数学',

        (case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ) '英语',

        (case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格'end ) '语文'

         from score;

MySQL的常见函数我们学习完了,那接下来,我们就来分析一下,在前面讲到的两个函数的案例场景,思考一下需要用到什么样的函数来实现?

  1. 数据库中,存储的是入职日期,如  2000-01-01,如何快速计算出入职天数呢?-------------- >

答案: datediff

  1. 数据库中,存储的是学生的分数值,如9875,如何快速判定分数的等级呢?------------------------ >

答案: case ... when ...

<think>好的,我现在需要帮助用户了解MySQL中的函数使用说明和示例。首先,用户提到了聚合函数、INSERT INTO ... ON DUPLICATE KEY UPDATE语法以及去重distinct方法。根据提供的引用内容,我应该围绕这些部分展开回答。 首先,聚合函数是用户明确提到的,引用[1]详细介绍了聚合函数,包括常见的COUNT、SUM、AVG、MAX、MIN。我需要列出这些函数,给出每个的语法和示例,比如计算总行数、求和、平均值等。同时,注意用户可能还关心分组,所以GROUP BY和HAVING子句也需要提到,并提供示例说明。 接下来是INSERT INTO ... ON DUPLICATE KEY UPDATE,引用[2]提到了这个语法。这里需要解释它的作用:插入数据时处理重复键冲突。需要给出一个示例,比如插入用户数据,当主键或唯一索引冲突时更新部分字段。同时,注意说明在发生冲突时如何更新字段,以及如何获取受影响的行数。 然后是去重方法,引用[3]讨论了DISTINCT关键字的使用。应该解释DISTINCT在SELECT中的用途,比如获取唯一值,并给出示例,如查询不重复的部门。另外,可能需要提到DISTINCT在聚合函数中的应用,比如COUNT(DISTINCT column),以及结合GROUP BY的使用场景,比如统计每个部门的员工数。 接下来要考虑用户可能的需求。用户可能想了解函数的基本用法,所以每个部分都要有清晰的语法结构和示例。同时,用户可能对性能或注意事项有疑问,比如聚合函数对NULL的处理,DISTINCT对查询性能的影响,或者ON DUPLICATE KEY UPDATE如何选择更新的字段。因此,在回答中加入这些注意事项会更有帮助。 另外,需要确保回答结构清晰,分点说明,每个函数或语法点都有对应的示例代码块,这样用户更容易理解。还要检查是否符合LaTeX格式要求,比如行内公式使用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,更多是SQL语句,所以可能不需要太多公式,但如果有涉及数值计算的地方需要注意格式。 最后,生成相关问题,这些问题应该围绕用户可能进一步想知道的内容,比如如何优化聚合查询、处理插入冲突的其他方法、去重与性能的权衡等。需要确保问题覆盖用户可能感兴趣的扩展话题。 现在需要把这些内容组织成结构化的回答,确保每个部分都有明确的标题,语法说明,示例代码,以及注意事项。同时,引用标注要正确,比如在提到聚合函数时添加[^1],在INSERT语法处添加[^2],在去重部分添加[^3]。 可能还需要检查是否有遗漏的重要函数,比如字符串函数或日期函数,但根据用户提供的引用,主要关注聚合函数、插入更新语法和去重方法。如果用户想了解更多函数类型,可以在相关问题中提及,但当前回答应集中在提供的引用内容上。 总结回答结构: 1. 聚合函数部分:列出常用函数,每个函数的说明、语法、示例。 2. 插入与更新语法:说明用途,示例,注意事项。 3. 去重方法:DISTINCT的使用,示例,与聚合函数结合使用的情况。 4. 注意事项:处理NULL、性能影响等。 5. 相关问题:生成3个相关问题,帮助用户深入探索。</think>### MySQL 函数使用说明与示例 #### 一、聚合函数 聚合函数用于对多行数据进行计算并返回单个结果,常用于数据分析和统计。 1. **`COUNT()`** - **功能**:统计行数(可含条件)。 - **语法**: ```sql SELECT COUNT(column_name) FROM table_name WHERE condition; ``` - **示例**: 统计员工表中工资大于5000的人数: ```sql SELECT COUNT(*) FROM employees WHERE salary > 5000; ``` 2. **`SUM()`** - **功能**:计算数值列的总和。 - **语法**: ```sql SELECT SUM(column_name) FROM table_name; ``` - **示例**: 计算订单总金额: ```sql SELECT SUM(amount) FROM orders; ``` 3. **`AVG()`** - **功能**:计算数值列的平均值。 - **语法**: ```sql SELECT AVG(column_name) FROM table_name; ``` - **示例**: 统计员工平均工资: ```sql SELECT AVG(salary) FROM employees; ``` 4. **`MAX()/MIN()`** - **功能**:返回列的最大值/最小值。 - **示例**: 查询最高和最低工资: ```sql SELECT MAX(salary), MIN(salary) FROM employees; ``` 5. **分组统计** 结合 `GROUP BY` 和 `HAVING` 实现分组筛选: ```sql SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 8000; ``` --- #### 二、插入与更新冲突处理 使用 `INSERT INTO ... ON DUPLICATE KEY UPDATE` 插入数据时自动处理主键或唯一索引冲突[^2]。 - **语法**: ```sql INSERT INTO table (column1, column2) VALUES (value1, value2) ON DUPLICATE KEY UPDATE column1 = new_value1; ``` - **示例**: 插入用户数据,若 `id` 冲突则更新姓名: ```sql INSERT INTO users (id, name, age) VALUES (1, 'Alice', 30) ON DUPLICATE KEY UPDATE name = 'Alice', age = 30; ``` - **说明**: - 若插入导致主键或唯一索引冲突,则执行 `UPDATE` 部分。 - 返回值:1(插入成功)或 2(更新成功)[^2]。 --- #### 、去重操作 使用 `DISTINCT` 关键字过滤重复值。 1. **基本去重** - **示例**:查询所有不重复的部门名称: ```sql SELECT DISTINCT department FROM employees; ``` 2. **结合聚合函数** - **示例**:统计不同部门的数量: ```sql SELECT COUNT(DISTINCT department) FROM employees; ``` 3. **多列去重** - **示例**:查询员工姓名和部门的唯一组合: ```sql SELECT DISTINCT name, department FROM employees; ``` --- #### 四、注意事项 1. 聚合函数默认忽略 `NULL` 值(`COUNT(*)` 除外)。 2. `DISTINCT` 可能影响查询性能,需谨慎用于大数据表。 3. `ON DUPLICATE KEY UPDATE` 需明确指定更新字段,避免数据覆盖错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值