找回密码
 FreeOZ用户注册
查看: 2200|回复: 9
打印 上一主题 下一主题

[数据库] 关于关系运算中的除法的理解

[复制链接]
跳转到指定楼层
1#
发表于 9-8-2009 22:00:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
大家能说说自己对于关系运算中的除法的理解?
回复  

使用道具 举报

2#
发表于 10-8-2009 13:28:58 | 只看该作者
能不能说明确点,或者给出个例子看看,什么叫做“关系运算中的除法”
回复  

使用道具 举报

3#
发表于 10-8-2009 13:37:53 | 只看该作者

回复 #2 someonehappy 的帖子

数学上称为”关系代数“,在实际中主要应用在关系数据库这样的技术中。

关系运算包括:
  (1)基本运算操作:并、差、笛卡尔积、投影和选择。
  (2)组合运算操作:交、联接、自然联接和除。

维基百科上数据库中的关系运算中除法的定义和示例
回复  

使用道具 举报

4#
发表于 11-8-2009 11:17:55 | 只看该作者
原来是这个意思。

那关系数据库里面都有相应的运算符号/函数么?比如mysql里面?
回复  

使用道具 举报

5#
发表于 11-8-2009 12:07:42 | 只看该作者
我所知oracle应没有。
照着楼上大侠给的wiki的例子, 在oracle里面可以自己用基本sql写法如下:
select student from tmp_finished_taskes a, tmp_task_list b
where a.task=b.task
group by student
having (count(distinct a.task))=(select count(distinct task) from tmp_task_list);
回复  

使用道具 举报

6#
 楼主| 发表于 11-8-2009 15:35:33 | 只看该作者
除法应该不是这样用。

我觉得除法其实是一种特殊情况下的join
有两个特殊前提:
1. 表一的标题包含了表二
2. 表一取表二标题的投影包含了表二

这里 表一 join 表二 就可以得到除的结果了

不知道我的理解是否正确

原帖由 summerainy 于 11-8-2009 12:07 发表
我所知oracle应没有。
照着楼上大侠给的wiki的例子, 在oracle里面可以自己用基本sql写法如下:
select student from tmp_finished_taskes a, tmp_task_list b
where a.task=b.task
group by student
having (c ...
回复  

使用道具 举报

7#
发表于 11-8-2009 17:02:07 | 只看该作者

回复 #6 key 的帖子

不正确,直接join的结果包含了除法的结果但是大于除的结果。直接Join不能满足”结果集中的每一个记录与 表二 中的所有元组的所有组合都存在于 表一 中“这一约束。

简化的SQL:
设表A有a,b和其它附加属性 表B有b和其它附加属性, 表A中a,b为联合主键,表B中b为主键

A / B (A和B中的无关附加属性可以忽略) 可以表示为:
  SELECT  a FROM A GROUP BY a HAVING count(b)=(SELECT count(b)   FROM  B);

这和 summerainy的写法差不多,不过不需要那么麻烦,表B(关系运算除法的分母)的作用仅在于提供B集合的大小。

评分

参与人数 1威望 +30 收起 理由
key + 30 多谢指正

查看全部评分

回复  

使用道具 举报

8#
 楼主| 发表于 11-8-2009 17:44:27 | 只看该作者
原帖由 coredump 于 11-8-2009 17:02 发表
不正确,直接join的结果包含了除法的结果但是大于除的结果。直接Join不能满足”结果集中的每一个记录与 表二 中的所有元组的所有组合都存在于 表一 中“这一约束。

简化的SQL:
设表A有a,b和其它附加属性 表B有b ...


原来我忽略了“每一”这个条件
回复  

使用道具 举报

9#
发表于 11-8-2009 21:34:08 | 只看该作者
简化的SQL:
设表A有a,b和其它附加属性 表B有b和其它附加属性, 表A中a,b为联合主键,表B中b为主键

A / B (A和B中的无关附加属性可以忽略) 可以表示为:
  SELECT  a FROM A GROUP BY a HAVING count(b)=(SELECT count(b)   FROM  B);

直接用这个语句做除法(不经过表A和B关联),出来的结果将不太准确,例子如:
table A
a       b
---------
John    Math
John    Chem
John    Eng
Alice   Dogs
Alice   Cats
Alice   Fish

table B
b
---------
Math
Chem
Eng

A/B= {John,Alice}

评分

参与人数 1威望 +30 收起 理由
coredump + 30 你太有才了!

查看全部评分

回复  

使用道具 举报

10#
发表于 11-8-2009 21:38:55 | 只看该作者

回复 #9 summerainy 的帖子

谢谢提醒,呵呵。这个表A中的b严格说还必须是指向表B的外键
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 8-4-2025 04:08 , Processed in 0.030619 second(s), 27 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表