oracle查询测试题
来源:互联网 发布:工资数据分析表 编辑:程序博客网 时间:2024/05/17 03:46
自己做过的oracle查询题目:
问题:
1, 找出没选过“黎明”老师的所有学生姓名。
2, 列出2门以上(含2门)不及格学生姓名及平均成绩。
3, 既学过1号课程又学过2号课所有学生的姓名。
4, 查询每门功课成绩最好的前两名
5, 查询出只选修了一门课程的全部学生的学号和姓名
6, 查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名
7, 查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名
8,查询选修‘张三’老师所授课程中成绩最好的学生姓名,课程编号和成绩。
9, 查询所有学生都选修的课程编号和课程名称(选作)
10, 查询学完所有课程的学生学号和姓名(选作)
自己的答案:
--1题 找出没选过“黎明”老师的所有学生姓名
select s.sname from s where sno notin(select t1.sno from sc t1 join c t2 on t1.cno = t2.cno where t2.cteacher='黎明')
--2题 列出2门以上(含2门)不及格学生姓名及平均成绩
select s.sname,t1.avgfen from s,(selectsc.sno,avg(scgrade) as avgfen from sc where sc.sno in (select sno from sc wherescgrade<60 group by sno having count(cno)>=2) group by sc.sno) t1 wheret1.sno = s.sno
--3题 既学过1号课程又学过2号课所有学生的姓名
--使用intersect关键字
select sname from s,sc
where s.sno=sc.sno and sc.cno =(select cnofrom c where c.cname='高数')
intersect
select sname from s,sc
where s.sno=sc.sno and sc.cno =(select cnofrom c where c.cname='化学');
--4题 查询每门功课成绩最好的前两名
select s.sname,s.sno,t.cno from (selectsno,cno,scgrade,row_number() over(partition by cno order by scgrade desc) asrowno from sc) t ,s where t.sno = s.sno and rowno<3
--用over partition by 我就可以查询到每位员工本来的具体信息和它所在部门的总工资:
--select name,dept,salary,sum(salary) over(partition by dept) total_salary from salary;
--用goup by 就没办法做到这点,只能查询到每个部门的总工资:
--select dept,sum(salary) total_salary fromsalary group by dept
--第五题 查询出只选修了一门课程的全部学生的学号和姓名
select s.sno,s.sname from s where s.snoin(select sc.sno from sc group by sc.sno having count(sc.cno)=1)
--第六题 查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名
--感觉这一题有歧义,可能比的是一个学生的2001成绩比2002成绩高,也肯能比的是2001成绩比2002成绩高德学生
--同一学生的比较
select s.sno,s.sname
from s, (select s.sno,scgrade from s,scwhere s.sno=sc.sno and sc.cno='2001') r1,(select s.sno,scgrade from s,sc wheres.sno=sc.sno and sc.cno='2002') r2
where r1.sno=r2.sno and s.sno = r1.sno ands.sno = r2.sno and r1.scgrade > r2.scgrade
group by s.sno,s.sname;
--不同的学生
select sno from sc where cno = 'c001' andsc.score >any (select score from sc where cno = 'c002');
--第七题查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名
--下面这个不对
select distinct s.sno,s.sname
from sc,s
where s.sno=sc.sno and cno in (select cnofrom sc where sno='1001');
--这个是正确的
--使用了自连接的思想
select s.sno,s.sname from s where s.sno in(SELECT a.sno FROM sc a,sc b WHERE a.sno<> '1001' AND b.sno = '1001' AND a.cno = b.cno GROUP BY a.sno HAVING COUNT(*) = (SELECT COUNT(*) FROM sc c WHERE c.sno = '1001'))
--第八题查询选修‘张三’老师所授课程中成绩最好的学生姓名,课程编号和成绩
--这个语句中rownum这里出现问题
select s.sname,c.cno,sc.scgrade
from s,c,sc
where s.sno=sc.sno and c.cno=sc.cno andc.cteacher='黎明' and rownum =1
group by c.cno,s.sname,sc.scgrade;
--自己写的
select t.sno,t.scgrade,t.cno,s.sname from(select t1.*,rownum rowno from(select sc.sno,sc.scgrade,sc.cno from sc where sc.cno=(select c.cno from cwhere c.cteacher = '黎明') order by sc.scgrade desc) t1) t ,s where s.sno = t.sno androwno<2
--第九题
--查询所有学生都选修的课程编号和课程名称(选作)
--有歧义,一种意思是该课程所有学生都选了,另一种意思所有学生都选过的课,至少每门课都被选了一次。
select c.cno,c.cname from c wherec.cno in (select sc.cno from sc group bysc.cno having count(*)>=1)--另一种意思所有学生都选过的课,至少每门课都被选了一次。
select c.cno,c.cname from c where c.cnoin(select cno from sc group by sc.cno having count(*)=(select count(*) from s))
--第十题
-- 查询学完所有课程的学生学号和姓名(选作)
select s.sno,s.sname from s where s.sno in(select sc.sno from sc group by sc.sno having count(*) = (select count(*) fromc))
- oracle查询测试题
- oracle 查询测试样题
- oracle like模糊查询的优化测试
- ESQL查询之简单的Oracle数据库查询测试
- oracle测试题
- Oracle测试题
- oracle测试题一
- oracle测试题二
- ORACLE连接类型 各种连接查询PL/SQL测试
- Oracle百万数据的分页查询和测试案例
- 45 个非常有用的 Oracle 查询语句(未测试)
- oracle数据库闪回查询和闪回表测试
- 查询测试
- oracle之经典查询题
- Oracle 软件测试工程师日常工作中常用到的查询语句(除功能业务查询语句)
- oracle中的null测试题
- oracle中的null测试题
- Oracle查询
- Java 多线程编程学习(一)
- hdoj 5787 K-wolf Number 数位dp xjb搞水过
- Android面试知识(3)
- tjut 2689
- String与StringBuffer的区别
- oracle查询测试题
- Building the main Guest Additions modu
- Android源码的下载,清华asop镜像
- RPCA的一些理解
- CodeForces 140ANew Year Table
- ReactNative-Image组件
- http://www.cnblogs.com/zyw-205520/p/3762954.html
- 欢迎使用CSDN-markdown编辑器
- USB HID 设备类协议入门