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

     1  SELECT T1.C#,
     2 
     3          ROUND(T1.AVG_SCORE, 2) AVG_SCORE,
     4 
     5          ROUND(T2.PASS_COUNT / T1.ALL_COUNT, 2) PASS_POINT
     6 
     7     FROM (SELECT DISTINCT C#,
     8 
     9                           COUNT(1) OVER(PARTITION BY C# ORDER BY C#) ALL_COUNT,
    10 
    11                           AVG(SCORE) OVER(PARTITION BY C# ORDER BY C#) AVG_SCORE
    12 
    13             FROM SC) T1,
    14 
    15          (SELECT DISTINCT C#,
    16 
    17                           COUNT(1) OVER(PARTITION BY C# ORDER BY C#) PASS_COUNT
    18 
    19             FROM SC
    20 
    21            WHERE SCORE >= 60) T2
    22 
    23    WHERE T1.C# = T2.C#
    24 
    25    ORDER BY AVG_SCORE, PASS_POINT DESC
    Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
     
      Union All,对两个结果集进行并集操作,包括重复行,不进行排序;
     
      Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
     
      Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。

    SQL查询强化训练 

    摘自 http://blog.163.com/ky_199/blog/static/143176020125711452318/

    http://yabar.iteye.com/blog/583203 更全

    http://www.iteye.com/wiki/blog/1143788更多练习的sql

    SQL查询强化训练

    以下案例用到以下表

    Student(S#,Sname,Sage,Ssex) 学生表

    S#:学生编号,字符串型

    Sname: 学生姓名,字符串型

    Sage:年龄 ,数值型    

    Ssex:性别,字符串型

    Course(C#,Cname,T#) 课程表

    C#:课程编号 ,字符串型 (企业管理001,马列002,UML 003,数据库004,英语006) 

    Cname:课程名称 ,字符串型

    T#:教师编号,字符串型

    SC(S#,C#,score) 成绩表

    S#:学生编号 ,字符串型  

    C#:课程编号 ,字符串型    

    score:成绩,数值型

    Teacher(T#,Tname) 教师表

    T#:教师编号 ,字符串型  

    Tname:教师姓名,字符串型

     

    注:合格的标准为课程的成绩大于等于60分,带#号的字段表示主键或有外键关联

     

    **********************************************************************************************************

    View Code
      1 SQL脚本预准备如下:
      2 
      3 create table COURSE
      4 
      5 (
      6 
      7   C#    VARCHAR2(20),
      8 
      9   CNAME VARCHAR2(20),
     10 
     11   T#    VARCHAR2(20)
     12 
     13 )
     14 
     15 create table SC
     16 
     17 (
     18 
     19   S#    VARCHAR2(20),
     20 
     21   C#    VARCHAR2(20),
     22 
     23   SCORE NUMBER(5,2)
     24 
     25 )
     26 
     27 create table STUDENT
     28 
     29 (
     30 
     31   S#    VARCHAR2(20),
     32 
     33   SNAME VARCHAR2(20),
     34 
     35   SAGE  NUMBER,
     36 
     37   SSEX  VARCHAR2(20)
     38 
     39 )
     40 
     41 create table TEACHER
     42 
     43 (
     44 
     45   T#    VARCHAR2(20),
     46 
     47   TNAME VARCHAR2(20)
     48 
     49 )
     50 
     51 insert into course (C#, CNAME, T#)
     52 
     53 values ('001', '企业管理', '9001');
     54 
     55  
     56 
     57 insert into course (C#, CNAME, T#)
     58 
     59 values ('002', '马列', '9002');
     60 
     61  
     62 
     63 insert into course (C#, CNAME, T#)
     64 
     65 values ('003', 'UML', '9006');
     66 
     67  
     68 
     69 insert into course (C#, CNAME, T#)
     70 
     71 values ('004', '数据库', '9004');
     72 
     73  
     74 
     75 insert into course (C#, CNAME, T#)
     76 
     77 values ('006', '英语', '9006');
     78 
     79  
     80 
     81 insert into sc (S#, C#, SCORE)
     82 
     83 values ('1008', '003', 85.00);
     84 
     85  
     86 
     87 insert into sc (S#, C#, SCORE)
     88 
     89 values ('1008', '004', 21.00);
     90 
     91  
     92 
     93 insert into sc (S#, C#, SCORE)
     94 
     95 values ('1008', '001', 47.00);
     96 
     97  
     98 
     99 insert into sc (S#, C#, SCORE)
    100 
    101 values ('1005', '006', 99.00);
    102 
    103  
    104 
    105 insert into sc (S#, C#, SCORE)
    106 
    107 values ('1012', '002', 22.00);
    108 
    109  
    110 
    111 insert into sc (S#, C#, SCORE)
    112 
    113 values ('1001', '001', 60.00);
    114 
    115  
    116 
    117 insert into sc (S#, C#, SCORE)
    118 
    119 values ('1001', '002', 88.00);
    120 
    121  
    122 
    123 insert into sc (S#, C#, SCORE)
    124 
    125 values ('1001', '004', 20.00);
    126 
    127  
    128 
    129 insert into sc (S#, C#, SCORE)
    130 
    131 values ('1002', '006', 20.00);
    132 
    133  
    134 
    135 insert into sc (S#, C#, SCORE)
    136 
    137 values ('1003', '002', 78.00);
    138 
    139  
    140 
    141 insert into sc (S#, C#, SCORE)
    142 
    143 values ('1003', '006', 90.00);
    144 
    145  
    146 
    147 insert into sc (S#, C#, SCORE)
    148 
    149 values ('1003', '001', 97.00);
    150 
    151  
    152 
    153 insert into sc (S#, C#, SCORE)
    154 
    155 values ('1003', '003', 72.00);
    156 
    157  
    158 
    159 insert into sc (S#, C#, SCORE)
    160 
    161 values ('1004', '002', 88.00);
    162 
    163  
    164 
    165 insert into sc (S#, C#, SCORE)
    166 
    167 values ('1004', '006', 62.00);
    168 
    169  
    170 
    171 insert into sc (S#, C#, SCORE)
    172 
    173 values ('1006', '001', 32.00);
    174 
    175  
    176 
    177 insert into sc (S#, C#, SCORE)
    178 
    179 values ('1006', '003', 99.00);
    180 
    181  
    182 
    183 insert into sc (S#, C#, SCORE)
    184 
    185 values ('1006', '004', 69.00);
    186 
    187  
    188 
    189 insert into sc (S#, C#, SCORE)
    190 
    191 values ('1006', '006', 73.00);
    192 
    193  
    194 
    195 insert into sc (S#, C#, SCORE)
    196 
    197 values ('1007', '001', 77.00);
    198 
    199  
    200 
    201 insert into sc (S#, C#, SCORE)
    202 
    203 values ('1007', '002', 54.00);
    204 
    205  
    206 
    207 insert into sc (S#, C#, SCORE)
    208 
    209 values ('1007', '003', 83.00);
    210 
    211  
    212 
    213 insert into sc (S#, C#, SCORE)
    214 
    215 values ('1008', '006', 12.00);
    216 
    217  
    218 
    219 insert into sc (S#, C#, SCORE)
    220 
    221 values ('1008', '002', 55.00);
    222 
    223  
    224 
    225 insert into sc (S#, C#, SCORE)
    226 
    227 values ('1009', '002', 34.00);
    228 
    229  
    230 
    231 insert into sc (S#, C#, SCORE)
    232 
    233 values ('1010', '002', 84.00);
    234 
    235  
    236 
    237 insert into sc (S#, C#, SCORE)
    238 
    239 values ('1010', '006', 87.00);
    240 
    241  
    242 
    243 insert into sc (S#, C#, SCORE)
    244 
    245 values ('1011', '006', 99.00);
    246 
    247  
    248 
    249 insert into sc (S#, C#, SCORE)
    250 
    251 values ('1012', '004', 87.00);
    252 
    253  
    254 
    255 insert into sc (S#, C#, SCORE)
    256 
    257 values ('1002', '002', 75.00);
    258 
    259  
    260 
    261 insert into sc (S#, C#, SCORE)
    262 
    263 values ('1011', '001', 12.00);
    264 
    265  
    266 
    267 insert into sc (S#, C#, SCORE)
    268 
    269 values ('1011', '002', 76.00);
    270 
    271  
    272 
    273 insert into sc (S#, C#, SCORE)
    274 
    275 values ('1011', '004', 44.00);
    276 
    277  
    278 
    279 insert into sc (S#, C#, SCORE)
    280 
    281 values ('1012', '001', 89.00);
    282 
    283  
    284 
    285 insert into student (S#, SNAME, SAGE, SSEX)
    286 
    287 values ('1001', 'kangyue', 29, 'male');
    288 
    289  
    290 
    291 insert into student (S#, SNAME, SAGE, SSEX)
    292 
    293 values ('1002', 'wangyu', 29, 'male');
    294 
    295  
    296 
    297 insert into student (S#, SNAME, SAGE, SSEX)
    298 
    299 values ('1003', '王新刚', 30, '');
    300 
    301  
    302 
    303 insert into student (S#, SNAME, SAGE, SSEX)
    304 
    305 values ('1004', '鲁豫', 27, 'famale');
    306 
    307  
    308 
    309 insert into student (S#, SNAME, SAGE, SSEX)
    310 
    311 values ('1005', 'sanhui', 29, 'male');
    312 
    313  
    314 
    315 insert into student (S#, SNAME, SAGE, SSEX)
    316 
    317 values ('1006', '梦涵', 28, 'famale');
    318 
    319  
    320 
    321 insert into student (S#, SNAME, SAGE, SSEX)
    322 
    323 values ('1007', 'yangdayong', 30, 'male');
    324 
    325  
    326 
    327 insert into student (S#, SNAME, SAGE, SSEX)
    328 
    329 values ('1008', 'sunguoqiang', 30, 'male');
    330 
    331  
    332 
    333 insert into student (S#, SNAME, SAGE, SSEX)
    334 
    335 values ('1009', '李宏利', 49, 'male');
    336 
    337  
    338 
    339 insert into student (S#, SNAME, SAGE, SSEX)
    340 
    341 values ('1010', '小心', 20, 'famale');
    342 
    343  
    344 
    345 insert into student (S#, SNAME, SAGE, SSEX)
    346 
    347 values ('1011', '小泉', 99, 'male');
    348 
    349  
    350 
    351 insert into student (S#, SNAME, SAGE, SSEX)
    352 
    353 values ('1012', '特里', 39, 'male');
    354 
    355  
    356 
    357 insert into teacher (T#, TNAME)
    358 
    359 values ('9001', '崔老师');
    360 
    361  
    362 
    363 insert into teacher (T#, TNAME)
    364 
    365 values ('9002', '颜老师');
    366 
    367  
    368 
    369 insert into teacher (T#, TNAME)
    370 
    371 values ('9003', '岳老师');
    372 
    373  
    374 
    375 insert into teacher (T#, TNAME)
    376 
    377 values ('9004', '夏老师');
    378 
    379  
    380 
    381 insert into teacher (T#, TNAME)
    382 
    383 values ('9005', '杨老师');
    384 
    385  
    386 
    387 insert into teacher (T#, TNAME)
    388 
    389 values ('9006', '叶平');
    390 
    391  
    392 
    393 insert into teacher (T#, TNAME)
    394 
    395 values ('9007', '梦老师');

     

    *************************************************************************************************************************

    完成以下语句:

    1、查询001课程比002课程成绩高的所有学生的学号;

    View Code
     1 SELECT T2.S#--, T2.COURSE_001, T2.COURSE_002
     2 
     3 FROM
     4 
     5 (
     6 
     7   SELECT T1.S#, SUM(T1.COURSE_001) COURSE_001, SUM(T1.COURSE_002) COURSE_002
     8 
     9   FROM
    10 
    11   (
    12 
    13     SELECT S#,
    14 
    15            CASE WHEN C# = '001'THEN SCORE
    16 
    17                 ELSE 0
    18 
    19                 END COURSE_001,
    20 
    21            CASE WHEN C# = '002'THEN SCORE
    22 
    23                 ELSE 0
    24 
    25                 END COURSE_002
    26 
    27     FROM SC
    28 
    29   ) T1
    30 
    31   GROUP BY S#
    32 
    33 ) T2
    34 
    35 WHERE T2.COURSE_001 > T2.COURSE_002

    2、查询平均成绩大于60分的同学的学号和平均成绩;

    View Code
    1 SELECT S#, AVG(SCORE) SCORE
    2 
    3 FROM SC
    4 
    5 GROUP BY S#
    6 
    7 HAVING AVG(SCORE) >60

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

    View Code
     1 SELECT T1.S#, T1.SNAME, T2.CNT, T2.TOTAL_SCORE
     2 
     3 FROM STUDENT T1,
     4 
     5 (
     6 
     7 SELECT S#, COUNT(1) CNT, SUM(SCORE) TOTAL_SCORE
     8 
     9 FROM SC
    10 
    11 GROUP BY S#
    12 
    13 ) T2
    14 
    15 WHERE T1.S# = T2.S#

    4、查询姓“李”的老师的个数;

    View Code
    1 SELECT COUNT(1) FROM TEACHER WHERE TNAME LIKE '李%';

    5、查询没学过“叶平”老师课的同学的学号、姓名;

    View Code
     1 SELECT T.S#, T.SNAME
     2 
     3   FROM STUDENT T
     4 
     5 WHERE T.S# NOT IN (SELECT S#
     6 
     7                   FROM SC
     8 
     9                  WHERE C# IN (SELECT C#
    10 
    11                                 FROM TEACHER T1, COURSE T2
    12 
    13                                WHERE T1.T# = T2.T#
    14 
    15                                  AND TNAME = '叶平'));

    6、查询学过“001并且也学过编号002”课程的同学的学号、姓名;

    View Code
     1 SELECT T1.S#, T1.SNAME
     2 
     3   FROM STUDENT T1
     4 
     5 WHERE EXISTS (SELECT T2.S#
     6 
     7           FROM SC T2
     8 
     9          WHERE T2.C# IN ('001', '002')
    10 
    11            AND T2.S# = T1.S#
    12 
    13          GROUP BY T2.S#
    14 
    15         HAVING COUNT(1) > 1);
    32.--法一:  
    33.  
    34.SELECT c.s#,c.sname FROM t_wolf_student c WHERE c.s# IN(  
    35.  
    36.SELECT a.s# FROM t_wolf_sc a WHERE a.c#='001'  
    37.  
    38.INTERSECT  
    39.  
    40.SELECT b.s# FROM t_wolf_sc b WHERE b.c#='002');  
    41.  
    42.--法二:  
    43.  
    44.SELECT a.s#,a.sname FROM t_wolf_student a,t_wolf_sc b WHERE a.s#=b.s# AND b.c#='001' AND EXISTS   
    45.  
    46.(SELECT * FROM t_wolf_sc c WHERE c.c#='002' AND c.s#=b.s#);  
    47.  
    

       

    7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;

    View Code
     1 SELECT T.S#, T.SNAME
     2 
     3   FROM STUDENT T
     4 
     5 WHERE T.S# IN (SELECT S#
     6 
     7                   FROM SC
     8 
     9                  WHERE C# IN (SELECT C#
    10 
    11                                 FROM TEACHER T1, COURSE T2
    12 
    13                                WHERE T1.T# = T2.T#
    14 
    15                                  AND TNAME = '叶平'));

     

    8、查询课程编号001的成绩比课程编号002课程低的所有同学的学号、姓名;

    View Code
     1 SELECT T3.S#, T3.SNAME--, T2.COURSE_001, T2.COURSE_002
     2 
     3 FROM
     4 
     5 (
     6 
     7   SELECT T1.S#, SUM(T1.COURSE_001) COURSE_001, SUM(T1.COURSE_002) COURSE_002
     8 
     9   FROM
    10 
    11   (
    12 
    13     SELECT S#,
    14 
    15            CASE WHEN C# = '001'THEN SCORE
    16 
    17                 ELSE 0
    18 
    19                 END COURSE_001,
    20 
    21            CASE WHEN C# = '002'THEN SCORE
    22 
    23                 ELSE 0
    24 
    25                 END COURSE_002
    26 
    27     FROM SC
    28 
    29   ) T1
    30 
    31   GROUP BY S#
    32 
    33 ) T2,
    34 
    35 STUDENT T3
    36 
    37 WHERE T2.S# = T3.S#
    38 
    39 AND   T2.COURSE_001 < T2.COURSE_002

    9、查询所有课程成绩小于60分的同学的学号、姓名;

    View Code
     1 SELECT T.S#, T.SNAME FROM STUDENT T
     2 
     3 WHERE EXISTS (SELECT DISTINCT T1.S#
     4 
     5           FROM SC T1
     6 
     7          WHERE NOT EXISTS (SELECT 1
     8 
     9                   FROM SC T2
    10 
    11                  WHERE T2.SCORE > 60
    12 
    13                    AND T2.S# = T1.S#)
    14 
    15            AND T1.S# = T.S#)

     

    这里需要注意的:

    View Code
     1 有两个简单例子,以说明 “exists”和“in”的效率问题
     2 
     3 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
     4 
     5     T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
     6 
     7 2) select * from T1 where T1.a in (select T2.a from T2) ;
     8 
     9      T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
    10 
    11 exists 用法:
    12 
    13 请注意 1)句中的有颜色字体的部分 ,理解其含义;
    14 
    15 其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于
    16 
    17select 1 from T1,T2     where T1.a=T2.a”
    18 
    19 但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。
    20 
    21exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
    22 
    23 因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。
    24 
    25  
    26 
    27 in 的用法:
    28 
    29 继续引用上面的例子
    30 
    312) select * from T1 where T1.a in (select T2.a from T2) ”
    32 
    33 这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
    34 
    35 打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:
    36 
    37select * from T1 where T1.ticketid in (select T2.id from T2) ”
    38 
    39 Select name from employee where name not in (select name from student);
    40 
    41 Select name from employee where not exists (select name from student);
    42 
    43 第一句SQL语句的执行效率不如第二句。
    44 
    45 通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因

     

    10、          查询没有学全所有课的同学的学号、姓名;

     

    View Code
     1 SELECT T1.S#, T1.SNAME FROM STUDENT T1
     2 
     3 WHERE NOT EXISTS (SELECT S#
     4 
     5           FROM (SELECT S#, COUNT(1) CNT FROM SC GROUP BY S#) T
     6 
     7          WHERE CNT = (SELECT COUNT(1) FROM COURSE)
     8 
     9            AND T.S# = T1.S#)
    10 
    11 ORDER BY T1.S#

    11、          查询至少有一门课与学号为1001的同学所学相同的同学的学号和姓名;

    View Code
     1 SELECT T1.S#, T1.SNAME
     2 
     3   FROM STUDENT T1,
     4 
     5        (SELECT DISTINCT S#
     6 
     7           FROM SC
     8 
     9          WHERE C# IN (SELECT C# FROM SC WHERE S# = 1001)
    10 
    11            AND S# != 1001) T2
    12 
    13 WHERE T1.S# = T2.S#

    12、          查询至少学过学号为1001同学所有课的其他同学学号和姓名;

    View Code
     1 SELECT DISTINCT T4.S#, T4.SNAME
     2 
     3   FROM (SELECT T1.S#, T1.CNT1, T2.CNT2, COUNT(1) OVER(PARTITION BY S#) CNT
     4 
     5           FROM (SELECT S#, C#, COUNT(1) OVER(PARTITION BY S#) CNT1
     6 
     7                   FROM SC
     8 
     9                  WHERE S# != '1001'
    10 
    11                  GROUP BY S#, C#) T1,
    12 
    13                (SELECT C#, COUNT(1) OVER(PARTITION BY S#) CNT2
    14 
    15                   FROM SC
    16 
    17                  WHERE S# = '1001') T2
    18 
    19          WHERE T1.C# = T2.C#
    20 
    21            AND T1.CNT1 >= T2.CNT2) T3,
    22 
    23        STUDENT T4
    24 
    25 WHERE T4.S# = T3.S#
    26 
    27    AND T3.CNT >= T3.CNT2

    13、          把SC表中叶平老师教的课的成绩都更改为此课程的平均成绩;(暂时未发现其他好办法)

    View Code
     1 UPDATE SC SET SC.SCORE=(
     2 
     3   WITH TT AS(
     4 
     5     SELECT T.C#, AVG(T.SCORE) SCO
     6 
     7       FROM SC T
     8 
     9      WHERE T.C# IN (SELECT T1.C#
    10 
    11                       FROM COURSE T1, TEACHER T2
    12 
    13                      WHERE T1.T# = T2.T#
    14 
    15                        AND T2.TNAME = '叶平')
    16 
    17      GROUP BY T.C#
    
    18 
    19   )
    20 
    21   SELECT SCO FROM TT WHERE TT.C# = SC.C#
    22 
    23 )
    24 
    25 WHERE EXISTS
    26 
    27           (SELECT T1.C#
    28 
    29             FROM COURSE T1, TEACHER T2
    30 
    31            WHERE T1.T# = T2.T#
    32 
    33              AND T2.TNAME = '叶平'
    34 
    35              AND T1.C# = SC.C#
    36 
    37           )

    14、          查询和1002号的同学学习的课程完全相同的其他同学学号和姓名;

    View Code
     1 SELECT DISTINCT T4.S#, T4.SNAME
     2 
     3   FROM (SELECT T1.S#, T2.CNT2, COUNT(1) OVER(PARTITION BY S#) CNT
     4 
     5           FROM (SELECT S#, C#, COUNT(1) OVER(PARTITION BY S#) CNT1
     6 
     7                   FROM SC
     8 
     9                  WHERE S# != '1002'
    10 
    11                  GROUP BY S#, C#) T1,
    12 
    13                (SELECT C#, COUNT(1) OVER(PARTITION BY S#) CNT2
    14 
    15                   FROM SC
    16 
    17                  WHERE S# = '1002') T2
    18 
    19          WHERE T1.C# = T2.C#
    20 
    21            AND T1.CNT1 = T2.CNT2) T3,
    22 
    23        STUDENT T4
    24 
    25 WHERE T4.S# = T3.S#
    26 
    27    AND T3.CNT = T3.CNT2

    15、          删除学习“叶平”老师课的SC表记录;

     

    View Code
    1 DELETE FROM SC T1
    2 
    3 WHERE EXISTS (SELECT 1
    4 
    5           FROM COURSE T2
    6 
    7          WHERE T2.T# IN (SELECT T# FROM TEACHER WHERE TNAME = '叶平')
    8 
    9            AND T2.C# = T1.C#)

    16、          向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号002课程的同学学号、002、002号课的平均成绩

    View Code
     1 INSERT INTO SC WITH TT AS
     2 
     3   (SELECT ROUND(AVG(SCORE), 2) AVG_SCORE FROM SC WHERE C# = '002')
     4 
     5   SELECT DISTINCT T1.S#, '002', TT.AVG_SCORE
     6 
     7     FROM SC T1, TT
     8 
     9    WHERE NOT EXISTS (SELECT T2.S#
    10 
    11             FROM SC T2
    12 
    13            WHERE T2.C# = '002'
    14 
    15              AND T2.S# = T1.S#)

    17、          按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分;

    View Code
     1 SELECT S#, ENTERPRISE_, DATABASE_, ENGLISH_, SCORE_CNT,
     2 
     3        TRUNC((NVL(ENTERPRISE_, 0) + NVL(DATABASE_, 0) + NVL(ENGLISH_, 0))/SCORE_CNT, 2) AVG_SCORE
     4 
     5 FROM
     6 
     7 (
     8 
     9   SELECT S#, ENTERPRISE_, DATABASE_, ENGLISH_,
    10 
    11          DECODE(ENTERPRISE_, '', DECODE(DATABASE_, '', DECODE(ENGLISH_, '', 0, 1), DECODE(ENGLISH_, '', 1, 2)), DECODE(DATABASE_, '',DECODE(ENGLISH_, '', 1, 2), DECODE(ENGLISH_,'',2, 3))) SCORE_CNT
    12 
    13   FROM(
    14 
    15     SELECT S#, SUM(ENTERPRISE_) ENTERPRISE_, SUM(DATABASE_) DATABASE_, SUM(ENGLISH_) ENGLISH_
    16 
    17     FROM
    18 
    19     (
    20 
    21     SELECT S#,
    22 
    23            CASE WHEN C# = '001' THEN SCORE
    24 
    25            ELSE NULL
    26 
    27            END ENTERPRISE_,
    28 
    29            CASE WHEN C# = '004' THEN SCORE
    30 
    31            ELSE NULL
    32 
    33            END DATABASE_,
    34 
    35            CASE WHEN C# = '006' THEN SCORE
    36 
    37            ELSE NULL
    38 
    39            END ENGLISH_
    40 
    41       FROM SC
    42 
    43      WHERE C# IN(SELECT C# FROM COURSE WHERE CNAME IN ('数据库', '企业管理', '英语'))
    44 
    45      )
    46 
    47      GROUP BY S#
    48 
    49    )
    50 
    51 );

    18、          查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

    View Code
    1 SELECT C#, MAX(SCORE), MIN(SCORE) FROM SC GROUP BY C#;

    19、          按各科平均成绩从低到高和及格率的百分数从高到低顺序;

     

    View Code
     1 SELECT T1.C#,
     2 
     3          ROUND(T1.AVG_SCORE, 2) AVG_SCORE,
     4 
     5          ROUND(T2.PASS_COUNT / T1.ALL_COUNT, 2) PASS_POINT
     6 
     7     FROM (SELECT DISTINCT C#,
     8 
     9                           COUNT(1) OVER(PARTITION BY C# ORDER BY C#) ALL_COUNT,
    10 
    11                           AVG(SCORE) OVER(PARTITION BY C# ORDER BY C#) AVG_SCORE
    12 
    13             FROM SC) T1,
    14 
    15          (SELECT DISTINCT C#,
    16 
    17                           COUNT(1) OVER(PARTITION BY C# ORDER BY C#) PASS_COUNT
    18 
    19             FROM SC
    20 
    21            WHERE SCORE >= 60) T2
    22 
    23    WHERE T1.C# = T2.C#
    24 
    25    ORDER BY AVG_SCORE, PASS_POINT DESC

    20、          查询如下课程平均成绩和及格率的百分数: 企业管理(C#为001)平均分,企业管理及格百分数,马克思平(C#为002)均分,马克思及格百分数,UML(C#为003)平均分,UML及格百分数,数据库平均分(C#为004),数据库及格百分数

    View Code
     1 WITH TT AS( 
     2 
     3        SELECT C#, SCORE
     4 
     5        FROM SC
     6 
     7        WHERE C# IN (SELECT C#
     8 
     9                     FROM COURSE
    10 
    11                     WHERE CNAME IN ('企业管理', '马列', 'UML', '数据库'))
    12 
    13    )
    14 
    15    SELECT T1.C#,
    16 
    17          ROUND(T1.AVG_SCORE, 2) AVG_SCORE,
    18 
    19          ROUND(T2.PASS_COUNT / T1.ALL_COUNT*100, 2) || '%' PASS_POINT
    20 
    21     FROM (SELECT DISTINCT C#,
    22 
    23                           COUNT(1) OVER(PARTITION BY C# ORDER BY C#) ALL_COUNT,
    24 
    25                           AVG(SCORE) OVER(PARTITION BY C# ORDER BY C#) AVG_SCORE
    26 
    27             FROM TT) T1,
    28 
    29          (SELECT DISTINCT C#,
    30 
    31                           COUNT(1) OVER(PARTITION BY C# ORDER BY C#) PASS_COUNT
    32 
    33             FROM TT
    34 
    35            WHERE SCORE >= 60) T2
    36 
    37    WHERE T1.C# = T2.C#
  • 相关阅读:
    【c++】中文设置
    《谁动了我的奶酪》读后感
    KMP算法的C++实现
    我也说说中文分词(上:基于字符串匹配)
    删除字符串中的空格
    linux jdk bin安装
    笔试题汇总
    栈的压入、弹出序列
    顺序打印矩阵
    二叉树镜像
  • 原文地址:https://www.cnblogs.com/baiyixianzi/p/sql1.html
Copyright © 2011-2022 走看看