我正在学习《数据库系统原理》,有些问题理解不了,请教一下各位老师。教材如下:集合成员的算术比较
其形式如下:
<元组> θ all | some| any (<集合>)
这里要求“元组”与集合中“元组”的结构一致。θ 是算术比较运算符,“θ all”操作比较左边那个元组与右边集合中每一个元组满足θ运算,“θ some”操作表示左边那个元组与右边集合中至少一个元组满足θ运算。any和some是同义词,早期的sql标准用any,为避免和英语中的any意思混淆,后来的标准都改为some。按教材的意思是元组与集合的比较,也就是行与集合的比较,但是看习题有好像需要集合与集合进行比较,很困惑。习题如下:设教学数据库中有四个关系:
教师关系 T(T#,TNAME,TITLE)
课程关系 C(C#,CNAME,T#)
学生关系 S(S#,SNAME,AGE,SEX)
选课关系 SC(S#,C#,SCORE)(8)检索选修课程包含LIU老师所授全部课程的学生学号。
分析:
在课程关系里,能检索出LIU老师教授的所有课程,在选课关系里能检索出每个学生的选修的LIU老师的课程,如果第二个集合大于等于第一个集合,就是符合条件的。这样就是两个集合的比较,不知道如何实现。TSQL的实现:
select s# from sc,c where sc.c#=c.c# and t#=(select t# from t where tname='LIU') group by s# having count(1)=(select count(1) from c where t#=(select t# from t where tname='LIU'))
是不是TSQL没有实现sql标准里的集合比较功能?
这个习题用sql标准语句的话怎么回答?
其形式如下:
<元组> θ all | some| any (<集合>)
这里要求“元组”与集合中“元组”的结构一致。θ 是算术比较运算符,“θ all”操作比较左边那个元组与右边集合中每一个元组满足θ运算,“θ some”操作表示左边那个元组与右边集合中至少一个元组满足θ运算。any和some是同义词,早期的sql标准用any,为避免和英语中的any意思混淆,后来的标准都改为some。按教材的意思是元组与集合的比较,也就是行与集合的比较,但是看习题有好像需要集合与集合进行比较,很困惑。习题如下:设教学数据库中有四个关系:
教师关系 T(T#,TNAME,TITLE)
课程关系 C(C#,CNAME,T#)
学生关系 S(S#,SNAME,AGE,SEX)
选课关系 SC(S#,C#,SCORE)(8)检索选修课程包含LIU老师所授全部课程的学生学号。
分析:
在课程关系里,能检索出LIU老师教授的所有课程,在选课关系里能检索出每个学生的选修的LIU老师的课程,如果第二个集合大于等于第一个集合,就是符合条件的。这样就是两个集合的比较,不知道如何实现。TSQL的实现:
select s# from sc,c where sc.c#=c.c# and t#=(select t# from t where tname='LIU') group by s# having count(1)=(select count(1) from c where t#=(select t# from t where tname='LIU'))
是不是TSQL没有实现sql标准里的集合比较功能?
这个习题用sql标准语句的话怎么回答?
join [c] on c.c#=sc.c#
join [t] on c.t#=t.t# and t.tname='LIU'
group by sc.s#
having(count(*)=(select count(*) from c,t where c.t#=t.t# and t.tname='LIU'))
FROM SC LEFT JOIN C ON SC.S#=C.C#
LEFT JOIN T ON T.T#=C.T#
WHERE T.TNAME='LIU'
GROUP BY SC.S#
HAVING (COUNT(TNAME)=(SELECT COUNT(*) from C,T where T.T#=C.T# and T.TNAME='LIU'))
一个项目涉及到的50个Sql语句(整理版)我这个帖子里面有你需要的内容.
此问题已经搞清楚了。
通过双重否定来解决:--1,liu老师没有被选修的课
select * from c,t where c.t#=t.t# and t.tname='liu' and c# not in (select c# from sc)
--2,liu老师没有被某学生选修的课
select * from c,t,s where c.t#=t.t# and t.tname='liu' and c# not in (select c# from sc where sc.s#=s.s#)
--3,不在没选修liu老师学生里的其他学生
select * from s where s# not in (select s# from c,t,s where c.t#=t.t# and t.tname='liu' and c# not in (select c# from sc where sc.s#=s.s#))
即:检索这样的学生——不存在LIU老师教授的课程,该学生没有选。SELECT S#
FROM S
WHERE NOT EXISTS (
SELECT C#
FROM C
WHERE C.T# IN (SELECT T.T# FROM T WHERE T.TNAME = 'LIU')
AND NOT EXISTS (SELECT * FROM SC WHERE SC.S# = S.S# AND SC.C# = C.C#)
)
CREATE TABLE #Nums(n int NOT NULL PRIMARY KEY CLUSTERED)
INSERT INTO #Nums
SELECT TOP(10) n = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM sys.columnsSELECT * FROM #Nums WHERE n = 1
SELECT * FROM #Nums WHERE n = (1)
SELECT * FROM #Nums WHERE n = (SELECT col = 1)
SELECT * FROM #Nums WHERE n <> 1
SELECT * FROM #Nums WHERE n <> (1)
SELECT * FROM #Nums WHERE n <> (SELECT col = 1)SELECT * FROM #Nums WHERE n = (1,2) --ERROR
SELECT * FROM #Nums WHERE n = (SELECT col = 1 UNION ALL SELECT col = 2) --ERROR
SELECT * FROM #Nums WHERE n <> (1,2) --ERROR
SELECT * FROM #Nums WHERE n <> (SELECT col = 1 UNION ALL SELECT col = 2) --ERRORSELECT * FROM #Nums WHERE n =SOME (1,2) --ERROR
SELECT * FROM #Nums WHERE n =SOME (SELECT col = 1 UNION ALL SELECT col = 2)
SELECT * FROM #Nums WHERE n <>ALL (1,2) --ERROR
SELECT * FROM #Nums WHERE n <>ALL (SELECT col = 1 UNION ALL SELECT col = 2)SELECT * FROM #Nums WHERE n IN (1,2)
SELECT * FROM #Nums WHERE n IN (SELECT col = 1 UNION ALL SELECT col = 2)
SELECT * FROM #Nums WHERE n NOT IN (1,2)
SELECT * FROM #Nums WHERE n NOT IN (SELECT col = 1 UNION ALL SELECT col = 2)
其形式如下:
<元组> θ all | some| any (<集合>)<元组> =SOME (<集合>) <==等价于==> <元组> IN (<集合>)
<元组> <>ALL (<集合>) <==等价于==> <元组> NOT IN (<集合>)
<元组> =ALL (<集合>) 通常没有意义,当集合有两个不同元素时总为False。
<元组> <>SOME (<集合>) 通常没有意义,当集合有两个不同元素时总为True。<元组> >SOME (<集合>) <==等价于==> <元组> > (MIN(<集合>))
<元组> >ALL (<集合>) <==等价于==> <元组> > (MAX(<集合>))
>=, <, <=同理。T-SQL对于以上比较,仅支持当<元组>和<集合>都只有1列的情况。