SQL Server 中的“记录”和“行”有什么区别?

swa*_*eck 62 sql-server terminology row record

有一个关于在 SQL Server添加日期和时间的无关紧要的问题引发了一场相当引人入胜的分类辩论。

那么我们如何区分这些相关术语以及如何正确使用它们呢?

记录

Aar*_*and 75

引用 Joe Celko 的话(您不仅可以在整个网络和他的维基百科条目中找到此参考,而且您甚至会在某些会议的 T 恤上看到它):

行不是记录。

很多人指出他是一个迂腐的混蛋,喜欢谦虚和辱骂新手,我承认这就是他遇到的方式。但我也亲自见过他——甚至和他一起吃饭——我无法告诉你他的现实生活中的人物与他的网上有多大不同。我什至有一次发现他打电话给行记录,他很尴尬(完整的背景故事在这里)。

实际上,我在 2006 年在德克萨斯州格雷普韦恩参加 PASS 会议时穿着这件衬衫

无论如何,请说出您对这个人的在线角色的看法,但他写了标准,并且这样的权威规定存在区别的事实应该告诉您一些事情。当有人称某行为记录时他会畏缩,我的许多同事也是如此——他们也是 SQL Server 领域的专家。我们在那个阵营里的人相信他是对的。

例如,Itzik Ben-Gan,一个明显的 SQL Server 大师。这是他的培训工具包(考试 70-461)中第一课的引述:查询 Microsoft SQL Server 2012

作为 T-SQL 中不正确术语的一个例子,人们经常使用术语“字段”和“记录”来分别指代 T-SQL 所谓的“列”和“行”。字段和记录是物理的。字段是您在客户端应用程序的用户界面中拥有的内容,而记录是您在文件和游标中拥有的内容。表是逻辑的,它们具有逻辑行和列。

而且,了解 Itzik,如果你给他发电子邮件或在会议上逼他,他会很乐意告诉你同样的事情。如果您将一行称为记录,在他看来,您没有正确使用该术语。

现在,作为一个充满各种人的行业,您可能会发现似乎对两者进行了非常细微区分的材料(例如发布在另一个答案中的技术目标文章),并且您会发现该行业中有很多人将它们视为相同的(我认识 Microsoft 的几个人,以及 Brent Ozar 等其他人,他总是将其称为记录)。这并不能使他们正确,这只是他们看待问题的方式——他们认为逻辑和物理是一样的(至少在这种情况下),而且他们中的许多人可能认为我们其他人只是花费太多时间的肛门保持器关于语义。

由于没有供应商会说“你应该称它们为 {records|rows}”,我们将永远处理这个论点,因为总会有人不了解逻辑与物理,或者教得不同,或者来自 Access 或编程背景等。就像有人说 tomay-to 和其他人说 tomah-to 一样,总会有各种各样的人从“他们是一样的”到“他们完全不同” “ - 以及介于两者之间的许多色调。同样,这并不能使他们中的任何一个正确,因为没有人可以成为这方面的最终权威。但在 SQL Server 领域,绝对是大多数。


也就是说,恕我直言,当您谈论表中的数据时,您将其称为一行。执行插入时,您是在向表中插入一行。运行更新时,您正在更新表中的一行。当您执行 SELECT 时,您正在从表中检索行。

一旦您的应用程序保留它,请随意将其称为记录。但是,如果您说“我插入了记录”并且有人纠正了您,请不要生气。


jco*_*and 34

Microsoft 在其组织中的多个地方提供了每个表条目的表格数据存储的官方名称(为了满足我自己的目的创造分类学定义)称为“ROW”。我提出作为证据ROW_NUMBERROWCOUNTROWVERSIONDataTable.Rows物业,其中一个DataTable是TSQL“表”对象的C#表示。在这种情况下,整个 MSDN 属性鼓励使用row来引用作为表中一个条目的数据集合。(注意我试图避免使用“记录”或“行”来定义这一点,这是问题的重点)

然而,说法是应用程序处理用户“记录”。可能无法直接由单个存储行表示的记录的独特之处在于记录可以具有子记录。确实,一个表可以有相关的多对一表,但这些表不是连续存储的,而是逻辑相关的存储。

因此,行是表中的东西,而记录是开发人员在实际使用中使用的东西。

  • 可以说 ROW 是逻辑实体,而 RECORD 是物理实体。一个 ROW 可能有多个记录:一个在聚集索引中,几个在 NC 索引中。不适合页面的行可以在页面中的记录和 SLOB 存储中的溢出记录之间拆分。一行字段的 BLOB 值可以跨越 BLOB 存储中的多个 TEXT 记录。堆中的一行可以由存根记录和前向记录组成。等等等等。 (8认同)
  • 我并不反驳你的回答,也许我的措辞是错误的。我只展示了 SQL 引擎本身如何看待事物,其中物理访问层将它们称为“记录”,而处理“行”的查询处理(语言)层。 (4认同)

Phi*_*lᵀᴹ 32

我刚刚搜索了文档“信息技术 — 数据库语言 — SQL 第 2 部分:基础 (SQL/Foundation)”,该文档定义了所有主要 RDBMS 实现的 SQL 的 ANSI 标准。

row正如预期的那样,这个词主要在整个文档中使用了数百次。

该词record仅用于描述类似于 Oracle PL/SQL 中使用的记录(专门描述 ADA 记录数据类型)的记录。文件中有 6 处提及。

我认为这澄清了这个问题,并回答了双方的各种争论。


附加信息

来自 wiscorp.com 上的一份(最新免费可用的草稿版)SQL 标准(SQL 标准页面有其他几个旧版本和修订版)。

搜索日期为2011-12-217IWD2-02-Foundation-2011-12.pdf发现该单词row在文档中出现了 2277 次,而单词record仅出现了 21 次,要么是动词“record”或者在最后的一些附录中,在 SQL 数据类型和宿主语言类型(Ada,Pascal)的数据类型对应规范中。

此外,同一份文件在第 57 页(强调我的):

4.15.1 表格介绍

本条由 ISO/IEC 9075-9 中的第 4.10.1 条“表格介绍”修改。

表是零行或多行的集合,其中每一行是一个或多个列值的序列。一个最具体类型是行类型。给定表的每一行都具有相同的行类型,称为该表的行类型。每个的第i字段的值在表中是的第i列的值在表中。行是可以插入表和从表中删除的最小数据单元。

一个表的度数,以及它每一的度数,就是该表的列数。表中的数是它的基数。基数为 0(零)的表称为空表。

要么是一个基地台,一个派生表,或瞬时表


就使用 SQL 的 DBMS 而言:

行不是记录,字段不是列,表不是文件!


Cad*_*oux 14

因为关系数据库很少单独使用,为了避免系统其他部分之间的混淆,我总是参考表和行列。在客户端应用程序中,我们通常有其他构造,包括数据读取器、数据集、数据行、数据表等 - 例如“字段”通常用于屏幕数据输入,而 Pascal 具有类似于 C 中的结构的记录数据类型.

有时在系统设计中,“记录”的概念可能用于表示比单行更广泛的内容。它可能是连续的,它的历史。就像当我们谈论已删除的行时,我们可能指的是用列简单地标记为已删除的行或“移动”到已删除的表中的行(而不仅仅是缺少行,因为不存在而很难钉住)。记录一词的用法更多样。

表、行和列是普遍接受的术语,用于在关系数据库中指代这些实体,包括 Codd 和 Date 的论文和工作,大多数数据库专业人员更喜欢这个术语,因为它更明确。

当人们谈论行和列时,通常没有歧义——其他人明白你在谈论底层数据库物理设计,而不是物理设计之前的逻辑设计中的任何其他类型的工件,或者任何后来出现的系统实体,如字段上的字段屏幕。


Gri*_*han 10

虽然你的问题已经得到很好的回答。我也想加分。也许你会发现它在某种程度上有帮助。另外我的答案不是特定于 SQL Server

这些词可以互换使用。

 1          2         3              4 
--------------------------------------------------------------------
Row    =  Record  =  Tuple        =  Entity 

Column =  Field   =  Attribute    =  Attribute

table  =  File    =  Relation     =  Entity Types(or Entity Set)
Run Code Online (Sandbox Code Playgroud)
  • 学习 ER-Modules 时可以使用的 4 个术语
  • 3 使用时关系模型
  • 2 一般场景,DataBase books start with these terminology因为这些在现实生活中被人们广泛使用,也在文件系统中。

记录是存储系统中具有隐含意义的基本单元。在 DBMS 中record,一章中的单词use 描述了数据库表如何存储在磁盘块上。在 DBMS 中,arecord-oriented file-system是一个文件系统,其中文件存储为记录的集合。


A-K*_*A-K 9

语言不断发展。几十年前,识字的人使用“索引”而不是更简单的“索引”。当我们切换到“索引”时,我们消除了不必要的复杂性并使语言更有用。需要记住“索引”的复数是纯粹的开销——它并没有以任何方式帮助我们交流。毫无疑问,曾经有语法纳粹喜欢纠正那些转向“索引”的人。当然,语法纳粹输了。如果整个事情保持相关性足够长,这就是奥卡姆剃刀如何消除无用的细节。

所以让我们放轻松 - 了解行和记录之间的差异绝对不会增加我们开发和维护数据库的能力。许多优秀的专业人士交替使用行和记录,但开发了很棒的系统。因此,奥卡姆剃刀应该最终消除这种区别,下一代将不得不学习一个不那么无用的事实。当然,如果当时 SQL 仍然相关。


Tri*_*ped 5

简短回答

  • 记录是一段存储(或收集)的数据。
  • 行是线性存储的记录。
  • 尽可能使用更具体的术语。

注意:表线性存储记录,查询线性返回结果

支持

来自网络的其他定义:

值得注意的是,SQL 定义通常遵循英语定义。

如果您认为应该在此处给出定义,请将其添加到评论中。
我对 SQL 标准的定义或实现文档特别感兴趣。

引用了“行不是记录”。断章取义,这似乎与我之前的断言(以及许多数据库专业人士的断言)相矛盾。但是,如果您阅读 Joe Celko(又名 --CELKO--)的整篇文章(1搜索引用),很明显 Joe Celko 正在试图纠正对个人的误解,Joe Celko 认为这种误解源于该人的“ ...传统文件系统数据处理的背景...”。简而言之,Joe Celko 表示 SQL 行的工作方式与其他系统中的记录不同。Joe Celko 并不是声称拥有定义术语的权利/特权,他只是试图澄清由于错误地将一种存储模型的原理应用于另一种存储模型而造成的理解错误。

  • 我很欣赏你为此所做的工作和想法。我要指出的是,Celko 的区分旨在找出 RDBMS 和 RDBMS 之前的平面文件 COBOL 系统之间的差异。因此,他强调“行”是 RDBMS 模式的一部分,“记录”是平面文件的组成部分。 (3认同)

小智 5

引用 CJ Date 的书《数据库系统概论》“这样一个表的行可以认为是文件的记录……

因此,对于数据库,它是 Row。