在我正在阅读的一本书中(查询SQL Server 2012),作者讨论了数据库如何工作的理论。他提到了关系,属性和元组等。
他经常强调T-SQL的某些方面不是关系的。如下面的摘录:
与结果是关系的前几个阶段不同,输出 这个阶段不是关系因素,因为它有保证的顺序。该 此阶段的结果是标准SQL调用游标的结果。注意 这里使用术语光标是概念性的。 T-SQL也支持 对象称为基于查询结果定义的游标, 并且允许以指定的顺序一次一个地获取行。您 可能会关心以特定顺序返回查询结果 用于演示目的或者如果调用者需要使用结果 以这种方式通过一些获取行的游标机制 一次。 但请记住,此类处理不是关系。如果你 需要以关系方式处理查询结果 - 例如, 根据查询定义表格表达式,如视图(详细信息 稍后在第4章) - 结果将需要是关系。也, 排序数据可以增加查询处理的成本。如果你不在乎 关于返回结果行的顺序,您可以避免 通过不添加ORDER BY子句来获得这种不必要的成本。
我想知道,因为SQL
的每个实现都有一个ORDER BY
条款,这使得它非关系,为什么它甚至重要({在ORDER BY
被使用后设置)它不再是关系,因为它就像每个地方一样?
我可以理解他是否说它是非标准的,例如使用!=
而不是<>
来表示不平等,因为这会影响可移植性等但我不明白为什么某些事情更适合作为关系。< / p>
请指教。
答案 0 :(得分:4)
听起来作者指的是使用集合论(在他的术语中称为“关系”)与使用游标或类似方法逐行处理。以关系方式访问数据允许数据库引擎执行选择/连接/排序/命令/等。在整个数据集上,光标一次只处理一行。据我所知,添加ORDER BY
子句不会使查询“非关系”,作者只是注意到如果你不关心结果集的顺序,你可以将该子句从您的查询和数据库引擎将以最终处理数据的顺序返回数据。
另请注意,ORDER BY
子句是数据库引擎最后执行的子句,这意味着查询以“关系”方式处理,然后在最后一分钟进行排序。游标从第一个记录开始逐个移动,因此整个操作将根据您的游标/查询定义以预先确定的顺序执行。
答案 1 :(得分:0)
(查询SQL Server 2012)中的关系查询点是:
但是结果的显示顺序是不确定的,这意味着不确定,并且对于相同的数据库可能会有所变化,具体取决于基础流程引擎。
因此,在添加ORDER BY子句之前和之后,顺序可以相同,但是并不能保证它们相等(例如,对于不同的补丁)