中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL聚合函數怎么用

發布時間:2023-05-08 14:16:58 來源:億速云 閱讀:117 作者:zzz 欄目:開發技術

這篇文章主要介紹了MySQL聚合函數怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇MySQL聚合函數怎么用文章都會有所收獲,下面我們一起來看看吧。

    聚合函數

    在 MySQL 中,聚合函數是用于計算多行數據的統計信息的函數,例如總和、平均值、最大值、最小值和行數等。聚合函數用于在查詢結果中創建單個值,該值代表聚合操作的結果。將多行數據聚合成單個結果,這是聚合函數得名的由來。

    以下是 MySQL 中常見的聚合函數:

    函數說明
    COUNT([DISTINCT] expr)返回查詢到的數據的數量
    SUM([DISTINCT] expr)返回查詢到的數據的總和,不是數字沒有意義
    AVG([DISTINCT] expr)返回查詢到的數據的平均值,不是數字沒有意義
    MAX([DISTINCT] expr)返回查詢到的數據的最大值,不是數字沒有意義
    MIN([DISTINCT] expr)返回查詢到的數據的最小值,不是數字沒有意義

    這些函數通常用于 SELECT 查詢語句中,與 GROUP BY 子句結合使用以對數據進行分組和匯總。

    COUNT 函數

    在 MySQL 中,count 函數用于計算指定列或表中行的數量。

    語法

    SELECT COUNT(column_name) FROM table_name;

    計算結果會忽略指定列中的NULL。

    如果要計算表中所有行的數量,可以使用以下語法:

    SELECT COUNT(*) FROM table_name;

    理解

    SELECT COUNT(column_name) FROM table_name; 就是 SELECT column_name FROM table_name; 的結果的非空行數

    有如下表格

    MariaDB [test_db]> select * from student_scores;
    +----+---------+---------+------+---------+
    | id | name    | chinese | math | english |
    +----+---------+---------+------+---------+
    |  1 | Alice   |      80 |   85 |      90 |
    |  3 | Charlie |      90 |   95 |      85 |
    |  4 | Dave    |      80 |   90 |      95 |
    |  5 | Emma    |      95 |   85 |      90 |
    |  6 | Frank   |      70 |   78 |      80 |
    |  7 | God     |    NULL | NULL |    NULL |
    +----+---------+---------+------+---------+
    6 rows in set (0.00 sec)

    查詢總人數:

    MariaDB [test_db]> select count(name) as 總人數 from student_scores;
    +-----------+
    | 總人數    |
    +-----------+
    |         6 |
    +-----------+
    1 row in set (0.00 sec)

    實際上,count() 內寫成 * 也可以,甚至寫成 1 這樣的字面值也可以得到正確結果。

    MariaDB [test_db]> select count(*) as 總人數 from student_scores;
    +-----------+
    | 總人數    |
    +-----------+
    |         6 |
    +-----------+
    1 row in set (0.00 sec)
    
    MariaDB [test_db]> select count(1) as 總人數 from student_scores;
    +-----------+
    | 總人數    |
    +-----------+
    |         6 |
    +-----------+
    1 row in set (0.00 sec)

    這是因為 * 和 1 都可以作為一個列,select count(*) as 總人數 from student_scores; 的結果就是 select * as 總人數 from student_scores; 的結果的行數。select count(1) as 總人數 from student_scores; 的結果是 select 1 as 總人數 from student_scores; 的結果的行數。

    統計 chinese 列,NULL 行被忽略

    MariaDB [test_db]> select count(chinese) from student_scores;
    +----------------+
    | count(chinese) |
    +----------------+
    |              5 |
    +----------------+
    1 row in set (0.00 sec)

    將 distinct 寫在 count() 內外的區別:

    MariaDB [test_db]> select count(distinct chinese) from student_scores;
    +-------------------------+
    | count(distinct chinese) |
    +-------------------------+
    |                       4 |
    +-------------------------+
    1 row in set (0.00 sec)
    
    MariaDB [test_db]> select distinct count(chinese) from student_scores;
    +----------------+
    | count(chinese) |
    +----------------+
    |              5 |
    +----------------+
    1 row in set (0.00 sec)

    很明顯,寫在里面才是對去重后的結果統計行數,寫在外面是在已經統計好行數后對count的結果去重。

    SUM 函數

    在 MySQL 中,SUM 是一個聚合函數,用于計算指定列或表中所有行的數值之和。可以將 SUM 用于任何數值類型的列,包括整數、小數等。

    語法

    SELECT SUM(column_name) FROM table_name WHERE conditions;

    column_name 是要計算總和的列的名稱

    統計所有人的語文成績的和

    MariaDB [test_db]> select sum(chinese) from student_scores;
    +--------------+
    | sum(chinese) |
    +--------------+
    |          415 |
    +--------------+
    1 row in set (0.00 sec)

    AVG 函數

    在 MySQL 中,AVG 是一個聚合函數,用于計算指定列或表中所有行的數值平均值。AVG 函數僅適用于數值類型的列,例如整數或小數。

    語法

    SELECT AVG(column_name) FROM table_name WHERE conditions;

    求英語的平均分

    MariaDB [test_db]> select avg(english) from student_scores;
    +--------------+
    | avg(english) |
    +--------------+
    |      88.0000 |
    +--------------+
    1 row in set (0.00 sec)

    MAX 函數 MIN 函數

    語法

    SELECT MAX(column_name) FROM table_name WHERE conditions;
    
    SELECT MIN(column_name) FROM table_name WHERE conditions;

    查詢數學是最高分和最低分

    MariaDB [test_db]> select max(math) from student_scores;
    +-----------+
    | max(math) |
    +-----------+
    |        95 |
    +-----------+
    1 row in set (0.00 sec)
    
    MariaDB [test_db]> select min(math) from student_scores;
    +-----------+
    | min(math) |
    +-----------+
    |        78 |
    +-----------+
    1 row in set (0.00 sec)

    group by 子句

    簡介

    上面我們使用聚合函數后的結果都只有一行,這是因為我們把整個表看成了一個整體,把一列中的所有行直接聚合成了一個數字。

    GROUP BY 是用于對結果集進行分組的子句。使用 GROUP BY 可以根據一個或多個列對結果集進行分組,以便在結果中顯示每個組的匯總信息。

    以下是 GROUP BY 子句的基本語法:

    SELECT column_name, aggregate_function(column_name)
    FROM table_name
    WHERE conditions
    GROUP BY column_name;

    column_name 是要分組的列的名稱

    aggregate_function 是要應用于分組的列的聚合函數,例如 SUMAVGCOUNT

    table_name 是要從中選擇數據的表的名稱

    conditions 是一個可選的 WHERE 子句,用于指定選擇數據的條件。

    示例:scott 數據庫

    接下來的示例我們使用 scott 數據庫,scott 是由 Oracle 公司創建的一個示例數據庫,用于教學和測試。

    scott 數據庫的 sql 文件

    DROP database IF EXISTS `scott`;
    CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    
    USE `scott`;
    
    DROP TABLE IF EXISTS `dept`;
    CREATE TABLE `dept` (
      `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部門編號',
      `dname` varchar(14) DEFAULT NULL COMMENT '部門名稱',
      `loc` varchar(13) DEFAULT NULL COMMENT '部門所在地點'
    );
    
    
    DROP TABLE IF EXISTS `emp`;
    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 '部門編號'
    );
    
    
    DROP TABLE IF EXISTS `salgrade`;
    CREATE TABLE `salgrade` (
      `grade` int(11) DEFAULT NULL COMMENT '等級',
      `losal` int(11) DEFAULT NULL COMMENT '此等級最低工資',
      `hisal` int(11) DEFAULT NULL COMMENT '此等級最高工資'
    );
    
    
    insert into dept (deptno, dname, loc)
    values (10, 'ACCOUNTING', 'NEW YORK');
    insert into dept (deptno, dname, loc)
    values (20, 'RESEARCH', 'DALLAS');
    insert into dept (deptno, dname, loc)
    values (30, 'SALES', 'CHICAGO');
    insert into dept (deptno, dname, loc)
    values (40, 'OPERATIONS', 'BOSTON');
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
    
    insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
    
    insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
    insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
    insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
    insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
    insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

    單列分組

    查詢每個部門的平均工資和最高工資

    從 emp 表中找,然后對 deptno 分組,分別求平均工資和最高工資

    select deptno 部門編號, avg(sal) 平均工資, max(sal) 最高工資
    from emp
    group by deptno;
    +--------------+--------------+--------------+
    | 部門編號     | 平均工資     | 最高工資     |
    +--------------+--------------+--------------+
    |           10 |  2916.666667 |      5000.00 |
    |           20 |  2175.000000 |      3000.00 |
    |           30 |  1566.666667 |      2850.00 |
    +--------------+--------------+--------------+
    3 rows in set (0.00 sec)

    上述示例,group by 會先將表按部門分組,然后對分出的每個組,分別執行 select 語句。

    多列分組

    查詢每個部門的每種崗位的平均工資和最低工資

    select deptno, job, avg(sal) 平均工資, min(sal) 最低工資
    from emp
    group by deptno, job;
    +--------+-----------+--------------+--------------+
    | 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)

    上述用例先按部門分組,然后對每組再按崗位分組,對每個小組執行 select 語句。

    下圖展示分組的過程:

    MySQL聚合函數怎么用

    having 子句

    查詢平均工資低于 2000 的部門及其平均工資

    錯誤寫法:

    select deptno, avg(sal)
    from emp
    where avg(sal) < 2000
    group by deptno;

    where 的執行在 group 之前,執行 where 的時候還沒分組吶,根本無法求平均值和篩選。

    我們知道,having 篩選在 group by 之后,正確的應該用 having

    select deptno, avg(sal)
    from emp
    group by deptno
    having avg(sal) < 2000;

    關于“MySQL聚合函數怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“MySQL聚合函數怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    弥勒县| 铅山县| 栾城县| 华安县| 新巴尔虎右旗| 措美县| 镇安县| 苍溪县| 鄄城县| 友谊县| 乌恰县| 登封市| 阿克| 永泰县| 曲周县| 泰安市| 吴旗县| 项城市| 怀集县| 巧家县| 东光县| 中山市| 钦州市| 商水县| 中牟县| 金门县| 卢氏县| 乐昌市| 灵山县| 蒙阴县| 项城市| 鱼台县| 公安县| 漠河县| 米泉市| 中方县| 万安县| 唐海县| 济源市| 大兴区| 赤壁市|