大家好,我是jacky朱元禄,很高兴继续跟大家分享《MySQL数据分析实战》,本小节,jacky会跟朋友们分享单表操作8句箴言的后四句:就是:别拿SQL 做分析,关公面前耍大刀;要想分析怎么办,编程语言是主力,SQL函数茫茫多,真的不能用太多,筛选透视是基础,分组聚合要牢记。
前面我们分享了8句箴言的前四句,也就是SQL数据预处理和SQL数据清洗,后四句呢,说的就是SQL数据分析,SQL数据分析大致说的就是两个方面内容:第一个方面就是SQL函数的问题,第二个方面就是分组聚合的问题。
那下面我们先来说SQL函数,我们记下笔记
为了说清楚 SQL 语法中的函数问题,我们先说一下数学中的函数。有朋友会问,为什么说数学中的函数,这个跟咱们SQL语法中的函数关系大吗?再说我们初中就知道函数了,这有什么好说的呢?那 jacky 说,要理解SQL语法中函数,真的还要明白数学中函数是什么意思,我们学生时代学了这个多年的数学,你还真的就没学明白函数的定义。
我们先看一下数学中函数的定义是什么意思。
那函数到底是个啥呢?
函数这个词是因为翻译过来的,是我国清代数学家李善兰(1859年)在翻译《代数学》一书时,把“function”译成“函数”的。但我个人认为这样翻译是不妥的,如此晦涩的翻译直接导致数学在中国很难普及。我个人的做了若干年的数据建模工作,每天与这个所谓的“函数”打交道,其实函数就是 function ,function的英文直译是什么,就是功能。那函数就是功能,这样的翻译会好的多。那 SQL 函数,就是SQL的功能,就是调用了SQL函数,就调用了与这个函数相对应的功能,大家这样理解就要好的多。
好,那么说完了函数到底是个啥之后,我们再来说说SQL中的函数到底要学什么?
这里我对SQL函数再做一个进一步的解释,就是函数不仅对SQL来说,对所有编程语言来说,函数都起着至关重要的作用。函数就像是编程语言的“道具箱”,每种编程语言都准备了非常多的函数。就像前面jacky说的,函数就是功能,函数可以帮助我们实现各种各样的功能,比如说函数可以帮助我们实现计算、字符串操作、日期计算等各种各样的预算功能。
前面我们学了聚合函数,大家还记得吧,那聚合函数就能实现数据的聚合功能是吧。那像聚合函数的这样的函数SQL里面一共有200多种,这就是jacky在8句箴言中所说的“SQL函数茫茫多”,那为什么又说“真的不能用太多呢”?
前面jacky专门用一次课来分享MySQL到底是什么?jacky说MySQL就是一个存储数据的软件是吧。也就是说MySQL的主要功能是存储数据,那分析数据,或者说调用数据的功能都不是它的主业,是吧;既然调用函数不是MySQL的主业,那也就是说MySQL对于调用函数是不优化的,什么意思呢?因为数据库特别是mysql,虽然提供了这些方法,但是如果访问量特别的大,数据内容特别的多,调用一些复杂的函数很容易造成速度变慢,甚至数据库的崩溃。如果只是公司内部用,访问量不大,还是没关系的。越大型的项目越不要用这些复杂的sql语句,尽量将所有数据都查出来,在代码中进行处理。
那到底应该怎样学习SQL函数呢?
jacky给出的建议是,我们只需了解一些代表性的函数,这些代表性的函数大致分为以下几类:
用来进行数值计算的:算数函数
用来进行字符串操作的:字符串函数
用来进行日期操作的:日期函数
用来转化数据类型和值的:转换函数
用来进行数据聚合的聚合函数
以上这些函数我们只做了解,知道它们相应的功能,用的时候查看相关资料就可以了。
什么叫分组聚合,这里有两个关键字,一个叫分组一个叫聚合,这两个关键字不好理解。什么叫分组,什么又叫聚合呢?
二、group by 和having 解释:前提必须了解sql语言中一种特殊的函数:聚合函数,
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
having是分组(group by)后的筛选条件,分组后的数据组内再筛选。
三、having和where含义:
having是分组(group by)后的筛选条件,分组后的数据组内再筛选;where则是在分组前筛选。
where子句中不能使用聚集函数,而having子句中可以,所以在集合函数中加上了HAVING来起到测试查询结果是否符合条件的作用。即having子句的适用场景是可以使用聚合函数。
having 子句限制的是组,而不是行。having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle。
大家好,我是 jacky朱元禄,我们接着上次的分享往下讲,本小节jacky先给大家讲解分组聚合中的 having 子句;这里jacky在插一句话:jacky说了半天分组聚合,我再给大家通俗的解释一下什么是分组聚合。我们还记得8句箴言的最后一句怎么说,是不是:筛选透视是基础,分组聚合要牢记。这句话怎么看,大家肯定都用过 EXCEL 这个软件,EXCEL中大家都用过 筛选和透视这两个功能,是吧。那我们说SQL中的分组聚合就相当于EXCEl中筛选和透视这两个功能,从本质上来说,EXCEL也是一个数据库。好,通过类比EXCEL中的功能,大家是不是对分组聚合的作用有一个更直观地理解了。
好,我们回到这次课的主题,我们说分组聚合中的 having 子句是干什么的呢?那jacky说,having子句,与 where 子句一样,都是进行条件判断的;那jacky上次课说过,where 和 having 都可以用在分组聚合的语句中。
那么,对于分组结果的条件判断,我们什么时候用 having ,什么时候用 where 呢?
(1)where 能做,having 几乎都能做,不想记太多,就用 having;
(2)有些事,只有 having 能做,where 做不了:
1)where子句中不能使用聚集函数,而having子句中可以;
2)where子句中不能使用字段别名,而 having 字句中可以;