博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL查询强化训练(2)
阅读量:4634 次
发布时间:2019-06-09

本文共 6458 字,大约阅读时间需要 21 分钟。

摘自

 

现在有三个表student,score,course

对应的建表语句如下:

View Code
1 CREATE TABLE student(  2 student_id NUMBER PRIMARY KEY,  3 student_name,VARCHAR2(30) NOT NULL)  4  5 CREATE TABLE score(  6 score_id NUMBER PRIMARY KEY,  7 student_id NUMBER,  8 course_id NUMBER,  9 score NUMBER) 10 11 CREATE TABLE course( 12 course_id NUMBER PRIMARY KEY, 13 course_name VARCHAR2(30))

 

要求用基本SQL实现如下的两条查询要求:

(1) 求出每门课程成绩排名前五名的同学的姓名,分数和课程名
(2)求出每门课程成绩排名第三的同学的姓名,分数和课程名

答案:

View Code
1 create table STUDENT   2 2.(   3 3.  STUDENT_ID   NUMBER not null,   4 4.  STUDENT_NAME VARCHAR2(30) not null   5 5.)   6 6.;   7 7.alter table STUDENT   8 8.  add primary key (STUDENT_ID);   9 9.  10 10.prompt Loading STUDENT...  11 11.insert into STUDENT (STUDENT_ID, STUDENT_NAME)  12 12.values (1, '张三');  13 13.insert into STUDENT (STUDENT_ID, STUDENT_NAME)  14 14.values (2, '李四');  15 15.insert into STUDENT (STUDENT_ID, STUDENT_NAME)  16 16.values (3, '王五');  17 17.insert into STUDENT (STUDENT_ID, STUDENT_NAME)  18 18.values (4, '马六');  19 19.insert into STUDENT (STUDENT_ID, STUDENT_NAME)  20 20.values (5, '孙七');  21 21.insert into STUDENT (STUDENT_ID, STUDENT_NAME)  22 22.values (6, '王八');  23 23.commit;
View Code
1 create table COURSE   2 2.(   3 3.  COURSE_ID   NUMBER not null,   4 4.  COURSE_NAME VARCHAR2(30)   5 5.)   6 6.;   7 7.alter table COURSE   8 8.  add primary key (COURSE_ID);   9 9.  10 10.prompt Loading COURSE...  11 11.insert into COURSE (COURSE_ID, COURSE_NAME)  12 12.values (1, '语文');  13 13.insert into COURSE (COURSE_ID, COURSE_NAME)  14 14.values (2, '数学');  15 15.insert into COURSE (COURSE_ID, COURSE_NAME)  16 16.values (3, '英语');  17 17.commit;
View Code
1 create table SCORE   2 2.(   3 3.  SCORE_ID   NUMBER not null,   4 4.  STUDENT_ID NUMBER,   5 5.  COURSE_ID  NUMBER,   6 6.  SCORE      NUMBER   7 7.)   8 8.;   9 9.alter table SCORE  10 10.  add primary key (SCORE_ID);  11 11.  12 12.prompt Loading SCORE...  13 13.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  14 14.values (1, 1, 1, 99);  15 15.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  16 16.values (2, 1, 2, 98);  17 17.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  18 18.values (3, 1, 3, 97);  19 19.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  20 20.values (4, 2, 1, 99);  21 21.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  22 22.values (5, 2, 2, 97);  23 23.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  24 24.values (6, 2, 3, 98);  25 25.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  26 26.values (7, 3, 1, 96);  27 27.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  28 28.values (8, 3, 2, 95);  29 29.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  30 30.values (9, 3, 3, 94);  31 31.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  32 32.values (10, 4, 1, 93);  33 33.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  34 34.values (11, 4, 2, 92);  35 35.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  36 36.values (12, 4, 3, 91);  37 37.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  38 38.values (13, 5, 1, 90);  39 39.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  40 40.values (14, 5, 2, 89);  41 41.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  42 42.values (15, 5, 3, 88);  43 43.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  44 44.values (16, 6, 1, 87);  45 45.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  46 46.values (17, 6, 2, 86);  47 47.insert into SCORE (SCORE_ID, STUDENT_ID, COURSE_ID, SCORE)  48 48.values (18, 6, 3, 85);  49 49.commit;
select *  2.  from (select s.STUDENT_NAME,  3.               sc.SCORE,  4.               c.COURSE_NAME,  5.               dense_rank() over(partition by c.COURSE_ID order by sc.SCORE desc) drank  6.          from student s, course c, score sc  7.         where s.STUDENT_ID = sc.STUDENT_ID  8.           and c.COURSE_ID = sc.COURSE_ID) t  9.where t.drank < 6;
View Code
1 结果如下: 2   3  4  5  6 STUDENT_NAME SCORE COURSE_NAME DRANK 7 张三 99 语文 1 8 李四 99 语文 1 9 王五 96 语文 210 马六 93 语文 311 孙七 90 语文 412 王八 87 语文 513 张三 98 数学 114 李四 97 数学 215 王五 95 数学 316 马六 92 数学 417 孙七 89 数学 518 李四 98 英语 119 张三 97 英语 220 王五 94 英语 321 马六 91 英语 422  23 孙七 88 英语 524 25
View Code
1 1.2成绩相同的人排名相同,且排名不是连续的。  2 Sql如下:  3    4   5   6 Sql代码    7 1.select *    8 2.  from (select s.STUDENT_NAME,    9 3.               sc.SCORE,   10 4.               c.COURSE_NAME,   11 5.               rank() over(partition by c.COURSE_ID order by sc.SCORE desc) ranking   12 6.          from student s, course c, score sc   13 7.         where s.STUDENT_ID = sc.STUDENT_ID   14 8.           and c.COURSE_ID = sc.COURSE_ID) t   15 9.where t.ranking < 6;   16   17  结果如下: 18   19  20  21 STUDENT_NAME SCORE COURSE_NAME RANKING 22 张三 99 语文 1 23 李四 99 语文 1 24 王五 96 语文 3 25 马六 93 语文 4 26 孙七 90 语文 5 27 张三 98 数学 1 28 李四 97 数学 2 29 王五 95 数学 3 30 马六 92 数学 4 31 孙七 89 数学 5 32 李四 98 英语 1 33 张三 97 英语 2 34 王五 94 英语 3 35 马六 91 英语 4 36 孙七 88 英语 5 37   38  39 1.2成绩相同的人根据学号排序,排名是连续的。 40 Sql如下: 41   42  43  44 Sql代码   45 1.select *   46 2.  from (select s.STUDENT_NAME,   47 3.               sc.SCORE,   48 4.               c.COURSE_NAME,   49 5.               row_number() over(partition by c.COURSE_ID order by sc.SCORE desc, s.STUDENT_ID) rn   50 6.          from student s, course c, score sc   51 7.         where s.STUDENT_ID = sc.STUDENT_ID   52 8.           and c.COURSE_ID = sc.COURSE_ID) t   53 9.where t.rn < 6;   54   55  结果如下: 56   57  58  59 STUDENT_NAME SCORE COURSE_NAME RN 60 张三 99 语文 1 61 李四 99 语文 2 62 王五 96 语文 3 63 马六 93 语文 4 64 孙七 90 语文 5 65 张三 98 数学 1 66 李四 97 数学 2 67 王五 95 数学 3 68 马六 92 数学 4 69 孙七 89 数学 5 70 李四 98 英语 1 71 张三 97 英语 2 72 王五 94 英语 3 73 马六 91 英语 4 74 孙七 88 英语 5 75  76   77  78  79 (2)求出每门课程成绩排名第三的同学的姓名,分数和课程名: 80 Sql如下: 81   82  83  84 Sql代码   85 1.select *   86 2.  from (select s.STUDENT_NAME,   87 3.               sc.SCORE,   88 4.               c.COURSE_NAME,   89 5.               row_number() over(partition by c.COURSE_ID order by sc.SCORE desc, s.STUDENT_ID) rn   90 6.          from student s, course c, score sc   91 7.         where s.STUDENT_ID = sc.STUDENT_ID   92 8.           and c.COURSE_ID = sc.COURSE_ID) t   93 9.where t.rn = 3;   94   95  结果如下: 96   97  98  99 STUDENT_NAME SCORE COURSE_NAME RN100 王五 96 语文 3101 王五 95 数学 3102 王五 94 英语 3

 

转载于:https://www.cnblogs.com/baiyixianzi/archive/2012/08/19/sql2.html

你可能感兴趣的文章
smartupload 上传文件时 把页面编码改成gbk 解决乱码
查看>>
EPS是什么格式
查看>>
input禁止显示历史输入记录
查看>>
Python的数据库操作(Sqlalchemy)
查看>>
2.抽取代码(BaseActivity)
查看>>
My simplified pickit2 clone
查看>>
Redis 入门知识
查看>>
夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
查看>>
转--Android如何在java代码中设置margin
查看>>
反射的所有api
查看>>
Js 判断网页窗口是否滚动到底部
查看>>
上传文件
查看>>
css 定位及遮罩层小技巧
查看>>
用java向mysql数据库中插入数据为空
查看>>
项目中非常有用并且常见的ES6语法
查看>>
dateTimePicker编辑状态下,取值不正确的问题
查看>>
mac 端口转发方案
查看>>
[2017.02.23] Java8 函数式编程
查看>>
loadrunner支持https协议的操作方法-经验总结
查看>>
30 个 php 操作 redis 常用方法代码例子
查看>>