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


56

关于在SQL Server添加日期和时间的问题相当无害,这引发了相当有趣的分类学争论。

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

记录


32
一种推动工艺,另一种则被肮脏的
潮人

1
有关SO 的相关文章清楚地表明,这是一个重要的问题。
dezso 2013年

请注意,在Postgres和Oracle中,一行可以包含多个记录...
a_horse_with_no_name

Answers:


69

引用Joe Celko的话(不仅可以在网上和Wikipedia条目中找到此参考文献,而且甚至可以在某些会议的T恤上看到它):

行不是记录。

很多人指出他是个古怪的混蛋,只喜欢谦虚和口头上虐待新手,我承认这就是他的遭遇。但是我也亲自见过他-甚至和他一起吃饭-我无法告诉你他的现实角色与他的在线角色有何不同。我什至曾经抓过他打电话给行记录,他很尴尬(在这里有完整的背景故事)。

实际上,我穿着这件衬衫参加了2006年在得克萨斯州格雷普韦恩(Tvinevine)举行的PASS会议上

无论如何,请说出您对这个人的在线角色的看法,但是他写了这个标准,并且这样一个权威表明存在区别的事实应该告诉您一些信息。而且,当有人打电话给某行记录时,他不畏惧,我的许多同事(也是SQL Server领域的专家)也是如此。我们那个营地的人都相信他是对的。

例如,明显的SQL Server专家Itzik Ben-Gan。以下是他的培训工具包(考试70-461)中第一节课的引文:查询Microsoft SQL Server 2012

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

而且,了解Itzik,如果您给他发送电子邮件或在会议上碰壁他,他会很乐意告诉您。他认为,如果您将记录称为行,则表示您使用的术语不正确。

现在,作为一个由各种各样的人组成的行业,您可能会发现似乎在两者之间有非常微妙区别的材料(例如在另一个答案中发布的技术目标文章),并且您会发现该行业中有很多人认为他们是相同的(我认识Microsoft的几个人,以及像Brent Ozar这样的人,他们总是将其称为唱片)。那并不能使他们正确,那只是他们的看待方式-他们认为逻辑和物理是相同的(至少在这种情况下),而且他们中的许多人可能认为我们其他人只是花了太多时间的肛门保留物关于语义。

由于没有供应商会说“您应该称呼他们{records | rows}”,因此我们将永远与这个争论打交道,因为总会有人不懂逻辑,不懂物理,或者受过不同的教导,或者就像某些人说tomay-to和其他人说tomah-to一样,总会有各种各样的人从“他们相同”到“他们完全不同” ”-介于两者之间。同样,这并不能使其中任何一个正确,因为没有人可以成为这方面的最终权威。但是在SQL Server领域,绝对占多数。


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

一旦您的应用程序拥有记录,便可以随时将其称为记录。但是,如果您说“我插入了唱片”,并且有人纠正了您,请不要生气。


33

Microsoft在其组织中的多个地方都提供了每个表条目的表格数据存储的正式名称(以达到我的目的的分类学定义)被称为“ ROW”。我提交了,和属性作为证据ROW_NUMBER,其中a 是TSQL“表”对象的C#表示形式。在这种情况下,整个MSDN属性都鼓励使用来引用作为表中一项的数据集合。(请注意,我正试图避免使用“记录”或“行”来定义这一点,这是问题所在)ROWCOUNTROWVERSIONDataTable.RowsDataTablerow

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

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


8
可以认为ROW是逻辑实体,而RECORD是物理实体。一个ROW可能有多个记录:一个在聚集索引中,几个在NC索引中。可以在页面中的记录和SLOB存储中的溢出记录之间分割不适合页面的行。行的字段的BLOB值可以跨越BLOB存储中的多个TEXT记录。堆中的一行可以由存根记录和前向记录组成。等等等等
莱姆斯Rusanu

然后,您可能会完全从应用程序域中删除单词记录的用法,或者完全使领域变得混乱,使我们脱离了可定义的术语,而进入了理论数据库设计和实现细节的领域。您提出了很好的观点,但是按照应用程序与数据库的惯例,这是80%的读者感到满意的地方,我坚持我的答案。
jcolebrand

4
我不会与您的答案相抵触,也许我是对单词进行了错误处理。我仅介绍了SQL Engine本身如何看待事物,其中物理访问层将其称为“记录”,而查询处理(语言)层则将其称为“行”。
Remus Rusanu 2013年

我懂了。我仍然觉得浑浊。我向您保证,没有冒犯。
jcolebrand

31

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

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

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

我认为这消除了这个问题,并回答了双方的各种论点。


附加信息

摘自wiscorp.com上(最新免费版本的草稿)的SQL标准副本(“ SQL Standards”页面具有其他几个较旧的版本和修订版)。

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

此外,同一文件在第57页(重点为我):

4.15.1表简介

本条款已由ISO / IEC 9075-9中的4.10.1节“表简介”进行了修改。

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

表的程度及其每的程度是该表的列数。表中的数是其基数。基数为0(零)的表称为空表。

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


因此,对于使用SQL的DBMS而言:

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


14

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

有时在系统设计中,“记录”的概念可能用于表示比单行更宽的内容。这可能是一排,它是历史。就像当我们谈论已删除的行时一样,我们可能指的是简单地将其标记为已删除并带有列或“移至”已删除表的行(而不是简单地缺少缺少的行,因为该行不存在,很难做到)固定下来)。“记录”一词的用法更加多样化。

表,行和列是在关系数据库中引用这些实体(包括Codd和Date的论文和著作)时通常被接受的术语,并且大多数数据库专业人员更喜欢这种术语,因为它更为明确。

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


9

尽管您的问题已经很好地回答了。我也想补充一点。也许您会发现它在一定程度上有所帮助。另外我的答案并不特定于SQL Server

这些单词可以互换使用。

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

Column =  Field   =  Attribute    =  Attribute

table  =  File    =  Relation     =  Entity Types(or Entity Set)
  • 学习ER模块时可以使用的4种术语
  • 3使用关系模型时
  • 2总体场景,DataBase books start with these terminology因为这些在现实生活中以及文件系统中都为人们所普遍使用。

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


9

语言在不断发展。几十年前,有识之士使用“索引”代替了简单的“索引”。当我们切换到“索引”时,我们消除了不必要的复杂性,并使该语言更有用。记住“索引”的复数形式只是纯粹的开销-它丝毫没有帮助我们进行交流。毫无疑问,纳粹分子曾经喜欢纠正那些改用“索引”的人。当然,纳粹语法迷路了。如果整个物件保持足够长的相关时间,这就是Occam的剃须刀消除不必要的细节的方式。

因此,让我们放轻松-知道行和记录之间的差异绝对不会增加我们开发和维护数据库的能力。许多优秀的专业人员可以交替使用行和记录,但是却开发出了很棒的系统。因此,Occam的剃须刀最终应消除这种区别,下一代将不得不学习一个少用的事实。如果那时SQL当然仍然有用。


5

引用CJ Date的书“数据库系统入门”,“ 可以将这样一个表的行视为文件的记录...

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


4

简短答案

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

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

技术支持

网络上的其他定义:

  • SQL “行”(12
  • SQL “记录”(12
  • “记录”(1234
  • “行”(1,也参见234
  • 行VS记录在计算器上(12

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

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

引号是“行不是记录”。脱离上下文,这似乎与我之前的主张(以及许多数据库专业人员的主张)相矛盾。但是,如果您阅读了Joe Celko(aka --CELKO--)的全文(1引用报价),则很显然,Joe Celko正在尝试纠正对一个误解的想法,Joe Celko认为这是由于该人的“ ……使用传统文件系统进行数据处理的背景知识……”。简而言之,Joe Celko说SQL行与其他系统中的记录工作不同。Joe Celko并没有主张定义术语的权利/特权,他试图消除由于错误地将一种存储模型应用于另一种存储模型而带来的误解。


3
我感谢您所做的工作,并以为您投入了这项工作。我将注意到,Celko的差异化旨在得出RDBMS与RDBMS之前的平面文件COBOL系统之间的差异。Ergo,他强调“行”是RDBMS模式的一部分,而“记录”是平面文件的组成部分。
swasheck 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.