我正在使用Azure SQLdb上的示例AdventureWorksLT数据库。查询SELECT * FROM [SalesLT].[Customer]
时会得到以下结果。
但是当我查询SELECT CustomerID FROM [SalesLT].[Customer]
或SELECT TOP 7 CustomerID FROM [SalesLT].[Customer]
时,我期望CustomerID列的结果已经像第一个屏幕截图一样以一种排序的方式,但是相反,我得到了这样的意外未排序的结果,例如在下面。
这种意外行为的背后原因是什么?
答案 0 :(得分:2)
没有意外行为。
SQL表表示无序集。结果集为无序,除非您在最外面的查询中显式包含"sep=,"
"Service","Reported","Total","%"
"a service","23","70","32.86%"
"yet_a_service","27","70","38.57%"
"more_services","20","70","28.57%"
。
添加ORDER BY
以获得所需的结果:
ORDER BY
如果您没有SELECT TOP 7 CustomerID
FROM [SalesLT].[Customer]
ORDER BY CustomerID;
并且结果恰好看起来像是有序的,那只是一个巧合。如果要保证订购,则需要ORDER BY
。
答案 1 :(得分:2)
如果存在意外行为,则是由于错误的假设,因此行存在潜在的物理顺序。没有一个。 SQL是一种解释型语言。如果在没有SELECT
的情况下执行ORDER BY
语句,则解释器将决定要返回的行。很多时候,行以期望的顺序返回,但是由于解释器不保证行的顺序,所以不能依赖行。