Order-By
從有序 SELECT 中選擇無序集時的順序是什麼?
在以下一般情況下,SQL 標準及其主流 DB 實現(SQL Server、Oracle、DB2、PostgreSQL、Firebird、MySQL 等)如何說明最終順序:
SELECT * FROM (SELECT * FROM Table t ORDER BY t.Field)
我是否可以相信外部投影也尊重內部順序,或者我是否需要
ORDER BY
在外部語句中明確說明?我理解“明確列出”的建議。但是,在某些情況下,顯式列出可能會導致問題。一方面,PostgreSQL 要求列出的所有欄位也
ORDER BY
必須在其中列出SELECT DISTINCT
。在某些情況下,這並不好,因為它改變了預期的結果集,鑑於我感興趣的單列,這不再是不同的。
我可以相信外部投影也尊重內部秩序……?
你不能。
…或者我是否需要
ORDER BY
在外部語句中明確說明?
ORDER BY
是的,如果您想確保返回行的順序是您想要的,您確實需要在外部語句中明確說明您需要的內容。雖然您可能(在某些 DBMS 的舊版本中更常見)有時會發現返回的行的順序是 internal 中指定的順序
ORDER BY
,但不能保證這一點。如果你想要一個特定的順序,你需要明確。相關/類似問題:
- 為什麼 SSMS 在表格頂部而不是底部插入新行?
- MySQL 中 SELECT 語句的預設記錄順序是什麼?
- 在 SQL Server 中,當對僅具有聚集索引的表強制執行索引查找時,是否可以保證沒有顯式 ORDER BY 子句的順序?
- 對於這個特定的冗餘派生表,是否真的有可能無法保證訂單?
來自 SQL 標準的引用:
游標
…
處於打開狀態的游標標識結果集和相對於該結果集的排序的位置。如果游標的 <cursor specification> 不簡單地包含 <order by clause>,或者只包含未完全指定行順序的 <order by clause> ,則結果集的行的順序為僅在 <order by 子句> 指定順序的範圍內定義,否則依賴於實現。
<查詢表達式>
…
- T 的行排序如下:
a)如果 QE 沒有立即包含 <order by 子句>,則 T 中的行排序取決於實現。