关于group by的深入理解

今天,对sql的分组语句又有了更深的理解,因此在此记录。
上课时看到一个案例:
select (select eedepa from examinee where eeexam.eeid = examinee.eeid), AVG(achieve) from eeexam group by(select eedepa from examinee where eeexam.eeid = examinee.eeid)
这个语句一开始无法理解,显然这是一个相关子查询,即子查询依赖于父查询的输入,于是我认为在遍历eeexam表的时候进行select的同时会进行分组,这就非常奇怪了,因为这样理解的话group by后面是一个个具体的属性的值,这样一来就是根据具体属性值来分组,于是始终无法理解。
后来经老师同学的帮助以及进一步理解,解决此问题,不知道理解是否正确,但是至少在逻辑上成功自恰了,理解如下:
group by“会对通过where过滤之后生成的表按group by子句中指定列的值分组。”从上面这句教材中可以看出以下两点:1、group by是在select 出符合条件的表后进行分组的;2、group by按子句中指定的列进行分组。因此以上代码可以这样理解:先进行查询(相关子查询),得到一个eedepa、achieve这两个属性的表,有achieve是因为avg()聚集函数需要分组后才能起作用。这个时候group by后面的相关子查询也得到了一个单列表(仅有eedepa属性),然后在将生成的表按照eedepa单列表进行分组,然后作用聚集函数,得到最终的表。

猜你喜欢

转载自blog.csdn.net/qq_39805362/article/details/83244517