vlambda博客
学习文章列表

保姆级详细教程,带你学会MySQL函数!(下)

- 点击上方 “中国统计网” 设置⭐星标不迷路!-


前篇→


其它常用系统函数


保姆级详细教程,带你学会MySQL函数!(下)


流程控制函数


1.if函数:实现if-else的效果


保姆级详细教程,带你学会MySQL函数!(下)


2.ifnull函数:判断值是否为null,是null用指定值填充


保姆级详细教程,带你学会MySQL函数!(下)


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


case ... when共有三种用法,我相信自己的总结会相当全面。希望大家一定要好好研究这几种用法,都是很有用的。


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

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

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


case ... when用作等值判断的语法格式;


case 要判断的字段或表达式when 常量1 then 要显示的值1或语句1when 常量2 then 要显示的值2或语句2...else 要显示的值n或语句nend


操作如下:


保姆级详细教程,带你学会MySQL函数!(下)


case ... when用作区间判断的语法格式;


case when 条件1 then 要显示的值1或语句1when 条件2 then 要显示的值2或语句2...else 要显示的值n或语句nend


操作如下:


保姆级详细教程,带你学会MySQL函数!(下)


 case...when与聚合函数的联用;


保姆级详细教程,带你学会MySQL函数!(下)


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


 -- 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.cgroup by sc.c;


结果如下:


保姆级详细教程,带你学会MySQL函数!(下)


聚合函数


1.聚合函数的功能和分类;


聚合函数的功能;


用作统计使用,又称为聚合函数或统计函数或组函数。


聚合函数的分类:

  • sum 求和

  • avg 平均值

  • max 最大值

  • min 最小值

  • count 计算个数


2.聚合函数的简单使用


保姆级详细教程,带你学会MySQL函数!(下)


3.五个聚合函数中传入的参数,所支持的数据类型有哪些?


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


测试数据;


"建表语句"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 ("Zoo",6500,'1993.3.20'), ("Hobby",4000,'1997.6.10'), ("Aline",5500,'2000.5.1'), ("Bob",10000,'2008.10.1');


sum()函数和avg()函数:传入整型/小数类型才有意义;


保姆级详细教程,带你学会MySQL函数!(下)


结论如下:

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


max()函数和min()函数:传入整型/小数类型、日期/时间类型意义较大;


保姆级详细教程,带你学会MySQL函数!(下)


结论如下:

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

  • max()和min()中传入的是"日期类型",max()计算的最大值是离我们最近的那个日期,min()计算的最小值是离我们最远的那个日期,这个可以记一下。

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


count()函数:可以传入任何数据类型,但是碰到null要注意;


保姆级详细教程,带你学会MySQL函数!(下)


结论如下:


 count()函数可以传入任何数据类型,表示对行计数。 "但是下面的知识点需要特别注意的" 首先看看【count(sal),count(birth)】这两句表示的是什么意思?这两句分别表示的是对sal列字段、birth列字段的行数,进行统计。由于其中有一条记录是null值,因此使用count()函数计数的时候,会忽略掉null行。 其次,对于count(*)表示的是统计【整个表】有多少行,这个肯定是对原始数据的行数的正确统计,只要整张表某一行有一个列字段的值不是null,count(*)就会认为该行为1行。当然要是一整行都是null值,你也没必要插入这条记录。 总结: 当某个字段列中没有null值,则"count(列字段)=count(*)。" 当某个字段列中有null值,则"count(列字段)<count(*)。" 因此,假如你想统计的是整张表的行数,请用count(*)。


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


count()函数碰到null值需要特别注意;


保姆级详细教程,带你学会MySQL函数!(下)


结论如下:


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


count(1),count(0)表示的是啥意思呢?


无论是sum(1),sum(0),count(1),count(0),avg(1),avg(0),原理都是一样的,相当于在原表中新增一列。
其次,我们知道where后面接的是【逻辑值】,当使用where 1where 0原理也还是一样,也相当于在原表中新增一列。
我们只需要记住在mysql中:"非0即为true,0为false"。也就是说,下面的所有是1的地方,你可以换成任何非0数字,都是可以的。


原理图如下:


保姆级详细教程,带你学会MySQL函数!(下)


测试一下:


保姆级详细教程,带你学会MySQL函数!(下)


count(*)计数的效率问题:

  • MYISAM存储引擎下,count(*)的效率高。

  • INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)效率要高一些。

  • 综上所述:优先使用count(*).


4.聚合函数和group by的联合使用最重要


当SQL语句中使用了group by分组函数后,select后面的字段必须是group by后面的字段 + 聚合函数的使用。


End.
作者:黄伟呢
来源:数据分析与统计学之美
本文已和作者授权,如需转载请与作者联系




往期小编推荐  

点击标题即可阅读👇👇


项目分享丨

干货技巧丨

理论知识丨


保姆级详细教程,带你学会MySQL函数!(下)
保姆级详细教程,带你学会MySQL函数!(下)
 点分享 
 点点赞 
点在看