如何使用 SQL AVG、COUNT、MAX、MIN 和 SUM 彙總數據

来源:https://www.cnblogs.com/vin-c/archive/2022/05/12/16263142.html
-Advertisement-
Play Games

本文介紹什麼是 SQL 的聚集函數,如何利用它們彙總表的數據。這些函數很高效,它們返回結果一般比你在自己的客戶端應用程式中計算要快得多。 一、聚集函數 我們經常需要彙總數據而不用把它們實際檢索出來,為此 SQL 提供了專門的函數。使用這些函數,SQL 查詢可用於檢索數據,以便分析和報表生成。這種類型 ...


本文介紹什麼是 SQL 的聚集函數,如何利用它們彙總表的數據。這些函數很高效,它們返回結果一般比你在自己的客戶端應用程式中計算要快得多。

一、聚集函數

我們經常需要彙總數據而不用把它們實際檢索出來,為此 SQL 提供了專門的函數。使用這些函數,SQL 查詢可用於檢索數據,以便分析和報表生成。這種類型的檢索例子有:

  • 確定表中行數(或者滿足某個條件或包含某個特定值的行數);
  • 獲得表中某些行的和;
  • 找出表列(或所有行或某些特定的行)的最大值、最小值、平均值。

上述例子都需要彙總出表中的數據,而不需要查出數據本身。因此,返回實際表數據純屬浪費時間和處理資源(更不用說帶寬了)。再說一遍,我們實際想要的是彙總信息。

為方便這種類型的檢索,SQL 給出了 5 個聚集函數,見表 1。這些函數能進行上述檢索。與 SQL 如何使用函數處理數據 介紹的數據處理函數不同,SQL 的聚集函數在各種主要 SQL 實現中得到了相當一致的支持。

聚集函數(aggregate function)

對某些行運行的函數,計算並返回一個值。

表 1 SQL 聚集函數

函數 說明
AVG() 返回某列的平均值
COUNT() 返回某列的行數
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

下麵說明各函數的使用。

1.1 AVG() 函數

AVG() 通過對錶中行數計數並計算其列值之和,求得該列的平均值。AVG() 可用來返回所有列的平均值,也可以用來返回特定列或行的平均值。

下麵的例子使用 AVG() 返回 Products 表中所有產品的平均價格:

SELECT AVG(prod_price) AS avg_price
FROM Products;

輸出:

avg_price
-------------
6.823333

SELECT 語句返回值 avg_price,它包含 Products 表中所有產品的平均價格。如 SQL 如何創建計算欄位 中所述,avg_price 是一個別名。

AVG() 也可以用來確定特定列或行的平均值。下麵的例子返回特定供應商所提供產品的平均價格:

SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';

輸出:

avg_price
-----------
3.8650

這條 SELECT 語句與前一條的不同之處在於,它包含了 WHERE 子句。此 WHERE 子句僅過濾出 vend_idDLL01 的產品,因此 avg_price 中返回的值只是該供應商產品的平均值。

註意:只用於單個列

AVG() 只能用來確定特定數值列的平均值,而且列名必須作為函數參數給出。為了獲得多個列的平均值,必須使用多個 AVG() 函數。只有一個例外是要從多個列計算出一個值時,本問後面會講到。

說明:NULL

AVG() 函數忽略列值為 NULL 的行。

1.2 COUNT() 函數

COUNT() 函數進行計數。可利用 COUNT() 確定表中行的數目或符合特定條件的行的數目。

COUNT() 函數有兩種使用方式:

  • 使用 COUNT(*) 對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。
  • 使用 COUNT(column) 對特定列中具有值的行進行計數,忽略 NULL 值。

下麵的例子返回 Customers 表中顧客的總數:

SELECT COUNT(*) AS num_cust
FROM Customers;

輸出:

num_cust
--------
5

在此例子中,利用 COUNT(*) 對所有行計數,不管行中各列有什麼值。計數值在 num_cust 中返回。

下麵的例子只對具有電子郵件地址的客戶計數:

SELECT COUNT(cust_email) AS num_cust
FROM Customers;

輸出:

num_cust
--------
3

這條 SELECT 語句使用 COUNT(cust_email)cust_email 列中有值的行進行計數。在此例子中,cust_email 的計數為 3(表示 5 個顧客中只有 3 個顧客有電子郵件地址)。

說明:NULL

如果指定列名,則 COUNT() 函數會忽略指定列的值為 NULL 的行,但如果 COUNT() 函數中用的是星號(*),則不忽略。

1.3 MAX() 函數

MAX() 返回指定列中的最大值。MAX() 要求指定列名,如下所示:

SELECT MAX(prod_price) AS max_price
FROM Products;

輸出:

max_price
----------
11.9900

這裡,MAX() 返回 Products 表中最貴物品的價格。

提示:對非數值數據使用 MAX()

雖然 MAX() 一般用來找出最大的數值或日期值,但許多(並非所有)DBMS 允許將它用來返回任意列中的最大值,包括返迴文本列中的最大值。

在用於文本數據時,MAX() 返回按該列排序後的最後一行。

說明:NULL

MAX() 函數忽略列值為 NULL 的行。

1.4 MIN() 函數

MIN() 的功能正好與 MAX() 功能相反,它返回指定列的最小值。與 MAX() 一樣,MIN() 要求指定列名,如下所示:

SELECT MIN(prod_price) AS min_price
FROM Products;

輸出:

min_price
----------
3.4900

其中 MIN() 返回 Products 表中最便宜物品的價格。

提示:對非數值數據使用 MIN()

雖然 MIN() 一般用來找出最小的數值或日期值,但許多(並非所有)DBMS 允許將它用來返回任意列中的最小值,包括返迴文本列中的最小值。

在用於文本數據時,MIN() 返回該列排序後最前面的行。

說明:NULL

MIN() 函數忽略列值為 NULL 的行。

1.5 SUM() 函數

SUM() 用來返回指定列值的和(總計)。

下麵舉一個例子,OrderItems 包含訂單中實際的物品,每個物品有相應的數量。可如下檢索所訂購物品的總數(所有 quantity 值之和):

SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;

輸出:

items_ordered
----------
200

函數 SUM(quantity) 返回訂單中所有物品數量之和,WHERE 子句保證只統計某個物品訂單中的物品。

SUM() 也可以用來合計計算值。在下麵的例子中,合計每項物品的 item_price*quantity,得出總的訂單金額:

SELECT SUM(item_price*quantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;

輸出:

total_price
----------
1648.0000

函數 SUM(item_price*quantity) 返回訂單中所有物品價錢之和,WHERE 子句同樣保證只統計某個物品訂單中的物品。

提示:在多個列上進行計算

如本例所示,利用標準的算術操作符,所有聚集函數都可用來執行多個列上的計算。

說明:NULL

SUM() 函數忽略列值為 NULL 的行。

二、聚集不同值

以上 5 個聚集函數都可以如下使用。

  • 對所有行執行計算,指定 ALL 參數或不指定參數(因為 ALL 是預設行為)。
  • 只包含不同的值,指定 DISTINCT 參數。

提示:ALL 為預設

ALL 參數不需要指定,因為它是預設行為。如果不指定 DISTINCT,則假定為 ALL

下麵的例子使用 AVG() 函數返回特定供應商提供的產品的平均價格。它與上面的 SELECT 語句相同,但使用了 DISTINCT 參數,因此平均值只考慮各個不同的價格:

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';

輸出:

avg_price
-----------
4.2400

可以看到,在使用了 DISTINCT 後,此例子中的 avg_price 比較高,因為有多個物品具有相同的較低價格。排除它們提升了平均價格。

註意:DISTINCT 不能用於 COUNT(*)

如果指定列名,則 DISTINCT 只能用於 COUNT()DISTINCT 不能用於 COUNT(*)。類似地,DISTINCT 必須使用列名,不能用於計算或表達式。

提示:將 DISTINCT 用於 MIN()MAX()

雖然 DISTINCT 從技術上可用於 MIN()MAX(),但這樣做實際上沒有價值。一個列中的最小值和最大值不管是否只考慮不同值,結果都是相同的。

說明:其他聚集參數

除了這裡介紹的 DISTINCTALL 參數,有的 DBMS 還支持其他參數,如支持對查詢結果的子集進行計算的 TOPTOP PERCENT

為瞭解具體的 DBMS 支持哪些參數,請參閱相應的文檔。

三、組合聚集函數

目前為止的所有聚集函數例子都只涉及單個函數。但實際上,SELECT 語句可根據需要包含多個聚集函數。請看下麵的例子:

SELECT COUNT(*) AS num_items,
       MIN(prod_price) AS price_min,
       MAX(prod_price) AS price_max,
       AVG(prod_price) AS price_avg
FROM Products;

輸出:

num_items      price_min           price_max           price_avg
----------     ---------------     ---------------     ---------
9              3.4900              11.9900             6.823333

這裡用單條 SELECT 語句執行了 4 個聚集計算,返回 4 個值(Products 表中物品的數目,產品價格的最高值、最低值以及平均值)。

註意:取別名

在指定別名以包含某個聚集函數的結果時,不應該使用表中實際的列名。雖然這樣做也算合法,但許多 SQL 實現不支持,可能會產生模糊的錯誤消息。

四、小結

聚集函數用來彙總數據。SQL 支持 5 個聚集函數,可以用多種方法使用它們,返回所需的結果。這些函數很高效,它們返回結果一般比你在自己的客戶端應用程式中計算要快得多。

原文鏈接:https://www.developerastrid.com/sql/sql-summarizing-data/

(完)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文先給出“win10找不到無線網路報錯”的通用解決方案,併在方案中介紹本次出現的“Windows無法自動將IP協議堆棧綁定到網路適配器”問題。 ...
  • 針對假如已經是安裝了redis,只是是單部署,需要把他切換成redis集群+哨兵模式,我因為偷懶,就寫了個腳本來執行,各位看官,請品~你品~你細品~ 首先準備個升級包,放到任意路徑,內容如下: 第一個文件不用管,第二個跟第四個,是把裡面的配置改好,如何配置請參考我之前寫的redis集群一, 然後是u ...
  • 一 、通過雲開發平臺快速創建初始化應用 1.創建相關應用模版請參考鏈接:5分鐘站點生成神器——Docusaurus 2.完成創建後就可以在github中查看到新增的Docusaurus倉庫 二 、 本地編寫個人博客 1.將應用模版克隆到本地 ● 首先假定你已經安裝了Git、node,沒有安裝請移步n ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 實現呼吸燈的效果:D1為長亮LED,D2為呼吸燈,通過PWM的方式實現D2亮→滅→亮→滅……的漸變效果,一次變化 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 前情提要: 該方法只適用於Windows10以上版本,Ubuntu直接可在微軟商店安裝 在這個網頁docs.microsoft.com/zh-cn/windo… 可以設置完成前5部,然後根據下麵具體操作。 ps:1.在連接中我們要打開powers ...
  • 五一5天小假期的結束大家休息好了嗎?上班了狀態回整的怎麼樣呢?阿裡云云發平臺給大家帶福利了呢,通過玩游戲把獎品帶回家。 雲開發平臺兩周年,0門檻部署上線4款熱門游戲,游戲暢玩還有AirPods耳機、筋膜槍等8種獎品任你挑啦!4款游戲只需要完成2個就可以抽獎呢,100%中獎;還額外有故事有獎徵集的板塊 ...
  • 一、引言 SQL Server有一些很好用的功能,只不過由於個人原因沒用過或者不記得怎麼用,導致需要花點時間用其它方式來實現。 二、好用小知識 2.1、FORMAT函數 1)時間格式化,如將當前日期格式化為2022-05-12: SELECT FORMAT(GETDATE(),'yyyy-MM-dd ...
  • 一、引言 A表數據同步至B表的場景很常見,比如一個公司有總部及分廠,它們使用相同的系統,只是賬套不同。此時,一些基礎數據如物料信息,只需要總部錄入即可,然後間隔一定時間同步至分廠,避免了重覆工作。 二、測試數據 CREATE TABLE StudentA ( ID VARCHAR(32), Name ...
一周排行
    -Advertisement-
    Play Games
  • 分組和樹形結構是不一樣的。 樹形結構是以遞歸形式存在。分組是以鍵值對存在的形式,類似於GroupBy這樣的形式。 舉個例子 ID NAME SEX Class 1 張三 男 1 2 李四 女 2 3 王二 男 1 當以Sex為分組依據時則是 Key Value 男 1 張三 男 1 3 王二 男 1 ...
  • NetCore中將SQLServer資料庫備份為Sql腳本 描述: 最近寫項目收到了一個需求, 就是將SQL Server資料庫備份為Sql腳本, 如果是My Sql之類的還好說, 但是在網上搜了一大堆, 全是教你怎麼操作SSMS的, 就很d疼! 解決方案: 通過各種查找資料, 還有一些老哥的幫助, ...
  • 我的Notion Clowd.Squirrel Squirrel.Windows 是一組工具和適用於.Net的庫,用於管理 Desktop Windows 應用程式的安裝和更新。 Squirrel.Windows 對 Windows 應用程式的實現語言沒有任何要求,甚至無需服務端即可完成增量更新。 ...
  • 轉載請註明來源 https://www.cnblogs.com/brucejiao/p/16188865.html 謝謝! 轉載請註明來源 https://www.cnblogs.com/brucejiao/p/16188865.html 謝謝! 轉載請註明來源 https://www.cnblog ...
  • 1. Netty源碼研究筆記(3)——Channel系列 依舊是通過先縱向再橫向的研究方法,在開篇中,我們發現不管是Sever還是Client,最終的啟動是通過調用channel的對應方法來完成的,而這個動作實際在channel綁定的eventLoop中執行。 接下來,我們繼續EchoSever、E ...
  • 大家好,今天給大家介紹一款輕量、快速、穩定可編排的組件式規則引擎框架LiteFlow。 一、LiteFlow的介紹 LiteFlow官方網站和代碼倉庫地址 官方網站:https://yomahub.com/liteflow Gitee托管倉庫:https://gitee.com/dromara/li ...
  • 我使用Spring AOP實現了用戶操作日誌功能 今天答辯完了,復盤了一下系統,發現還是有一些東西值得拿出來和大家分享一下。 需求分析 系統需要對用戶的操作進行記錄,方便未來溯源 首先想到的就是在每個方法中,去實現記錄的邏輯,但是這樣做肯定是不現實的,首先工作量大,其次違背了軟體工程設計原則(開閉原 ...
  • 《零基礎學Java》 繪製幾何圖形 Java可以分別使用 Graphics 和 Graphics2D 繪製圖形,Graphics類 使用不同的方法繪製不同的圖形(drawLine()方法可f以繪製線、drawRect()方法用於繪製矩形、drawOval()方法用於繪製橢圓形)。 Graphics類 ...
  • 本期教程人臉識別第三方平臺為虹軟科技,本文章講解的是人臉識別RGB活體追蹤技術,免費的功能很多可以自行搭配,希望在你看完本章課程有所收穫。 ...
  • 很多人都喜歡使用黑色的主題樣式,包括我自己,使用了差不多三年的黑色主題,但是個人覺得在進行視窗轉換的時候很廢眼睛。 比如IDEA是全黑的,然後需要看PDF或者WORD又變成白色的了,這樣來回切換導致眼睛很累,畢竟現在網頁以及大部分軟體的界面都是白色的。那麼還是老老實實的使用原來比較順眼的模式吧。 1 ...