作為一個剛畢業進入這行的菜鳥,嬸嬸的覺的那種大神、大牛到底是怎樣煉成的啊,我這小菜鳥感覺這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)
就先寫這些吧,寫長了,大家也沒耐心看,哈哈、、、、、太長的博客 ,我也靜不下心來寫,一點一點總結吧