00:00
好,那么刚才呢,咱们讲到这个count,哎,我最后呢,抛出来了一个问题,说呢,我们这个count清COUNT1,还有这个count字段,我们如果想计算这个表中有多条记录,哎,建议用哪一个啊,咱们当时说的是建议大家用这俩就不要用它了,是吧,因为这个字段呢,它不一定靠谱。啊,那么呃,有的字段呢,是不是就是靠谱的呀。那有的字段它是靠谱的,比如说我们像这里边用的这个employ ID,或者是这个salary,这两个字段呢,在咱们这个员工表当中,它都是非空的,就是没有一个,呃,一行数据它是空的是吧?那在这这种场景下呢,是不是就可以用了是吧?那么在都可以用的情况下呢,我们用哪一个比较好呢?哎,就是咱们现在要提出来的一个问题。啊,这个问题呢,没有放在刚才这个视频当中,所以刚才视频中如果再加上它呢,是不是就显得有点太重了是吧?哎,太重了啊,那我们这里边写一下啊,说如果这个需要啊统计啊表中的这个记录数。啊,那么使用。哎,咱们呢,是不是有三种情况可以进行选择的,一个呢,是这个count星,那还有呢,是这个COUNT1啊,其实这块就算是一个常数了啊,你写一写二其实都可以的。
01:11
嗯,然后呢,再一个呢,就是count这个具体的字段。用这三个哪个效率更高呢?注意我这里边呢,既然提到了这个count的具体字段了,咱这就属于高手跟高手之间的这个过招,什么意思啊,那这里边呢字段了,咱们默认的话呢,你肯定用的是不是应该是那些非空的那些字段了是吧?就是这个字段的值是没有空值的啊,你说我这块呢,是commission BD,它不就错了吗?啊,那那当然没毛病是吧,咱们现在呢,默认就是它里边的值一定不存在着nor值。那就意味着我们这块呢,如果是查这个员工表,是不是都应该是107对吧?好,那么哪一个效率更高呢?哎这个问题啊,哎这块呢,哎,其实一方面我在咱们的这个课件里边。
02:00
讲这个,诶过了。在讲这个看的这块的话呢,你看我们这呢,有介绍啊,有介绍说这个谁更好是吧?啊那么这块呢,我写的就比较薄了啊,我写的就比较薄了,那哎这个看哪块会更清楚啊,相当于也是给咱们这个下篇啊,我做一个预告啊,在下篇咱们这个课件里边,我有一个章节啊,咱们这个下篇里边像索引啊,这样这儿这儿这儿。这几个章节全是讲优化的。啊,全是讲优化的,对于大家找工作来讲,实际开发来讲是非常有帮助的,应该这么讲啊,就单单这索引这一个章节。啊,应该说呢,市面上大家你不会看到比我这里边儿记录的更加详细的。啊,不会见到比我这里边儿记录记得更加详细的。啊,这个肯定啊,这个非常的我还是非常满意的啊呃,到时候我讲完这个上面之后呢,咱们就接着给大家讲这个下篇把这个东西呢,毫无保留的免费的都发给大家。啊都发给大家好,那么诶刚才说啥了,咱们说这个第九章啊。
03:02
这个第九章呢,打开以后。那我这块呢,找到就是这块呢,提到是这个索引优化和这个社会优化了啊嗯,在这里边呢,讲一个count问题,仅仅属于我们这么多优化里的一个小部分里边的一个小结而已啊,你可见这个优化的点还是非常丰富的。那问这个抗的氢跟抗的这个具体字段呢,哪个效率高啊,这里边自然而然的也包了一个抗一,那你看这里边儿写的还是比较丰富的。啊,我这呢就是想做一个广告是吧,呃这个,呃,当然把这个结果也要告诉大家来我们这块呢,到底应该用哪个呢?这个就说来话长了啊,因为呢跟存储引擎有关系,那存储引擎又是什么鬼呢?就是这个哥们,这个哥们呢在哪呢?又在这个逻辑架构里边,这个逻辑架构呢,长这个样子。啊,所以说呢,这个知识啊,它都是环环相扣的啊,你想弄清其中一个点,你得把这一片呢都得弄清楚啊,这个呢形成一个体系,这个时候呢,你的墙垒的足够高,别人想超过你呢,就超不过去了。
04:02
对吧,啊,那你这时候你的价值会更高,你是不是相应的待遇啊,就会更高一些。啊,大家呢,这个在你职业发展的时候啊,也应该会有这样一个感触,就是呃,很多这个情况呢,是不是都满足这种正态分布啊,包括呢,这个咱们每个职职场人也是一样的。啊,那你如果呢,处在这个人群,就是正常来讲,大家比如说学完这个技术之后呢,找工作一般呢,都处在这个就是波峰的这个左右这样一个范围内,就是跟你差不多的人呢,很多。啊,跟你差不多的人呢,很多,呃,你这块努力努力呢,你发现薪资涨了,但是涨幅也不大,但是呢,你要注意这个真正优秀的人呢,他一定是非常少的,也就是说呢,你努力努力,你不断的努力啊,整几个加号下去之后呢,你就会发现我我这样来说啊,比如说大家呢,你努力了一年。那假设你的工资呢,一开始是这个,呃,假设是15K啊,你努力了一年,就是努力的强度,我们假设呢,是一个常数C吧。啊,那么努力一年呢,你这工资呢,你可能变成是这个25了,相当于涨了这个10K对吧,涨了10K啊。
05:04
那如果让你同样的这个强度的情况下呢,又努力了一年,同样的强度的情况下,那我注意,那我想强调就是你在得到的这个薪资就不是35K了。就不是35K了,因为呢,你再去努力的时候呢,达到这个年薪30万的,那其实呢,这已经是啊,就过掉了很多人了,你在同样的强度再去努力一年,那你有可能直接就翻番变成50K了,因为呢,再跟你去能够PK的人已经非常少了,那公司呢,又挺多的需要这种高端的人才,那你的这个薪资呢,就上去了,也就是说呢,我们很多时候看待问题啊,就习惯上以这种线性思维去看待,但很多场景下呢,他根本不是线性的,它可能是一个指数的。当你再付出同样的努力的时候呢?你发现你超越的人呢,哎。就是超越人其实是少了,因为没有那么多人了,你会发现呢,你站在了一个小高峰上啊,就是这样的一个道理。啊,这样个道理,行,那么我们这块呢,呃,吹直吹牛是吧,好,我们这块拉回来啊,就这里边我们讲了很多的优化手段,那这里边呢,跟啊,就是我们要一说这个效率谁跟谁高啊,这里边呢,一句话呢是说不完的啊跟存储引擎呢是有关系的,那如果我们使用的是这个叫my I sum这样的一个引擎,这呢是这个,呃,之前这个版本啊,5.5啊,在这个等等这些版本之前用的一个存储引擎是MYI啊,如果你要用的是这哥们的话呢。
06:28
呃,这时候呢,呃,我们这个其实复杂度啊,就相当于是如果咱们使用的是MYI存储引擎,我这样说吧。哎,咱们把这个结论呢,也在咱们这个课件里边,简单的给大家留一下,这如果使用的是这个my Sam群众引擎,则三者效率相同。都是。都是这个呢,大家应该知道这个算法的时间复杂度是吧,我这呢就这样来写了啊,都是跟这个OE是一样的,就是常量的,哎,为什么呢?因为他专门有一个字段呢,去记录了一下,你这个表中呢,到底有多少条这个记录。
07:02
啊,我看我这记得应该是写着呢啊。如果是它的话呢,是它啊,这在哪是吧,因为每张MYSM这个数据表里边都会有一个Meta的信息,就是这个原数据信息叫count啊,直接呢,我们记录一下这个字段值,你要求的话呢,直接从这个拿这个值就行,所以它是个常量级的,对吧,但是如果呢,我们要使用另外一个就是这个no DB啊,像我们5.7啊,8.0啊,咱们用的都是inno DB啊这个存储引擎。啊,具体呢,存储引擎的区别是什么?这个咱们先不在这去说了,这一说就真的就说多了,如果使用的是这个叫DB的这个存储引擎。那么它们三者的效率呢?是不一样的。三者。哎,效率这块呢,我们怎么去讲呢,来我在这里边呢,是写了一个啊表是不是在这儿了。哎,这样子才处理的啊,这个我CTRLC一下。哎,这么着。哎,这个我把这个着重号呢,就去掉了啊。
08:02
行,这个呢,大家怎么去体会呢?哎,就是说呢,我们此时的三者效率呢,我们count牺升跟COUNT1呢,相当于都是把整个表中的这一条记录呢,我们把它呢看成就是一个,哎,就相当于是一条记录呢,我们不去读它具体这个字段啊这样子的,那有同学想着我们跟具体这个字段去比,为什么这个具体字段它就这个差一些呢。为什么具体资料会差呢?因为呢,我们再去使用前边这个呢,去计算个数的时候呢,哎,这里边又一说又会多哈,就是我们这个存储引擎呢,它自动的会去找其中的那个索引,找那种二级索引呢,它涉及到那个字段比较比较少的啊这个的这一说大家肯定会有点懵,对应到我这里边儿呢,写的在哪呢。哎,我找一下啊,哎,在这儿。哎,在这啊,他呢会找我们这个对应的这个二级索引,然后二级索引呢,有可能有多个,那么他会找这个k Les啊这呢相当于是我们在plan啊去查去查看一下我们这个,呃查询语句呢,呃,这个分析的时候呢,其中呢,有一个这个属性信息叫做kles啊,他会找这个kles比较小的这个二级索引进行扫描,说白了就是我们这种写法的话呢,它会自动的去找一个比较优化的一个方式,而我们要是显示的用个字段的话呢,它就没有办法去做优化了,那进而的话呢,我们说前两个呢,效率就会比这个要高一些。
09:19
那大家呢,就知道这么个事儿就行,那么关于我们这个优化呀,索引啊,什么叫二级索引啊,什么叫聚集索引啊,这个我们讲到下篇的时候呢,在正确的在完整的给大家引入去讲解,那也是一个非常完整的知识体系啊,那到时候呢,大家学完之后的话呢,应该去面试,这这都是应该是小case了啊。好,那么我们关于这个count这就说到这儿啊,嗯,接下来的话呢,我们来看一下这个叫格,如果BY啊,进入咱们这一章的第二个内容的学习。Group by呢,是不是叫分组啊,哎,咱们前面讲过叫order by order呢叫排序啊,通过哪个字段呢去排序,那group呢叫做组,相当于我们通过哪一个字段呢进行是不是分组操作呀。
10:04
啊,分组操作好来我们看一下这个如和BY的一个使用,还是从一个需求出发。哎,从一个需求出发,大家看。我们想求一下这个员工表当中注意各个部门的平均工资。哎,各个部门的平均工资相当于呢,你要是同样一个部门的话呢,是不是就应该看成是一组是吧,那我们这里边是不是就分成好多组啊。好多组是吧,来回过来看一下啊,我们直接呢就开始来写了需求。需求查询。各个。啊,部门的这个平均工资啊,平均工资啊,最高工资啊,都一样啊,都可以行来看一下咱们原来的话呢,你要是select avg的salary啊,From这个employ employees这样的写法呢,是不是只是把整个公司的107个员工看成一组,所以呢,就出来了一条记录。
11:04
啊,只有这一条记录,这是整个公司的一个平均工资啊,一组是吧,那我们现在是不是要分成好多组啊,那你要是好多组呢,咱们是不是得告诉数据库服务器,你想按照什么来分组啊。哎,按照啥呀,是不是按照部门ID来分组啊。这个我的普通话还是挺标准的是吧?啊部门ID啊来我们按照部门ID分一下组,哎,走大家看到此时呢,你看我们这个数据呢,是不是就好多行了,因为每一行啊代表一个部门。每一行代表一个部门,那大家呢,可能就有疑惑,诶哪个部门是5760,哪个部门恰好是1万呢,是不是没有显示啊,诶那这块呢,显示一下没问题,那我们就在查询这块呢,你把这个department itd你给他加上不就完事了吗?是不是就可以了,来选中啊执行。啊出来了,哎哟,我们还发现呢,没有部门的这些这些哥们儿啊,咱们这个表是有一个啊,但是他可能在实际这个表当中有可能有多个是闹的是吧?啊,如果有多个员工的p department是no,那他们就自成一组啊,他们的平均呢是7000啊50部门的是这么多,70号部门呢,这个平均工资呢,恰好是1万。
12:17
哎,就是这个意思啊,就这意思,那你要求这个部门的这个最高工资,那你只需要在后面呢,是不是加一个some的salary就行了呀。就行了。此时呢,大家你注意相当于呢,咱们把这个员工表啊,你看这块的话呢,把这个员工表呢,是不是就分成了好多组啊,你告诉我们需要就是告诉这个数据库服务器呢,我们按照哪个字段来分组的,就像呢,你这个老板说说诶你去那个呃,按照这个部门ID去分个组,然后看一下每一组里边这个平均工资是多少,或者说这个最高工资是多少,那这块呢,相当于你就知道啊这个一样的数呢,我们就放一起了。这个地盘麦地一样的,那同样的我们让数据库服务器呢,去自动的帮我们做这个事儿,那你一样的要告诉他说你去分页组按照什么呢?你按照这部分埋进去给我分组。
13:05
哎,就是这个道理。就是这个道理,应该是比较好理解的是吧?好比较好理解的行,那么同样的话呢,我们可以再按照其他的一些这个字段去分组,比如说我们想查询一下,嗯,这个我们同样的啊,咱们这么着CTRLCCTRLV查询各个job ID的。这个平均工资咱们这个表中啊,是不是有好多的个招白ID,那计算他们的这个平均的salary啊,From employees,然后各group by,你是不是得按照这个招牌D来进行一个分组啊。对吧,来选中执行,那这呢就分出来了19行数据,但是呢,我们看不出来说哪一个工种是17000,那建议呢,咱们在前面这块呢,是不是补一下这个招白ID啊。哎,是不是这么着。它就出来了,是不是这个工种这么多,这个工种这么多。没问题吧,哎,可以了啊,哎,可以了。行,那这样的话呢,咱们就相当于是这个,诶group呢,这个就说清楚,它是这样一个特征的啊,这样一个特征的啊呃,那么这个说完之后的话呢,我们再来强调下一个需求。
14:11
好,大家看。我这呢,我记得有个图好看这个啊,使用多个列进行分组的,嗯,咱们这个图看能不能看懂,稍微字有点小。这个是什么意思啊,就是我们现在呢,希望按照这个部门来分组。然后同时的话呢,假设呢,是同一个部门的,你比如说我们像50号部门吧。50号部门的话呢,原来我们就把它看成是一组了,现在呢,我想再拆分一下,就是你同一个部门里边呢,工种一样的,看成是一起一起的,比如说50号部门里边这些哥们呢,他是招白D是一样的,那我们就这个计算他们的平均工资啊,这些呢是一样的,你就计算他们平均工资,相当于呢,就是按照这个depend me和这个赵白的呢进行分组。进行分组,哎,这个怎么搞啊。这怎么着?哎,那其实呢,也不难啊,哎,这块呢,相当于我们这个需求就更复杂一些。
15:07
那相当于是查询各个department。ID啊,各个job ID啊,这是吧,那平均工资最高工资我就不求了啊,你后边补一个sum,这个salary就可以了啊哎,Select咱们想查询的是这个叫avg的一个salary是吧。哎,然后from一下这个an employees,然后group by,哎,注意这时候呢,我们分组的话呢,你是不是明确说了有两个字段,那我们就得是把这两个字段呢,是不是都得搁到咱们的group by当中呀。CTRLC啊转过来。对吧,好粘过来,粘过来以后呢,我们这块呢,直接选中做一个执行,其实呢就可以了,但是还是那个问题,那你看我可以每次都是先这样去运行,还有一个问题就是咱们不知道到底是哪一个部门的,哪一个工种是这么多是吧,所以呢,咱们会把这两个字段呢,CTRLC,那我们会粘到这,哎,我再逗号一下。
16:03
好,此时呢,我们选中了在一执行是不是就比较清楚了,比如说我们看这个50号部门,50号部门的这个CRK,它是平均工资这么多,50号部门的这种可可乐这么多啊,52这个是这么多,哎,这就比较清楚了。没问题是吧。啊没问题,好,这个大家呢,可能心里边觉得,哎差不多啊,哎比较清晰,那我这块呢,我再写一种方式,但是你看这两个呢,是不是一样啊,是不是一样什么呀,我呢把这个赵白地我放在前面。啊,这个呢显示,其实这个显示呢,这个谁前谁后呢就无所谓了,这个您可以交换的,那我这块呢,保险起这个怕大家再多想,我呢也交换了一下,你看啊,我此时这个分组是这样分的,先按照这个赵白地啊,按照工种分一下,然后呢再按照这个部门分一下,那么问。这两个操作查询出来的是一个事儿吗。大家此时也可以把这个视频呢,先暂停一下。
17:02
想上五秒钟给答案。好,你暂停了,我我就不用暂停了啊好,那么说一下这俩一样吗。就说这不不清楚啊,不清楚咱们是不是就运行一下看呀,这呢有20行行数据,哎,那选中呢,一执行,哎还是二行数据,还是二行数据,只不过呢,我们这时候呈现的时候呢,是先呈现这个照白了啊后呈现这个地方上来地是吧,其实呢,这两个是哎一样的啊,我们从这个实际需求上来讲啊,他俩呢是一样的。哎,同学有点不解啊,你这样想啊,哎,脑海当中你浮现的出现一个什么呀,出现的就是你们公司,比如说开这个,哎,团建的啊,就是部门跟这个员工啊,这些部门员工啊,就是所有员工呢,都在这样一个大的一个场地当中,那现在呢,就是你作为一个主持人,你说啊,咱们呢,大家先按照部门来分组啊,好,那么是一个部门呢,就大家分好了,然后呢,你说再分啊,第一个部门当中呢,是一个工种呢在一起,那这块呢,是不是就分出这样的效果了,先按这个分,再按这个分是吧。
18:04
好,那么这块呢,假设呢,你说我现在换一种这个分法,大家呢,先按照这个工种分啊,按照工种先分开,然后呢,大家再按照部门来分,那最终的效果呢,大家你想想实际上是一样的。什么效果呢?就是你是同一个部门的,并且工种一样的,你们才会在一组。是不是这俩都是如此啊?啊,那都都是这样子的啊,所以说呢,这两个呢,只不过是先分后分的区别,最终效果呢,就是同一个部门同一个工种呢,你们才会在一起,所以说呢,求平均呢,那当然还都是一样的了。哎,所以这两个是相同的啊,哎,这个注意一下。好,那么上边这个呢,相当于我们提的就算是,哎,那按照我们这里的叫法呢,是不是按照一个列来进行这个分组了是吧?哎,一个列分组的,然后下边这个呢,是多个列来进行分组的。哎,这块呢,是我们说的这个写法啊,我们这呢叫这个这样我写一下吧,叫方式一。
19:00
那这个呢,我们叫这个方式二啊。行,那这个说完之后的话呢,我下面呢,要讲一个重要的一个点了,哎,我要讲一个重要的点,好大家看。我们就以啊,纯粹的是这样的一个语句来说,纯粹这个语句来说,刚才的话呢,我是不是在刚开始计算的时候呢,没有这个事儿啊。然后我把这个呢,选中以后呢,做这个执行,那咱们看一下这是不是20条记录,我现在一执行是不是还是20条记录。啊,那这个时候呢,他的需求就是我们按照部门ID和照ID呢进行了分组,那分组之后呢,就是每一组的这个数据呢,平均值就都在这儿了,只不过咱们不知道哪一个部门哪一个工种是不是7280啊。这个咱们看不出来,所以说呢,我那会儿呢,是不是在上边这个select当中呢,把这两个字段呢,给加上了,哎,你知道我加上的原因呢,是基于咱们实际的可读性上来讲呢,是把它给加上了。
20:01
啊,那么下一个这这块大家这都是熟悉的啊,然后下一个点。下个点啊,我这个位置,哎,我能不能去一个。看我能不能去一个。你说那去,去就去呗。啊,你想想,你看这是我去了以后,我我为了大家好理解啊,我把这哥俩呢调一下顺序啊。我去掉一个以后呢,相当于咱们告诉数据库服务器说我只按照department ID来进行分组。是按照它来分组是吧?那言外之意呢,我们此时列出来的这个表中是不是说呢?呃,一个部门的应该占一条数据呀,比如说50号部门的应该占一条,那这个呃,60号部门的应该占一条,70号部门的占一条,因为咱们只按照部门来分组的是吧?好,那么问我们这个呢,要是一条数据占这个一行数据的话呢,那如何看待这个赵白D大家不一样呢?因为咱们明明知道了,你比如说你看50号部门是不是这里边儿我就能够看到有三个不同的招白地,那如果说50号记录只能显示一个,那我问大家,你说我们这个招白地应该写谁呀?
21:09
就是说那那这个。老师你说的对,这个我我整不明白了是吧,那整明白的话呢,那其实我们就想说了,这个写法它是错误的。它是错误的,好,既然是错误的,我们要执行一下的话呢,按说应该报错了是吧,但是没有。但是没有,你看他没有报错,但是这个事儿的话呢,大家知道他是不对的啊,你看我们这一个部门,你看他就只给我们留了一个,那咱们这个部门里边有好多工种,怎么可能只有这一个工种呢?所以呢,虽然没有报错,但是这个结果呢,它是不对的。啊,它是不对的啊,你看同样的这样一个需求,我CTRLC一下,咱们放到这个Oracle当中可以看,我选过来以后,我们这样画跑一下。你看这块呢,是不是就给我们报错了,你看人家Oracle。看人家Oracle是吧,别人家的这个孩子。都怎么弄的这块呢,大家发现我这只写了个方BYD,他说呢,不是group by表达式,也就是说呢,你这写了个招BYD,但是你招BYD呢,没有出现在group by当中啊,人家报的这个错误信息多么的精准的,Oracle这个my circle就不行啊,所以说大家在用这个my circlele的时候呢,你要小心,就是我反复强调的啊,你要运行报错了,那肯定是写错了,但你要运行以后没报错出来结果了,结果也不一定对啊,这个要注意。
22:26
哎,那么错误原因大家就知道了,那么我们由这个错误原因想引出来的这个点。哎,大家你把这个结论呢,给他记住就行。把这个结论呢记住就行,就是在我们这个题目当中,说白了就是你这个里边需要补一下这个招白底是吧,那么结论是什么呢?就是啊,注意听你看我这样说的对不对啊,说啊我这个格外当中出现的这个字段。诶诶,这个先说这个吧,这个select当中我们出现了一些字段和是不是组函数啊,那么我说呀,非组函数的这个字段。
23:03
非组数数的字段,比如说我们这俩说他俩呢,一定要出现在个如和BY当中。指明呢,我们相当于要按照这两个字段呢去分组了,是吧?那么反之呢,葛如果拜当中这个字段。一定需要写在select当中吗?我们说是不是不需要啊,你看我那会儿呢,我可以写上面练习的时候,我每次是不是一开始都没写,只是出于咱们说可读性更好,我是不是把这俩才补到这儿了。对吧,哎,那这呢,就是我们说的这个结论写一下。这个起来中。结拜中,哎,出现的这个非组函数的这个字段,必须声明在咱们的这个个group by中。啊,必须生命在group中。反之,这个中。
24:01
哎,这个声明的字段是吧,哎,不一定。啊,或者叫这个可以啊,不出现在是吧。哎,咱们这个select中。那这呢,就是我们说的这个结论。大家再去体会一下,就相当于我们既然这里边儿呢,出现了这个非组函数这个字段了,然后呢,其实你就一定要按照它来进行这个分组了。来进行分组,所以一定要出现在goodbye当中,反正呢,这里边写的呢,哎,这个你可以不写在这儿啊,只是说呢,我们可读性呢会稍微差一点而已啊,哎,大家呢,把这个结论呢,记住它。啊,这个结论记住它好,这呢是我们说的这个叫呃结论一吧,然后呢,呃相当于我们此时呢在做这个总结啊,这个结论二的话呢,就是我们这个group by呢,它写在哪的这个问题啊这块我们强调一下,这个group by呢,它呢,哎是哎声明在。哎,咱们在这个问题当中,大家只看到是不是生命在这个,在这个from的后面是吧?那问题就是如果我们还存在了这个where的时候呢,到底grow跟where谁先谁后啊,哎,咱们强调我这个where呢,跟from他哥俩呢,是不是比较亲的,所以说那个grow呢,它声明在from后面,那我再写一下啊,哎,也得在这个where的后面。
25:16
啊,Where的后面,那么是不是还有咱们讲过这个order by了,也讲过limit了,是吧,那跟这俩哥俩比呢,那这那哥俩比呢,我们说的生命在他俩这个后面啊,这个生命在这个order by。Order by前面。那outbit前面那个limit呢,是不是放在outbit后面了,那自然而然的是不是也是放在这个,呃,Limit的这个前面了。前面是吧,哎,就是这个意思,哎,你知道呢,它所处的位置啊,就如果你要写where的话呢,Where写到这儿,如果呢,要写这个这个order by的话呢,Order by跟这个limit是写到group by的这个后面啊,就是这个道理啊,这个呢,我们想强调的就是它的一个声明的位置啊,声明一个位置。啊,这是这个结论二,然后接着呢,再来一个结论三。
26:03
这个结论三的话呢,咱们相当于说一个这个哎算是一个叫哎新特性了啊,哎往下看。哎,这个新特性了,就是我们这里边呢,提到了一个新的一个用法,叫做with roll up啊with roll up,哎,With roll是什么意思呢?这个大家做一个了解其实就可以了啊,哎,就是with,在grow by中使用with roll up。买中。哎,这个group by中啊,使用这个with lookup,嗯,给大家举例子啊,比如说我们select一下,我们叫department ID,然后呢,Avg的一个salary from employees,然后隔BY,咱们先来一个叫department ID是吧?哎,这么着好,那此时呢,我们选中啊,执行一下,这呢,是不是就计算了说各个部门的一个平均工资是多少是吧?这你看一下是不是一共呢,这写的是12条记录,相当于呢,我们是分成了12组,对吧?好,那么在这个后边呢,我就加上一个叫I with I roll up,诶这么着是吧,那么此时呢,我们再去啊,这样我先把这个给盯一下,大家可以方便的去做这个对比。
27:12
我选中之后呢,我们再有。再执行一下。好,这时候大家看。你会发现呢,这个跟我们刚才去比较的话呢,多了一条记录,这是不是13行了。那13行了,这个我们往上匹配一下,这样多的这个呢,其实就是咱们最后的这个。最后这个呢,你看这个多的是一个什么。这个闹的话呢,相当于这个没有具体值了,这个6461 6461的话呢,大家不知道还有没有印象,咱们计算这个公司的平均工资上面有没有。在这儿看。诶诶好啊对对,就这啊这呢是咱们集团这个公司的,你看这个ABG的salary。是不是就是6461这个数,那相当于呢,就是咱们现在呢,大家你看到我们如果加上叫with roll up。
28:00
加上这样的一个声明的时候呢,他会是不是把呃,一组一组的都分完之后的话呢,最后是不是还把整个我们所有的数据呢,合在一起,看成是一组计算了一下整体的一个平均是吧?哎,这就是with up它的一个特征,那自然而然的话呢,你像这个位置,咱们是不是也没有办法写是十号部门20号部门的呀,因为它是整个公司的,哎,它的一个平均呢,是吧。哎,这个大家要小心一点。那OK,那那如果有这样的一个with roll up存在的话呢,大家就不能够怎么着呀,大家要慎重的跟这个outba去使用,那我这块说一个例子,你看啊,咱们现在的话呢,没有这个with up,我们这块呢,是不是这样子去做一个查询,这呢是不是查询出来各个部门的这个叫平均工资,那么完全呢,我们在这个基础之上呢,是不是加一个order by order by呢,按照平均工资来排序,这时候大家呢,你去给它呢起一个别名啊,叫做avg的sal是吧,然后我们把这个呢放到这。那这个呢,哎,我就写上这个A了,显示的加上了啊一执行此时的话呢,是不是就按照我们这个,呃,平均工资从低到高做了一个排序。
29:05
这个能清楚,那其中呢,没有部门的这些人呢,相当于他们自成一个组是吧,哎,就这样一个意思,好,这个呢是一个正确的。啊,这是一个正确的,相当于这是一个正常的一个需求查询。各个部门的平均工资。啊,然后呢,按照。这个平均工资啊,从低啊,或者直接说呢,叫升序排列。哎,这个需求呢,是合情合理的,那么如果说呢,哎,我们在这个基础之上。大家呢,在这块加了一个叫with。哎,加了个with,好,你看这时候我们选中以后呢,咱们再去执行。啊,Incorrect啊,这个呢,呃,这个roll up啊and order by,那这块呢,是不是就报错了,就相当于呢,就是如果呢,你要加上这个with roll up以后呢,我们再去做这个order这个操作呢,它就矛盾了。
30:01
啊,他就矛盾了,这个怎么去理解呢?就好比是说呢,你看我们这块呢,多出来一行数据,你要是真的假设能排序的话呢,相当于是把这一行也会考虑当成一条记录去排,而事实上呢,这是公司的平均,根本就不是某一组的是吧,所以它也不适合参与这个排序,诶所以通过这个的话呢,我们想强调的一点就是。呃,这个呢,咱们就不写成是这个结论四了哈,这个是在这个结论三里边儿。啊,结论三当中的啊,这个相当于是一个说明。哎,咱们在这个课件当中啊,也都给大家写了,说当使用这个呃,Roll up的时候呢,不能同时使用order bes,就进行这个结果的一个排序,哎,它俩呢,是互相排斥的是吧。哎,就是这个意思,哎,所以咱们下边这个呢,是一个错误的。OK。行,那么这样的话呢,咱们就把这个叫格如何拜啊,我呢就讲清楚了。那么后边的话呢,大家只要是出现了。啊,有同学说那个我们以前没有讲过呗,现在讲了是吧?哎,咱们要出现了分组的时候呢,以及呢,你只要出现分组了,咱们肯定是不是基于这一组要计算一些这个组函数了,是吧?那么在这种场景下呢,我们就可以使用这个勾BY了,如果呢,你要是把整个表呢,看成是一个组,那就用不着勾了,就是咱们上面简单的使用这五个组函数,那只有呢,你把这些数据呢,要把它按照某一个指标呢,分成好多个组,我们才会用这个格如何带。
31:26
好,这呢就是grow的一个使用。
我来说两句