一个颇有意思的SQL语句

前几天,一个朋友在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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值