Sql-Standard

子查詢(派生表)中的 ORDER BY 用法 SQL 標準是否允許

  • March 9, 2019

MariaDB 文件提到ORDER BYSQL 標準從不允許子查詢(派生表)中的子句。

含義 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,則優化器可以自由地以它認為最簡單/最快的方式返回結果。它可以利用索引或記憶體或任何其他允許它產生正確結果的東西,但不限於這樣做。

引用自:https://dba.stackexchange.com/questions/231745