先定义四个表:
教师关系: T (T#,TNAME,TITLE)
课程关系:C (C#,CNAME,T#)
学生关系:S (S#,SNAME,AGE,SEX)
选课关系:SC (S#,C#,SCORE)
1、检索至少选修课程号为C2和C4的学生学号
select X.S#
from SC AS X,SC AS Y
WHERE X.S#=Y.S# AND X.C# =‘C2‘ AND Y.C#=‘C4‘;
AS 可以省略 可以写成 SC X,SC Y
2、检索学习全部课程的学生姓名
思路: 在表S中找学生,要求这个学生学了全部的课程。换而言之,在表S 中找学生,在C中不存在一门课,这学生没有学。
SELECT SNAME
FROM S
WHERE NOT EXISTE /* C表中不存在一门课*/
( SELECT *
FROM C
WHERE NOT EXISTS /*该学生没有学*/
(SELECT *
FROM SC
WHERE SC.S#=S.S# AND SC.C#=C.C#));
3、检索所学课程包含学生S3所学课程的学生学号。
思路:在SC表中找一个学生(S#), /* 在SC表中找*/
对与S3学的每一门课(C#), /* 在SC表中找*/
该学生都学了。 /* 在SC表中存在一个元组*/
然后,改成双重否定形式:
在SC表中找一个学生(S#),
不存在S3学的一门课(C#),
该学生没有学了。
SELECT DISTINCT S#
FROM SC AS X
WHERE NOT EXISTS /*不存在是S3学的一门课*/
(SELECT *
FROM SC AS Y
WHERE Y.S#=‘S3‘ AND NOT EXISTS /*该学生没有学*/
(SELECT *
FROM SC AS Z
WHERE Z.S#=X.S# AND Z.C#=Y.C#
))
原文:http://my.oschina.net/u/2367628/blog/521856