首頁 > 資料庫 > mysql教程 > 為什麼「GROUP BY」子句在 MySQL 和 PostgreSQL 中的工作方式不同?

為什麼「GROUP BY」子句在 MySQL 和 PostgreSQL 中的工作方式不同?

Mary-Kate Olsen
發布: 2025-01-18 09:41:10
原創
572 人瀏覽過

Why Does a `GROUP BY` Clause Work Differently in MySQL and PostgreSQL?

MySQL 和 PostgreSQL GROUP BY 子句:比較

流行的關聯式資料庫系統 MySQL 和 PostgreSQL 對 GROUP BY 子句的處理方式不同。 此子句根據指定的列對行進行分組,從而啟用對分組資料進行聚合函數計算。 讓我們來看看主要的區別。

常見場景涉及包含列 the_tablecol1col2 的表(例如 col3)。 在 MySQL 中,像 SELECT col2, col3, col1 FROM the_table GROUP BY col2; 這樣的查詢可能會傳回結果,看似為每個 col3 群組中的 col1col2 選擇任意值。 然而,在 PostgreSQL 中相同的查詢會產生錯誤。

為什麼 PostgreSQL 會出錯?

PostgreSQL 嚴格遵守 SQL 標準。 此標準要求 SELECT 清單中未包含在 GROUP BY 子句 中的任何欄位都必須 是聚合函數的一部份。 在我們的例子中,col3col1 違反了此規則。

聚合函數解釋

聚合函數(如 MINMAXAVGSUMCOUNT)從多行計算單一值。 它們對於匯總分組資料至關重要。

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 群組的 col1col2 的最小值,提供明確定義的結果。 將 MIN() 替換為其他聚合函數,例如 MAX()AVG() 等,可為每個群組提供不同的總計統計資料。 這種方法保證了標準 SQL 合規性,並避免了 MySQL 的非標準 GROUP BY 擴充中固有的歧義。

以上是為什麼「GROUP BY」子句在 MySQL 和 PostgreSQL 中的工作方式不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板