如何使用 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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...