sql复杂查询

前言

  前面的一篇文章写了下数据库设计和SQL语句基础,里面都是简单的增删改查,而且对最重要的查询也没有深入研究,实在是罪过,那么本文就sql复杂的查询语句进行探讨,也是当作一个记录好了

No.1

假设我们现在有张这样的score表(sn表示student_name学生姓名,cn表示课程class_name名字,sc表示score成绩)

sncnsc
光头语文9
吴克语文100
光头物理99
吴克物理7
光头体育100
吴克体育5

现在我们要求不及格(<60)科目大于等于2门的那个人的平均分,一条sql解决?
先post答案:

SELECT sn,AVG(sc) 
FROM score
WHERE sn
IN (SELECT sn FROM score WHERE sc<60 GROUP BY sn HAVING COUN(sc)>=2)
GROUP BY sn;

现在来理解上面这么一串东西
根据[1],我们知道sql执行顺序是FROM=>WHERE(IN)=>GROUP BY=>HAVING=>SELECT

先看外层的:
1. FROM score,我们还是得到score这张表

sncnsc
光头语文9
吴克语文100
光头物理99
吴克物理7
光头体育100
吴克体育5

2. WHERE sn IN ( SELECT sn FROM score WHERE sc<60 GROUP BY sn HAVING COUN(sc)>=2)
这个就要求括号里面的 (SELECT sn FROM score WHERE sc<60 GROUP BY sn HAVING COUN(sc)>=2)

2.1 FROM score,我们可以得到原来的表

sncnsc
光头语文9
吴克语文100
光头物理99
吴克物理7
光头体育100
吴克体育5

2.2 WHERE sc<60,我们可以筛出sc<60的项

sncnsc
光头语文9
吴克物理7
吴克体育5

2.3 GROUP BY sn,有点像依据学生姓名来归档放在一起并合并了单元格,关于GROUP BY[2]会讲的更加好理解
这里写图片描述

2.4 HAVING COUNT(sc)>=2,HAVING的作用和WHERE很像都是筛选,不过WHERE不能带聚合函数的(比如SVG,SUM,COUNT等等)
这里写图片描述

2.5 SELECT sn,返回的自然就只有’吴克’了

所以WHERE sn IN (吴克),sn的取值只能是吴克,那么2这一步最后得到吴克所有科目的成绩

sncnsc
吴克语文100
吴克物理7
吴克体育5

3. 再GROUP BY sn
这里写图片描述
4. 最后SELECT sn,AVG(sc),我们就可以球的我们这位挂课数目在2门以上的吴克同学的平均分了

snAVG(sc)
吴克37.3333

Reference:
[1]十步完全理解 SQL
[2]可以这样去理解group by和聚合函数

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值