子查詢(派生表)中的 ORDER BY 用法 SQL 標準是否允許
MariaDB 文件提到
ORDER BY
SQL 標準從不允許子查詢(派生表)中的子句。含義 SQL 查詢
SELECT field1 , field2 FROM ( SELECT field1 , field2 FROM table1 ORDER BY field2 ) alias
SQL 標準從不允許
根據 SQL 標準,“表”(以及 FROM 子句中的子查詢)是一組無序的行。表中的行(或 FROM 子句中的子查詢)沒有任何特定的順序。這就是優化器可以忽略您指定的 ORDER BY 子句的原因。事實上,SQL 標準甚至不允許 ORDER BY 子句出現在這個子查詢中
見源
但是當我查看 SQL 92 標準時。(我知道它很舊)
4.9 表格
…
…
表可以是基表、查看表或派生表。 基表可以是持久基表、全域臨時表、已創建的本地臨時表或已聲明的本地臨時表。
…
…
派生表是通過評估 a 直接或間接從一個或多個其他表派生的表
<query expression>
。派生表的值派生自評估時基礎表的<query expression>
值。……
_
派生表和游標的簡單基礎表在子條款 7.9、
"<query specification>"
……、子條款 7.10、……"<query expression>"
和子條款 13.1 ……中定義"<declare cursor>"
。查看的表沒有簡單的基礎表。他們提到游標,讓我們看看他們對游標的看法以及它們是什麼。
4.21 游標
…
…
處於打開狀態的游標標識一個表、該表的行的順序以及相對於該順序的位置。如果
<declare cursor>
不包含<order by clause>
,或包含<order by clause>
未完全指定行順序的 ,則表的行具有僅在**<order by clause>
指定順序的範圍內定義的順序,否則依賴於實現。**所以他們在這裡提到處於打開狀態的游標可以是表,可以是基表、查看表或派生表。如果您在第 4.9 節表中查看他們如何定義表是什麼
如果我讀到這篇文章,我可能會將其解釋為
ORDER BY
在派生表中使用(如上面的 SQL 查詢)對於 SQL 標準是完全有效的,這取決於供應商是否允許將ORDER BY
其作為選項。但我會解釋錯英語不是我的母親 laungauge,所以問題是我解釋正確嗎?
游標不是表,它指的是表或該表的視圖。游標的順序僅在定義游標的查詢具有排序依據的範圍內。該較大查詢中的子查詢不會定義順序,並且查詢用於游標的事實不會按照子查詢的合法語法進行排序。
基本上,與任何其他查詢一樣,如果您在最外層沒有 order by,則優化器可以自由地以它認為最簡單/最快的方式返回結果。它可以利用索引或記憶體或任何其他允許它產生正確結果的東西,但不限於這樣做。