7、第七个例子很像搭桥,SC就是那个桥,S或C都要经过它。
8、SELECT NAME,AGE
FROM S
WHERE C2 NOT IN
SELECT C#
FROM SC
WHERE S#=S.S# //选择S中的一个元组跳出SC中所有课号,再看有无C2,如果没有就挑出来。。。外层指针相对固定。。。
内层映射块形成以学号相等的一系列一度关系S#=S.S#内外指针
外层WHERE的选择作用及与内外层扫描指针的关系。
9、SELECT UNIQUE C#
FROM SC SCX //SCX为别名,内层用,便于区分。
WHERE C# IN //这一行的C#为外层SCX中的课号,
SELECT C# //使它与不是这个学生学的课号对
FROM SC //比。
WHERE S#非=SCX.S# //至少有两个学生选的课号选出来
同义变量问题:内外层均在同一关系上操作
内外层指针的区别
10、SELECT UNIQUE S#
FROM SC SCX
WHERE (SELECT C#
FROM SC
WHERE S#=SCX.S#) //两个关系的比较
CONTAINS //包含
(SELECT C#
FROM SC
WHERE S#='S3') //选出包含S3同学所选课程的同学
CONTAINS子句后的映射块产生一个常值关系:S3所选课程的所有课号。
利用SEQUEL提供的函数,可将上述查询改写如下:
外层WHERE子句后映射块产生一系
SELECT S#
FROM SC
GROUP BY S#
HAVING SET(C#) CONTAINS //每分成一个学号出来,就投影出课号
(SELECT C#
FROM SC
WHERE S#='S3')
GROUP BY属性名:将FROM子句中关系按指定属性取值相等分组;
HAVING子句依CONTAINS后的关系(条件)成立与否取集合;
SET 属性名:库函数,即取括号中属性列投影