zoukankan      html  css  js  c++  java
  • 查询、课程Oracle数据库之SQL语句练习by小雨

    本文纯属个人见解,是对前面习学的总结,如有描述不确正的地方还请高手指正~

                 由于被拉去行进建模赛比,小生的sql训练划计直接被延后了三天。趁着今晚没课(逃了)将这一套

         题集行进一下训练,强固下之前的习学。须要说明的是,训练所针对的据数都是来自上一盘文章中的

         http://blog.csdn.net/kiritor/article/details/8790214。据数未几,也就是生学、课程的关相息信。

                 1、查询“C001”课程比“C002”课程绩成高的全部生学的息信。    

                ☞  在from子句面后用使子查询

    select  s.*,a.cno,a.score from student s, 
     (
     select * from score where cno='C001'
     )a,
     (
      select * from score where cno='C002'
     )b
     where a.sno=b.sno and a.score>=b.score and s.SNO = a.SNO
     ;

                    用使关相子查询方法实现

    select * from student s, score a
       where a.cno ='C001'
       and exists
        (
           select * from score b 
           where b.cno='C002'
           and a.score >=b.score
           and a.sno = b.sno    
        )  
        and s.sno =a.sno
     ;

                    

        2、查询均平绩成大于60分的全部生学的息信,括包其均平绩成

                           第一种方法

        

    select s.sno,t.sname, avg(s.score) from student t, score s
     where t.sno=s.sno 
      group by (s.sno,t.sname) 
      having avg(s.score)>60
     ;

                   

        ☞  第二种方法

        

    select t.sno ,t.sname, m.avg_s from student t,
       (
         select s.sno, avg(s.score) avg_s from  score s
         group by s.sno having avg(s.score)>60
       ) m
       where m.sno = t.sno
     ;

                     3、查询全部同窗的姓名、学号、总绩成、选课数

        

    /*思绪:可以道知的是选课数、总绩成可以通过
       子查询中的置内函数查询出来的*/   
    --首先查询出总绩成与选课数
    select sum(score) ,count(cno) from score group by sno;
    --后之查询生学的学号姓名等息信就牵强附会了
    select t.* ,tmp.sum_sc,tmp.sum_cn from student t,
      (
        select sno, sum(score) sum_sc ,count(cno) sum_cn from score group by sno
      ) tmp
     where t.sno = tmp.sno
     ;

                     4、查询姓为“刘”的教师的息信

        

    select * from teacher where tname like '刘%'; 
     select count(*) from teacher where tname like '刘%';

                    5、查询学过“王燕”教师课的同窗的学号、姓名

                             思考:首先查询出王燕教师传授的课程的编号

                            第一种方法

    select  t.* ,s.cno,s.score from student t, score s
     where s.cno in    
       (
         select distinct cno from course c,teacher t
         where c.tno = 
          (
         select tno from teacher where tname='王燕'
          ) 
       ) 
       and t.sno = s.sno
    ;

                    

        ☞  第二种方法

        

    select * from student st 
        where st.sno  in
         (
           select distinct sno from score s join course c
             on s.cno=c.cno
             join teacher t on c.tno=t.tno 
             where tname='王燕'
         )  
    ;

                      6、查询学过“c001”并且也学过编号“c002”课程的同窗的学号、姓名

        

    --通过连接的方法实现
    select * from score s
     join score a on s.sno = a.sno 
     join student st on st.sno = s.sno
     where s.cno='C001' and a.cno = 'C002'
     and st.sno = s.sno
     ;

                   7、查询课程编号‘COO2’的绩成比课程编号为'C001'的绩成低的生学的全部息信。

                         呃,是不是有种似曾相识的感到呢,和第一题没有区分嘛,不过我们用采子查询的

                         方法来实现。

        

    select * from student t
     join score a on t.sno = a.sno
     join score b on t.sno = b.sno
     where a.cno = 'C002' 
         and b.cno ='C001'
         and a.score <= b.score
    ;

                 

       哈哈用使连接的方法看起来更加简略吧!

                        8、查询全部课程绩成都小于60分的生学的学号等息信

                          先来看看一种经常误以为是确正的查询吧!小生是在网上找的题库

                          案答什么的感到感到有些题问啊,还是自己斟酌吧

                          错误的查询:

        

    select st.*,s.score from student st
     join score s on st.sno=s.sno
     join course c on s.cno=c.cno
     where s.score <60

                       

        很轻易的可以道知这个查询只要有小于60分的课程都市查到,这其实不符合目题的要求

                         下一种查询方法:

                               思考全部的课程小于60,就是不存在某个生学的某门课程大于60分

    select t.*  from student t
      where  
         not  exists
         (
            select * from score s 
             where s.score >60.9  and t.sno = s.sno
         )
         and t.sno in
          (
             select sno from score
          )   
     ;

                 

        9、查询没有学完全部课程的生学的息信

                              

                               思考::

                                 1、我们该应道知统共的课程数
                             2、再在score表中查询,按照sno分组、并
                                   去重,加添having子句
             

    select  t.sno,t.sname from student t 
     left join  score on t.sno=score.sno
     group by t.sno,t.sname
     having count(score.cno)<
      (
        select count(distinct cno) from course
      )
    ;

                     10、查询至少有一门课与学号为‘S001’所选的课一样的

                        思绪:首先查询出学号为S001生学所选
                                     的全部课程的息信,后之行进判断

    select  t.sno,t.sname ,score.cno from student t 
    left join score on t.sno= score.sno
    where score.cno in
      (
        select distinct cno from score where sno='S001'
      )  
      and t.sno <>'S001'
    ;

                  第一阶段的训练就到这儿了。

    文章结束给大家分享下程序员的一些笑话语录: 面试官:熟悉哪种语言
    应聘者:JAVA
    面试官:知道什么叫类么
    应聘者:我这人实在,工作努力,不知道什么叫累
    面试官:知道什么是包?
    应聘者:我这人实在 平常不带包 也不用公司准备了
    面试官:知道什么是接口吗?
    应聘者:我这个人工作认真。从来不找借口偷懒
    面试官:知道什么是继承么
    应聘者:我是孤儿没什么可以继承的
    面试官:知道什么叫对象么?
    应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
    面试官:知道多态么?
    应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系??

  • 相关阅读:
    setTimeout 理解
    Git 使用规范流程
    JavaScript异步编程 ( 一 )
    javaScript模块化一
    javascript 知识点坑
    javaScript闭包
    函数式编程
    JavaScript的68个技巧一
    MySql 隐式转换
    MySQL优化
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3028928.html
Copyright © 2011-2022 走看看