sql null 替换 0_第六关:SQL题目

c1ca248bd0ba337c7b4cadeb79390163.png
course表

7e5ac604c52c56635d5c5fded242e428.png
score表

a9c23c341e13348fb1e798a4785275da.png
student表

5d6514583dabeec80894d08339fdcca9.png
teacher表

一、简单查询

1396ed4e1629b4b85eb40e2ae6ce6d02.png

a95bb56bdcaa12a41306456b13062e51.png

0b91b24a9f422957ecbc4030337b3624.png

891c0cd5fdbb129b0352752410ed4a6b.png

二、汇总分析

935825930c8c9b948cebc7f3e887bb9f.png

4d2ab97e6475c625e6b22155554a6743.png

badde6ebc31842b8e0c4e1fcb495dc5b.png

e4f78e76da04187859ced76c46735534.png

b3837967a60b9fa67312947a956f5c9d.png

d8fc161c7e2aec8200612c78a87f75c7.png

6ef371aeae26c75ac6582c9f72a3fd7b.png

30fff95a8ee0c2c23b56e0a503d1cdd7.png

ffcaa9bf71d75e38d93a74335497320f.png

b5969cbdb4fb70d0b8a713601f4f55e3.png

fb1bb17a34464735563d8b565c6d6b2d.png

da0ac5544de7b209d624880228514665.png

be6ef214f256195ac063c3e864e831d9.png

三、复杂查询

35c282862b2d462a32415e9375947336.png

4c7dd129b9ee88ffd384521c0215b062.png

e7e6a6556eb3116e6fb91bc1e023d9cc.png

fd49e479cde97e2cb693112b837bc909.png

topN问题N=1分组取每组最大(小)值

题目:按课程号分组取成绩最大(小)值所在行的数据方法一:自join

566b865bacc134ebc979e3fe74a3468b.png

方法二:关联子查询

74bee599136c31d4383b207f673a53da.png
  • 每组最大的N条记录(N大于等于2)

题目:查询各科成绩前两名的记录

方法一:关联子查询

de46e211690e0c61b6e6f64a93285e88.png

方法二:自联结

b2df8841e32f98bc559182c52acf536b.png

方法三、union all

7238127c6e78f75e0fdee3bd421ceffa.png

值得注意的是第三种方法看起来似乎并不准确,因为它忽略了成绩并列的情况。四、多表查询
join

1abeb7c994c1f5270933c5f437bdb76e.png

e33770adc2ee93cce085e6947ac036c8.png
近似学生表

268c6fd398409735e054b1c303270970.png
学生表

893e1381c48af033c5958a596f0a146f.png

练习 还是章节前那四个表

查询所有学生的学号、姓名、选课数、总成绩

65831691280d5bae1882a1f342f77411.png

查询平均成绩大于85的所有学生的学号、姓名和平均成绩

eb885ef585c458279a9b66ecb72c2857.png

查询学生的选课情况:学号,姓名,课程号,课程名称

a8af7e85457dec115f734f32cbd4035e.png

最后发现把没有选课的学号为0004的同学漏了,为了避免这种情况,应该score表先与course表 join 得到一个表,student在与其left join

992a8e8f401ca1d27279814fc22aff16.png

查询出每门课程的及格人数和不及格人数

556706e0e47740138506b241c59565fa.png

也可以稍微修改一下,利用count对null求和为0,得出另一种方法

f8e1b51980f3bfa988594ee2e012eb3f.png

使用分段[100-85],[85-70],[70-60],[‹60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称

effbacead88d8d1fe0dc43b267f09c3b.png

查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名

a525bfcff345a38f191d03fb0c80520c.png

SQL行列互换

1ff6984ab956a83467707458b4ba6576.png

ce7ffc2bc887d7cc41d795e04612258a.png

第1步,


select 学号,'课程号0001','课程号0002','课程号0003'
from score
group by 学号

523878ae7d4efa30208c4f760bab5088.png


第2步,使用case表达式,替换常量列为对应的成绩

fb6e9dc51f0d28e277be8f1ec0841afc.png

如果直接运行整个SQL语句只会输出前3行,因为select……group by……默认输出每个分类的第一行数据。因此这里需要添加聚合函数max或者sum。

4722f7d74e2e8d17255a74c1e574a675.png


最后还有一点问题没有解决:原表中学号为0001的学生的0002课程成绩是不知道,并不是0,而按照上图结果却是为0
还需要进行修改

767371b78aef335651fbb203db6013da.png

当聚合函数与null作运算时有:

count(*)时:将null那一行算入。

count(某列):不会统计null那一行。

sum: null不会对sum产生影响

avg:null对其产生影响
max 或者min:null不会对其产生影响因此当且仅当某个学号对应的某个课程号每一行都为null,sum或者max才为null,也就是说某个学生根本没有选择那一门课程,成绩就为null。符号我们的要求。

五、如何提高SQL查询效率

1. select子句中尽量避免使用*,不要返回用不到的任何字段
2. where子句比较符号左侧避免函数
这会导致数据库引擎进行全表扫描,从而增加运行时间。where子句中遇到函数或加减乘除的运算,应当将其移到右侧。3. 尽量避免使用in和not inin和not in也会导致数据库进行全表搜索,从而增加运行时间,对于连续的数值,能用 between 就不要用 in 。
4. 尽量避免使用or

or会导致数据库进行全表搜索,有时可以用union连接,避免使用or5.使用limit子句限制返回的数据行数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值