swasheck Asked: 2013-01-12 14:10:11 +0800 CST2013-01-12 14:10:11 +0800 CST 2013-01-12 14:10:11 +0800 CST SQL Server 中的“记录”和“行”有什么区别? 772 有一个关于在 SQL Server 中添加日期和时间的相当无害的问题引发了一场相当引人入胜的分类辩论。 那么我们如何区分这些相关术语以及如何正确使用它们呢? 排 记录 sql-server terminology 8 个回答 Voted Best Answer Aaron Bertrand 2013-01-13T16:17:53+08:002013-01-13T16:17:53+08:00 引用 Joe Celko(您不仅可以在整个网络和他的 Wikipedia 条目中找到此参考资料,而且您甚至会在某些会议的 T 恤上看到它): 行不是记录。 很多人指出他是一个迂腐的混蛋,喜欢谦虚和口头辱骂新手,我承认他就是这样。但我也亲自见过他——甚至和他一起吃饭——我无法告诉你他的现实生活中的角色与他的在线形象有多么不同。我什至有一次发现他打电话给行记录,他很尴尬(这里有完整的背景故事)。 无论如何,请说出您对这个人的在线角色的看法,但他编写了标准,并且这样的权威规定存在区别的事实应该告诉您一些事情。当有人称一行为记录时,他会畏缩不前,我的许多同事也是如此——他们也是 SQL Server 领域的专家。我们那些在那个阵营的人相信他是对的。 例如,Itzik Ben-Gan,一个明显的 SQL Server 大师。这是他的培训工具包(考试 70-461)中第一课的引述:查询 Microsoft SQL Server 2012: 作为 T-SQL 中不正确术语的示例,人们经常使用术语“字段”和“记录”来分别指代 T-SQL 所称的“列”和“行”。字段和记录是物理的。字段是您在客户端应用程序的用户界面中所拥有的,而记录是您在文件和游标中所拥有的。表是逻辑的,它们有逻辑的行和列。 而且,知道 Itzik,如果你给他发电子邮件或在会议上把他逼到角落,他会很高兴地告诉你同样的事情。如果您将一行称为记录,在他看来,您没有正确使用该术语。 现在,作为一个充满各种人的行业,您可能会找到似乎在两者之间做出非常微妙区别的材料(例如在另一个答案中发布的技术目标文章),并且您会发现该行业的很多人将它们视为相同的(我认识微软的几个人,以及像 Brent Ozar 这样的其他人,他们总是称其为记录)。这并不能使他们正确,这只是他们看待它的方式 - 他们认为逻辑和物理是相同的(至少在这种情况下),他们中的许多人可能认为我们其他人只是花费太多时间的肛门保留者关于语义。 由于没有供应商会说“你应该称他们为 {records|rows}”,我们将永远处理这个论点,因为总会有人不明白逻辑与物理,或者被教导不同,或者来自Access或编程背景等。就像有人说tomay-to和其他人说tomah-to一样,总会有各种各样的人,从“他们一样”到“他们完全不同” “ - 以及介于两者之间的许多阴影。同样,这并不能使他们中的任何一个人正确,因为没有人可以成为这方面的最终权威。但在 SQL Server 领域,绝对是大多数。 也就是说,恕我直言,当您谈论表格中的数据时,您将其称为一行。当您执行插入时,您正在向表中插入一行。当您运行更新时,您正在更新表中的一行。当您执行 SELECT 时,您正在从表中检索行。 一旦您的应用程序拥有它,请随意将其称为记录。但是,如果您说“我插入了一条记录”并且有人纠正了您,请不要生气。 jcolebrand 2013-01-12T14:48:56+08:002013-01-12T14:48:56+08:00 微软在其组织中的多个地方提供了每个表条目的表格数据存储的官方名称(为了创造一个服务于我自己目的的分类定义)称为“ROW”。我提交作为证据ROW_NUMBER、ROWCOUNT和属性,其中 a是 TSQL“表”对象的 C# 表示ROWVERSION。在这种情况下,作为一个整体,MSDN 属性鼓励使用来引用作为表中一个条目的数据集合。(注意我试图避免使用“记录”或“行”来定义这个,这是问题的关键)DataTable.RowsDataTablerow 但是,用语是应用程序处理用户“记录”。可能无法由单个存储行直接表示的记录的独特之处在于记录可以具有子记录。诚然,一个表可以有相关的多对一表,但这些表不是连续存储的,而是逻辑相关的。 因此,行是表中的东西,而记录是开发人员在实际使用中使用的东西。 Philᵀᴹ 2013-01-13T16:55:00+08:002013-01-13T16:55:00+08:00 我刚刚搜索了文档“信息技术 - 数据库语言 - SQL 第 2 部分:基础 (SQL/Foundation)”,它定义了所有主要 RDBMS 实现的 SQL 的 ANSI 标准。 正如预期的那样,该词row在整个文档中主要使用了数百次。 该词record仅用于描述类似于 Oracle PL/SQL 中使用的记录的记录(特别是描述 ADA 记录数据类型)。文件中提到了 6 处。 我认为这澄清了这个问题,并回答了双方的各种论点。 附加信息 来自 wiscorp.com 上的一份(最新免费提供的草案版本)SQL 标准的副本(SQL 标准页面有其他几个旧版本和修订版)。 搜索日期为2011-12-21的7IWD2-02-Foundation-2011-12.pdf显示单词row在文档中出现了 2277 次,而单词record仅出现了 21 次,或者作为动词“记录”或者在最后的一些附录中,在 SQL 数据类型和宿主语言类型(Ada、Pascal)的数据类型对应的规范中。 此外,同一文件在第 57 页(强调我的): 4.15.1 表格介绍 本款由 ISO/IEC 9075-9 中的第 4.10.1 款“表格介绍”修改。 表是零个或多个行的集合,其中每一行是一个或多个列值的序列。最具体的行类型是行类型。给定表的每一行都具有相同的行类型,称为该表的行类型。表中每一行的第 i 个字段的值就是表中该行的第 i 列的值。行是可以插入表和从表中删除的最小数据单位。 一个表的度数,以及它的每一行的度数,是该表的列数。表中的行数是它的基数。基数为 0(零)的表称为空表。 表可以是基表、派生表或临时表。 就使用 SQL 的 DBMS 而言: 行不是记录,字段不是列,表不是文件! Cade Roux 2013-01-12T14:43:48+08:002013-01-12T14:43:48+08:00 因为关系数据库很少单独使用,为了避免系统其他部分的混淆,我总是提到表和行和列。在客户端应用程序中,我们通常有其他构造,包括数据读取器、数据集、数据行、数据表等 - 例如“字段”通常用于屏幕数据输入,Pascal 有一个类似于 C 中的结构的 Record 数据类型. 有时在系统设计中,“记录”的概念可能用于表示比单行更广泛的内容。这可能是一个行,它的历史。就像当我们谈论删除的行时,我们可能指的是简单地用列标记为已删除或“移动”到已删除表的行(而不仅仅是缺少一行,因为不存在,很难固定)。记录一词的用法更加多样化。 表、行和列是在关系数据库中引用这些实体的普遍接受的术语,包括 Codd 和 Date 的论文和工作,并且大多数数据库专业人员更喜欢这个术语,因为它更明确。 当一个人谈论行和列时,通常不会有歧义——其他人理解你是在谈论底层数据库物理设计,而不是在物理设计之前的逻辑设计中的任何其他类型的工件或任何后来出现的系统实体,如字段上的字段屏幕。 Grijesh Chauhan 2013-01-13T20:41:20+08:002013-01-13T20:41:20+08:00 尽管您的问题已经得到很好的回答。我也想补充一下我的观点。可能你会发现它在某种程度上很有帮助。我的回答也不是特定于 SQL Server 这些词可以互换使用。 1 2 3 4 -------------------------------------------------------------------- Row = Record = Tuple = Entity Column = Field = Attribute = Attribute table = File = Relation = Entity Types(or Entity Set) 学习 ER-Modules 时好用的 4 个术语 3 使用关系模型时 2 一般场景,DataBase books start with these terminology因为这些在现实生活中被人们广泛使用,在文件系统中也是如此。 记录是存储系统中具有隐含意义的基本单元。在 DBMSrecord中,章节中的“使用”一词描述了数据库表如何存储在磁盘块上。在 DBMS 中,arecord-oriented file-system是一个文件系统,其中文件存储为记录的集合。 A-K 2013-01-17T19:29:53+08:002013-01-17T19:29:53+08:00 语言不断发展。几十年前,有文化的人使用“索引”而不是更简单的“索引”。当我们切换到“索引”时,我们消除了不必要的复杂性并使语言更加有用。需要记住“索引”的复数形式是纯粹的开销——它对我们交流没有任何帮助。毫无疑问,曾经有语法纳粹喜欢纠正那些改用“索引”的人。当然,语法纳粹输了。如果整个事情保持相关性足够长,这就是奥卡姆剃刀消除无用细节的方式。 所以让我们放轻松——知道行和记录之间的区别绝对不会增加我们开发和维护数据库的能力。许多优秀的专业人士交替使用行和记录,但开发了很棒的系统。因此,奥卡姆剃刀应该最终消除这种区别,而下一代将不得不学习一个不那么无用的事实。当然,如果当时 SQL 仍然适用。 Trisped 2013-01-12T15:05:31+08:002013-01-12T15:05:31+08:00 简短的回答: 记录是一段存储(或收集)的数据。 行是线性存储的记录。 尽可能使用更具体的术语。 注意:表线性存储记录,查询线性返回结果 支持: 来自网络的其他定义: SQL "行" ( 1 , 2 ) SQL“记录”( 1 , 2 ) "记录" ( 1 , 2 , 3 , 4 ) “行”(1,另见2、3、4) StackOverflow 上的行与记录 (1、2) 值得注意的是,SQL 定义通常遵循英文定义。 如果您有一个您认为应该在这里的定义,请将其添加到评论中。 我对 SQL 标准中的定义或实现文档特别感兴趣。 引用了“行不是记录”。断章取义,这似乎与我之前的断言(以及许多数据库专业人士的断言)相矛盾。但是,如果您阅读了 Joe Celko(又名 --CELKO--)的整篇文章(1 Search for the quote),那么很明显,Joe Celko 正试图纠正对某个人的误解,Joe Celko 认为这种误解源于该人的“ ...使用传统文件系统进行数据处理的背景...”。简而言之,Joe Celko 是说 SQL 行的工作方式与其他系统中的记录不同。Joe Celko 并没有要求定义一个术语的权利/特权,他试图澄清由于错误地将一个存储模型应用于另一个存储模型而导致的错误理解。 Andrew Peterson 2016-04-19T09:51:31+08:002016-04-19T09:51:31+08:00 引用 CJ Date 的书《数据库系统简介》“这样的表的行可以被认为是文件的记录…… ” 因此,对于数据库,它是 Row。
引用 Joe Celko(您不仅可以在整个网络和他的 Wikipedia 条目中找到此参考资料,而且您甚至会在某些会议的 T 恤上看到它):
很多人指出他是一个迂腐的混蛋,喜欢谦虚和口头辱骂新手,我承认他就是这样。但我也亲自见过他——甚至和他一起吃饭——我无法告诉你他的现实生活中的角色与他的在线形象有多么不同。我什至有一次发现他打电话给行记录,他很尴尬(这里有完整的背景故事)。
无论如何,请说出您对这个人的在线角色的看法,但他编写了标准,并且这样的权威规定存在区别的事实应该告诉您一些事情。当有人称一行为记录时,他会畏缩不前,我的许多同事也是如此——他们也是 SQL Server 领域的专家。我们那些在那个阵营的人相信他是对的。
例如,Itzik Ben-Gan,一个明显的 SQL Server 大师。这是他的培训工具包(考试 70-461)中第一课的引述:查询 Microsoft SQL Server 2012:
而且,知道 Itzik,如果你给他发电子邮件或在会议上把他逼到角落,他会很高兴地告诉你同样的事情。如果您将一行称为记录,在他看来,您没有正确使用该术语。
现在,作为一个充满各种人的行业,您可能会找到似乎在两者之间做出非常微妙区别的材料(例如在另一个答案中发布的技术目标文章),并且您会发现该行业的很多人将它们视为相同的(我认识微软的几个人,以及像 Brent Ozar 这样的其他人,他们总是称其为记录)。这并不能使他们正确,这只是他们看待它的方式 - 他们认为逻辑和物理是相同的(至少在这种情况下),他们中的许多人可能认为我们其他人只是花费太多时间的肛门保留者关于语义。
由于没有供应商会说“你应该称他们为 {records|rows}”,我们将永远处理这个论点,因为总会有人不明白逻辑与物理,或者被教导不同,或者来自Access或编程背景等。就像有人说tomay-to和其他人说tomah-to一样,总会有各种各样的人,从“他们一样”到“他们完全不同” “ - 以及介于两者之间的许多阴影。同样,这并不能使他们中的任何一个人正确,因为没有人可以成为这方面的最终权威。但在 SQL Server 领域,绝对是大多数。
也就是说,恕我直言,当您谈论表格中的数据时,您将其称为一行。当您执行插入时,您正在向表中插入一行。当您运行更新时,您正在更新表中的一行。当您执行 SELECT 时,您正在从表中检索行。
一旦您的应用程序拥有它,请随意将其称为记录。但是,如果您说“我插入了一条记录”并且有人纠正了您,请不要生气。
微软在其组织中的多个地方提供了每个表条目的表格数据存储的官方名称(为了创造一个服务于我自己目的的分类定义)称为“ROW”。我提交作为证据
ROW_NUMBER
、ROWCOUNT
和属性,其中 a是 TSQL“表”对象的 C# 表示ROWVERSION
。在这种情况下,作为一个整体,MSDN 属性鼓励使用来引用作为表中一个条目的数据集合。(注意我试图避免使用“记录”或“行”来定义这个,这是问题的关键)DataTable.Rows
DataTable
row
但是,用语是应用程序处理用户“记录”。可能无法由单个存储行直接表示的记录的独特之处在于记录可以具有子记录。诚然,一个表可以有相关的多对一表,但这些表不是连续存储的,而是逻辑相关的。
因此,行是表中的东西,而记录是开发人员在实际使用中使用的东西。
我刚刚搜索了文档“信息技术 - 数据库语言 - SQL 第 2 部分:基础 (SQL/Foundation)”,它定义了所有主要 RDBMS 实现的 SQL 的 ANSI 标准。
正如预期的那样,该词
row
在整个文档中主要使用了数百次。该词
record
仅用于描述类似于 Oracle PL/SQL 中使用的记录的记录(特别是描述 ADA 记录数据类型)。文件中提到了 6 处。我认为这澄清了这个问题,并回答了双方的各种论点。
附加信息
来自 wiscorp.com 上的一份(最新免费提供的草案版本)SQL 标准的副本(SQL 标准页面有其他几个旧版本和修订版)。
搜索日期为2011-12-21的7IWD2-02-Foundation-2011-12.pdf显示单词row在文档中出现了 2277 次,而单词record仅出现了 21 次,或者作为动词“记录”或者在最后的一些附录中,在 SQL 数据类型和宿主语言类型(Ada、Pascal)的数据类型对应的规范中。
此外,同一文件在第 57 页(强调我的):
就使用 SQL 的 DBMS 而言:
行不是记录,字段不是列,表不是文件!
因为关系数据库很少单独使用,为了避免系统其他部分的混淆,我总是提到表和行和列。在客户端应用程序中,我们通常有其他构造,包括数据读取器、数据集、数据行、数据表等 - 例如“字段”通常用于屏幕数据输入,Pascal 有一个类似于 C 中的结构的 Record 数据类型.
有时在系统设计中,“记录”的概念可能用于表示比单行更广泛的内容。这可能是一个行,它的历史。就像当我们谈论删除的行时,我们可能指的是简单地用列标记为已删除或“移动”到已删除表的行(而不仅仅是缺少一行,因为不存在,很难固定)。记录一词的用法更加多样化。
表、行和列是在关系数据库中引用这些实体的普遍接受的术语,包括 Codd 和 Date 的论文和工作,并且大多数数据库专业人员更喜欢这个术语,因为它更明确。
当一个人谈论行和列时,通常不会有歧义——其他人理解你是在谈论底层数据库物理设计,而不是在物理设计之前的逻辑设计中的任何其他类型的工件或任何后来出现的系统实体,如字段上的字段屏幕。
尽管您的问题已经得到很好的回答。我也想补充一下我的观点。可能你会发现它在某种程度上很有帮助。我的回答也不是特定于 SQL Server
这些词可以互换使用。
DataBase books start with these terminology
因为这些在现实生活中被人们广泛使用,在文件系统中也是如此。记录是存储系统中具有隐含意义的基本单元。在 DBMS
record
中,章节中的“使用”一词描述了数据库表如何存储在磁盘块上。在 DBMS 中,arecord-oriented file-system
是一个文件系统,其中文件存储为记录的集合。语言不断发展。几十年前,有文化的人使用“索引”而不是更简单的“索引”。当我们切换到“索引”时,我们消除了不必要的复杂性并使语言更加有用。需要记住“索引”的复数形式是纯粹的开销——它对我们交流没有任何帮助。毫无疑问,曾经有语法纳粹喜欢纠正那些改用“索引”的人。当然,语法纳粹输了。如果整个事情保持相关性足够长,这就是奥卡姆剃刀消除无用细节的方式。
所以让我们放轻松——知道行和记录之间的区别绝对不会增加我们开发和维护数据库的能力。许多优秀的专业人士交替使用行和记录,但开发了很棒的系统。因此,奥卡姆剃刀应该最终消除这种区别,而下一代将不得不学习一个不那么无用的事实。当然,如果当时 SQL 仍然适用。
简短的回答:
注意:表线性存储记录,查询线性返回结果
支持:
来自网络的其他定义:
值得注意的是,SQL 定义通常遵循英文定义。
如果您有一个您认为应该在这里的定义,请将其添加到评论中。
我对 SQL 标准中的定义或实现文档特别感兴趣。
引用了“行不是记录”。断章取义,这似乎与我之前的断言(以及许多数据库专业人士的断言)相矛盾。但是,如果您阅读了 Joe Celko(又名 --CELKO--)的整篇文章(1 Search for the quote),那么很明显,Joe Celko 正试图纠正对某个人的误解,Joe Celko 认为这种误解源于该人的“ ...使用传统文件系统进行数据处理的背景...”。简而言之,Joe Celko 是说 SQL 行的工作方式与其他系统中的记录不同。Joe Celko 并没有要求定义一个术语的权利/特权,他试图澄清由于错误地将一个存储模型应用于另一个存储模型而导致的错误理解。
引用 CJ Date 的书《数据库系统简介》“这样的表的行可以被认为是文件的记录…… ”
因此,对于数据库,它是 Row。