mysql資料庫基本操作(五)

彭方炎QAQ發表於2019-05-22

表紀錄之查(單表查詢)2

       上一篇講了4類查詢的方式,現在接著上一篇繼續看還有哪些方式。

group by 分組查詢

      顧名思義,分組查詢要分組,因為mysql5.7之後預設不支援group by語句,需要改配置檔案,我沒有去改,如果需要用到group by的可以百度一下如何修改配置檔案,再練習下面這個例子。

group by 分組查詢:
        CREATE TABLE order_menu(
             id INT PRIMARY KEY auto_increment,
             product_name VARCHAR (20),
             price FLOAT(6,2),
             born_date DATE,
             class VARCHAR (20)
                                );


         INSERT INTO order_menu (product_name,price,born_date,class) VALUES ("蘋果",20,20170612,"水果"),
                                             ("香蕉",80,20170602,"水果"),
                                             ("水壺",120,20170612,"電器"),
                                             ("被罩",70,20170612,"床上用品"),
                                             ("音響",420,20170612,"電器"),
                                             ("床單",55,20170612,"床上用品"),
                                             ("草莓",34,20170612,"水果");


            -- 注意,按分組條件分組後每一組只會顯示第一條記錄

            -- group by字句,其後可以接多個列名,也可以跟having子句,對group by 的結果進行篩選。


                    -- 按位置欄位篩選
                       select * from order_menu group by 5;

                    -- 練習:對購物表按類名分組後顯示每一組商品的價格總和
                       select class,SUM(price)from order_menu group by class;

                    -- 練習:對購物表按類名分組後顯示每一組商品價格總和超過150的商品
                       select class,SUM(price)from order_menu group by class
                                                        HAVING SUM(price)>150;



                   /*
                   having 和 where兩者都可以對查詢結果進行進一步的過濾,差別有:
                     <1>where語句只能用在分組之前的篩選,having可以用在分組之後的篩選;
                     <2>使用where語句的地方都可以用having進行替換
                     <3>having中可以用聚合函式,where中就不行。
                   */


            -- GROUP_CONCAT() 函式
            SELECT id,GROUP_CONCAT(name),GROUP_CONCAT(JS) from ExamResult GROUP BY 

 

 聚合函式

         聚合函式感覺像python的內建函式,先不要管聚合函式要幹嘛,先把要求的內容查出來再包上聚合函式即可。(一般和分組查詢配合使用),直接開始吧,根據聚合函式功能不同,我們先看 統計表中所有記錄的聚合函式:

       1.COUNT(列名):統計行的個數

       我們可以用來統計學生個數吧:

select count(*) from result;

        統計一下語文成績80分以上同學的個數試試:

 select count(*) from result where chinese>80;
View Code

       注意:count(*)統計所有行;     count(欄位)不統計null值.比如我統計一下語文成績的個數:

select count(chinese) from result;

      2.SUM(列名):統計滿足條件的行的內容和

       求和函式在各種語言裡面用的都還比較多,我們先求一個語文成績的總分:

select sum(chinese) as 語文總成績 from result;

      各科成績都求個總分吧:

select sum(chinese) as 語文總成績,
    -> sum(english) as 英語總成績,
    -> sum(math) as 數學總成績 from result;

     有了總成績,是不是可以求所有成績和平均分啦?

select sum(chinese)/count(*) from result;     #包括Lily的
select sum(chinese)/count(chinese) from result;    #不包括Lily的

      3. AVG(列名):

     求平均值,這個可以直接求平均值了,就不用sum那樣了,試一下:

select AVG(chinese) from result;

 

       這個和sum求的不包括Lily的平均一樣,說明AVG會自己去除null。

       4.Max、Min

       這個也很好理解了,最大值最小值。先看看英語最高分是多少:

 select MAX(english) from result;

      不多說了,直接找到總分最高和最低的,注意兩個最低分的區別。

select MAX(english+chinese+math) from result;
select MIN(english+chinese+math) from result;
select MIN(ifnull(english,0)+ifnull(chinese,0)+ifnull(math,0)) from result;

      注意:null 和所有的數計算都是null,所以需要用ifnull將null轉換為0!ifnull(Chinese,0),其他的聚合函式就不做過多介紹了,用法都很簡單。

limit使用

      當資料很多是,我們只想顯示部分,就可以用limit來控制,我只顯示第一行:

select * from result limit 1;

      看一下下面一條是什麼意思:

select * from result limit 2,5;

      從結果得到答案,就是跳過前2行,再顯示後面5行,用法很簡單。

使用正規表示式查詢

      在python中學過正規表示式模組re,在sql中同樣存在正則,其實我們上一篇說where的時候,說的就是正則,這裡再補充幾個例子:

      1.找名字以P開頭的資訊,這個和p%很像:

select * from result where name REGEXP '^p';

     2.找名字以y結尾的資訊:

select * from result where name REGEXP 'y$';

    3.找名字以p開頭且重複至少1次的所有資料,因為重複兩次我們沒有這樣的資料嘛:

select * from result where name REGEXP 'p{1}';

        sql 的正則和python的用法其實很像的,掌握一種另一種就很容易明白,這裡就不多講了。還有一點需要注意的是where、order by、group by這些執行的先後順序,Mysql在執行sql語句時的執行順序:from先於where先於select先於group by先於having先於order by,瞭解了這個順序,再看看那些報錯就清晰很多了,這個還是需要記住的,很重要。

相關文章