【问题标题】:Does the term "row set" and "row" have different meaning in the SQL vocabulary?术语“行集”和“行”在 SQL 词汇表中是否具有不同的含义?
【发布时间】:2021-12-08 09:16:40
【问题描述】:

考虑关系enrolled(student, course),其中(student, course) 是主键,关系paid(student, amount),其中student 是主键。假设没有空值,也没有外键或完整性约束。 给定以下四个查询:

查询1:

select student from enrolled where student in (select student from paid)

查询2:

select student from paid where student in (select student from enrolled)

查询3:

select E.student from enrolled E, paid P where E.student = P.student

查询4:

select student from paid where exists 
    (select * from enrolled where enrolled.student = paid.student)

下列哪一项是正确的?

(A) 对于任何数据库,所有查询都返回相同的行集

(B) Query2 和 Query4 为所有数据库返回相同的行集,但存在 Query1 和 Query2 返回不同行集

的数据库

(C) 存在 Query3 返回的行数比 Query2 少的数据库

(D) 存在 Query4 在运行时会遇到完整性违规的数据库


这个问题本来很简单,但如果我们认为“行集”和“行”这两个术语的含义是等价的,那么我们会得到一个答案,但是如果我们认为它们具有不同的含义,然后我们得到另一个答案。

现在我的同行here 中很少有人认为术语“行集”和“行”具有不同的含义。他们说,在 SQL 中,当我们改变一个表时,我们会得到x rows affected 的提示。因此在 SQL 中,表中的元组称为行(允许重复)。而“行集”是基于集合论概念(或关系代数概念)的表中删除重复项的元组集合。

而其他同行认为术语“行集”和“行”的含义相同。他们说在 SQL 中,当我们输出一个表时,我们会得到x rows in set 的提示。他们说在 SQL 中,术语“行集”和“行”可以互换使用。

就个人而言,我觉得它们的意思是一样的。但我不确定。请问谁能确认一下?

【问题讨论】:

  • 这部分是关于英语的问题,而不是 SQL。 “返回严格较少的行”意味着返回具有较少成员的行集。 (而且“严格”是多余的。)独立于用法来谈论单词含义或“含义相同”的单词通常没有意义。
  • 这里的SQL“行集”查询结果不是一组行值。不清楚是指一袋行值还是行值列表。查询返回行值列表。不清楚这里的“行集”是否忽略了顺序(给一个袋子)或没有(给一个列表)。写关于 SQL 的文章一向非常草率。 PS 未修饰的“行”可以表示行值或行值的实例或行值变量——询问演讲者/作者。法式吐司不是吐司。 (而不是法语。)给出此引用所用 SQL 的参考及其“行集”的定义。
  • 它们似乎意味着包不列出,否则选择都是错误的。
  • 那么,法式吐司是吐司吗?语言很滑。重新“行”,它类似于“整数”。当有人说它们有两个整数时,它们可能意味着两个值,它们必须不同,否则只会有 1 个值;或者当他们有两个六时,他们可能会说,所以值六的两个实例;并且它们可能草率地表示包含整数的变量或常量。在 SQL 中,特别是“表”被草率地用于表值或基表,即表值变量。始终区分值与变量以及要明确的确切数据类型。 PS 请提供您的 SQL 参考。
  • GATE 告诉你它说它使用的是什么 SQL 引用?在我的上一条评论中,我指的是在那之前的评论。 (“行集”不是官方的 SQL 技术术语。“结果集”是。它不是一个集合,它是一个列表。)

标签: sql relational-database definition relational-algebra


【解决方案1】:

请为您的“同行”所说的内容提供参考和定义。 SQL 是对关系理论的破坏,这就是为什么 SQL 有“行”或“记录”而不是“元组”的原因。 SQL 中的某些查询可以返回重复的行('bags' 而不是 'sets'),所以我会避免使用 'set' wrt SQL,除非您的查询具有显式 SELECT DISTINCT 或表已声明键,这样您就可以确定结果是一套。

(student, course) 是主键,...student 是主键...假设没有空值,也没有外键或完整性约束。

主键完整性约束。我想你的意思是没有其他限制。

所以enrolled 中出现的student 值集与paid 中出现的student 值集没有任何联系。给定的student 值可能同时出现在两者中,或仅出现在其中一个中,或仅出现在另一个中。 student 单独不是 enrolled 的主键,因此那里可能会重复 student 值。所以

(A) 对于任何数据库,所有查询都返回相同的行集

其中一些查询可能会返回重复的行(因为它们没有SELECT DISTINCT。所以错误:并非所有查询都返回集合。

如果您的意思是所有查询都为架构所在的任何数据库报告一组相同的 student 值:True。 (对所有情况使用SELECT DISTINCT 进行测试。)

(B) Query2 和 Query4 返回相同的行集 ...

q 似乎借鉴了一些我不会猜测的“行集”的微妙意义。通常 SQL 查询不返回“集合”。避免使用该术语。

(C) 存在 Query3 返回的行数严格少于 Query2 的数据库

我不想猜测。这在很大程度上取决于特定的 DBMS 以及它如何优化主键查询。

(D) 存在 Query4 在运行时会遇到完整性违规的数据库

错误。查询不会遇到完整性违规。只有更新会破坏完整性。

【讨论】:

  • 这没有回答帖子提出的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多