【MySQL】聚合查詢 和 分組查詢

?個人主頁:?喜歡做夢

歡迎??👍點贊? ?關注? ??收藏? 💬評論


目錄

🌴 一、聚合查詢

🌲1.概念

🌲2.聚合查詢函數

COUNT()

?SUM()

AVG()

?MAX()和MIN()

🌴?二、分組查詢

🍀1.GROUP BY子句

定義

語法

?🍀2.HAVING

定義

having與where的區別

🌴?三、插入查詢結果

🍃語法


🌴 一、聚合查詢

🌲1.概念

聚合查詢:是SQL中對數據進行分組統計的操作,可以將多行數據按照特定條件合并計算,返回匯總結果。

🌲2.聚合查詢函數

函數說明
COUNT()統計行數
SUM()統計數值列總和
AVG()統計數值列平均和
MAX()尋找最大值
MIN()尋找最小值
  • 除了函數COUNT(),其他如果不是數字沒有意義;
  • 除了函數COUNT(),可以進行全列COUNT(*)查詢,其他不可以;
  • null不參與該查詢;
  • 多個聚合函數可以同時使用。

示例:?

-- 創建學生成績表
mysql>  create table student_grade(->  id bigint auto_increment primary key,->  name varchar(20),->  chinese bigint,->  math bigint,->  english bigint);
Query OK, 0 rows affected (0.07 sec)mysql> insert into student_grade(name,chinese,math,english) values('張三',89,95,65),-> ('李四',96,88,67),('王柿子',78,91,75),('張亮',99,73,97);
Query OK, 4 rows affected (0.13 sec)
Records: 4  Duplicates: 0  Warnings: 0mysql> insert into student_grade(name,chinese,math,english) values('麗麗',null,56,89);
Query OK, 1 row affected (0.05 sec)mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 張三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 張亮      |      99 |   73 |      97 |
|  5 | 麗麗      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)

COUNT()

mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 張三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 張亮      |      99 |   73 |      97 |
|  5 | 麗麗      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)-- 推薦使用COUNT(*)查詢
mysql> select count(*) from student_grade;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)-- 當然,也可以使用常量
mysql>  select count(1) from student_grade;
+----------+
| count(1) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)-- 可以指定列查詢,因為chinese中有null,這不會被統計在內
mysql> select count(chinese) from student_grade;
+----------------+
| count(chinese) |
+----------------+
|              4 |
+----------------+
1 row in set (0.00 sec)
  • 一般使用COUNT(*)來查詢,里面也可以使用常量,當更推薦使用*;
  • 也可以指定列查詢;
  • 當列中包含null,null不會被統計在內。?

?SUM()

mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 張三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 張亮      |      99 |   73 |      97 |
|  5 | 麗麗      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)-- 查詢數學成績總和
mysql> select sum(math) from student_grade;
+-----------+
| sum(math) |
+-----------+
|       403 |
+-----------+
1 row in set (0.03 sec)-- 參數可以使用表達式
mysql> select sum(math+chinese+english) as total from student_grade;
+-------+
| total |
+-------+
|  1013 |
+-------+
1 row in set (0.04 sec)-- 查詢語文成績總和
-- 之前說到null與任何值結果相加都為null,chinese有null值但是其結果并不為null
-- 原因:在sum()求和時,null不參與運算
mysql> select sum(chinese) from student_grade;
+--------------+
| sum(chinese) |
+--------------+
|          362 |
+--------------+
1 row in set (0.00 sec)-- *一般用來取所有列,不能直接用在sun()函數里
mysql> select sum(*) from student_grade;
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 '*) from student_grade' at line 1
  • *不能直接使用sum()函數里面,一般用于計算某一列中數值的總和,也就是SUM(列名);
  • 參數可以使用表達式;
  • null不參與SUM()運算。?

AVG()

-- 查詢語文成績平均值
mysql>  select avg(chinese) from student_grade;
+--------------+
| avg(chinese) |
+--------------+
|      90.5000 |
+--------------+
1 row in set (0.00 sec)-- 查詢數學成績平均值
mysql> select avg(math) from student_grade;
+-----------+
| avg(math) |
+-----------+
|   80.6000 |
+-----------+
1 row in set (0.00 sec)-- 不能使用*
mysql> select avg(*) from student_grade;
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 '*) from student_grade' at line 1
  • 其注意事項與SUM()相似?

?MAX()和MIN()

mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 張三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 張亮      |      99 |   73 |      97 |
|  5 | 麗麗      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)-- 查詢數學成績最大值
mysql>  select max(math) from student_grade;
+-----------+
| max(math) |
+-----------+
|        95 |
+-----------+
1 row in set (0.04 sec)-- 查詢語文成績最小值
mysql> select min(chinese) from student_grade;
+--------------+
| min(chinese) |
+--------------+
|           78 |
+--------------+
1 row in set (0.00 sec)-- 可以同時查詢
mysql> select max(chinese),min(chinese) from student_grade;
+--------------+--------------+
| max(chinese) | min(chinese) |
+--------------+--------------+
|           99 |           78 |
+--------------+--------------+
1 row in set (0.00 sec)-- 使用別名
mysql> select max(chinese)數學最大值 ,min(chinese)語文最小值 from student_grade;
+-----------------+-----------------+
| 數學最大值      | 語文最小值      |
+-----------------+-----------------+
|              99 |              78 |
+-----------------+-----------------+
1 row in set (0.00 sec)

🌴?二、分組查詢

🍀1.GROUP BY子句

定義

?定義:GROUP BY是SQL中用于分組聚合的核心子句,用于將查詢結果按照一個或多個列的值進行分組,把具有相同列值的行歸為一組。找同一組內的數據可以使用聚合函數(如COUNT、SUM、MAX、MIN)。

語法
select column1,sum(conumn2),... from table group by column1,colum3;
  • column1:分組的列名;
  • sum(column2):?沒有被分組的列(需要的運算的列),如果要顯示結果,需要用到聚合函數;
  • group by:分組查詢的關鍵字;
  • column1:要分組的列名。

示例:

統計每個班級的學生數量

-- 創建學生表
mysql>  create table students(->  class_id bigint,   -- 學生所在班級->  name varchar(20)); -- 學生姓名
Query OK, 0 rows affected (0.04 sec)-- 插入
mysql>  insert into students values(1,'楊楊'),(3,'麗麗'),(1,'小美'),(2,'小帥'),(3,'王五');
Query OK, 5 rows affected (0.04 sec)
Records: 5  Duplicates: 0  Warnings: 0-- 查看學生表
mysql> select* from students;
+----------+--------+
| class_id | name   |
+----------+--------+
|        1 | 楊楊   |
|        3 | 麗麗   |
|        1 | 小美   |
|        2 | 小帥   |
|        3 | 王五   |
+----------+--------+
5 rows in set (0.00 sec)-- 分組:查看每個班級有多少學生
mysql> select class_id,count(class_id) as student_count from students group by class_id;
+----------+---------------+
| class_id | student_count |
+----------+---------------+
|        1 |             2 |
|        3 |             2 |
|        2 |             1 |
+----------+---------------+
3 rows in set (0.01 sec)-- 將其按班級編號進行升序排序
-- group by后面可以跟order by
mysql> select class_id,count(class_id) as student_count from students group by class_id order by class_id asc;
+----------+---------------+
| class_id | student_count |
+----------+---------------+
|        1 |             2 |
|        2 |             1 |
|        3 |             2 |
+----------+---------------+
3 rows in set (0.00 sec)

?🍀2.HAVING

定義

定義:對分組結果進行過濾,group by子句進行分組以后,不能使用where語句,而需要用HAVING。

-- 篩選分組后班級編號小于2的班級
mysql> select class_id,count(class_id) as student_count from students group by class_id having class_id<=2;
+----------+---------------+
| class_id | student_count |
+----------+---------------+
|        1 |             2 |
|        2 |             1 |
+----------+---------------+
2 rows in set (0.00 sec)
  • having必須和group by一起用,having要跟在group by后面;?
having與where的區別
區別wherehaving
作用對象分組前對原始數據進行篩選對分組后的結果進行篩選
使用限制不能使用聚合函數可以使用聚合函數

🌴?三、插入查詢結果

插入查詢結果:把一個表中的數據插入到另一個表中?

🍃語法

insert into table_name [(column1,column2,...)] 
select column1,colum2,...
from another_table
  • able_name : 被插入數據的表名;
  • another_table : 源表,即數據來源的表;
  • []:表示可寫可不寫,如果寫了,那么colum1,colum2,...需要加上括號(),并且插入的列數量和數據類型要與被插入的列數量與數據類型相同。

示例:

將舊學生表1中的學生姓名插入到另一個表中?

-- 查看舊表學生表1找你中的信息:
mysql> select * from students;
+----------+--------+
| class_id | name   |
+----------+--------+
|        1 | 楊楊   |
|        3 | 麗麗   |
|        1 | 小美   |
|        2 | 小帥   |
|        3 | 王五   |
+----------+--------+
5 rows in set (0.02 sec)-- 創建新表
mysql> create table  new_student(-> id bigint auto_increment primary key,-> name varchar(20));
Query OK, 0 rows affected (0.09 sec)-- 將舊表中的學生名復制到新表中
mysql> insert into new_student (name) select name from students;
Query OK, 5 rows affected (0.08 sec)
Records: 5  Duplicates: 0  Warnings: 0-- 查看新表中的信息
mysql> select * from new_student;
+----+--------+
| id | name   |
+----+--------+
|  1 | 楊楊   |
|  2 | 麗麗   |
|  3 | 小美   |
|  4 | 小帥   |
|  5 | 王五   |
+----+--------+
5 rows in set (0.00 sec)

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

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

    相關文章

    計算機啟動流程中,都干了啥事。比如文件掛在,操作系統加載,中斷向量表加載,磁盤初始化在哪階段。

    建議在電腦上看&#xff0c;手機上格式有點問題&#xff0c;認真讀&#xff0c;這方面沒問題的&#xff0c;肝了一天。 目錄.計算機啟動詳解 一.計算機啟動直觀圖二.步驟詳解前置準備磁盤初始化1.開機階段2.執行BIOS階段3.執行引導記錄&#xff08;MBR&#xff09;階段4.操作系…

    后端開發技術之Log日志框架

    第一章 日志原理 1.1 log發展歷史 從JDK1.4開始提供java.until.logging&#xff0c;后來大佬發現JUL太難用了&#xff0c;就自己手擼了個log4j&#xff0c;后來log4j發現安全漏洞&#xff0c;加上代碼結構問題難以維護&#xff0c;于是從1.2就停止更新log4j&#xff0c;并又重…

    美麗天天秒鏈動2+1源碼(新零售商城搭建)

    什么是鏈動21模式&#xff1f; 鏈動21主要是建立團隊模式&#xff0c;同時快速提升銷量。是目前成員中速度最快的裂變模式。鏈動21模式合理合規&#xff0c;同時激勵用戶 公司的利潤分享機制&#xff0c;讓您在享受購物折扣的同時&#xff0c;也能促進并獲得客觀收益。 鏈動21模…

    Python10天沖刺-設計模型之策略模式

    策略模式是一種行為設計模式&#xff0c;它允許你在運行時動態地改變對象的行為。這種模式的核心思想是將一組相關的算法封裝在一起&#xff0c;并讓它們相互替換。 下面是使用 Python 實現策略模式的一個示例&#xff1a; 示例代碼 假設我們有一個簡單的購物車系統&#xf…

    【CTFer成長之路】XSS的魔力

    XSS闖關 level1 訪問url&#xff1a; http://c884a553-d874-4514-9c32-c19c7d7b6e1c.node3.buuoj.cn/level1?usernamexss 因為是xss&#xff0c;所以對傳參進行測試&#xff0c;修改?username1&#xff0c;進行訪問 會發現username參數傳入什么&#xff0c;welcome之后就…

    自主機器人模擬系統

    一、系統概述 本代碼實現了一個基于Pygame的2D自主機器人模擬系統&#xff0c;具備以下核心功能&#xff1a; 雙模式控制&#xff1a;支持手動控制&#xff08;WASD鍵&#xff09;和自動導航模式&#xff08;鼠標左鍵設定目標&#xff09; 智能路徑規劃&#xff1a;采用改進型…

    快速上手非關系型數據庫-MongoDB

    簡介 MongoDB 是一個基于文檔的 NoSQL 數據庫&#xff0c;由 MongoDB Inc. 開發。 NoSQL&#xff0c;指的是非關系型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫&#xff0c;是對不同于傳統的關系型數據庫的數據庫管理系統的統稱。 MongoDB 的設計理念是為了應對大數據量、…

    性能優化實踐:啟動優化方案

    性能優化實踐&#xff1a;啟動優化方案 在Flutter應用開發中&#xff0c;啟動性能是用戶體驗的第一印象&#xff0c;也是應用性能優化的重要環節。本文將從理論到實踐&#xff0c;深入探討Flutter應用的啟動優化方案。 一、Flutter應用啟動流程分析 1. 啟動類型 冷啟動&…

    在文本廢墟中打撈月光

    在文本廢墟中打撈月光 ----再讀三三的《山頂上是海》之“暗室”所理 今天是2025年5月1日&#xff0c;傳統的“五一”小長假。當我早飯后“坐”在衛生間的那幾分鐘里&#xff0c;閨女和兒子就騎著家中僅有的兩輛電動車去了圖書館。我是該做些什么&#xff1f; 于是我左手拿著三…

    C++之類和對象基礎

    ?向對象三?特性&#xff1a;封裝、繼承、多態 類和對象 一.類的定義1. 類的定義格式2.類域 二.實例化1.對象2.對象的大小 三.this指針 在 C 的世界里&#xff0c;類和對象構成了面向對象編程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;的核心框架&…

    計算機網絡——HTTP/IP 協議通俗入門詳解

    HTTP/IP 協議通俗入門詳解 一、什么是 HTTP 協議&#xff1f;1. 基本定義2. HTTP 是怎么工作的&#xff1f; 二、HTTP 協議的特點三、HTTPS 是什么&#xff1f;它和 HTTP 有啥區別&#xff1f;1. HTTPS 概述2. HTTP vs HTTPS 四、HTTP 的通信過程步驟詳解&#xff1a; 五、常見…

    使用 Java 實現一個簡單且高效的任務調度框架

    目錄 一、任務調度系統概述 &#xff08;一&#xff09;任務調度的目標 &#xff08;二&#xff09;任務調度框架的關鍵組成 二、任務狀態設計 &#xff08;一&#xff09;任務狀態流轉設計 &#xff08;二&#xff09;任務表設計&#xff08;SQL&#xff09; 三、單機任…

    基于GPT 模板開發智能寫作輔助應用

    目錄 項目說明 1. 項目背景 2. 項目目標 3. 功能需求 4. 技術選型 項目結構 詳細代碼實現 前端代碼(client) client/src/main.js client/src/App.vue client/src/components/HistoryList.vue 后端代碼(server) server/app.js server/routes/api.js server/mo…

    linux 使用nginx部署next.js項目,并使用pm2守護進程

    前言 本文基于&#xff1a;操作系統 CentOS Stream 8 使用工具&#xff1a;Xshell8、Xftp8 服務器基礎環境&#xff1a; node - 請查看 linux安裝node并全局可用pm2 - 請查看 linux安裝pm2并全局可用nginx - 請查看 linux 使用nginx部署vue、react項目 所需服務器基礎環境&…

    使用huggingface_hub需要注意的事項

    在安裝huggingface_hub的時候要注意如果你的python是放在c盤下時記得用管理員模式命令行來安裝huggingface_hub&#xff0c;否則安裝過程會報錯&#xff0c;之后也不會有huggingface-cli命令。 如果安裝時因為沒有用管理員權限安裝而報錯了&#xff0c;可以先卸載huggingface-…

    Spring MVC @RequestHeader 注解怎么用?

    我們來詳細解釋一下 Spring MVC 中的 RequestHeader 注解。 RequestHeader 注解的作用 RequestHeader 注解用于將 HTTP 請求中的**請求頭&#xff08;Request Headers&#xff09;**的值綁定到 Controller 方法的參數上。 請求頭是 HTTP 請求的一部分&#xff0c;包含了關于…

    Rust 學習筆記:關于結構體的例題

    Rust 學習筆記&#xff1a;關于結構體的例題 Rust 學習筆記&#xff1a;關于結構體的例題下面的程序能通過編譯嗎&#xff1f;下面的程序能通過編譯嗎&#xff1f;下面的程序能通過編譯嗎&#xff1f;哪種說法最能描述 Display 和 Debug 特質之間的區別&#xff1f;下面哪個選項…

    STM32 SPI通信協議

    1. SPI協議概述 1.1 什么是SPI&#xff1f; SPI&#xff08;Serial Peripheral Interface&#xff09;是由摩托羅拉公司于1980年代提出的同步串行通信協議&#xff0c;主要用于短距離高速芯片間通信。作為四線制全雙工通信協議&#xff0c;它以簡單的硬件實現和高效的傳輸速率…

    92.一個簡單的輸入與顯示示例 Maui例子 C#例子

    一、關于項目命名的注意事項 在開發.NET MAUI項目時&#xff0c;項目命名是一個不可忽視的細節。如果你習慣了在C#控制臺或WPF項目中使用中文項目名稱&#xff0c;那么在.NET MAUI中&#xff0c;你可能會遇到一些問題。我之前就因為使用中文項目名稱而導致項目無法直接運行&am…

    Locate 3D:Meta出品自監督學習3D定位方法

    標題&#xff1a; Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要&#xff1a; 我們提出了 Locate 3D&#xff0c;這是一種可根據指代表達&#xff08;如“沙發和燈之間的小咖啡桌”&#xff09;在三維場景中定位物體的模型。Locate 3…