分享自己在刚开始学习sql的时候碰到一个问题,可能很多刚开始学习sql的朋友也会遇到同样的困惑。
有以下这样一张score表,我们需要从表中找到每门课程里成绩最低的学号,看到“每门课程”,学过分组查询后我们就会知道Group by可以实现此需求。
我们编写sql语句:
运行后输出结果:
结果初看没什么问题,请注意结果中学号这一列的返回结果,与原始表进行对比发现:课程0002获得60分的学号应该为0002,结果出错啦!!!
那这是为何,反复检查sql语句,发现在语法和逻辑上都没问题。
问题原因:sql中的select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。 所以这样导致了学号出错,mysql数据库中会输出错误的结果,如果是oracle的话就会报错。
-------------------------------------------------------
将以上的sql语句改写(运用子查询):
这下问题解决,结果输出:
你现在可能心中还是有一些小疑惑:上述sql语句中不还是使用了Group by吗?为什么没有出错?
首先上述更正后的语句Group by出现在子查询中,而子查询语句select语句中是一个聚合函数,所以没有出错;其次在关联子查询中的Group by子句是可以省略不写的,如果用以下语句查询结果是一样的(省略了Group by子句),可以自己动手试一试。
以上即为select与group by之间的“恩怨情仇”,你了解了吗。。。