任务:有学生,科目,考分三张表,需要从中筛选出五门考分总和超过720的学生。

科目表最简单只有五条记录:

CREATE TABLE tb_course
(
id NUMBER not null primary key,
name NVARCHAR2(10) not null
) Insert into tb_course(id,name) values('','语文');
Insert into tb_course(id,name) values('','数学');
Insert into tb_course(id,name) values('','英语');
Insert into tb_course(id,name) values('','物理');
Insert into tb_course(id,name) values('','化学');

学生表只有两个字段,但数据量却有十万:

CREATE TABLE tb_student
(
id NUMBER not null primary key,
name NVARCHAR2(20) not null
) Insert into tb_student
select rownum,dbms_random.string('*',dbms_random.value(15,20)) from dual
connect by level<=100000
order by dbms_random.random

成绩表很庞大,需要在其中创建共两百万条数据:

CREATE TABLE tb_score
(
id NUMBER not null primary key,
studentid int not null,
courseid int not null,
score int not null
)

Insert into tb_score
select rownum,dbms_random.value(0,100000),dbms_random.value(1,5),dbms_random.value(0,150) from dual
connect by level<=2000000
order by dbms_random.random

执行完毕以后commit.

现在可否开始查询呢?还不行,我们需要把每个考生单科最高分数据遴选出来,放到一张新表中。

create table tb_score2 as
select * from tb_score where (studentid,courseid,score) in(
select studentid,courseid,max(score) as score from tb_score
group by studentid,courseid)

在我实验中,新表中约有49万数据,是原表的四分之一。

那么为什么不删除tb_score表中不是每个考生单科最高分那些记录呢,比如用下来的sql去删:

delete from tb_score where id not in(
select id from tb_score where (studentid,courseid,score) not in(
select studentid,courseid,max(score) as score from tb_score
group by studentid,courseid) )

是因为这样删除实在是太慢了,我浏览了百度新闻,51job首页和电影港首页居然还没完,选出数据放到新表会快得多。

然后用以下语句就能找出五门总分在720以上的学生:

select stu.id,stu.name,sco.sumscore from tb_student stu,
(select new_score.studentid,new_score.sumscore,new_score.cids from
(select studentid,sum(score) as sumscore,(listagg(courseid,',') within group (order by courseid)) as cids from tb_score2
group by studentid ) new_score where new_score.cids=(select listagg(id,',') within group (order by id) from tb_course)
and new_score.sumscore>720 ) sco
where stu.id=sco.studentid
order by sco.sumscore desc

让我们看看这些英才都是哪些人:

SQL> select stu.id,stu.name,sco.sumscore from tb_student stu,
2 (select new_score.studentid,new_score.sumscore,new_score.cids from
3 (select studentid,sum(score) as sumscore,(listagg(courseid,',') within group (order by courseid)) as cids from tb_score2
4 group by studentid ) new_score where new_score.cids=(select listagg(id,',') within group (order by id) from tb_course)
5 and new_score.sumscore>720 ) sco
6 where stu.id=sco.studentid
7 order by sco.sumscore desc; ID NAME SUMSCORE
---------- ---------------------------------------- ----------
60230 MGHSGQWZZLWTMHAFCK 738
98913 FCIJHDBJDKUCLFTIOLR 737
19881 OWWHEDLATQLSUVXF 736
8711 UOAOGXWBATDMYBFM 736
26842 MUVPTHSTPNSKWSXIFAPP 735
58112 GOGZBZKYIZQBAYQS 735
42644 ZCWWQFSGOZMDFMS 735
42177 XDRUJHTZTOJVSFGI 734
56021 FBYUWGMGZORIQBXLTHO 733
65292 HUOUBIIWJNLAOGZW 733
87009 EBMPZNHSZMXMTSUC 732 ID NAME SUMSCORE
---------- ---------------------------------------- ----------
83641 VKEKWTDNFDHXZRRPWIYD 731
58593 ZECIYJCZNYMUSNTG 731
32116 PZXWQZXAYLVAWNYG 729
97616 FGQGNKHTPDHHWOUU 729
74935 QNEHWSJTFLOSMXB 729
66747 WJURFLHNXQFDKNNOVT 729
49933 WGGGACVVJXXCODNLLB 729
23554 JKUNYBSSEKXQCVWE 728
55634 TCLLHZESREMRLIIWRUK 727
9387 EMYCJDHYLAXSGKE 726
93450 KQSBMYGSCRETYKYSYK 726 ID NAME SUMSCORE
---------- ---------------------------------------- ----------
76314 NHOPFXSAYNKHSKHZJNY 726
76186 TXVXNSZETKCGLLX 726
61658 KSVTBNNAAJWZVVHP 726
33200 KJZXFGIDCJRRNKWNKG 726
84699 TDWMXMJRJTFCLGTC 726
86265 HBMIDMWVXMESKIIIQFPV 726
63956 MGPVABXLFQVKMKOQHN 725
33717 ABVGWFOAMIEQGIXIHBS 725
96610 OYOIJZGDXHWHTFNUDL 725
13104 KXCWLAUGOZSKQWTL 724
91912 MJYPLBSMWPEOLXUGGD 724 ID NAME SUMSCORE
---------- ---------------------------------------- ----------
83508 IBNWASUMLVNLBXCURX 724
50997 YETMKRMKNAYMQQORGB 724
33868 WBXWDFIALHEAPPHKRAM 724
20391 RDHGEGGOIGVWTNJMJ 724
70595 SMVMJFVMDIYUNWYXC 724
8865 EYZZZGOAJNUENIXT 723
73241 DYMNRSECWZYLWFI 723
60378 YYQYSKIVBITGICD 723
13578 TLGLDLAYPRRCFTWQKRX 723
27338 HPAMAIQHHQNKDYJ 723
41174 HPMAFEVRCXEBVRRVEBYI 723 ID NAME SUMSCORE
---------- ---------------------------------------- ----------
93860 VVXTQWGQGPEALAN 723
89181 AUAVRUBGTVEQISOBAFP 723
87519 MFOWKQSBTJVRJXX 723
83007 OZOYETVCZMJNXSIOSX 723
85947 DXSJSSMEMCJAIIGT 722
52919 FXELVCEHUAUMPHRKONX 722
94309 NTOCAERVSKNGLEZNIZ 722
34681 ZYOXMRWYYOVWONLNDR 722
30518 JNPYQNNWBPSKICREMPE 722
49635 MTJFGEKFQREYUQWPEWF 722
80760 LLHVLFAKXVSHTVYHOC 722 ID NAME SUMSCORE
---------- ---------------------------------------- ----------
57707 SLYATRQZDXZYFVEM 722
18030 QZMPAWQKYISWWTSWM 722
74491 JLKIFEQCCLFCFIEFW 722
43296 VBLZPERIAXJYYYSTI 722
80816 IQSGRNLVHELBTSLGZ 722
92947 JHXVIRBODOUDZMMWP 722
5212 LCSFRFCWAFTLFPBWLU 721
9299 RUTLPLEFYYDVKLHPLK 721
10058 VBPVPMMAXRZIZLXHEI 721
10361 GBIXPYTHTZZWDPKW 721
15331 UMJLKKQHAKKBAOH 721 ID NAME SUMSCORE
---------- ---------------------------------------- ----------
28393 LDLWTKPQSXLRWYN 721
39285 RIIBDINLLFXHETSPA 721
46517 TNUZAIUCZKWBFAGWEV 721
58569 ZINHWFNOOTQPEQOA 721
60567 UDECJDCGZIZZWUM 721
61563 SXBXGEBVXVNKSCWTUHLW 721
66670 XZYWNVSUWZWRYVYTVD 721
68668 FSAKVTSSBMYFPOSPSLG 721
91083 MGZJEJCGBSXEANPBHZK 721
92262 QKMPVBTYMXUVOGSAL 721
95418 QZQFIHRMNIGCDXSYHE 721 ID NAME SUMSCORE
---------- ---------------------------------------- ----------
99418 HMKXSDFBGRETSZXYX 721 已选择78行。

2020年1月23日

[oracle/sql]写SQL从学生考试成绩三表中选出五门分综合超过720的尖子的更多相关文章

  1. 写sql语句统计各个学生各科成绩(case when用法)

    尊重原创:http://blog.csdn.net/love_java_cc/article/details/78268326 有如下一张表score: 建表语句: CREATE TABLE `sco ...

  2. SQL 查询:查询学生平均成绩

    编程萌新,因为遇到这么个SQL 查询的问题:在一张表A里有如下字段:学生姓名.学科名.学科成绩.写一条SQL 语句查出各科平均成绩并按学生姓名分组,按如下格式显示:学生姓名|语文|数学|英语.一开始遇 ...

  3. [置顶] 【机器学习PAI实践八】用机器学习算法评估学生考试成绩

    (本文数据为实验用例) 一.背景 母亲是老师反而会对孩子的学习成绩造成不利影响?能上网的家庭,孩子通常能取得较好的成绩?影响孩子成绩的最大因素居然是母亲的学历?本文通过机器挖掘算法和中学真实的学生数据 ...

  4. [Oracle/SQL]找出id为0的科目考试成绩及格的学生名单的四种等效SQL语句

    本文是受网文 <一次非常有意思的SQL优化经历:从30248.271s到0.001s>启发而产生的. 网文没讲创建表的数据过程,我帮他给出. 创建科目表及数据: CREATE TABLE ...

  5. 面试题: 数据库 sql优化 sql练习题 有用 学生表,课程表,成绩表,教师表 练习

    什么是存储过程?有哪些优缺点? 什么是存储过程?有哪些优缺点? 存储过程就像我们编程语言中的函数一样,封装了我们的代码(PLSQL.T-SQL). 存储过程的优点: 能够将代码封装起来 保存在数据库之 ...

  6. sql面试题(学生表_课程表_成绩表_教师表)

    原帖链接:http://bbs.csdn.net/topics/280002741 表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程 ...

  7. sql面试题一 学生成绩

    sql面试题一 学生成绩   原帖链接:http://topic.csdn.net/u/20081020/15/1ABF54D0-F401-42AB-A75E-DF90027CEBA0.html 表架 ...

  8. 经典sql面试题(学生表_课程表_成绩表_教师表)

    转载:https://www.cnblogs.com/qixuejia/p/3637735.html 表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna ...

  9. Java使用JDBC连接SQL Server数据库|实现学生成绩信息系统

    Java实验四 JDBC 使用SQL Server数据库或者MySQL数据库各自的客户端工具,完成如下任务: (1)创建数据库students: (2)在数据students中创建表scores,包括 ...

随机推荐

  1. 7、Prototype 原型模式 通过复制创造实例 创造型模式

    2020-07-19 发哥讲 发哥讲 其实上一节的末尾讲到如何去生成对象,其中有一个关于clone的,这其实就是Prototype原型模式. 通过克隆(拷贝)的方式生成对象 1.了解Prototype ...

  2. linux常用命令(三)文件操作命令

    Linux文件的目录结构 根目录 / 家目录 /home 临时目录 /tmp 配置目录 /etc 用户程序目录 /usr 文件基本操作 ls 查看目录下的文件 touch 新建文件 mkdir 新建文 ...

  3. ElasticSearch 7.X版本19个常用的查询语句

    整理一篇常用的CRUD查询语句,之前这篇文件是在17年左右发表的,从英文翻译过来,现在采用7.x 版本进行实验,弃用的功能或者参数,我这边会进行更新,一起来学习吧. 为了演示不同类型的 Elastic ...

  4. 小程序的优化代码的分析Promise方法

    代码优化,这里通过了wx.request请求轮播图的API,通过result结果里面的data数据我们可以看到massage里面装着我们的数据 通过图片可以用看到swiperList返回的三个元素的数 ...

  5. Java基于SSM的个人博客系统(源码 包含前后台)

    @ 目录 系统简介 系统运行截图 核心代码 写在最后 系统简介 技术点:Java.JSP.SSM框架,实现了个人博客系统 用户角色分为:普通用户.管理员.系统管理员 功能:发博客.博客分类.博客删除. ...

  6. LNK2005 连接错误解决办法 2009-10-30 12:13

    nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@ ...

  7. Java继承后访问成员的特点

    继承后的特点--成员变量 对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编 ...

  8. setjmp()/longjmp()的使用方法

    setjmp和longjmp.为了让你实现复杂的流控制,程序在系统里面运行完全依靠内存(代码段,全局段,堆存储器,栈存储器)和寄存器的内容(栈指针,基地址,计数器),setjmp保存当前的寄存器里面的 ...

  9. C++炮台实验

    炮台实验 蒜头君在玩一个战争模拟游戏,他有高度为 1,2,3,... ,n的炮台各一个,他需要把这 n个炮台从左往右排成一行,并且炮口都朝向右边. 在这个游戏中,所有炮台发射的炮弹会摧毁前方所有高度比 ...

  10. 分析dubbo心跳检测机制

    目的: 维持provider和consumer之间的长连接 实现: dubbo心跳时间heartbeat默认是60s,超过heartbeat时间没有收到消息,就发送心跳消息(provider,cons ...