『 MySQL數據庫 』聚合統計

文章目錄

  • 前言 🥑
    • 🥝 聚合函數
      • 🍓 COUNT( ) 查詢數據數量
      • 🍓 SUM( ) 查詢數據總和
      • 🍓 AVG( ) 查詢數據平均值
      • 🍓 MAX( ) 查詢數據最大值
      • 🍓 MIN( ) 查詢數據最小值
    • 🥝 數據分組GROUP BY子句
      • 🍓 GROUP BY示例
      • 🍓 HAVING語句


前言 🥑

請添加圖片描述
在MySQL中存在一種查詢方式叫做聚合查詢;
聚合查詢顧名思義就是將一組數據的同種類型進行聚合,那么既然是一組同類型的數據那么即必須要對該數據進行分組同時再對這組數據進行聚合;
所以對于聚合查詢來說時應該有兩部分組合:

  • 將數據進行分組;
  • 將數據進行聚合統計;
    需要配合SELECT語句進行使用;

🥝 聚合函數

請添加圖片描述
在MySQL中存在一些高頻操作:查詢數量個數,查詢數據總和…
而在MySQL中存在著一些函數,這些函數即用來對表內數據進行這些比較高頻的操作,這些函數叫做聚合函數,當然這些函數存在的意義也是聚合查詢中的重要操作;
存在一張表(Point):

+----+---------+---------+------+---------+
| id | name    | chinese | math | english |
+----+---------+---------+------+---------+
|  1 | Lihua   |     100 |  118 |     180 |
|  2 | Liming  |      57 |   58 |     140 |
|  3 | Zhaolao |      66 |   80 |      94 |
|  4 | Wu      |      76 |   70 |      94 |
|  5 | Wuqi    |      88 |   43 |     160 |
|  6 | Liqiang |      89 |  122 |     180 |
|  7 | Qinsu   |      90 |  104 |     134 |
|  8 | Zhaoli  |      54 |   74 |     200 |
+----+---------+---------+------+---------+

🍓 COUNT( ) 查詢數據數量

請添加圖片描述
語法:

COUNT([DISTINCT] expr) 
-- 返回查詢到的數據的數量
-- 其中[]內為可選項

該函數能查詢對應數據的數量;

  • 示例1:查詢該表中人數個數:
    mysql> select count(*) from Point;
    +----------+
    | count(*) |
    +----------+
    |        8 |
    +----------+
    1 row in set (0.00 sec)
    

  • 示例2:查詢該表中math字段數據>100的個數:
    mysql> select count(math) from Point where math>100;
    +-------------+
    | count(math) |
    +-------------+
    |           3 |
    +-------------+
    1 row in set (0.00 sec)
    

  • 示例3:查詢該表中english字段數據個數
    mysql> select count(distinct english) from Point; -- 利用distinct進行去重
    +-------------------------+
    | count(distinct english) |
    +-------------------------+
    |                       6 |
    +-------------------------+
    1 row in set (0.00 sec)
    

🍓 SUM( ) 查詢數據總和

請添加圖片描述
語法:

COUNT([DISTINCT] expr) 

該函數能夠算出一組數據的總和;

  • 示例:計算出english字段所有數據的總和:
    mysql> select sum(english) from Point;
    +--------------+
    | sum(english) |
    +--------------+
    |         1182 |
    +--------------+
    1 row in set (0.00 sec)mysql> select sum(distinct english) from Point;
    +-----------------------+
    | sum(distinct english) |
    +-----------------------+
    |                   908 |
    +-----------------------+
    1 row in set (0.00 sec)
    

🍓 AVG( ) 查詢數據平均值

請添加圖片描述
語法:

AVG([DISTINCT] expr) 

該函數能夠算出一組數據的平均值;

  • 示例:計算出表中english+math+chinese字段的平均值:
    mysql> select AVG(english+chinese+math) from Point;
    +---------------------------+
    | AVG(english+chinese+math) |
    +---------------------------+
    |                  308.8750 |
    +---------------------------+
    1 row in set (0.00 sec)
    

🍓 MAX( ) 查詢數據最大值

請添加圖片描述
語法:

MAX([DISTINCT] expr) 

該函數能夠算出一組數據的最大值;

  • 示例:計算出表中chinese字段的最大值:
    mysql> select max(chinese) from Point;
    +--------------+
    | max(chinese) |
    +--------------+
    |          100 |
    +--------------+
    1 row in set (0.00 sec)
    

🍓 MIN( ) 查詢數據最小值

請添加圖片描述
語法:

MIN([DISTINCT] expr) 

該函數能夠算出一組數據的最小值(用法與MAX()函數相同);


🥝 數據分組GROUP BY子句

請添加圖片描述
聚合統計講究的是一個先將數據進行分組在將數據進行聚合統計,在MySQL中可以使用GPOUP BY子句將數據進行分組;
在SELECT中使用GROUP BY子句對指定列進行分組查詢;
語法:

SELECT column1 ,column2, ... FROM table_name GROUP BY column1,column2...;

在進行聚合查詢的演示前需要準備一個來自Oralce 9i的測試用表 - 雇員表(該表在本篇博客中存在資源);

下載該表后使用SOURCE /路徑的方式將表至于MySQL當中;

該文件為一個數據庫,庫中共有三張表: dept部門表,emp員工表,salgrade工資等級表 ;
其中三張表的表結構分別為:

  • dept

           Table: dept
    Create Table: CREATE TABLE `dept` (`deptno` int(2) unsigned zerofill NOT NULL COMMENT ' 部門編號 ',`dname` varchar(14) DEFAULT NULL COMMENT ' 部門名稱 ',`loc` varchar(13) DEFAULT NULL COMMENT ' 部門所在地點 '
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

  • emp

           Table: emp
    Create Table: CREATE TABLE `emp` (`empno` int(6) unsigned zerofill NOT NULL COMMENT '雇員編號',`ename` varchar(10) DEFAULT NULL COMMENT '雇員姓名',`job` varchar(9) DEFAULT NULL COMMENT '雇員職位',`mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇員領導編號',`hiredate` datetime DEFAULT NULL COMMENT '雇傭時間',`sal` decimal(7,2) DEFAULT NULL COMMENT '工資月薪',`comm` decimal(7,2) DEFAULT NULL COMMENT '獎金',`deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部門編號'
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

  • salgrade
           Table: salgrade
    Create Table: CREATE TABLE `salgrade` (`grade` int(11) DEFAULT NULL COMMENT '等級',`losal` int(11) DEFAULT NULL COMMENT '此等級最低工資',`hisal` int(11) DEFAULT NULL COMMENT '此等級最高工資'
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

該表的對應數據分別為:

############## 表dept ##############
mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+############## 表emp ##############
mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+############## 表salgrade ##############
mysql> select * from salgrade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+

🍓 GROUP BY示例

請添加圖片描述

  1. 顯示每個部門的最高工資與平均工資:

    該在示例中需要顯示每個每個部門的最高工資,說明需要將 每個部分進行分組,GROUP BY deptno;
    同時要求計算出每個部門的最高工資與最低工資,說明需要對每個部門進行聚合統計,即MAX(sal)AVG(sal);
    將其組合即為:

    select max(sal),avg(sal) from emp group by deptno;
    

    由于是以deptno進行分組,所以可以SELECT出分組的名;
    即:

    mysql> select deptno,max(sal),avg(sal) from emp group by deptno;
    +--------+----------+-------------+
    | deptno | max(sal) | avg(sal)    |
    +--------+----------+-------------+
    |     10 |  5000.00 | 2916.666667 |
    |     20 |  3000.00 | 2175.000000 |
    |     30 |  2850.00 | 1566.666667 |
    +--------+----------+-------------+
    

  1. 顯示每個部門的每種崗位的平均工資與最低工資:

    在該示例中需要顯示每個部門與每種崗位,說明該示例中需要對數據進行兩類分組,即為GROUP BY deptno , job;
    且需要聚合統計出該類數據的平均值與最高值,即為AVG(sal)MIN(sal);
    在該條件中由于是對部門deptno與崗位job進行分組,所以在SELECT時可以分別顯示出他們的值;
    即為:

    mysql> SELECT deptno,job,avg(sal),min(sal) from emp group by deptno,job;
    +--------+-----------+-------------+----------+
    | deptno | job       | avg(sal)    | min(sal) |
    +--------+-----------+-------------+----------+
    |     10 | CLERK     | 1300.000000 |  1300.00 |
    |     10 | MANAGER   | 2450.000000 |  2450.00 |
    |     10 | PRESIDENT | 5000.000000 |  5000.00 |
    |     20 | ANALYST   | 3000.000000 |  3000.00 |
    |     20 | CLERK     |  950.000000 |   800.00 |
    |     20 | MANAGER   | 2975.000000 |  2975.00 |
    |     30 | CLERK     |  950.000000 |   950.00 |
    |     30 | MANAGER   | 2850.000000 |  2850.00 |
    |     30 | SALESMAN  | 1400.000000 |  1250.00 |
    +--------+-----------+-------------+----------+
    9 rows in set (0.00 sec)# 也可將其進行重命名
    mysql> SELECT deptno 部門,job 崗位,avg(sal) 最大工資,min(sal) 最小工資 from emp group by deptno,job;
    +--------+-----------+--------------+--------------+
    | 部門   | 崗位      | 最大工資     | 最小工資     |
    +--------+-----------+--------------+--------------+
    |     10 | CLERK     |  1300.000000 |      1300.00 |
    |     10 | MANAGER   |  2450.000000 |      2450.00 |
    |     10 | PRESIDENT |  5000.000000 |      5000.00 |
    |     20 | ANALYST   |  3000.000000 |      3000.00 |
    |     20 | CLERK     |   950.000000 |       800.00 |
    |     20 | MANAGER   |  2975.000000 |      2975.00 |
    |     30 | CLERK     |   950.000000 |       950.00 |
    |     30 | MANAGER   |  2850.000000 |      2850.00 |
    |     30 | SALESMAN  |  1400.000000 |      1250.00 |
    +--------+-----------+--------------+--------------+
    9 rows in set (0.00 sec)

🍓 HAVING語句

請添加圖片描述
HAVING語句為條件篩選語句的一種,其使用方式類似于WHERE;
大部分情況下HAVING子句是用來配合GROUP BY語句進行使用,即對分組聚合后的數據進行篩選;
HAVING子句可以做到與WHERE子句一樣的事,但是WHERE子句的功能卻不能與HAVING子句相當;
由于HAVING語句是用來針對聚合統計而產生的,所以在MySQL中不能使用HAVING子句來代替WHERE子句,即這兩個語句不能混為一談;

  • 示例:顯示平均工資低于2000的部門和它的平均工資:

    在該示例中要求了平均工資低于2000的部門,即需要對部門進行GROUP BY分類,即GROUP BY deptno;
    同時示例要求顯示平均工資,即為AVG(sal);
    將其組合在一起即能顯示出各個部門的平均工資:

    mysql> select deptno,avg(sal) from emp group by deptno;
    +--------+-------------+
    | deptno | avg(sal)    |
    +--------+-------------+
    |     10 | 2916.666667 |
    |     20 | 2175.000000 |
    |     30 | 1566.666667 |
    +--------+-------------+
    3 rows in set (0.00 sec)

    其又要求顯示平均工資低于2000的部門與它的平均工資,則可以使用HAVING子句對聚合統計后的數據進行篩選;

    mysql> select deptno as 部門,avg(sal) as 平均工資  from emp group by deptno having 平均工資<2000;
    +--------+--------------+
    | 部門   | 平均工資     |
    +--------+--------------+
    |     30 |  1566.666667 |
    +--------+--------------+
    1 row in set (0.00 sec)##當使用where子句代替having子句時將會報錯;
    mysql> select deptno as 部門,avg(sal) as 平均工資  from emp group by deptno where 平均工資<2000;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where 平均工資<2000' at line 1

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

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

相關文章

湖科大計網:計算機網絡概述

一、計算機網絡的性能指標 一、速率 有時候數據量也認為是以10為底的&#xff0c;看怎么好算。&#xff08;具體吉大考試用什么待商榷&#xff09; 二、帶寬 在模擬信號系統中帶寬的含義&#xff0c;本課程中用到的地方是&#xff1a;香農定理和奈奎斯特定理公式的應用之中。 …

全面高壓化與全面超快充,破解新能源汽車的時代難題

是什么讓新能源車主感到疲憊與焦慮&#xff1f;是什么阻擋更多消費者選擇新能源汽車&#xff1f;我們在身邊進行一個簡單的調查就會發現&#xff0c;問題的答案非常一致&#xff1a;充電。 充電難&#xff0c;充電慢的難題&#xff0c;始終是困擾新能源汽車產業發展&#xff0c…

vue,uniapp的pdf等文件在線預覽

vue&#xff0c;uniapp文件在線預覽方案&#xff0c;用了個稍微偏門一點的方法實現了 通過后端生成文件查看頁面&#xff0c;然后前端只要展示這個網頁就行&#xff0c;uniapp就用web-view來展示&#xff0c;后臺系統就直接window.open()打開就行 示例查看PDF文件&#xff0c;…

每日一練【四數之和】

一、題目描述 18. 四數之和 給你一個由 n 個整數組成的數組 nums &#xff0c;和一個目標值 target 。請你找出并返回滿足下述全部條件且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若兩個四元組元素一一對應&#xff0c;則認為兩個四元組重復&#x…

基于ssm社區管理與服務的設計與實現論文

目錄 摘 要 1 Abstract 2 第一章 緒論 3 1.1研究背景 3 1.2 研究現狀 3 1.3 研究內容 4 第二章 系統關鍵技術 5 2.1 Java簡介 5 2.2 MySql數據庫 5 2.3 B/S結構 6 2.4 Tomcat服務器 6 第三章 系統分析 7 3.1可行性分析 7 3.1.1技術可行性 7 3.1.2經濟可行性 7 3.1.3運行可行性…

uniapp自定義的日歷(純手寫)

效果圖&#xff1a; html&#xff1a; <!-- 年月 --><view class"box"><view class"box_time"><view class"time"><image click"lefts" :src"url/uploads/20231206/9d1fb520b12383960dca3c214d84fa0…

vue獲取主機id和IP地址

獲取主機id和IP地址 在vue.config.js const os require(“os”); function getNetworkIp() { let needHost “”; // 打開的host try { // 獲得網絡接口列表 let network os.networkInterfaces(); for (let dev in network) { let iface network[dev]; for (let i 0; i …

LLM之Agent(五)| AgentTuning:清華大學與智譜AI提出AgentTuning提高大語言模型Agent能力

?論文地址&#xff1a;https://arxiv.org/pdf/2310.12823.pdf Github地址&#xff1a;https://github.com/THUDM/AgentTuning 在ChatGPT帶來了大模型的蓬勃發展&#xff0c;開源LLM層出不窮&#xff0c;雖然這些開源的LLM在各自任務中表現出色&#xff0c;但是在真實環境下作…

【Android】Glide的簡單使用(下)

文章目錄 緩存設置內存緩存硬盤緩存自定義磁盤緩存行為圖片請求優先級縮略圖旋轉圖片Glide的回調:TargetsBaseTargetTarget注意事項設置具體尺寸的Target 調試及Debug獲取異常信息 配置第三方網絡庫自定義緩存 緩存設置 GlideApp .with(context).load(gifUrl).asGif().error(…

MySQL_7.索引概述

1.什么是索引 在關系數據庫中&#xff0c;索引是一種單獨的、物理的數對數據庫表中一列或多列的值進行排序的一種存儲結構。 它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單 2.索引的優點 (1)通過創建唯一性索引,可以保證數據庫表中每…

編寫Yaml文件當Poc,利用Nuclei掃描器去掃描漏洞

編寫Yaml文件當Poc,利用Nuclei掃描器去掃描漏洞 YAML是一種數據序列化語言&#xff0c;它的基本語法規則注意如下&#xff1a; -大小寫敏感 -使用縮進表示層級關系 -縮進時不允許使用Tab鍵&#xff0c;只允許使用空格。 -縮進的空格數目不重要&#xff0c;只要相同層級的元…

VSCode如何設置Vue前端的debug調試

vscode在調試vue.代碼時&#xff0c;如何進行debug? 1.安裝Chrome Debug插件。 2.在launch.json中&#xff0c;將url修改成你前端項目的路徑&#xff1a; 1 {2 // Use IntelliSense to learn about possible attributes.3 // Hover to view descriptions of existing att…

redis 三主三從高可用集群docker swarm

由于數據量過大&#xff0c;單個Master復制集難以承擔&#xff0c;因此需要對多個復制集進行集群&#xff0c;形成水平擴展每個復制集只負責存儲整個數據集的一部分&#xff0c;這就是Redis的集群&#xff0c;其作用是提供在多個Redis節點間共享數據的程序集。 官網介紹地址 re…

Elasticsearch:向量數據庫的真相

通過工作示例了解什么是向量數據庫、它們如何實現 “相似性” 搜索以及它們可以在明顯的 LLM 空間之外的哪些地方使用。除非你一直生活在巖石下&#xff0c;否則你可能聽說過諸如生成式人工智能和大型語言模型&#xff08;LLM&#xff09;之類的術語。 除此之外&#xff0c;你很…

如何利用Axure制作移動端產品原型

Axure是一款專業的快速原型設計工具&#xff0c;作為專業的原型設計工具&#xff0c;Axure 能夠快速、高效地創建原型&#xff0c;同時支持多人協作設計和版本控制管理。它已經得到了許多大公司的采用&#xff0c;如IBM、微軟、思科、eBay等&#xff0c;這些公司都利用Axure 進…

android 13.0 Settings去掉二級三級菜單搜索功能

1.概述 在13.0的系統rom定制化開發中,由于客戶定制開發需求,需要去掉Settings里面的搜索功能,主頁面的搜索功能,在前面的章節已經講了 這里需要去掉二級三級菜單的搜索功能,需要從搜索功能流程分析去掉搜索功能 2.Settings去掉二級三級菜單搜索功能核心代碼 packages/ap…

stl模板庫成員函數重載類型混肴編譯不通過解決方法

stl模板庫成員函數重載類型混肴編譯不通過解決方法 這種方式編譯不通過IsArithmetic和HasMemberList編譯器存在混肴 template <typename T, typename Enable std::enable_if<IsArithmetic<T>::value>::type >static void DumpWrapper(T* filed, std::strin…

SAP UI5 walkthrough step7 JSON Model

這個章節&#xff0c;幫助我們理解MVC架構中的M 我們將會在APP中新增一個輸入框&#xff0c;并將輸入的值綁定到model&#xff0c;然后將其作為描述&#xff0c;直接顯示在輸入框的右邊 首先修改App.controllers.js webapp/controller/App.controller.js sap.ui.define([&…

python變量的命名和使用

變量名只能包含字母、數字和下劃線 變量名只能包含字母、數字和下劃線。變量名可以字母或下劃線打頭&#xff0c;但不能以數字打頭。例如&#xff0c;可將變量命名為message_1&#xff0c;但不能將其命名為1_message。 Python 語言中&#xff0c;以下劃線開頭的標識符有特殊含…

Redis server啟動源碼

入口main函數 src/redis.c文件main函數 int main(int argc, char **argv) {struct timeval tv;/* We need to initialize our libraries, and the server configuration. */// 初始化庫 #ifdef INIT_SETPROCTITLE_REPLACEMENTspt_init(argc, argv); #endif//設置本地時間setl…