zoukankan      html  css  js  c++  java
  • SQL查询强化训练(2)

    摘自 http://www.iteye.com/topic/1112015

    现在有三个表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 语文 2
    10 马六 93 语文 3
    11 孙七 90 语文 4
    12 王八 87 语文 5
    13 张三 98 数学 1
    14 李四 97 数学 2
    15 王五 95 数学 3
    16 马六 92 数学 4
    17 孙七 89 数学 5
    18 李四 98 英语 1
    19 张三 97 英语 2
    20 王五 94 英语 3
    21 马六 91 英语 4
    22  
    23 孙七 88 英语 5
    24 
    25  
    View Code
      1 1.2成绩相同的人排名相同,且排名不是连续的。
      2 Sql如下:
      3  
      4 
      5 
      6 Sql代码  
      7 1.<span style="color: rgb(0, 0, 0); font-size: large;">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;</span>  
     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.<span style="font-size: large;">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;</span>  
     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.<span style="font-size: large;">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;</span>  
     94  
     95  结果如下:
     96  
     97 
     98 
     99 STUDENT_NAME SCORE COURSE_NAME RN
    100 王五 96 语文 3
    101 王五 95 数学 3
    102 王五 94 英语 3
  • 相关阅读:
    论文笔记:SAIN: Self-Attentive Integration Network for Recommendation(SIGIR 2019)
    论文笔记:Neural Graph Collaborative Filtering(SIGIR 2019)
    已过的时间,未来的征程
    关于博客
    论文阅读:OpenFlow: Enabling Innovation in Campus Networks
    论文阅读:ClickNF: a Modular Stack for Custom Network Functions
    论文阅读:Forwarding Metamorphosis: Fast Programmable Match-Action Processing in Hardware for SDN
    论文阅读:Camdoop: Exploiting In-network Aggregation for Big Data Applications
    Hedera: Dynamic Flow Scheduling for Data Center Networks
    论文阅读:NETFPGA SUME: TOWARD 100 GBPS AS RESEARCH COMMODITY
  • 原文地址:https://www.cnblogs.com/baiyixianzi/p/sql2.html
Copyright © 2011-2022 走看看