-1

通常的理解是在关系模型中:

  1. 每个关系操作都应该产生一个关系。
  2. 作为集合的关系不能包含重复的行。

想象一个包含以下数据的“用户”关系。

ID FIRST_NAME LAST_NAME
 1 Mark       Stone
 2 Jane       Stone
 3 Michael    Stone

如果有人运行查询select LAST_NAME from USERS,典型的数据库将返回:

LAST_NAME
Stone
Stone
Stone

由于这不是关系——因为它包含重复的行——理想的 RDBMS 应该返回什么?

4

5 回答 5

3

“但有些信息丢失了——有 3 个用户使用这个姓氏。”

如果具有该名称的用户数是您感兴趣的,那么您的示例查询不是您应该问的问题。

您的示例的查询将提供问题“所有姓氏是什么,以便存在具有该姓氏的用户?”的答案。

如果您要问的问题是“有多少名为'Stone'的用户”,那么您应该提交的查询是Select count(...) from users where last_name = 'Stone';

投影总是“丢失”信息:与被投影的属性相关的信息。我看不出如何将有用的关系运算符的已知属性解释为反对该运算符的参数。

于 2010-10-10T23:00:07.963 回答
2

在 RDBMS 中,仅对姓氏列的关系投影将仅返回一组具有不同姓氏值的元组。不会有重复的元组。

在 SQL 中,除非您指定 DISTINCT 关键字,否则您确实会得到重复项。那是因为 SQL 不是一种真正的关系语言——尤其是因为 SQL 表和表表达式不是正确的关系。SQL DBMS 不是 RDBMS。

于 2010-10-08T15:14:27.657 回答
2

“理想的 RDBMS 应该返回什么?”

正如大卫所说,它应该返回(在你的例子中)一行。

如果 SQL DBMS 将每个 SELECT 都视为请求了 SELECT DISTINCT,则它只是一个关系数据库。(但也需要满足一些微小的附加条件。)

之所以如此,是因为该单行的“含义”如下:“存在一些用户,他有一个名字,他有一个 ID,他的姓氏是'Stone'”。

没有任何逻辑需要第二次重复该陈述。您要求的权威参考是 Ted Codd 本人:“如果某件事是真的,那么说两次不会使它更真实。”。

于 2010-10-08T20:38:44.117 回答
1

我不确定返回值是否存在问题。有 3 条记录包含“石头” LAST_NAMEFIRST_NAME如果或ID已经包含在查询中,这将是显而易见的,但事实并非如此。通常,DISTINCT关键字用于处理此问题并确保不会有重复。

事实上,如果我的数据库开始DISTINCT自动应用(听起来您认为它应该如此),我会有些恼火。当您在数据库中调试一些奇怪的数据问题时,通常会在您不期望的情况下看到重复的行。

于 2010-10-08T14:13:26.977 回答
0

我认为您的原始查询没有返回重复的行。它从仅包含姓氏列的数据库中返回 3 行单独的数据。我想说您的问题措辞不正确,因此为什么 RDBMS 以它们的方式运行(我也认为这是正确的方式)。

要翻译您的查询:

从 USERS 中选择 LAST_NAME

换成英文,应该是:

“告诉我所有用户的姓氏”

如果我去高中体育课问老师“用你的班级名单,告诉我你班上所有学生的姓氏”,如果班里有双胞胎兄弟,我想他会列出他们的姓氏两次命名(或者他至少会问你这个问题,如果他应该)。他只会顺着班上的人名单,念出他们的姓氏。

如果您想问“班上学生的姓氏不同”,他不会列出重复的名字。然而,这就是“DISTINCT”关键字的存在。

所以查询将是:

从 USERS 中选择不同的 LAST_NAME

如果你真的对英语中唯一姓氏的数量感兴趣,那就是“班上学生有多少不同的姓氏”或使用你的例子:

从用户中选择计数(不同的 LAST_NAME)

而:从用户中选择计数(LAST_NAME)

用英语表示:“班上有多少人有姓氏?”

于 2014-03-08T00:36:28.150 回答