通常理解在关系模型中:
想象一下包含以下数据的'USERS'关系。
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应该返回什么?
答案 0 :(得分:3)
“但有些信息丢失了 - 有3个用户使用该姓氏。”
如果具有该名称的用户数量是您感兴趣的,那么您的示例查询不是您应该问的问题。
您的示例的查询将提供问题的答案“所有姓氏是什么,以便存在具有该姓氏的用户?”。
如果您想问的问题是“有多少用户被命名为'Stone'”,那么您应该提交的查询是来自用户的选择计数(...),其中last_name ='Stone';
投影总是“丢失”信息。与投射掉的属性相关联的信息。我没有看到有用的关系运算符的已知属性如何被解释为针对该运算符的参数。
答案 1 :(得分:2)
在RDBMS中,仅对姓氏列的关系投影将仅返回一组具有不同姓氏值的元组。没有重复的元组。
在SQL中,除非您指定了DISTINCT关键字,否则您将获得重复项。那是因为SQL不是真正的关系语言 - 除其他外,因为SQL表和表表达式不是正确的关系。 SQL DBMS不是RDBMS。
答案 2 :(得分:2)
“理想的RDBMS应该返回什么?”
正如大卫所说,它应该返回(在你的例子中)一行。
如果SQL DBMS将每个SELECT视为请求SELECT DISTINCT,则它只是一个关系型数据库。 (但也有一些微小的附加条件也得到满足。)
这样做的原因是该单行的“含义”如下:“存在一些用户,他有一个first_name,他有一个ID,他的last_name是'Stone'”。
从来没有任何逻辑上需要再次重复该陈述。你要求的权威性参考是Ted Codd本人:“如果事情是真的,那么说两次就不会让它变得更真实。”。
答案 3 :(得分:1)
我不确定我看到返回值有问题。有三条记录包含LAST_NAME
的“石头”。如果查询中包含FIRST_NAME
或ID
,则情况显而易见,但事实并非如此。通常,DISTINCT
关键字用于处理此问题,并确保不存在重复项。
事实上,如果我的数据库开始自动应用DISTINCT
(听起来你觉得它可能应该这样),我会有些恼火。在调试数据库中的一些奇怪的数据问题时,在您不期望的时候看到重复的行通常是必需的中断。
答案 4 :(得分:0)
我认为你的原始查询没有返回重复的行。它从数据库返回3个单独的数据行,其中只包含姓氏列。我会说你的问题没有正确表达,因此为什么RDBMS以他们的方式运作(我也认为这是正确的方式)。
翻译您的查询:
从USERS中选择LAST_NAME
英文,它将是:
“告诉我所有用户的姓氏”
如果我进入高中体育课,并要求老师“使用你的班级名单,告诉我你班上所有学生的姓氏”,如果班上有双胞胎兄弟,我会认为他会两次列出他们的姓氏(或者如果他应该,他至少会问你这个问题)。他只会从课堂上的人名单中读出他们的姓氏。
如果你想问这个问题,“班上学生的姓氏有什么不同”,他就不会列出重复的名字。然而,这就是“DISTINCT”关键词的存在。
所以查询将是:
从USERS中选择不同的LAST_NAME
如果你真的对英文中唯一姓氏的数量感兴趣,那就是“班上学生有多少不同的姓氏”或者使用你的例子:
从USERS中选择计数(不同的LAST_NAME)
,而: 从USERS中选择计数(LAST_NAME)
用英语表示: “班上有多少人有姓?”