oracle 练习50题

** 以下五行是 Oracle 创建用户的操作,若为 mysql 则可忽略

create user zxq identified by zxq;       #-- 创建用户

grant create session to zxq;              # -- 创建会话权限

grant create table to zxq;                 #-- 创建表权限

grant unlimited tablespace to zxq;         #-- 分配表空间使用权限

select tname from tab;                    #-- 查用户中的表

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

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

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

Teacher(T#,Tname) 教师表

Student(S_id,Sname,Sage,Ssex) 学生表

学生编号: S_id

学生姓名: Sname

出生年月: Sage

学生性别: Ssex

Course(C_id,Cname,T_id) 课程表

课程编号: C_id

课程名称: Cname

教师编号: T_id

Teacher(T_id,Tname) 教师表

教师编号: T_id

教师姓名: Tname

SC(S_id,C_id,score) 成绩表

学生编号:S_id

课程编号:C_id

分数:    score

教师表

create table Teacher (T_id varchar(10),Tname varchar(20));          

insert into Teacher values('01','Li Pengfei');

insert into Teacher values('02','Wang Wen');

insert into Teacher values('03','Zhang Zhichao');

select * from Teacher;

学生表 

create table Student (S_id varchar(10),Sname varchar(20),Sage date,Ssex varchar(10));

insert into Student values('01','Zhao Lei',to_date('1990-01-01','YYYY-MM-DD'),'MAN');   

insert into Student values('02','Qian Dian',to_date('1990-12-21','YYYY-MM-DD'),'MAN');

insert into Student values('03','Sun Feng',to_date('1990-05-20','YYYY-MM-DD'),'MAN');

insert into Student values('04','Li Yun',to_date('1990-08-06','YYYY-MM-DD'),'MAN');

insert into Student values('05','Zhou Mei',to_date('1991-12-01','YYYY-MM-DD'),'WOMAN');

insert into Student values('06','Wu Lan',to_date('1992-03-01','YYYY-MM-DD'),'WOMAN');

insert into Student values('07','Zheng Zhu',to_date('1989-07-01','YYYY-MM-DD'),'WOMAN');

insert into Student values('08','Wang Ju',to_date('1990-01-20','YYYY-MM-DD'),'WOMAN');

select * from Student;

课程表

create table Course (C_id varchar(10),Cname varchar(10),T_id varchar(10));

insert into Course values('01','CHINESE','02');

insert into Course values('02','MATH','01');

insert into Course values('03','ENGLISH','03');

select * from Course;

成绩表

create table SC (S_id varchar(10),C_id varchar(10),score number(3,0));      -- Mysql 支持字符型 float,

insert into SC values('01','01','80');

insert into SC values('01','02','90');

insert into SC values('01','03','99');

insert into SC values('02','01','70');

insert into SC values('02','02','60');

insert into SC values('02','03','80');

insert into SC values('03','01','80');

insert into SC values('03','02','80');

insert into SC values('03','03','80');

insert into SC values('04','01','50');

insert into SC values('04','02','30');

insert into SC values('04','03','20');

insert into SC values('05','01','76');

insert into SC values('05','02','87');

insert into SC values('06','01','31');

insert into SC values('06','03','34');

insert into SC values('07','02','89');

insert into SC values('07','03','98');

commit;

select * from SC;

01、 查询'01'课程比'02'课程成绩高的所有学生的学号;

 (一)select a.S_id from SC a,SC b

     where a.C_id = 01 and b.C_id = 02 and a.SCORE > b.SCORE and a.S_id = b.S_id;

 (二)select a.S_id from

     (select S_id,C_id,score from sc where C_id = '01') a

     join (select S_id,C_id,score from sc where C_id = '02') b

     on a.S_id = b.S_id where a.score > b.score;  

 

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

select S_id,avg(score) from sc

 group by S_id

 having avg(score) > 60;

 

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

select s.S_id,s.Sname,nvl(count(sc.C_id),0),nvl(sum(sc.score),0) from student s

 left join sc on s.S_id = sc.S_id

 group by s.S_id,s.Sname;

 

04、 查询姓“Li” 的老师个数;

 (一)select count(*) from teacher where Tname like 'Li%';

 (二)select count(*) from teacher where instr(tname,'Li') = 1;

 

05、 查询没学过“Li Pengfei”老师课的同学的学号、姓名;

(一)select s.S_id,s.Sname from student s where s.S_id not in

   (select S_id from sc where C_id  in

   (select C_id from course where T_id  in

   (select T_id from teacher where Tname = 'Li Pengfei')));

(二)select s.S_id,s.Sname from student s where s.S_id not in

   (select S_id from sc

   join course c on sc.C_id = c.C_id

   join teacher t on c.T_id = t.T_id

   and t.Tname = 'Li Pengfei');

      

06、 查询学过“01”并且也学过“02”课程的同学的学号、姓名; 

select a.S_id,(select s.Sname from student s where a.S_id = s.S_id) S_name from sc a,sc b

 where a.C_id = 01 and b.C_id = 02 and a.S_id = b.S_id

 group by a.S_id;

 

07、 查询学过“Li Pengfei”老师所教的所有课的同学的学号、姓名; 

select s.S_id,s.Sname from student s where s.S_id in

 (select S_id from sc where C_id in

 (select C_id from course where T_id in

 (select T_id from teacher where Tname = 'Li Pengfei')));

08、 查询课程编号“02”的成绩比课程编号“01”课程低的所有同学的学号、姓名;

(一)select s.S_id,s.Sname from student s,sc a,sc b

    where a.C_id = 02 and b.C_id = 01 and s.S_id = a.S_id and s.S_id = b.S_id and a.score < b.score;

(二)select s.S_id,s.Sname from student s,(select * from sc where C_id = '01') a,(select * from sc where C_id = '02') b

    where s.S_id = a.S_id and s.S_id = b.S_id and b.score < a.score;

  

09、 查询所有课程成绩小于80分的同学的学号、姓名;(查看两段sql的区别)

(一)select s.S_id,s.Sname from student s,sc where s.S_id = sc.S_id

    group by s.S_id,s.Sname having max(score) < 80;-----------------没有8号同学

  

(二) select S_id,Sname from student where S_id not in (select S_id from sc where score >= 80);

 

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

 select s.S_id,s.Sname from student s where s.S_id not in

 (select sc.S_id from sc group by sc.S_id having count(sc.C_id) = (select count(c.C_id) from course c));

 

11、 查询至少有一门课与学号为“07”的同学所学相同的同学的学号和姓名;         -- 至少,代表最少一门,就都包含 

select distinct a.S_id,(select Sname from student s where s.S_id = a.S_id) S_name from sc a

    where not exists (select * from sc b where b.S_id = '07'

       and not exists (select * from sc c where c.C_id = b.C_id and c.S_id = a.S_id));

 

12、 查询学过学号为“07”的同学所有门课的其他同学学号和姓名;       -- 注意:所有门课

 select distinct S_id,(select Sname from student s where s.S_id = sc.S_id) S_name from sc where C_id in

 (select distinct C_id from sc where S_id = '07')

 and S_id != '07'

 group by S_id

 having count(*) = (select count(1) from sc where S_id = '07');

 

14、 查询和“07”号的同学学习的课程完全相同的其他同学的学号和姓名; -- 注意:完全相同  - update sc set c_id = '02' where s_id = '06' and score = '31'; 

select S_id,(select Sname from student s where s.S_id = sc.S_id) S_name from sc where C_id not in

  (select C_id from sc where S_id = '07')

  group by sc.S_id

  having count(*) = (select count(*) from sc where S_id = '07');

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

delete from sc where C_id in

 (select C_id from course where T_id in

 (select T_id from teacher where T_name = 'Li Pengfei'))

 select * from sc;

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

 (一)  insert into sc(S_id,C_id,score)

     select distinct s.S_id,'02',(select avg(score) from sc where C_id = '02')

     from student s

     left join sc on sc.S_id = s.S_id

     where s.S_id not in (select S_id from sc where C_id = '03');

    

     select * from sc;

      

(二) insert into sc(S_id,C_id,score)

     select distinct s.S_id,sc.C_id,(select avg(score) from sc where C_id = '02')

     from student s,sc

     where not exists (select * from sc where C_id = '03' and sc.S_id = s.S_id) and sc.C_id = '02';

    

     select * from sc;

 

17、 按平均成绩从高到低显示所有学生的“数学”,“语文”,“英语”三门的课程成绩,

按如下形式显示:student_id,math,chinese,english,course_sum,avg_score;

 select

        tt.S_id student_id,tt.math math,tt.chinese chinese,tt.english english,tt1.course_num,tt1.avg_score

 from

        (select t.S_id,

           sum(decode(t.Cname,'MATH',t.score,0)) as math,

           sum(decode(t.Cname,'CHINESE',t.score,0)) as chinese,

           sum(decode(t.Cname,'ENGLISH',t.score,0)) as english

        from (select c.S_id,c.C_id,c.score,d.Cname from sc c left join course d on c.C_id = d.C_id) t

        group by t.S_id

        ) tt

 inner join

        (select S_id,sum(score) course_num,round(avg(score),1) avg_score from sc group by S_id) tt1

 on tt.S_id = tt1.S_id

 order by tt1.avg_score desc;

   

18、 查询各科成绩最高和最低分,以如下形式显示:cours_id,max,min

 select C_id course_id,max(score) max,min(score) min from sc group by C_id;

     

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

 select sc.C_id,avg(sc.score),

  100*sum(case when sc.score >= 60 then 1 else 0 end)/count(1)||'%'

 from sc

 group by sc.C_id

 order by avg(sc.score),

 sum(case when sc.score >= 60 then 1 else 0 end)/count(1) desc;

 

20、 查询如下课程平均成绩和及格率的百分数(用“1行”显示):math(01),chinese(02),english(03); 

select

   sum

    (case when c_id='01' then score else 0 end)/

    sum(case when c_id='01' then 1 else 0 end) "math_avg",

  (sum

    (case when c_id='01' and score>=60 then 1 else 0 end)/

    sum(case when c_id='01' then 1 else 0 end))*100||'%'"math_rate",

   sum

     (case when c_id='02' then score else 0 end)/

     sum(case when c_id='02' then 1 else 0 end) "chinese_avg",

  (round

   (sum(case when c_id='02' and score>=60 then 1 else 0 end)/

     sum(case when c_id='02' then 1 else 0 end),2)

  )*100||'%'"chinese_rate",

  sum(case when c_id='03' then score else 0 end)/

  sum(case when c_id='03' then 1 else 0 end) "english_avg",

  (round

   (sum(case when c_id='03' and score>=60 then 1 else 0 end)/

   sum(case when c_id='03' then 1 else 0 end),2)

  )*100||'%'"english_rate"

 from sc;

21、 查询不同老师所教不同课程平均分从高到低显示; 

select tname,sc.c_id,cname,avg(score)

  from sc,course c,teacher t where t.t_id=c.t_id and sc.c_id=c.c_id

  group by sc.c_id,tname,cname

  order by avg(score) desc;

22、 查询如下课程成绩从第3名到第6名的学生成绩单:math(01),chinese(02),english(03)-student_id,student_name,math,chinese,english,avg_score;    (本题有争议)   

select * from

  (select s.s_id student_id,s.sname student_name,

       sum(case when c_id = '01' then score else 0 end) math,

       sum(case when c_id = '02' then score else 0 end) chinese,

       sum(case when c_id = '03' then score else 0 end) english,

       avg(sc.score) avg_score,

       row_number() over(order by avg(sc.score) desc) r

  from student s,sc

  where s.s_id = sc.s_id

  group by s.s_id,s.sname)

  where r >= 3 and r <= 6;

23、 统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[-60]

 select

  a.C_id,

  a.Cname,

  sum(case when score > 85 and score <= 100 then 1 else 0 end) as yi,

  sum(case when score > 70 and score <= 85 then 1 else 0 end) as er,

  sum(case when score > 60 and score <= 70 then 1 else 0 end) as san,

  sum(case when score > 0 and score <= 60 then 1 else 0 end) as si

 from course a,sc b

 where b.C_id = a.C_id

 group by a.C_id,a.Cname;

  

24、 查询学生平均成绩及其名次;

 

(一)select S_id ,avg(score) avg,rank() over(order by avg(score) desc) paiming from sc group by S_id;

 

(二)select S_id,round(avg(score),1) avg,rank() over(order by avg(score) desc) paiming from sc group by S_id;--------------------保留小数一位

 

25、 查询各科成绩前三名的记录:(不考虑成绩并列情况)

 select * from

 (select S_id,C_id,score,

 row_number() over(partition by C_id order by score desc) rn

 from sc)

 t

 where t.rn < 4;

   

26、 查询每门课程被选修的学生数;

 select C_id,count(S_id) from sc group by C_id;

   

27、 查询出只选修了2门课程的全部学生的学号和姓名;

 select S_id,(select Sname from student s where a.S_id = s.S_id) S_name

 from sc a

 group by a.S_id having count(C_id) = 2;

 

28、 查询男生、女生人数

select ssex,count(*) from student group by ssex;

 

29、 查询姓“张”的学生名单;

 select Sname from student where Sname like 'Zhang%'

   

30、 查询同名同姓学生名单,并统计同名人数;

 select sname,count(*) renshu from student group by sname having count(*) > 1;

 

311990年出生的学生名单(注:student表中的sage列的类型是datetime); 

 select * from student where to_char(sage,'YYYY') = '1990';

 

32、 查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;

 select C_id,avg(score) from sc group by C_id order by avg(score) asc,C_id desc;

  

34、 查询课程名称为“MATH”,且分数低于60的学生姓名和分数;

 select s.Sname,sc.score from student s,sc,course c

 where s.S_id = sc.S_id and sc.C_id = c.C_id and c.Cname = 'MATH' and sc.score < 60;

 

35、 查询所有学生的选课情况;

 select s.S_id,s.Sname,c.Cname from student s,sc,course c where s.S_id = sc.S_id and sc.C_id = c.C_id;

    

36、 查询每门课程成绩在70分以上的姓名、课程名称和分数;

 select s.Sname,c.Cname,sc.score from student s,sc,course c

 where s.S_id = sc.S_id and sc.C_id = c.C_id and sc.score > 70;

 

37、 查询不及格的课程,显示学号、姓名、课程号、成绩;

 select sc.S_id,(select Sname from student s where s.S_id = sc.S_id) S_name,C_id,score from sc where score < 60;

 

38、 查询课程编号为03且课程成绩在80分以上的学生的学号和姓名;

 select S_id,(select Sname from student s where s.S_id = sc.S_id) S_name from sc where C_id = 03 and score > 80;

 

39、 求选了课程的学生人数;

 select count(distinct S_id) from sc;

  

40、 查询选修“Li Pengfei”老师所授课程的学生中,成绩最高的学生姓名及其成绩;

 select s.Sname,sc.score from student s,sc,course c,teacher t

 where s.S_id = sc.S_id and sc.C_id = c.C_id and c.T_id = t.T_id and t.Tname = 'Li Pengfei'

 and sc.score = (select max(score) from sc where sc.C_id = c.C_id);

 

41、 查询各个课程及相应的选修人数;

 select C_id,count(C_id) from sc group by C_id;

 

42、 查询不同课程成绩相同的学生的学号、课程号、学生成绩;

select distinct a.S_id, a.C_id,a.score from sc a,sc b

where a.S_id = b.S_id and a.C_id != b.C_id

and a.score = b.score;

  

43、 查询每门课程成绩最好的前两名; 

(一)select * from

     (select C_id,S_id,score,

     row_number() over(partition by C_id order by score desc) rn

     from sc)

     t

     where t.rn < 3;

    

 (二)select a.C_id,a.S_id,a.score from sc a

     left join sc b

     on a.C_id = b.C_id

     and a.score <b.score

     group by a.C_id,a.S_id,a.score

     having count(a.C_id) < 2;---------------------无法排序

    

(三)select a.C_id,a.score,a.s_id

      from sc a where

      (select count(*) from sc b where a.C_id = b.C_id and a.score < b.score) < 2

      order by a.C_id asc,a.score desc;

  

44、 统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列;

 select C_id,count(S_id)

 from sc

 group by C_id

 having count(S_id) > 5

 order by count(S_id) desc,C_id asc;

45、 检索至少选修3门课程的学生学号;

 select S_id from sc group by S_id having count(C_id) >= 3;

  

46、 查询全部学生都选修的课程的课程号和课程名;

 select c.C_id,c.Cname from course c

 where c.C_id in

 (select C_id from sc group by C_id having count(S_id) = (select count(S_id) from student));

 

47、 查询没学过“Li Pengfei”老师所授的任一门课程的学生姓名; 

select Sname from student s where s.S_id not in

 (select sc.S_id from sc where sc.C_id in

 (select c.C_id from course c where c.T_id in

 (select t.T_id from teacher t where Tname = 'Li Pengfei')));

 

48、 查询两门以上不及格课程的同学的学号及其平均成绩;

 select S_id,avg(score) from sc where S_id in

 (select S_id from sc where score < 60 group by S_id having count(C_id) > 1) group by S_id;

 

49、 检索“04”课程分数小于60,按分数降序排列的同学学号; 

select S_id from sc where C_id = '04' and score < 60 order by score desc;

  

50、 删除“02”同学的“01”课程的成绩;

 delete from sc where S_id = '02' and C_id = '01';

 select * from sc;

  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值