00:00
行,那接下来咱们就来看一看下一个知识点了。group by和。Group by啊,首先第一点,Group by是按照什么某个字段进行什么某个字段或者某些字段进行什么分组。Having是干什么呀?是对分组之后的数据进行二次过滤啊,Having是对分组之后的数据进行再次过滤。我再说一下啊,Group by是按照某个字段或者是某些字段进行分组,Having是对你分组之后的数据进行再次过滤,比如说我们这里有个案例,各位这个案例是什么呢?找出每一个工作岗位的最高薪资。你思考一下这个问题。
01:12
找出每个工作岗位的最高薪资。咱们脑袋转稍微快一点啊。注意听各位,我强调一下,咱们这三天讲这个买circle它的重要性,我再说一下,买circle将贯穿您的整个开发生涯,也就是说你只要是从事Java开发,只要不脱离这一行,您每天都需要写SQL语句。所以出去面试的时候,任何一家面试公司在面试的时候,这个笔试题的最后一道题必然是SQ语句。你永远都逃不过,我告诉你啊,就是我现在是搞这个就业,我知道这个事儿,就是咱们学生出去之后面试,一般情况下拿到电话之后,他去面了,到了这家公司之后,一般先上来给你一套什么笔试题,让你去做,笔试题的最后那一道题一般都是SQ语句体。
02:10
就是让你写字口的。SQL不会让你写增删改太简单,让你写查询语句select。查询。而且基本上就是这个SQL语句做出来的这个。进行技术面谈的概率就很高,如果SQL语句没做出来,前面做的挺好,基本上没戏啊。我说一下,SQL语句是项目经理非常重视的一项能力。因为我们软件处理就是处理数据,处理数据就需要您个人参与,写什么circle circle写不出来活你就干不了,说白了。而且每一条搜狗从网上能百度能查到吗?对不起,查不到,为啥?因为每一个业务都是不一样的,银行有银行的业务,证券有证券的业务,保险行业保险行的业务,每个行业的业务不一样,你最后写的所有语句肯定都不都不一样,你从网上找不到相同的东西,根本就找不到这个,完全凭空靠你自己一个人去写这个东西才能写出来,你写不出来,项目写不了,代码进没法进展。
03:11
你就拖后腿,项目到最后交交不上。啊,项目经理到最后呢,项目也上不了线,项目经理是吧,也发愁,所以说我想说的是呢,咱们不管你加码学的咋样,IO这块是吧,你可能学的很差,线程这块你可能也没太听明白,但是各位我说一下子这个circle您必须给他拿下。必须拿下,这个是硬性任务,这就必须弄这个东西,就不能有一点含糊,你要不会,你找工作是个事,告诉你你搜个鱼就不危险,我们现阶段讲的还是单表,对吧,是不是从一张表里边查这点东西,你要玩不转,两张表,三张表,四张表,五张表组合起来查,你怎么玩的转。所以我就很担心有人睡觉,你知道吧,一打盹我就得给你上上课。
04:02
对。你的脑袋一走神,我就能看出来你没在停课呀,就你这种状况,你能听懂,糟糕,根本听不懂,不知道讲啥,反正就是哦,找个每每个工作岗位最高薪资是什么东西是吧?想啊,是下午很困,我理解各位啊,但这个没办法,您要是困就掐一下自己吧啊,要是困就站起来,站起来学学一会儿啊,好找出每个工作岗位的最高薪资,咱们先看这个表当中的数据,各位。找出每个工作岗位,工作岗位,工作岗位,大家想这个工作岗位有几个呀?不知道有几个,我们可以排个序吧,From emp order by,按照工作岗位的升序排好,大家看这是不是工作岗位,有这个也有这个岗位,也有这个岗位,也有这个岗位,还有这个岗位。我现在要找的是每一个工作岗位的最高薪资。
05:02
我找的不是整个公司的最高薪资啊,我找的不是您这张表当中最高的薪资,我找的是您每一组里边的最高薪资,您这一组里边的最高薪资,您这一组里边的最高薪资,听懂了吧?您必须得用这group by先进行分组,再进行找这个最大的值,各位啊,所以说这是非常重要是分组有很多开发情况,我们是需要先进行分组,对每组的数据进行操作,那这个时候我们就得用这个语句了,好了,各位怎么写?来,我直接写出来,语句你去记,格式你需要下工夫去记啊,Select好。某某某,我可能还不知道具体查什么,我一会再说from哪张表我是清楚的,通过这张表E我要干什么,我要从这张表里边查每一个工作岗位的最高薪资,所以呢,我这写group by,按照什么分组呢?按照工作岗位进行分组,注意group by是这个是分组,BY是什么意思?通过通过这个字段,这个字段就是谁,就是他通过这个字段进行分组,分完组之后我们找什么最高薪资。
06:15
好,各位,如果把后边去掉这句话表示的含义什么意思?就表示找您这张表里边的最高薪资,听懂了吗?如果您group by这句话加上去的话,就表示先进行分组,在对每一组求最大值。这个circle语句有没有执行顺序,有先再BY,再select,记住啊,它是有顺序要求的。有要求的分组函数永远都是在什么时候在group by语句执行结束之后才会执行。注意,这里有一个内容是这样说的,说分组函数。
07:03
一般都会和谁一般都会。和联合使用,这也是为什么它叫做分组函数的原因。我们上面是不是刚刚讲过分组函数啊。他为啥叫分组函数啊?是因为这些函数通常都是和这个group by联合起来使用的,这也是为什么它被称为分组函数的原因,就是因为它通常和group联合使用。并且任何一个分组函数包括什么count max,并且任何一个分组函数都是在group by语句执行结束之后才会执行。记住,分组函数一定是在格之后执行。
08:17
当。一条语句当中没有的话。整张表的数据自成一组。当一条SQL语句没有group by的话。整张表的数据会自成一组。就是我在这里给大家说的是我即将要学的这个东西,叫按照什么分组,Having是对分组之后的数据在什么过滤,现在咱们讲的是group by啊,是分组函,呃,这个分组,但分组的话这块就关联到这个分组函数,我想说的是分组函数一般呢都会和它联合起来用。
09:13
这也是分组函数为什么叫分组函数的原因,是因为它和group连用。而且我还告诉你,这个分组函数在任何情况都是在group之后执行的,就是这个一定是在grow之后执行的,那有同你说老师,那万一这个语句里边没有group的话,这个这个这个组是什么组啊,就是这张表我说了就自成一组。整个这张表就是几组数据,一组数据就是这样的。好,这句话可以解释了。李老师,这我怎么不知道呢?这句话是什么意思?说思考L语句当中有个语法规则,分组函数不可直接使用在外词句当中。
10:00
分组函数不能直接用在where后边。原因非常简单。因为group by是在where执行结束之后才会执行的。我说慢点啊,这个我们停留的时间稍微长一点。分组函数之所以不能直接用在Y后边,是因为group by这个语句。他是在where后面执行。我慢慢写,你慢慢想啊,给你时间。怎么解释,因为因为。Group by是在外执行之后才会执行的。
11:06
分组函数。必须在分完组之后才能用。Wire的时候,Group by还没有执行。也就是意味着您还没有分组,你去哪用分组函数啊。你好好儿想想。我说呀,分组函数一般是联合谁group by用一般分组函数在什么时候执行group by之后,Group是不是分组,分完组之后是不是才有权利去执行分组函数恰好是group执行是在后面执行。
12:00
恰好是group by的语句的执行是在执行之后group才能轮得到,那你在where后面这个地方直接用分组函数的话,就相当于还没有分组呢,你怎么能用分组函数呢?你们必须知道的一件事是select某某某,然后呢,在这个位置from某某某,然后某某某某某某某某某某某某好,这几个语的执行顺序我再捋遍,一是先从这张表里边查,经过这个条件的过滤之后再分组,分完组之后如果不满意,你可以再进行过滤,过滤之后你可以把它查出来,查完之后你最后排序输出。
13:01
也就是说wi和hi这两个有一个相同的作用,都是为了过滤数据,但是呢,能在呃这个,但是呢,这个wi是先进行第一层的过滤吧,分完组之后,如果你对这个数据还不满意的话,你想再过滤的话,你可以用hi过滤,听懂了吗?好,你好好捋捋啊,Where执行结束之后,是不是才之后是不是才能用分组函数,所以在where执行的时候,这个位置能用分组函数吗?不能用。分组函数用不了,为啥分组函数用不了的原因是因为它还没分组,所以你分组函数用不了。Select avg,我说了,如果这条语句没有group by的话,它整个这张表的数据会制成一张表。
14:09
但是,自成一张表这件事,也是谁先谁执行了,才会制成一张表。Group败之后。他才会。自成一张表,呃,这个自成一组,整张表的数据自成一组。就是如果说你select语句当中没有这个group by语句的话,实际上它有没有个缺省的。我慢点说啊,你们好好想想,就是就是咱们啊,要知道一个原理是什么,就是一条circle语句,如果没有这个group by语句的话,实际上它是有一个缺省的group,有一个默认的group在里边,而这个默认的格是是什么呢?是把整个这张表当成一组数据。
15:05
明白吗?所以你wi后边还是不能用什么分组函数,你用不了就不让你用这个东西,原因是分组函数的执行必须先分组才能轮到它,尴尬的是格外的执行必须等它结束,等外的结束之后格Y才能执行,所以你在执行这段代码的时候,它还没有分组,没有分组你这个函数根本就用不了。那说到这儿各位如果您还是不理解,您只有一招了,我也没有办法了,您只能背会。只能背会啊,因为我讲课一般情况是能让你理解,尽可能理解,别去背,但是如果说您实在是理解不了,记住外,或者不能直接使用这五个函数的,其中任何一个函数都不能用外后边不能不能写。不能加你加上报错。
16:00
听听明白了吗?诶各位行了,你要是理解这个了,那咱就好说了。好,那你告诉我这个程序怎么改。找出工资高于平均工资的员工。你不能说这个你写不了,你怎么解决这个问题啊。找出工资高于平均工资的员工。我们到最后还是得解决这个问题,对吧?第一步干啥找出平均工资对吧?第二步干啥找出高于平均工资的员工吧,好,找出平均工资都会吧,Average salary,这个是不是就是平均工资,平均工资我们从这儿一查,查完之后的结果就是这样的一个结果,对吧?我们把它拿过来放到这,这就是整个的均工,我们工资高于这个的对吗?所以这条语怎么写,Select件工资多这个值,这样是不是就查出来了。
17:17
分两步,大家看是不是就查出来了,当我们查出来最后的结果是不是就是这个这拨人是高于平均工资的,对吧?好,那这两步能不能联合起来写呢?可以,这两条语句完全可以拼接在一块,也就这个是你这条语句的查询结果。这个问题就解决了。Select语句中嵌套select语句,这叫子查询。我们在这里会学。看见了吗?还没到这儿呢。啊,但是这个事儿我需要先给你交代一下,要不然这个你不会写呀。
18:06
子查询就是select语句中嵌套什么select语句,这个很好用。这很好用啊,就是这样。这个语句你联合起来复制一下,你粘贴过来一执行,最后的结果跟上面一模一样。有的老师你这你这个这不是这不是这个函数在这个这个地方出现了吗?不是啊,这个函数现在是用在select后边的。对吧,跟您这个还不一样,您这个是说白了就是直接在外人后面用了分组函,这是绝对不允许的,在词口语句当中。但你可以换一个思路,什么思路,就是我刚才处理这个问题的思路,就是第一步先干啥,算出一个结果之后再把这个套进去,诶这个也可以。那我问大家一个问题啊,带小括号的优先级是不是比较高,也就这条语句会先执行谁小括号里边的执行完一个结果之后再去执行外边这个SQ语句懂了吧?诶至于这个子查询是什么,咱们到后边的时候,咱们再看这块呢,咱们就先说到这,总之我想讲的不是这个子查询,各位我想讲的是where,后面不能直接用什么分组函数,您把这个理解了就行了啊,这个理解了就可以了。
19:25
嗯。
我来说两句