select与group by之间的“恩怨情仇”(SQL查询成绩表中每一科成绩最低的分数以及这个学生的学号,课程号)

分享自己在刚开始学习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之间的“恩怨情仇”,你了解了吗。。。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值