MySQL中的count(id=1)與sum(id=1)區別

首先創建個表說明問題:

CREATE TABLE `result` (
`name` VARCHAR(20) DEFAULT NULL,
`subject` VARCHAR(20) DEFAULT NULL,
`score` TINYINT(4) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8

插入一些數據:

INSERT INTO result VALUES
('張三','數學',90),
('張三','語文',50),
('張三','地理',40),
('李四','語文',55),
('李四','政治',45),
('王五','政治',30),
('趙六','語文',100),
('趙六','數學',99),
('趙六','品德',98);
  1.  

要求:查詢出2門及2門以上不及格者的平均成績。
經常會用兩種查詢語句有兩種:
1.

select name,sum(score < 60) ,avg(score)  from result  group by name having sum(score<60) >=2;

2.

select name ,count(score<60) as a,avg(score) from result group by name having a >=2;   /*  http://www.manongjc.com  */

    兩種查詢的結果肯定是不一樣的,肯定是第一種正確的,原因是爲什麼,這時你就要想了,count()函數的意義和sum函數的意義:count()函數裏面的參數是列名的的時候,那麼會計算有值項的次數,sum()函數裏面的參數是列名的時候,是計算列名的值的相加,而不是有值項的總數。
    對count()行數還要注意:它會計算總行數。不管你是否有值都會列入計算範圍。另外一點:MYISAM引擎很容易獲得總行數的統計,查詢速度變得更快。
    歸納:實際編程中統計總行數是經常用到的。此時使用count(*)多處可見。我很少看到有人使用列名作爲參數:count(a)的情況。即使是這樣使用,可能其初衷也是想統計行數。只是不知道!這樣所造成的細微差異而錯誤使用了"列名"的形式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章