MySQL 和 PostgreSQL GROUP BY
子句:比較
流行的關聯式資料庫系統 MySQL 和 PostgreSQL 對 GROUP BY
子句的處理方式不同。 此子句根據指定的列對行進行分組,從而啟用對分組資料進行聚合函數計算。 讓我們來看看主要的區別。
常見場景涉及包含列 the_table
、col1
和 col2
的表(例如 col3
)。 在 MySQL 中,像 SELECT col2, col3, col1 FROM the_table GROUP BY col2;
這樣的查詢可能會傳回結果,看似為每個 col3
群組中的 col1
和 col2
選擇任意值。 然而,在 PostgreSQL 中相同的查詢會產生錯誤。
為什麼 PostgreSQL 會出錯?
PostgreSQL 嚴格遵守 SQL 標準。 此標準要求 SELECT
清單中未包含在 GROUP BY
子句 中的任何欄位都必須 是聚合函數的一部份。 在我們的例子中,col3
和 col1
違反了此規則。
聚合函數解釋
聚合函數(如 MIN
、MAX
、AVG
、SUM
、COUNT
)從多行計算單一值。 它們對於匯總分組資料至關重要。
MySQL 的非標準行為
MySQL 的行為背離了標準。 它允許選擇不在 GROUP BY
子句中的非聚合列,但這是不可靠的。這些列的選定值是不可預測的,並且取決於資料庫的內部工作原理;不保證它們是一致的。
符合標準的查詢
為了確保兩個資料庫的結果一致且可預測,請務必對 GROUP BY
子句中不存在的資料列使用聚合函數。 以下查詢在 MySQL 和 PostgreSQL 中都可以正確運作:
<code class="language-sql">SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1 FROM the_table GROUP BY col2;</code>
此查詢使用 MIN()
找出每個 col3
群組的 col1
和 col2
的最小值,提供明確定義的結果。 將 MIN()
替換為其他聚合函數,例如 MAX()
、AVG()
等,可為每個群組提供不同的總計統計資料。 這種方法保證了標準 SQL 合規性,並避免了 MySQL 的非標準 GROUP BY
擴充中固有的歧義。
以上是為什麼「GROUP BY」子句在 MySQL 和 PostgreSQL 中的工作方式不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!