如何使用 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...