前几天,一个朋友在QQ上问了一个SQL语句的写法:
已知三个表:
学生表(学号,姓名),课程表(课程号,课程名),选课表(学号,课程号,成绩)
要求查询选课最多的学生的姓名、课程名、成绩。
一直没时间(心情)考虑,五一放假,有了闲暇时间,今天早晨琢磨了一下。
首先创建三个测试表:
--学生表
SQL> create table stu
2 (
3 stuNo number primary key,
4 stuName varchar2(12)
5 )
6 /
表已创建。
--课程表
SQL> create table course
2 (
3 courseNo number primary key,
4 courseName varchar2(20)
5 )
6 /
表已创建。
--选课表
SQL> create table sel
2 (
3 stuNo number references stu(stuNo),
4 courseNo number references course(courseNo),
5 grade number,
6 primary key(stuNo,courseNo)
7 )
8 /
表已创建。
再添加测试数据:
SQL> insert into stu values(1001,'John');
已创建 1 行。
SQL> insert into stu values(1002,'Mike');
已创建 1 行。
SQL> insert into stu values(1003,'Tom');
已创建 1 行。
SQL> insert into stu values(1004,'Smith');
已创建 1 行。
SQL> insert into course values(200601,'English');
已创建 1 行。
SQL> insert into course values(200602,'Maths');
已创建 1 行。
SQL> insert into course values(200603,'Computer');
已创建 1 行。
SQL> insert into course values(200604,'Game');
已创建 1 行。
SQL> insert into sel values(1001,'200601',60);
已创建 1 行。
SQL> insert into sel values(1002,'200601',70);
已创建 1 行。
SQL> insert into sel values(1002,'200602',80);
已创建 1 行。
SQL> insert into sel values(1002,'200603',90);
已创建 1 行。
SQL> insert into sel values(1003,'200601',90);
已创建 1 行。
SQL> insert into sel values(1003,'200602',50);
已创建 1 行。
SQL> insert into sel values(1004,'200604',55);
已创建 1 行。
SQL> commit;
提交完成。
下面是这个问题的解决方法:
SQL> select stu.stuName,course.courseName,sel.grade
2 from stu,course,sel
3 where sel.stuNo=stu.stuNo
4 and sel.courseNo=course.courseNo
5 and sel.stuNo=(select stuNo from (select stuNo,count(*) from sel group by stuNo having count(*)=(select max(count(*)) from sel group by stuNo)))
6 /
STUNAME COURSENAME GRADE
------------ -------------------- ----------
Mike English 70
Mike Maths 80
Mike Computer 90
只是这个子查询太复杂,应该有更简单的方法。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/37724/viewspace-152536/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/37724/viewspace-152536/