我正在学习《数据库系统原理》,有些问题理解不了,请教一下各位老师。教材如下:集合成员的算术比较
其形式如下:
<元组> θ 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标准语句的话怎么回答?

解决方案 »

  1.   

    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'))
      

  2.   

    select sc.s# from [sc]
    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'))
      

  3.   

    SELECT SC.S#
    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'))
      

  4.   

    集合比较功能?你说的是having吧,可以把聚合后的结果放在一起作比较。
      

  5.   

    http://topic.csdn.net/u/20100517/17/b2ab9d5e-73a2-4f54-a7ec-40a5eabd8621.html
    一个项目涉及到的50个Sql语句(整理版)我这个帖子里面有你需要的内容.
      

  6.   

    感谢dawugui的帖子,昨晚学习完毕,获得不少收获。
    此问题已经搞清楚了。
    通过双重否定来解决:--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#))
     
      

  7.   

    (8)检索选修课程包含LIU老师所授全部课程的学生学号。
    即:检索这样的学生——不存在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#)
    )
      

  8.   


    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)
      

  9.   

    集合成员的算术比较
    其形式如下:
    <元组> θ all | some| any (<集合>)<元组> =SOME  (<集合>)  <==等价于==>  <元组> IN     (<集合>)
    <元组> <>ALL  (<集合>)  <==等价于==>  <元组> NOT IN (<集合>)
    <元组> =ALL   (<集合>) 通常没有意义,当集合有两个不同元素时总为False。
    <元组> <>SOME (<集合>) 通常没有意义,当集合有两个不同元素时总为True。<元组> >SOME  (<集合>)  <==等价于==>  <元组> > (MIN(<集合>))
    <元组> >ALL   (<集合>)  <==等价于==>  <元组> > (MAX(<集合>))
    >=, <, <=同理。T-SQL对于以上比较,仅支持当<元组>和<集合>都只有1列的情况。