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

溫馨提示×

溫馨提示×

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

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

MySQL聚合查詢方法怎么使用

發布時間:2023-03-20 14:26:13 來源:億速云 閱讀:181 作者:iii 欄目:開發技術

本篇內容介紹了“MySQL聚合查詢方法怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    1、前言

    前面的內容已經把基礎的增刪改查介紹的差不多了,也介紹了表的相關約束, 從本期開始往后的內容,就更加復雜了,更多的是一些復雜的查詢 SQL.

    2、插入查詢結果

    查詢還是用的比較多的,對于查詢到的數據,能不能也給保存下來呢?也就是把查詢的結果插入到另一張表中。

    案例:創建一張學生表,表中有 id,name,sex,java,python 這些字段,現需要把 java 成績超過 90 的學生復制進 java_result 表,復制的字段為 name,java。

    進行上述操作之前,我們需要創建一個學生表并準備好相關的數據:

    create table student (
        id int primary key,
        name varchar(20),
        sex varchar(1),
        java float(5, 2)
    );
    insert into student value 
        (1, '張三', '男', 92.1),
        (2, '小紅', '女', 88.2),
        (3, '趙六', '男', 83.4),
        (4, '王五', '男', 93.3),
        (5, '小美', '女', 96.0);

    有了學生表之后,我們要把 name,java 這兩個字段的查詢結果復制到 java_result 這個表中,這里我們注意,要求查詢結果的臨時表的列數和列的類型,要和 java_result 這里匹配,所以接下來我們就來創建 java_result 這張表:

    create table java_result (
        name varchar(20),
        java float(5, 2)
    );

    創建好 java_result 這張表之后,就要查詢 student 表中 name java 兩個字段,并且 java > 90,將滿足上述條件的查詢結果,插入到 java_result 表中!:

    insert into java_result select name, java from student where java > 90;
    -- Query OK, 3 rows affected (0.00 sec)
    -- Records: 3  Duplicates: 0  Warnings: 0
    select * from java_result;
    +--------+-------+
    | name   | java  |
    +--------+-------+
    | 張三   | 92.10 |
    | 王五   | 93.30 |
    | 小美   | 96.00 |
    +--------+-------+
    -- 3 rows in set (0.00 sec)

    這樣我們就發現,已經將 student 表中 name 和 java 字段滿足 > 90 的數據已經全部插入成功了!

    3、聚合查詢

    前面我們接觸過的 帶表達式查詢 都是列和列之間進行運算的,看哪一列滿足了這個條件。

    而現在要介紹的聚合查詢,就是針對 行和行 之間進行運算的! 

    3.1 聚合函數

    進行聚合查詢,需要搭配聚合函數,下面介紹的函數都是 SQL 中內置的一組函數,我們先來簡單的認識下:

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

    下面我們就來演示一下上述的聚合函數的簡單使用,在使用之前,我們需要有一張表,并且有相應的數據:

    select * from student;
    +----+--------+------+-------+
    | id | name   | sex  | java  |
    +----+--------+------+-------+
    |  1 | 張三   | 男   | 92.10 |
    |  2 | 小紅   | 女   | 88.20 |
    |  3 | 趙六   | 男   | 83.40 |
    |  4 | 王五   | 男   | 93.30 |
    |  5 | 小美   | 女   | 96.00 |
    |  6 | 李四   | 男   |  NULL |
    +----+--------+------+-------+
    -- 6 rows in set (0.00 sec)

    下面我們就針對上述這張表,來使用下上述的聚合函數。 

    3.1.1 count 

    ● 求出 student 表中有多少同學

    select count(*) from student;
    +----------+
    | count(*) |
    +----------+
    |        6 |
    +----------+
    -- 1 row in set (0.00 sec)

    這個操作就相當于先進行 select * ,然后針對返回的結果,在進行 count 運算,求結果集合的行數. 注意:此處如果有一列的數據全是 null,也會算進去!(因為是針對 *)

    此處這里的 count() 括號中,不一定寫 *,可以寫成任意的列明/表達式,所以我們可以針對 name 來統計人數:

    select count(name) from student;
    +-------------+
    | count(name) |
    +-------------+
    |           6 |
    +-------------+
    -- 1 row in set (0.00 sec)

     ● 統計有多少人有 java 考試成績

    select count(java) from student;
    +-------------+
    | count(java) |
    +-------------+
    |           5 |
    +-------------+
    -- 1 row in set (0.00 sec)

    這里我們看到了,由于 count 是針對 java 字段進行統計,而 李四 那一條數據中,java 為 null,前面我們學習過,null 與任何值計算都是 null,所以統計的時候,就把 null 給去掉了。

    ● 統計 java 成績大于90分的人數

    select count(java) from student where java > 90;
    +-------------+
    | count(java) |
    +-------------+
    |           3 |
    +-------------+
    -- 1 row in set (0.00 sec)

    這里我們要弄清楚,count() 這個括號中,是針對你要針對的那一列,針對不同列,不同的條件,就會有不同的結果,對于 count 的演示就到這里。

    注意:count 和 () 之間不能有空格,必須緊挨著,在 Java 中函數名和() 之間是可以有空格的,但很少人會這樣寫。

    3.1.2 sum

    這個聚合函數,就是把指定列的所有行進行相加得到的結果,要求這個列得是數字,不能是字符串/日期。

    ● 求出學生表中 java 考試分數總和

    select sum(java) from student;
    +-----------+
    | sum(java) |
    +-----------+
    |    453.00 |
    +-----------+
    -- 1 row in set (0.01 sec)

    雖然我們表中有 java 字段這列中有 null 值,前面了解到 null 與任何值運算都是 null,但是這里的 sum 函數會避免這種情況發生。

    當然在后面也可也帶上 where 條件,這里就不做過多演示了。

    3.1.3 avg 

    ● 求班級中 java 的平均分

    select avg(java) from student;
    +-----------+
    | avg(java) |
    +-----------+
    | 90.600000 |
    +-----------+
    -- 1 row in set (0.00 sec)

    當前只是針對某一列進行平均運算,如果有兩門課程,求每個學生總分的平均分呢?

    select avg(java + python) from student;

    這里每次查詢結果都只有一列,能否把兩個聚合函數一起使用呢?

    select sum(java), avg(java) as '平均分' from student;
    +-----------+-----------+
    | sum(java) | 平均分    |
    +-----------+-----------+
    |    453.00 | 90.600000 |
    +-----------+-----------+
    -- 1 row in set (0.00 sec)

    這里我們能發現一個細節,使用聚合函數查詢,字段也是可以取別名的。

    3.1.4 max 和 min

    ● 求出 java 考試分數的最高分和最低分

    select max(java) as '最高分', min(java) as '最低分' from student;
    +-----------+-----------+
    | 最高分    | 最低分    |
    +-----------+-----------+
    |     96.00 |     83.40 |
    +-----------+-----------+
    -- 1 row in set (0.00 sec)

    上述就是聚合函數最基礎的用法了, 但是在實際中也可能會有更復雜的情況,比如需要按照某某進行分組查詢,這就需要搭配 GROUP BY 字句了。

    4、GROUP BY 子句

    select 中使用 group by 自居可以對指定列進行分組查詢,但是需要滿足指定分組的字段必須是 "分組依據字段",其他字段若想出現在 select 中,則必須包含在聚合函數中。

    這里我們構造出一張薪水表 salary:

    create table salary (
        id int primary key,
        name varchar(20),
        role varchar(20),
        income int 
    );
    insert into salary value 
        (1, '麻花疼', '老板', 5000000),
        (2, '籃球哥', '程序猿', 3000),
        (3, '歪嘴猴', '經理', 20000),
        (4, '多嘴鳥', '經理', 25000),
        (5, '雷小君', '老板', 3000000),
        (6, '阿紫姐', '程序猿', 5000);

    像上述的情況,如果要查平均工資,那公平嗎???

    select avg(income) from salary;
    +--------------+
    | avg(income)  |
    +--------------+
    | 1342166.6667 |
    +--------------+
    -- 1 row in set (0.00 sec)

    那籃球哥的月薪連平均下來的零頭都不到,所以這樣去求平均工資是毫無意義的,真正有意義的是啥呢?求老板這個職位的平均工資,以及經理這個職位的平均工資,及程序猿這個職位的平均工資,通俗來說,就是按照 role 這個字段進行分組。每一組求平均工資:

    select role, avg(income) from salary group by role;
    +-----------+--------------+
    | role      | avg(income)  |
    +-----------+--------------+
    | 程序猿    |    4000.0000 |
    | 經理      |   22500.0000 |
    | 老板      | 4000000.0000 |
    +-----------+--------------+
    -- 3 rows in set (0.00 sec)

    這就也就是把 role 這一列,值相同的行給分成了一組,然后計算平均值,也是針對每個分組,分別計算。

    在 MySQL 中,這里得到的查詢結果臨時表,如果沒有 order by 指定列排序,這里的順序是不可預期的,當然也可以手動指定排序,比如最終結果按照平均工資降序排序:

    select role, avg(income) from salary group by role order by avg(income) desc;
    +-----------+--------------+
    | role      | avg(income)  |
    +-----------+--------------+
    | 老板      | 4000000.0000 |
    | 經理      |   22500.0000 |
    | 程序猿    |    4000.0000 |
    +-----------+--------------+
    -- 3 rows in set (0.00 sec)

    如果不帶聚合函數的普通查詢,能否可行呢?這里如果你沒有修改任何配置文件,是不可行的,記住千萬不能把前面的 order by 與 group by 弄混!

    5、HAVING 關鍵字

    分組查詢也是可以指定條件的,具體三種情況:

    • 先篩選,再分組(where)

    • 先分組,再篩選(having)

    • 分組前分組后都指定條件篩選(where 和 having 結合使用)

    如何理解上述三條的含義呢? 這里我們舉幾個例子就很好理解了:

    ● 籃球哥月薪 3000 實在是太低了,簡直給程序猿崗位拖后腿,干脆求平均工資時去掉籃球哥的月薪數據。

    select role, avg(income) from salary where name != '籃球哥' group by role;
    +-----------+--------------+
    | role      | avg(income)  |
    +-----------+--------------+
    | 程序猿    |    5000.0000 |
    | 經理      |   22500.0000 |
    | 老板      | 4000000.0000 |
    +-----------+--------------+
    -- 3 rows in set (0.00 sec)

    這樣求出來的平均值就不包含籃球哥的月薪數據了,這就是先篩選,再分組。

    ● 還是查詢每個崗位的平均工資,但是除去平均月薪在 10w 以上的崗位,不能讓籃球哥眼紅!

    select role, avg(income) from salary group by role having avg(income) < 100000;
    +-----------+-------------+
    | role      | avg(income) |
    +-----------+-------------+
    | 程序猿    |   4000.0000 |
    | 經理      |  22500.0000 |
    +-----------+-------------+
    -- 2 rows in set (0.00 sec)

    這樣一來就只保留了平均月薪小于 10w 的崗位了,很明顯這個平均值是在分組之后才算出來的,這也就是先分組,再篩選。

    這里 having 也能加上邏輯運算符,具體感興趣的小伙伴可以自行下來嘗試一下,好比如你想要拿好 offer,就得技術過關,還能加班!至于第三種分組前后都需要篩選,就是把上述倆例子結合起來,這里就不多贅述了!

    “MySQL聚合查詢方法怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

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

    AI

    区。| 滁州市| 安仁县| 尼玛县| 建水县| 洪洞县| 潢川县| 富宁县| 北碚区| 饶河县| 通海县| 和田市| 应城市| 辽阳县| 婺源县| 焉耆| 炎陵县| 麻阳| 廊坊市| 辉南县| 奉新县| 江北区| 县级市| 兰州市| 台湾省| 察雅县| 泌阳县| 乐清市| 固原市| 资阳市| 屯留县| 疏勒县| 乐安县| 奇台县| 图们市| 青河县| 瑞丽市| 中牟县| 荥经县| 巴楚县| 普兰店市|