ANSI SQL 包含幾個彙總函式,使你可以計算一組值以將其結果傳回一個值。 這些包括 Count()、Min()、Max()、Sum() 和 AVG() 等。根據預設,彙總函式會套用於所有列,但是你可以於 SELECT 陳述式使用 WHERE 子句來縮小欄位的範圍。此外,你亦可運用其他技術有條件地選取某幾列。我們將在今天使用 Navicat Premium 探索這些技術,包括使用 CASE 陳述式以及 GROUP BY 子句。我們會將這些技術套用於 AVG() 函式,但它們在所有彙總函式同樣可良好運作。
使用 AVG() 函式
AVG() 擷取特定運算式的平均值。如果該函式找不到符合的列,則傳回 NULL。我們將於 Sakila 範例資料庫 執行查詢。它最初是為 MySQL 開發的,但此後已移植到大多數流行的 DBMS。Navicat Premium 是理想的資料庫用戶端,因為它支援 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 的所有項目。此外,它還與 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Cloud、Google Cloud 和 MongoDB Atlas等雲端資料庫相容。
film 資料表儲存有關虛構的 Sakila 影片出租商店的各個電影的資訊。資料表欄包括標題、描述、片長、租金、等級和其他。
我們可以使用 AVG() 函式確定所有電影的平均租賃成本,如下所示:
使用 CASE 陳述式
AVG() 函式接受一個運算式,可以是欄名稱,亦可以是任何有效運算式。因此,我們可以將 CASE 陳述式作為參數傳遞給 AVG() 函式來有條件地套用 AVG() 函式。我們可以使用 CASE 陳述式找到僅具有 PG 評級的電影的平均 rental_rate,如下所示:
上面的查詢顯示了電影的總數、不是 PG 評級的電影、所有電影的平均租金以及具有 PG 評級的電影的平均租金。使用 CONCAT() 和 FORMAT() 函式可將 rental_rate 顯示為貨幣。
使用 GROUP BY 子句
將 AVG() 僅套用於某些列的另一種方法是使用 GROUP BY。它根據已選取的欄彙總結果。因此,按評分分組結果將列出每個評分的平均 rental_rate:
我們可以使用 WHERE 和/或 HAVING 子句來縮小要選取的列的範圍。兩者都可以單獨或一同使用。例如,以下查詢選取 language_id 為 1(英語)並且其評分次數小於 200的電影:
總結
在今天的文章中,我們使用 CASE 陳述[和 GROUP BY 子句有條件地以平均值列出電影記錄。
所有查詢都是在 Navicat Premium 15 中執行。它加入了 100 多項增強功能,包括幾個全新的功能,可為你提供比以往更多建置、管理和維護資料庫的方法!