3

在我正在阅读的一本书(Querying SQL Server 2012)中,作者谈到了数据库如何工作的理论。他提到了关系、属性和元组等。

他经常强调 T-SQL 的某些方面不是关系的事实。就像下面的摘录一样:

与之前的结果是关系的阶段不同,此阶段的输出不是关系的,因为它有保证的顺序。这个阶段的结果就是标准 SQL 所称的游标。请注意,此处使用术语光标是概念性的。T-SQL 还支持称为游标的对象,该对象基于查询结果定义,并且允许以指定顺序一次获取一个行。您可能关心以特定顺序返回查询结果以用于演示目的,或者调用者是否需要通过某种游标机制以这种方式使用结果,该机制一次获取一个行。但请记住,这样的处理不是相关的. 如果您需要以关系方式处理查询结果——例如,定义一个表表达式,如基于查询的视图(第 4 章后面的详细信息)——结果将需要是关系的。此外,对数据进行排序会增加查询处理的成本。如果您不关心返回结果行的顺序,则可以通过不添加 ORDER BY 子句来避免这种不必要的成本。

我想知道,由于几乎所有的实现SQL都有一个ORDER BY使它成为非关系的子句,为什么它(使用后面的集合ORDER BY)它不再是关系的,因为它在任何地方都是如此?

如果他说它是非标准的,我可以理解,例如使用!=而不是<>不平等,因为这会影响可移植性等,但我不明白为什么某些东西最好是相关的。

请赐教。

4

2 回答 2

4

听起来作者指的是使用集合论(用他的话来说是“关系”)与使用游标或类似方法逐行处理。以关系方式访问数据允许数据库引擎执行选择/连接/排序/订单/等。在整个数据集上,游标一次只能处理一行。据我所知,添加ORDER BY子句不会使查询“非关系”,作者只是指出,如果您不关心结果集的顺序,您可以将该子句排除在查询和数据库之外引擎将以最终处理数据的任何顺序返回数据。

另请注意,该ORDER BY子句是数据库引擎执行的最后一个,这意味着查询以“关系”方式处理,然后在最后一分钟排序。游标从第一条记录开始并逐条移动,因此整个操作将根据您的游标/查询定义以预先确定的顺序执行。

于 2013-11-08T15:28:28.557 回答
0

(Querying SQL Server 2012) 中的关系查询的要点是:

它返回一个满足查询要求的集合。

但是结果的呈现顺序是不确定的,这意味着它不确定,并且对于同一个数据库可能会发生变化,具体取决于底层流程引擎。

ORDER BY 使其具有确定性,因此在不同的服务器上运行相同的查询可以保证结果的相同顺序。

因此,通过这种方式,添加 ORDER BY 子句之前和之后的顺序可以相同,但并不认为它们会相等(例如,对于不同的补丁)

于 2019-12-26T09:41:16.433 回答