數據庫基礎知識——聚合函數、分組查詢

目錄

一、聚合函數

1.1 count

1.1.1 統計整張表中所有記錄的總條數

1.1.2 統計單列的數據

1.1.3 統計單列記錄+限制條件

1.2 sum

1.3 avg

1.4 max, min

二、group by 分組查詢

2.1 語法

2.2 示例

2.3 having


一、聚合函數

常用的聚合函數

函數說明
count ([distinct] expr)返回查詢到的數據的數量
sum ([distinct] expr)返回查詢到的數據的總和,不是數字的沒有意義
avg ([distinct] expr)返回查詢到的數據的平均值,非數字無意義
max ([distinct] expr)返回查詢到的數據的最大值,非數字無意義
min ([distinct] expr)返回查詢到的數據的最小值,非數字無意義

1.1 count

mysql> select * from books;
+----+--------------------------+-----------+-------+-----------+---------------------+
| id | book_name                | author    | price | book_type | publish_date        |
+----+--------------------------+-----------+-------+-----------+---------------------+
| 29 | 阿波羅的秘密             | NULL      | 65.00 | NULL      | 2011-01-01 09:30:00 |
| 30 | 馬達加斯加的企鵝         | 薩克斯    | 15.00 | NULL      | 2013-03-12 10:30:00 |
| 31 | 極簡主義                 | NULL      | 32.00 | NULL      | 2019-04-28 00:50:00 |
| 32 | 另一種顏色               | NULL      | 32.50 | NULL      | 2019-10-01 07:10:00 |
| 33 | 夏日清泉                 | NULL      | 26.00 | NULL      | 2017-07-21 14:30:00 |
| 34 | NULL                     | NULL      | 34.00 | NULL      | 2014-06-01 11:11:00 |
| 35 | 冬日暖陽                 | 徐然      | 46.30 | NULL      | 2019-02-28 18:11:00 |
| 36 | 22歲                     | 桂芽紫    | 55.70 | NULL      | 2018-03-21 11:11:00 |
| 37 | 森林里有什么             | NULL      | 48.00 | NULL      | 2020-05-30 08:10:00 |
| 38 | 情書                     | NULL      |  NULL | NULL      | 2010-12-01 13:30:00 |
| 39 | 八音盒                   | switch    |  NULL | NULL      | 2021-06-15 15:20:00 |
| 40 | 灼燒的靈魂               | NULL      | 62.28 | NULL      | 2021-09-01 08:35:00 |
+----+--------------------------+-----------+-------+-----------+---------------------+
12 rows in set (0.01 sec)

1.1.1 統計整張表中所有記錄的總條數

? ? ? ? ① 使用 * 做統計【推薦使用】

統計 books 表中有多少條記錄:

mysql> select count(*) from books;
+----------+
| count(*) |
+----------+
|       12 |
+----------+
1 row in set (0.01 sec)

? ? ? ? ② 使用常量做統計

mysql> select count(1) from books;
+----------+
| count(1) |
+----------+
|       12 |
+----------+
1 row in set (0.00 sec)mysql> select count(100) from books;  # 任意常數,無實際意義
+------------+
| count(100) |
+------------+
|         12 |
+------------+
1 row in set (0.00 sec)

1.1.2 統計單列的數據

統計有多少本書標識了作者姓名

# 指定列做統計,null 值不被計入結果集中

mysql> select count(author) from books;
+---------------+
| count(author) |
+---------------+
|             4 |
+---------------+
1 row in set (0.00 sec)

1.1.3 統計單列記錄+限制條件

統計價格小于40的圖書數量

mysql> select count(*) from books where price < 40;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)mysql> select count(price) from books where price < 40;
+--------------+
| count(price) |
+--------------+
|            5 |
+--------------+
1 row in set (0.00 sec)

1.2 sum

# 只能統計單列數據類型為數值的列,并且值為 null 的數據行不參與統計

mysql> select sum(price) from books;
+------------+
| sum(price) |
+------------+
|     416.78 |
+------------+
1 row in set (0.00 sec)mysql> select sum(author) from books;
+-------------+
| sum(author) |
+-------------+
|           0 |
+-------------+
1 row in set, 4 warnings (0.00 sec)  # 統計非數值的列會發出警告信息mysql> show warnings;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '薩克斯'    |
| Warning | 1292 | Truncated incorrect DOUBLE value: '徐然'      |
| Warning | 1292 | Truncated incorrect DOUBLE value: '桂芽紫'    |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'switch'    |
+---------+------+-----------------------------------------------+
4 rows in set (0.00 sec)

1.3 avg

括號里面可以是單列數據,也可以是多列數據

-- 單列統計平均值
mysql> select avg(price) from books;
+------------+
| avg(price) |
+------------+
|  41.678000 |
+------------+
1 row in set (0.00 sec)-- 多列統計平均值
mysql> select * from game;
+------+-----------+---------+-------+--------------+--------------+
| id   | name      | lifebar | power | constitution | intelligence |
+------+-----------+---------+-------+--------------+--------------+
|    1 | 孫悟空    |     100 |   100 |          100 |           80 |
|    3 | 沙悟凈    |     100 |    70 |           80 |           77 |
|    6 | 紅孩兒    |     100 |    50 |          100 |           50 |
|    7 | 牛魔王    |     100 |    76 |           89 |           50 |
+------+-----------+---------+-------+--------------+--------------+
4 rows in set (0.00 sec)mysql> select avg(power+constitution+intelligence) as 總屬性值 from game;
+--------------+
| 總屬性值     |
+--------------+
|     230.5000 |
+--------------+
1 row in set (0.00 sec)

1.4 max, min

找出 game 表中 power 最高值和 intelligence 最低值

# 多個聚合函數可以同時被使用

mysql> select max(power),min(intelligence) from game;
+------------+-------------------+
| max(power) | min(intelligence) |
+------------+-------------------+
|        100 |                50 |
+------------+-------------------+
1 row in set (0.00 sec)

# 使用別名

mysql> select max(power) 最高力量值,min(intelligence) '最低智力值' from game;
+-----------------+-----------------+
| 最高力量值      | 最低智力值      |
+-----------------+-----------------+
|             100 |              50 |
+-----------------+-----------------+
1 row in set (0.00 sec)

# 同一列可以使用不同聚合函數

mysql> select max(power) 最高力量值,min(power) 最低力量值 from game;
+-----------------+-----------------+
| 最高力量值      | 最低力量值      |
+-----------------+-----------------+
|             100 |              50 |
+-----------------+-----------------+
1 row in set (0.00 sec)

二、group by 分組查詢

????????group by 子句的作用是通過?定的規則將?個數據集劃分成若干個小的分組,然后針對若干個分組進行數據處理,比如使用聚合函數對分組進行統計。

2.1 語法

select {列 / 表達式}[,列 / 表達式...] 聚合函數(列 / 表達式) 
from 表名
group by {列 / 表達式}[,列 / 表達式...]
[having 條件]

{列 / 表達式}[,列 / 表達式...]:要查詢的列或表達式,可以有多個,必須在 group by 子句中作為分組的依據;

聚合函數(列 / 表達式):列或者表達式如果不在 group by 子句中,則必須包含在聚合函數中。

2.2 示例

mysql> update books set book_type = '小說' where book_name = '阿波羅的秘密' or book_name = '另一種顏色' or book_name = '森林里有什么' or book_name = '灼燒的靈魂';
Query OK, 4 rows affected (0.07 sec)
Rows matched: 4  Changed: 4  Warnings: 0mysql> update books set book_type = '言情' where book_name = '情書' or book_name = '22歲' or book_name = '八音盒';
Query OK, 3 rows affected (0.06 sec)
Rows matched: 3  Changed: 3  Warnings: 0mysql> update books set book_type = '散文' where book_name = '夏日清泉' or book_name = '冬日暖陽' or book_name = 'null';
Query OK, 2 rows affected (0.06 sec)  # 影響行數只有兩條,說明null并非字符串
Rows matched: 2  Changed: 2  Warnings: 0mysql> update books set book_type = '雜志' where book_name = '馬達加斯加的企鵝' or book_name = '極簡主義' or book_name = null;
Query OK, 2 rows affected (0.07 sec)  # 影響行數只有兩條,因為null的比較不能使用 =
Rows matched: 2  Changed: 2  Warnings: 0# null的比較應該使用 <=>
mysql> update books set book_type = '雜志' where book_name <=> null;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from books;
+----+--------------------------+-----------+-------+-----------+---------------------+
| id | book_name                | author    | price | book_type | publish_date        |
+----+--------------------------+-----------+-------+-----------+---------------------+
| 29 | 阿波羅的秘密             | NULL      | 65.00 | 小說      | 2011-01-01 09:30:00 |
| 30 | 馬達加斯加的企鵝         | 薩克斯    | 15.00 | 雜志      | 2013-03-12 10:30:00 |
| 31 | 極簡主義                 | NULL      | 32.00 | 雜志      | 2019-04-28 00:50:00 |
| 32 | 另一種顏色               | NULL      | 32.50 | 小說      | 2019-10-01 07:10:00 |
| 33 | 夏日清泉                 | NULL      | 26.00 | 散文      | 2017-07-21 14:30:00 |
| 34 | NULL                     | NULL      | 34.00 | 雜志      | 2014-06-01 11:11:00 |
| 35 | 冬日暖陽                 | 徐然      | 46.30 | 散文      | 2019-02-28 18:11:00 |
| 36 | 22歲                     | 桂芽紫    | 55.70 | 言情      | 2018-03-21 11:11:00 |
| 37 | 森林里有什么             | NULL      | 48.00 | 小說      | 2020-05-30 08:10:00 |
| 38 | 情書                     | NULL      |  NULL | 言情      | 2010-12-01 13:30:00 |
| 39 | 八音盒                   | switch    |  NULL | 言情      | 2021-06-15 15:20:00 |
| 40 | 灼燒的靈魂               | NULL      | 62.28 | 小說      | 2021-09-01 08:35:00 |
+----+--------------------------+-----------+-------+-----------+---------------------+
12 rows in set (0.00 sec)

統計每種類別的書的數量

mysql> select book_type 類型,count(*) 數量 from books group by book_type;
+--------+--------+
| 類型   | 數量   |
+--------+--------+
| 小說   |      4 |
| 雜志   |      3 |
| 散文   |      2 |
| 言情   |      3 |
+--------+--------+
4 rows in set (0.00 sec)

統計每種類別的平均售價,最高售價,最低售價

mysql> select book_type,avg(price),max(price),min(price) from books group by book_type;
+-----------+------------+------------+------------+
| book_type | avg(price) | max(price) | min(price) |
+-----------+------------+------------+------------+
| 小說      |  51.945000 |      65.00 |      32.50 |
| 雜志      |  27.000000 |      34.00 |      15.00 |
| 散文      |  36.150000 |      46.30 |      26.00 |
| 言情      |  55.700000 |      55.70 |      55.70 |
+-----------+------------+------------+------------+
4 rows in set (0.00 sec)

使用 round(數值, 小數點位數) 指定保留多少位小數點,并添加別名優化上面的語句:

mysql> select book_type,round(avg(price),2) 平均售價,max(price) 最高售價,min(price) 最低售價 from books group by book_type;
+-----------+--------------+--------------+--------------+
| book_type | 平均售價     | 最高售價     | 最低售價     |
+-----------+--------------+--------------+--------------+
| 小說      |        51.95 |        65.00 |        32.50 |
| 雜志      |        27.00 |        34.00 |        15.00 |
| 散文      |        36.15 |        46.30 |        26.00 |
| 言情      |        55.70 |        55.70 |        55.70 |
+-----------+--------------+--------------+--------------+
4 rows in set (0.00 sec)

group by 之后還能跟 order by 子句對獲得的結果集進行排序:

mysql> select book_type,round(avg(price),2) 平均售價,max(price)最高售價,min(price) 最低售價 from books group by book_type order by 平均售價 desc;
+-----------+--------------+--------------+--------------+
| book_type | 平均售價     | 最高售價     | 最低售價     |
+-----------+--------------+--------------+--------------+
| 言情      |        55.70 |        55.70 |        55.70 |
| 小說      |        51.95 |        65.00 |        32.50 |
| 散文      |        36.15 |        46.30 |        26.00 |
| 雜志      |        27.00 |        34.00 |        15.00 |
+-----------+--------------+--------------+--------------+
4 rows in set (0.00 sec)

還能統計每個類別有多少本書:

mysql> select book_type,round(avg(price),2),max(price),min(price),count(*) from books group by book_type;
+-----------+---------------------+------------+------------+----------+
| book_type | round(avg(price),2) | max(price) | min(price) | count(*) |
+-----------+---------------------+------------+------------+----------+
| 小說      |               51.95 |      65.00 |      32.50 |        4 |
| 雜志      |               27.00 |      34.00 |      15.00 |        3 |
| 散文      |               36.15 |      46.30 |      26.00 |        2 |
| 言情      |               55.70 |      55.70 |      55.70 |        3 |
+-----------+---------------------+------------+------------+----------+
4 rows in set (0.00 sec)

如果我想對分組之后的結果集進行過濾,比如找出平均售價大于50,小于55的類別,用 where 語句是錯誤的,而應該使用 having 子句 ↓

2.3 having

having 子句必須跟在 group by 子句后面!

mysql> select book_type,round(avg(price),2) 平均售價,max(price)最高售價,min(price) 最低售價 from books group by book_type order by 平均售價 desc having avg(price) between 50 and 55;
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 'having avg(price) between 50 and 55' at line 1
mysql> select book_type,round(avg(price),2) 平均售價,max(price)最高售價,min(price) 最低售價 from books group by book_type having avg(price) between 50 and 55 order by 平均售價 desc;
+-----------+--------------+--------------+--------------+
| book_type | 平均售價     | 最高售價     | 最低售價     |
+-----------+--------------+--------------+--------------+
| 小說      |        51.95 |        65.00 |        32.50 |
+-----------+--------------+--------------+--------------+
1 row in set (0.07 sec)mysql> select book_type,round(avg(price),2) 平均售價,max(price)最高售價,min(price) 最低售價 from books group by book_type having avg(price) >= 50 and avg(price) <= 55 order by 平均售價 desc;
+-----------+--------------+--------------+--------------+
| book_type | 平均售價     | 最高售價     | 最低售價     |
+-----------+--------------+--------------+--------------+
| 小說      |        51.95 |        65.00 |        32.50 |
+-----------+--------------+--------------+--------------+
1 row in set (0.01 sec)

* where 子句用在 from 表名 之后,也就是分組之前,而 having 子句跟在分組 group by 之后。如果需求要求對真實數據進行過濾,同時也需要對分組的結果進行過濾,那么在合適的位置同時寫 where 和? having 即可。

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

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

相關文章

改 TDengine 數據庫的時間寫入限制

一 sql連數據庫改 改 TDengine 數據庫的時間寫入限制 之前默認了可寫入時間為一個月&#xff0c;調整為10年&#xff0c;方便測試&#xff1a; SHOW DATABASES;use wi; SELECT CONCAT(ALTER TABLE , table_name, KEEP 3650;) FROM information_schema.ins_tables WHERE db_…

數碼視訊TR100-OTT-G1_國科GK6323_安卓9_廣東聯通原機修改-TTL燒錄包-可救磚

數碼視訊TR100-OTT-G1_國科GK6323_安卓9_廣東聯通原機修改-TTL燒錄包-可救磚刷機教程數碼視訊 TR100-G1 TTL 燒錄刷機教程固件由廣東聯通 TR100-G1 28 原版修改&#xff0c;測試一切正常1、把刷機文件解壓出 備用&#xff0c;盒子主板接好 TTL&#xff0c;不會接自行查找 TTl 接…

TVS防護靜電二極管選型需要注意哪些參數?-ASIM阿賽姆

TVS防護靜電二極管選型關鍵參數詳解TVS(Transient Voltage Suppressor)二極管作為電路防護的核心器件&#xff0c;在電子設備靜電防護(ESD)、浪涌保護等領域發揮著重要作用。本文將系統性地介紹TVS二極管選型過程中需要重點關注的參數指標&#xff0c;幫助工程師做出合理選擇。…

項目經理為什么要有一張PMP?認證?

在項目管理日益成為企業核心競爭力的今天&#xff0c;PMP已成為項目經理職業發展的重要“通行證”。這張由美國項目管理協會&#xff08;PMI&#xff09;頒發的全球公認證書&#xff0c;不僅是專業能力的象征&#xff0c;更在職業競爭力、項目成功率、團隊協作等多個維度為項目…

Qt中QSettings的鍵值使用QDataStream進行存儲

1. QDataStream介紹 數據流是編碼信息的二進制流&#xff0c;與主機的操作系統、CPU 或字節順序完全無關。例如&#xff0c;Windows 系統下 PC 寫入的數據流可由運行 Solaris 的 Sun SPARC 讀取。 您還可以使用數據流讀/寫raw unencoded binary data 。如果需要 "解析 &…

Typer 命令行工具使用示例

Typer 命令行工具使用示例 示例1&#xff1a;簡單問候程序 代碼 import typerapp typer.Typer()app.command() def greet(name: str):"""簡單的問候命令"""typer.echo(f"Hello {name}!")if __name__ "__main__":app()使用…

關于CAN總線bus off 理論標準 vs 工程實踐

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

CAN堆棧

PDU映射到HOH將硬件對象句柄HOH抽象成為硬件抽象層CanIf將pdu映射到硬件對象句柄上一個HOH代表一個Can控制器的一個消息緩沖區發送緩存區當所有Can硬件資源被占用時&#xff0c;LPDU存儲在緩沖區中。發送取消為了解決優先級反轉的問題&#xff0c;高優先級L-PDU會請求取消低優先…

sub3G和sub6G的區別和聯系

Sub-3G 和 Sub-6G 的區別與聯系Sub-3G 和 Sub-6G 是無線通信中頻段的不同分類&#xff0c;尤其在4G LTE和5G網絡中&#xff0c;定義了無線信號傳輸的不同頻率范圍。具體來說&#xff0c;Sub-3G 通常指的是低于3 GHz的頻段&#xff0c;而 Sub-6G 是指低于6 GHz的頻段。這些頻段的…

【數據可視化-106】華為2025上半年財報分析:用Python和Pyecharts打造炫酷可視化大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Scikit-learn Python機器學習 - 特征預處理 - 歸一化 (Normalization):MinMaxScaler

鋒哥原創的Scikit-learn Python機器學習視頻教程&#xff1a; 2026版 Scikit-learn Python機器學習 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程主要講解基于Scikit-learn的Python機器學習知識&#xff0c;包括機器學習概述&#xff0c;特征工程(數據…

LINUX_Ubunto學習《2》_shell指令學習、gitee

0、前言&#xff1a; 0.1、為什么學習shell腳本 學習Shell&#xff08;Shell腳本編程&#xff09;是提升系統管理和開發效率的重要技能&#xff0c;尤其在Linux/Unix環境中作用顯著。Shell是用戶與操作系統內核的接口&#xff0c;學習Shell有助于掌握系統工作原理。shell的核心…

系統安裝與遷移工具,一鍵下載系統并制作U盤啟動盤

大家好&#xff0c;今天想跟大家分享一款非常實用的軟件——Hasleo WinToUSB 下載地址獲取 點擊獲取&#xff1a;WinToUSB啟動盤 打開后的界面&#xff1b; image Windows To Go USB 可以安裝或克隆 Windows 到 USB 設備&#xff0c;作為便攜式 Windows 使用 可以選擇直接用…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(26):文法+單詞第8回3 復習 +考え方6

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;&#xff12;6&#xff09;&#xff1a;文法單詞第8回3 復習1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點1ー V辭書形 &#xff0b; ことができます。2ーこの橋、&am…

AM J BOT | 黃芪穩健骨架樹構建

Astragalus&#xff08;黃芪屬&#xff0c;豆科&#xff0c;含約 3,400 種&#xff09;是最大的被子植物屬之一&#xff0c;其多樣化在北半球多個地區的植被形成與生物多樣性格局中扮演了重要角色。然而&#xff0c;由于屬內物種數量龐大、形態復雜且演化歷史可能受到網狀進化的…

if __name__=‘__main__‘的用處

在 Python 中&#xff0c;if __name__ __main__:是一個常見的代碼模式&#xff0c;用于控制模塊的執行行為。它的核心作用是區分模塊是被直接運行還是被導入到其他文件中。作用詳解&#xff1a;?當文件被直接運行時?__name__會被自動設置為 __main__&#xff0c;此時 if塊內…

MySQL慢查詢優化策略

一、問題定位 1、慢查詢日志 -- 查看當前設置 SHOW VARIABLES LIKE slow_query%; ? -- 開啟慢查詢日志&#xff08;my.cnf永久配置&#xff09; [mysqld] slow_query_log 1 slow_query_log_file /var/log/mysql/slow.log long_query_time 1 -- 超過1秒的查詢 log_querie…

如何使用 ASP.NET Core 創建基于角色的 Web API

在使用 ASP.NET Core 構建基于角色的 Web API 時&#xff0c;代碼優先方法是一種強大而高效的方法。使用它&#xff0c;我們可以在代碼中定義數據模型和關系&#xff0c;然后自動生成相應的數據庫模式。這會帶來什么&#xff1f;當然是更快的開發周期和更大的靈活性。為什么&am…

無字母數字命令執行

寫在前面 說白了數字還是好構造的&#xff0c;bash的算數拓展&#xff01; base64命令 這玩意說白了有點雞肋&#xff0c;因為你得知道flag的文件名和位置&#xff01; base64 flag.php這個會將flag.php里面的內容給base64編碼輸出來。那么如何用無字母數字構造呢&#xff1f; …

AAB包轉apks轉apk

1. 下載bundletool-all-1.17.2.jar&#xff08;不一定非得1.17.2&#xff0c;可以其他版本&#xff09; https://github.com/google/bundletool/releases/tag/1.17.2 2. 在aab、keystore、bundletool-all-1.17.2.jar的目錄下&#xff0c;運行指令 java -jar bundletool-all-1…