我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL之函数

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL之函数

MySQL之函数

关于函数的说明

  • 概念:类似python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名

  • 好处:

    • 隐藏了实现细节
    • 提高代码的重用性
  • 调用:select 函数名(实参列表) [from 表]

  • 分类:

    • 单行函数:作用于表中的每一行记录,一条记录出来一个结果
      • 字符函数
      • 数学函数
      • 日期函数
      • 其他函数
      • 流程控制函数
    • 聚合函数:作用于一行或者多行,最终返回一个结果,用作统计使用
      • sum 求和
      • avg 平均值
      • max 最大值
      • min 最小值
      • count 计算个数

字符函数

length(str)

  • 获取参数值的字节个数
    • 对于utf8字符集来说,一个英文占1个字节;一个中文占3个字节
    • 对于gbk字符集来说,一个英文占1个字节;一个中文占2个字节

concat(str1,str2,...)

  • 拼接字符串

upper(str)

  • 将字符中的所有字母变为大写

lower(str)

  • 将字符中所有字母变为小

substr(str,start,len)

  • 从start3位置开始截取字符串,len表示要截取的长度
    • 没有指定len长度:表示从start开始起,截取到字符串末尾。
    • 指定了len长度:表示从start开始起,截取len个长度。

instr(str,要查找的子串)

  • 返回子串第一次出现的索引,如果找不到,返回0
    • 当查找的子串存在于字符串中:返回该子串在字符串中【第一次】出现的索引。
    • 当查找的子串不在字符串中:返回0。

trim(str)

  • 去掉字符串前后的空格
    • 该函数只能去掉字符串前后的空格,不能去掉字符串中间的空格。

lpad(str,len,填充字符)

  • 用指定的字符,实现对字符串左填充指定长度

rpad(str,len,填充字符)

  • 用指定的字符,实现对字符串右填充指定长度

replace(str,子串,另一个字符串)

  • 将字符串str中的字串,替换为另一个字符串

数学函数

round(x,[保留的位数])

  • 四舍五入
    • 当对正数进行四舍五入:按照正常的计算方式,四舍五入即可。
    • 当对负数进行四舍五入:先把符号丢到一边,对去掉负号后的正数进行四舍五入,完成以后,再把这个负号,补上即可。

ceil(x)

  • 向上取整,返回>=该参数的最小整数,又称为天花板函数
  • 天花板函数:在excel,python中均存在这个函数。你就想象一下你家的天花板,把这个数字丢到天花板上,求的是大于等于这个数字的最小整数

floor(x)

  • 向下取整,返回<=该参数的最大整数。又称为地板函数
  • 地板函数:在excel,python中均存在这个函数。你就想象一下你家的地板,把这个数字丢到地板上,求的是小于等于这个数字的最大整数

truncate(x,D)

  • 截断:也是在excel,python中均存在,含义基本都是一致的。

理解如下:

"参考下面的示例图,体会如下文字"

  • D是正数,操作的是小数点右侧的小数部分。

    • D=1,直接从第1个位置处,砍掉后面的部分。
    • D=2,直接从第2个位置处,砍掉后面的部分。
    • ......
  • D是0,直接去掉小数部分。

  • D是负数,操作的是小数点左侧的整数部分。

    • D=-1,直接从-1位置处,先砍掉后面的小数部分,并且"从当前位置起(包括当前位置),后面整数部分替换为0"。
    • D=-2,直接从-2位置处,先砍掉后面的小数部分,并且"从当前位置起(包括当前位置),后面整数部分替换为0"。
    • ……

示例图:

操作如下:

mod(被除数,除数)

  • 取余
    • 当被除数为正数,结果就是正数。
    • 当被除数为负数,结果就是负数。

操作如下:

日期时间函数

  • 日期的含义:指的是我们常说的年、月、日。
  • 时间的含义:指的是我们常说的时、分、秒。

在讲述下面函数之前,我们先补充一个知识,不同时间格式符表示什么含义呢?

now()

  • 返回系统当前的日期和时间

操作如下:

curdate()

  • 只返回系统当前的日期,不包含时间

操作如下:

curtime()

  • 只返回系统当前的时间,不包含日期

操作如下:

获取日期和时间中年、月、日、时、分、秒;

  • 获取年份:year(),例如:select year(now()),返回系统当前的日期和时间中的年份。
  • 获取月份:month(),例如:select month(now()),返回系统当前的日期和时间中的月份。
  • 获取日期:day(),例如:select day(now()),返回系统当前的日期和时间中的日期。
  • 获取小时:hour(),例如:select hour(now()),返回系统当前的日期和时间中的小时。
  • 获取分钟:minute(),例如:select minute(now()),返回系统当前的日期和时间中的分钟。
  • 获取秒数:second(),例如:select second(now()),返回系统当前的日期和时间中的秒数。

weekofyear()

  • 获取当前时刻所属的周数

操作如下:

quarter()

  • 获取当前时刻所属的季度

操作如下:

str_to_date()

  • 将日期格式的字符串,转换成指定格式的日期

操作如下:

date_format()

  • 将日期转换成日期字符串
    • %Y-%m-%d返回的月份是01,02...这样的格式。
    • %Y-%c-%d返回的月份是1,2...这样的格式。

操作如下:

date_add() + interval

  • 向前、向后偏移日期和时间

操作如下:

last_day()

  • 提取某个月最后一天的日期

操作如下:

datediff(end_date,start_date)

  • 计算两个时间相差的天数

操作如下:

timestampdiff(unit,start_date,end_date)

  • 计算两个时间返回的年/月/天数

  • unit参数是确定(start_date,end_date)结果的单位,表示为整数,以下是有效单位:

    • year:年份
    • month:月份
    • day:天
    • hour:小时
    • minute: 分钟
    • second:秒
    • microsecond:微秒
    • week:周数
    • quarter:季度

操作如下:

流程控制函数

if函数

  • 实现if-else的效果

ifnull函数

  • 判断值是否为null,是null用指定值填充

case...when函数的三种用法

case ... when共有三种用法。

有如下数据:

① 等值判断:类似于java中switch case的效果

-- case ... when用作等值判断的语法格式
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句
end

操作如下:

② 区间判断:类似于python中if-elif-else的效果

-- case ... when用作区间判断的语法格式
case 
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end 

操作如下:

③ case ... when和聚合函数联用

利用上述原始表,完成如下问题:

-- 18、查询各科成绩最高分、最低分和平均分,以如下形式显示:
-- 课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
-- 及格为:>=60,中等为:70-80,优良为:80-90,优秀为:>=90

操作如下:

select sc.c,cname,
max(score) 最高分,min(score) 最低分,avg(score) 平均分,
sum(case when score>60 then 1 else 0 end)/count(*) 及格率,
sum(case when score>=70 and score<80 then 1 else 0 end)/count(*) 中等率,
sum(case when score>=80 and score<90 then 1 else 0 end)/count(*) 优良率,
sum(case when score>=90 then 1 else 0 end)/count(*) 优秀率
from sc left join course 
on sc.c = course.c
group by sc.c;

结果如下:

测试数据:

-- 建表语句
create table test(
id int primary key auto_increment,
name varchar(20) not null,
sal int,
birth date)charset=utf8;

-- 插入数据
insert into test(name,sal,birth) values 
("pure",6500,"1996.11.20"),
("Hobby",4000,"1997.6.10"),
("Aline",5500,"2000.5.1"),
("Bob",10000,"2008.10.1");

聚合函数的简单使用

select * from test;

select count(*) 统计行数,
sum(sal) 求和, avg(sal) 平均值,
max(sal) 最大值, min(sal) 最小值
from test;

执行结果:

聚合函数中传入的参数,所支持的数据类型

mysql不是强类型的编程语言。也就是说,有些语句执行结果可能不报错,但是执行结果无实际意义,因此,我们也认为是不正确的。

sum()和avg()

结论如下:

  • sum()函数和avg()函数对于字符串类型、日期/时间类型的计算都没有太大意义。因此,sum()函数和avg()函数,我们只用来对小数类型和整型进行求和。

max()和min()

结论如下:

  • max()min()中传入的是"整型/小数类型",计算的是数值的最大值最小值

  • max()min()中传入的是"日期类型",max()计算的最大值是离我们最近的那个日期,min()计算的最小值是离我们最远的那个日期

  • max()min()中传入的是字符串类型max()计算的最大值是按照英文字母顺序显示的,min()计算的最小值也是按照英文字母顺序显示的,意义不太大

count()

插入一条数据

insert into test(name) values("LiLei");

结论如下:

  • count()函数可以传入任何数据类型,表示对行计数。

  • 但是下面的知识点需要特别注意的

  • 首先看看count(sal),count(birth)这两句表示的是什么意思?这两句分别表示的是
    对sal列字段、birth列字段的行数,进行统计。由于其中有一条记录是null值,因此使用count()
    函数计数的时候,会忽略掉null行。

  • 其次,对于count(*)表示的是统计【整个表】有多少行,这个肯定是对原始数据的行数的正确
    统计,只要整张表某一行有一个列字段的值不是nullcount(*)就会认为该行为1行。当然要是一
    整行都是null值,你也没必要插入这条记录。

总结:当某个字段列中没有null值,则count(列字段)=count(*)
当某个字段列中有null值,则count(列字段)。 因此,假如你想统计的是整张表的行数,请用count(*)

其实所有的分组函数都忽略null值的,但上面那个count()函数碰到null值要特别注意。

结论如下:

  • 对于avg(sal)求平均值来说,(6500+4000+5500+10000)/4=6500。对于后面这个
    sum()/count(*)求平均值来说,(6500+4000+5500+10000)/5=5200。
  • 好好体会上述例子,有时候某人成绩虽然记录的是null,但是你仍然有5个人存在,所
    以你要考虑一下怎么使用合适的函数,达到你想要的结果。

count(1),count(0),count(*),count(列名)的区别

count(0),count(1),count(*)不会过滤空值

count(列名)会过滤空值

无论是sum(1),sum(0),count(1),count(0),avg(1),avg(0),原理都是一样的,
相当于在原表中新增一列。

其次,我们知道where后面接的是逻辑值,当使用where 1where 0原理也还是
一样,也相当于在原表中新增一列。

我们只需要记住在mysql中:非0即为true,0为false。也就是说,下面的所有是
1的地方,你可以换成任何非0数字,都是可以的。

count(1),count(0)原理图如下:

测试结果:

count(*),count(1)计数的效率问题

  • MYISAM存储引擎下,count(*)的效率高。
  • INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)效率要高一些。
  • 综上所述:优先使用count(*)。

聚合函数和group by的联合使用

关于这个知识点,我们将会在后面的知识点中进行讲述。在这里我们只需要记住一句话:当SQL语句中使用了group by分组函数后,select后面的字段必须是group by后面的字段 + 聚合函数的使用。

其它常用系统函数

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL之函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL之函数

关于函数的说明概念:类似python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名好处:隐藏了实现细节提高代码的重用性调用:select 函数名(实参列表) [from 表]分类:单行函数:作用于表中的每一行记录,一条记录出来一个结果字符函数数学函数日
MySQL之函数
2018-12-21

MySQL函数之初见

MySQL函数基本语法函数申明要声明返回类型,用returns指定。函数体中要有返回语句,return 返回值。函数执行有别与存储过程执行,不需要Call关键字。定义一个返回时间和uuid拼接字符串的函数-- 创建函数CREATE FUNCTION my_fu
2018-03-26

MySQL基础教程12 —— 函数之其他函数

1. 位函数 对于比特运算,MySQL 使用 BIGINT (64比特) 算法,因此这些操作符的最大范围是 64 比特。|Bitwise OR: mysql> SELECT 29 | 15; -> 31 其结果为一个64比特无符号整数。&B
2022-05-17

Mysql计算字段长度函数之CHAR_LENGTH函数

目录语法结构示例案例:对过长的昵称进行截取处理问题:附:CHAR_LENGTH()和LENGTH()的区别总结CHAR_LENGTH函数用于返回字符串的长度,长度单位为字符不管汉字,数字或是字母都算是一个字符,包括中英文标点符号,空格也算
2023-05-19

Mysql计算字段长度函数之LENGTH函数

目录语法结构示例案例应用场景总结LENGTH函数用于返回字符串的字节长度,长度单位为字节使用uft8编码字符集时,一个汉字是3个字节,一个数字或字母是一个字节与CHAR_LENGTH函数的区别CHAR_LENGTH函数用于返回字符串的
2023-05-19

MySQL基础教程7 —— 函数之字符串函数

假如结果的长度大于 max_allowed_packet 系统变量的最大值时,字符串值函数的返回值为NULL。 对于在字符串位置操作的函数,第一个位置的编号为 1。ASCII(str)返回值为字符串str 的最左字符的数值。假如str为空字
2022-06-01

MySQL函数和游标之初见

MySQL函数基本语法函数申明要声明返回类型,用returns指定。函数体中要有返回语句,return 返回值。函数执行有别与存储过程执行,不需要Call关键字。定义一个返回时间和uuid拼接字符串的函数-- 创建函数CREATE FUNCTION my_fu
MySQL函数和游标之初见
2019-11-26

MySQL数据库之内置函数和自定义函数 function

目录1、内置函数1.1、字符串函数1.2、时间函数1.3、数学函数1.4、其他函数2、自定义函数2.1、创建函数2.2、查看函数2.3、调用函数2.4、删除函数2.5、注意事项3、函数流程结构案例前言:函数分为两类:系统函数和自定义函数
2022-06-15

MySQL基础教程6 —— 函数之控制流程函数

语法:CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END CASE WHEN [condi
2022-05-20

Mysql之如何创建函数问题

目录mysql如何创建函数Mysql无法创建函数 错误码 1418解决方式总结Mysql如何创建函数DELIMITER $$DROP FUNCTION IF EXISTS genPerson$$CREATE FUNCTION genP
2023-03-10

MySQL基础教程11 —— 函数之Cast函数和操作符

BINARYBINARY操作符将后面的字符串抛给一个二进制字符串。这是一种简单的方式来促使逐字节而不是逐字符的进行列比较。这使得比较区分大小写,即使该列不被定义为 BINARY或 BLOB。BINARY也会产生结尾空白,从而更加显眼。 my
2022-05-27

MySQL基础教程9 —— 函数之日期和时间函数

下面的例子使用了时间函数。以下询问选择了最近的 30天内所有带有date_col 值的记录: mysql> SELECT something FROM tbl_name -> WHERE DATE_SUB(CURDATE(),INTERVA
2022-05-15

编程热搜

目录