【MySQL系列】SQL 分組統計與排序

csdn

博客目錄

    • 引言
    • 一、基礎語法解析
    • 二、GROUP BY 的底層原理
    • 三、ORDER BY 的排序機制
    • 四、NULL 值的處理策略
    • 五、性能優化建議
    • 六、高級變體查詢

引言

在現代數據分析和數據庫管理中,分組統計是最基礎也是最核心的操作之一。無論是業務報表生成、用戶行為分析還是系統性能監控,我們經常需要按照某個字段對數據進行分組,然后計算每組的記錄數量或其他聚合值。

一、基礎語法解析

讓我們首先分析文章開頭給出的基礎 SQL 查詢語句:

SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id
ORDER BYcount DESC;

這個查詢由幾個關鍵部分組成:

  1. SELECT 子句:指定要查詢的列和聚合函數。這里選擇了 node_execution_id 列和 COUNT(*) 聚合函數,后者會計算每組的行數,并使用 AS 關鍵字將結果列命名為 count

  2. FROM 子句:指定數據來源的表,這里是 public.workflow_node_executionspublic 是模式名(schema),在多租戶數據庫環境中特別重要。

  3. GROUP BY 子句:定義分組的依據列。數據庫引擎會根據 node_execution_id 的值將表中的記錄分成若干組,每組擁有相同的 node_execution_id 值。

  4. ORDER BY 子句:指定結果的排序方式。DESC 表示降序排列,即 count 值大的組排在前面。
    在這里插入圖片描述

二、GROUP BY 的底層原理

理解 GROUP BY 的執行原理對于編寫高效的 SQL 查詢至關重要。當執行包含 GROUP BY 的查詢時,數據庫引擎通常會按照以下步驟操作:

  1. 數據掃描:首先從表中讀取所有滿足條件的行(如果沒有 WHERE 子句則讀取全部數據)。

  2. 哈希分組:數據庫會創建一個哈希表,以 GROUP BY 列的值作為鍵。對于每一行,計算 node_execution_id 的哈希值,并將該行放入對應的哈希桶中。

  3. 聚合計算:對于每個哈希桶(即每個分組),計算指定的聚合函數(如 COUNT(*)SUM()AVG() 等)。

  4. 結果生成:將每個分組的鍵值(node_execution_id)和聚合結果(count)組合成結果行。

值得注意的是,現代數據庫優化器可能會根據表大小、索引情況等因素選擇不同的分組算法,如排序分組法(sort-group)等,但哈希分組是最常見的實現方式。

三、ORDER BY 的排序機制

ORDER BY count DESC 決定了最終結果的呈現順序。數據庫引擎在完成分組和聚合后,會對結果集進行排序:

  1. 內存排序:如果結果集較小,數據庫會在內存中使用快速排序等算法直接完成排序。

  2. 外存排序:對于大型結果集,數據庫可能采用歸并排序等外部排序算法,將中間結果暫存到磁盤。

  3. 索引利用:如果 count 列上有索引,某些數據庫可能會利用索引來優化排序過程。

降序排列(DESC)會將較大的 count 值排在前面,這在分析高頻事件或熱門條目時特別有用。

四、NULL 值的處理策略

在分組操作中,NULL 值需要特別注意。SQL 標準規定:

  • 所有 NULL 值會被視為相同值歸入同一組
  • 如果 node_execution_id 包含 NULL 值,這些記錄會被聚合到一個特殊的分組中

如果業務上需要排除 NULL 值,應該顯式添加過濾條件:

SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
WHEREnode_execution_id IS NOT NULL
GROUP BYnode_execution_id
ORDER BYcount DESC;

五、性能優化建議

對于大型數據表,分組統計操作可能相當耗費資源。以下是幾個優化建議:

  1. 索引優化:在 node_execution_id 上創建索引可以顯著加速分組操作。對于這個查詢,復合索引 (node_execution_id) 就足夠。

  2. 分區表:如果表數據量極大,考慮按 node_execution_id 的范圍或哈希值進行分區,可以并行化分組操作。

  3. 物化視圖:對于頻繁執行的相同分組查詢,可以創建物化視圖預先存儲結果。

  4. 限制結果集:如果只需要前 N 個結果,添加 LIMIT 子句避免處理全部數據:

SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id
ORDER BYcount DESC
LIMIT 100;

六、高級變體查詢

基于基礎查詢,我們可以擴展出更多有用的分析:

  1. 添加篩選條件:只統計特定時間范圍內的執行情況
SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
WHEREexecution_time BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BYnode_execution_id
ORDER BYcount DESC;
  1. 多列分組:同時按節點 ID 和執行狀態分組
SELECTnode_execution_id,status,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id, status
ORDER BYcount DESC;
  1. HAVING 子句:只返回滿足特定條件的分組
SELECTnode_execution_id,COUNT(*) AS count
FROMpublic.workflow_node_executions
GROUP BYnode_execution_id
HAVINGCOUNT(*) > 100
ORDER BYcount DESC;

覺得有用的話點個贊 👍🏻 唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評論批評指正!😄😄😄

💘💘💘如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!🌙🌙🌙

img

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84478.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring中的InstantiationAwareBeanPostProcessor接口詳解

一、接口定位與核心功能 InstantiationAwareBeanPostProcessor是Spring框架中擴展Bean生命周期的關鍵接口,繼承自BeanPostProcessor。它專注于Bean的實例化階段(對象創建和屬性注入)的干預,而非父接口的初始化階段(如…

uniapp使用sse連接后端,接收后端推過來的消息(app不支持!!)

小白終成大白 文章目錄 小白終成大白前言一、什么是SSE呢?和websocket的異同點有什么?相同點不同點 二、直接上實現代碼總結 前言 一般的請求就是前端發 后端回復 你一下我一下 如果需要有什么實時性的 后端可以主動告訴前端的技術 我首先會想到 webso…

QML學習06Button

QMLx學習06Button 1、Button1.1 狀態改變(checkable)1.2 排斥性(autoExclusive)1.3 重復觸發(autoRepeat)、第一次觸發延時時間(autoRepeatDelay)、相互之間觸發的時間間隔&#xff…

什么是前端工程化?它有什么意義

前端工程化是指通過工具、流程和規范,將前端開發從手工化、碎片化的模式轉變為系統化、自動化和標準化的生產過程。其核心目標是 提升開發效率、保障代碼質量、增強項目可維護性,并適應現代復雜 Web 應用的需求。 一、前端工程化的核心內容 1. 模塊化開發 代碼模塊化:使用 …

校園二手交易系統

該交易平臺分為兩部分,前臺和后臺。用戶在前臺進行商品選購以及交易;管理員登錄后臺可以對商品進行維護,主要功能包含: 后臺系統的主要功能模塊如下: 登錄功能、注冊功能、后臺首頁 系統設置: 菜單管理、…

06-Web后端基礎(java操作數據庫)

1. 前言 在前面我們學習MySQL數據庫時,都是利用圖形化客戶端工具(如:idea、datagrip),來操作數據庫的。 我們做為后端程序開發人員,通常會使用Java程序來完成對數據庫的操作。Java程序操作數據庫的技術呢,有很多啊&a…

uni-app學習筆記十三-vue3中slot插槽的使用

在頁面開發中&#xff0c;通常一個頁面分為頭部&#xff0c;尾部&#xff0c;和中心內容區。其中頭部&#xff0c;尾部一般比較固定&#xff0c;而中心區域往往是多樣的&#xff0c;需要自定義開發。此時&#xff0c;我們可以引入slot(插槽)來實現這一目標。<slot> 作為一…

Agent模型微調

這篇文章講解&#xff1a; 把 Agent 和 Fine-Tuning 的知識串起來&#xff0c;在更高的技術視角看大模型應用&#xff1b;加深對 Agent 工作原理的理解&#xff1b;加深對 Fine-Tuning 訓練數據處理的理解。 1. 認識大模型 Agent 1.1 大模型 Agent 的應用場景 揭秘Agent核心…

【最新版】Arduino IDE的安裝入門Demo

1、背景說明 1、本教程編寫日期為2025-5-24 2、Arduino IDE的版本為&#xff1a;Arduino IDE 2.3.6 3、使用的Arduino為Arduino Uno 1、ArduinoIDE的安裝 1、下載。網址如下&#xff1a;官網 2、然后一路安裝即可。 期間會默認安裝相關驅動&#xff0c;默認安裝即可。 3、安…

Python應用運算符初解

大家好!運算符是編程中不可或缺的工具&#xff0c;它們能幫助我們執行各種計算和操作。無論是數學運算&#xff0c;還是變量賦值&#xff0c;運算符都在背后默默發揮作用。對于編程初學者來說&#xff0c;理解并掌握常見運算符的用法是邁向編程世界的重要一步。 算術運算符: 加…

小米2025年校招筆試真題手撕(二)

一、題目 給一個長度為n的序列和一個整數x&#xff0c;每次操作可以選擇序列中的一個元素&#xff0c;將其從序列中刪去&#xff0c;或者將其值加一。 問至少操作多少次&#xff0c;可以使操作后的序列&#xff08;可以為空&#xff09;中數字之和是x的倍數。 輸入描述&#…

CNN卷積神經網絡到底卷了啥?

參考視頻&#xff1a;卷積神經網絡&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分鐘帶你快速了解&#xff01; 我們知道&#xff1a; 圖片是由像素點構成&#xff0c;即最終的成像效果是由背后像素的顏色數值所決定 在Excel中&#xff1a;有這樣一個由數值0和1組成的66…

教師技術知識對人工智能賦能下教學效果的影響:以教學創新為中介的實證研究

教師技術知識對人工智能賦能下教學效果的影響&#xff1a;以教學創新為中介的實證研究 摘要 隨著教育信息化的快速發展&#xff0c;人工智能技術在教育領域的應用日益廣泛&#xff0c;為教育教學帶來了深刻變革。然而&#xff0c;當前關于教師技術知識如何影響人工智能賦能下的…

Linux驅動學習筆記(九)

設備模型 1.kobject的全稱為kernel object&#xff0c;即內核對象&#xff0c;每一個kobject都會對應到系統/sys/下的一個目錄&#xff0c;這些目錄的子目錄也是一個kobject&#xff0c;以此類推&#xff0c;這些kobject構成樹狀關系&#xff0c;如下圖&#xff1a; kobject定…

25年上半年五月之軟考之設計模式

目錄 一、單例模式 二、工廠模式 三、 抽象工廠模式 四、適配器模式 五、策略模式 六、裝飾器模式 ?編輯 考點&#xff1a;會挖空super(coffeOpertion); 七、代理模式 為什么必須要使用代理對象&#xff1f; 和裝飾器模式的區別 八、備忘錄模式 一、單例模式 這個…

Python打卡第36天

浙大疏錦行 作業&#xff1a; 對之前的信貸項目&#xff0c;利用神經網絡訓練下&#xff0c;嘗試用到目前的知識點讓代碼更加規范和美觀。 import torch import torch.nn as nn import torch.optim as optim from sklearn.model_selection import train_test_split from sklear…

全面理解類和對象(下)

文章目錄 再談構造函數初始化列表 static概念&#xff1a; 友元友元函數友元類 內部類再次理解類和對象 再談構造函數 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; };上述代碼有了…

TomatoSCI分析日記——層次聚類

TomatoSCI分析日記——層次聚類 今天介紹的是一種常見的聚類方法——層次聚類。層次聚類會將數據集劃分成嵌套的簇&#xff0c;形成一個層次結構&#xff08;樹狀圖&#xff09;&#xff0c;經常用于探究樣本的相似性。用大白話來說&#xff0c;就是&#xff1a;我有一大堆樣品…

mysql都有哪些鎖?

MySQL中的鎖機制是確保數據庫并發操作正確性和一致性的重要組成部分&#xff0c;根據鎖的粒度、用途和特性&#xff0c;可以分為多種類型。以下是MySQL中常見的鎖及其詳細說明&#xff1a; 一、按鎖的粒度劃分 行級鎖&#xff08;Row-level Locks&#xff09; 描述&#xff1a;…

flutter 項目調試、flutter run --debug調試模式 devtools界面說明

Flutter DevTools 網頁界面說明 1. 頂部導航欄 Inspector&#xff1a;查看和調試 Widget 樹&#xff0c;實時定位 UI 問題。Performance-- 性能分析面板&#xff0c;查看幀率、CPU 和 GPU 使用情況&#xff0c;識別卡頓和性能瓶頸。Memory-- 內存使用和對象分配分析&#xff…