一個頗有意思的SQL語句

lawzjf發表於2006-05-04

前幾天,一個朋友在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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章