SQL中的5種聚集函數


  作為一個剛畢業進入這行的菜鳥,嬸嬸的覺的那種大神、大牛到底是怎樣煉成的啊,我這小菜鳥感覺這TMD要學的東西這多啊,然后就給自己定了許多許多要學習的東西,可是有人又不停地給你灌輸:東西不在多而要精通!我也覺得很有道理,可是怎樣才能精通呢?封神之路,在哪里啊 !!!

  這一天沒有一個安靜的心,基本是學不進去了,發現自己還是太功利了,急功近利!也許你只要學就行,管他是否能夠立即讓人見識到你的厲害,技術和知識這種東西也許還是要強調一個 底蘊的。既然自己最煩那種看了兩篇文章就給你扯淡的人,拿自己也許就該一樣一樣去積累吧,管它是否現在眼前能用到?閑着也沒事,上網就是那么點事情,看看新聞、看看dota視頻、玩兩局dota,沒事了那就學吧,也許就不該給自己定太多的時間計划表,這東西!呵呵、、、、真不是人能堅持的,還是本着反正也沒事我就是看看,能學多少是多少,反正暫時也不用。這樣一想自己好多了,來學篇博客,叨叨兩句完了繼續上路。

  這段時間一直在學習sql相關的知識,原來在大學只是有一點sqlserver的基礎,上班了,這些東西真的不夠用啊! 公司現在用的是postgreSQL,這個數據庫不知道國內有多少公司在用,所以我還是先以mysql學習吧,再說了sql這種語言是統一標准的,各家的東西只是有細微不同而已。忽然中間看看自己做的學習筆記已經22頁了,其實還好,在這里就不發所有的筆記了,挑點坐看弄明白的東西,一小塊一小塊的總結,發出來,這樣看着就不會很累,太長的博客真的會嚇的很多的人,除非那些工作中需要這塊的知識;這樣的總結對自己也是一件好事,以后看的時候光看題目就行,不用再一篇很長很長的文章中找,閑話不多說了!進入正題:sql中的五種聚集函數

  下面的筆記是我在看了 燕十八php第二部-⑤ MySQL從入門到精通視頻教程 (46集全) 之后,自己又看了一些書,總結的sql聚集函數注意的地方,

  一、先給大家分享寫 sql 的順序:

    表->where(去除符合條件的行數據,此時烈沒有變化)->符合條件的中間結果表-> 分組統計運算或者投影運算:max、min、count、avg、group by->上步得到的新的結果集,這時就有可能產生新的列->having(篩選結果)->order by(得到排序結果表)->limit(限制條目)->最終結果表

                     所以說where->group by->having->order by/limit  ,這個就是寫sql語句時的順序

  二、常用的5個聚集函數:

                     Max               求最大

                     Min                求最小

                     Sum               求總和

                     Avg                求平均

                     Count            計算總行數

  

      1、sum 和 avg的輸入必須是數值集,但是其他的運算符可以作用在非數值數據類型的集合上,如字符串

      2、null  max、min、sum、avg都是忽略null的,而count(*)統計的行數包括null,count(column)忽略null的行

                 3、all/distinct   all是默認的也就是不寫的情況下,distinct是統計值不相同的行;對於count(distinct *)是錯誤的,對count使用distinct必須指明列;對於max和min使用distinct也是沒有意義的,雖然技術上可以實現sql語法沒有錯誤,但是一個列的最大值和最小值無論是否包含不同值都是相同的、不影響的

              4、牢記把列看成變量,那么聚合函數也可以這樣使用在一些列計算中

      

mysql> select cat_id,sum(shop_price*goods_number)
                    -> from ecs_goods
                    -> group by cat_id;
+--------+------------------------------+
| cat_id | sum(shop_price*goods_number) |
+--------+------------------------------+
|      2 |                         0.00 |
|      3 |                    356235.00 |
|      4 |                      6891.00 |
|      5 |                     29600.00 |
|      8 |                      4618.00 |
|     11 |                       790.00 |
|     13 |                       134.00 |
|     14 |                       162.00 |
|     15 |                       190.00 |
+--------+------------------------------+
9 rows in set (0.00 sec)

      

      5、特別記憶count 的兩種使用方式;

                     count(*) 對表中行的數目進行統計,不管列中是否包含null值 還是非空值

                     count(column)  對特定列中具有值的行進行計數,忽略null的值。

                     應特別注意:

                            count(column>值)這樣的帥選並沒有意義,count不會在這里根據你的條件統計,這樣的填入,就相當於給入一個數值一樣count(0)或者count(1)效果是一樣的,當然count(數字) 這樣的寫法和count(*)也是同樣的效果。所以這里我們只記住count()中填入列名時,是統計忽略null的行數,並且此時可以使用distinct

      實例

mysql> select goods_id,goods_name,max(shop_price) from ecs_goods;
+----------+------------+-----------------+
| goods_id | goods_name | max(shop_price) |
+----------+------------+-----------------+
|        1 | KD876      |         5999.00 |
+----------+------------+-----------------+
1 row in set (0.11 sec)

mysql> select min(shop_price) from ecs_goods;
+-----------------+
| min(shop_price) |
+-----------------+
|           18.00 |
+-----------------+
1 row in set (0.00 sec)

mysql> select sum(goods_number) from ecs_goods;
+-------------------+
| sum(goods_number) |
+-------------------+
|               313 |
+-------------------+
1 row in set (0.04 sec)

mysql> select avg(shop_price) from ecs_goods;
+-----------------+
| avg(shop_price) |
+-----------------+
|     1232.526774 |
+-----------------+
1 row in set (0.00 sec)

mysql> select count(cat_id) from ecs_goods;
+---------------+
| count(cat_id) |
+---------------+
|            31 |
+---------------+
1 row in set (0.02 sec)

 

       

    Select count(*) from 表名       查詢的就是絕對的行數,哪怕某一行所有字段全為空null,也就算在內

    而 select count(列名)from 表名

    查詢的是該列不為null的所有行的行數

    用count(*),count(1)誰好呢?

    其實對於myisam 引擎的表,沒有區別的

    這種引擎內部有一計算器在維護着行數

    Innodb 的表,count(*)直接讀行數的話,效率很低,因為innodb它是一行一行數了一遍

 

  三、上面是5個統計函數,單獨使用,意義不大,要和分組配合起來使用

              Group by 分組查詢

                     group by 子句給出一個或多個屬性用來構造分組

                     嚴格的講以group by    a,b,c為列則 select的列只能在a,b,c里選擇,語義上才沒有矛盾,所以在使用group by時,select的內容一定要仔細斟酌確保首先語義上沒有錯誤

    

mysql> select sum(goods_number)
                    -> from ecs_goods
                    -> group by cat_id;
+-------------------+
| sum(goods_number) |
+-------------------+
|                 0 |
|               203 |
|                 3 |
|                 8 |
|                61 |
|                23 |
|                 4 |
|                 9 |
|                 2 |
+-------------------+
9 rows in set (0.12 sec)

mysql> select goods_id,sum(goods_number)
    -> from ecs_goods
    -> group by cat_id;
+----------+-------------------+
| goods_id | sum(goods_number) |
+----------+-------------------+
|       16 |                 0 |
|        8 |               203 |
|        1 |                 3 |
|       23 |                 8 |
|        4 |                61 |
|        5 |                23 |
|       25 |                 4 |
|       29 |                 9 |
|       27 |                 2 |
+----------+-------------------+
9 rows in set (0.00 sec)

mysql> select cat_id,sum(goods_number)
    -> from ecs_goods
    -> group by cat_id;
+--------+-------------------+
| cat_id | sum(goods_number) |
+--------+-------------------+
|      2 |                 0 |
|      3 |               203 |
|      4 |                 3 |
|      5 |                 8 |
|      8 |                61 |
|     11 |                23 |
|     13 |                 4 |
|     14 |                 9 |
|     15 |                 2 |
+--------+-------------------+
9 rows in set (0.00 sec)

  就先寫這些吧,寫長了,大家也沒耐心看,哈哈、、、、、太長的博客 ,我也靜不下心來寫,一點一點總結吧

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM