有两张表  一个为学员表(id,学员id,姓名性别)另一个表 :成绩表(id, 课程id,学员id,成绩)
现在查询有两科以上不及格的学员我 用了2种方法
1.
SELECT 姓名
FROM 成绩表 INNER JOIN 学员表 ON 成绩表.学员ID = 学员表.ID
WHERE 成绩 < 60
GROUP BY 姓名
HAVING COUNT(姓名) >=2
2.
SELECT 姓名
FROM 成绩表 INNER JOIN 学员表 ON 成绩表.学员ID = 学员表.ID
WHERE 成绩 < 60
GROUP BY 姓名
HAVING COUNT(成绩) >=2
都能查出来
谁能告诉我区别是什么

解决方案 »

  1.   

    --没有什么区别,相信下面的语句得到的结果也是一样的SELECT 姓名
    FROM 成绩表 INNER JOIN 学员表 ON 成绩表.学员ID = 学员表.ID
    WHERE 成绩 < 60
    GROUP BY 姓名
    HAVING COUNT(1) >=2
    --HAVING COUNT(1) >=2 实际是取到按姓名分组后,数量大于2个的,SELECT 姓名
    FROM 成绩表 INNER JOIN 学员表 ON 成绩表.学员ID = 学员表.ID
    WHERE 成绩 < 60
    GROUP BY 姓名
    --取到的结果一样,
    --那么COUNT(1)\COUNT(成绩)\COUNT(姓名)取到的也一样
      

  2.   

    假如有NUll 列

    count(*) 是有区别的 ,
    比如 tab
    a  b
    1  2
    2  Null
    Null Nullcount(1) = 3
    Count(a) = 2
    Count(b) = 1
    Count(*) = 3count(1) 和 count(*) 是一样的
    但是count(col) -- 这里的col代表某一个具体的列的时候
    会除去某一个列的NUll的值 , Null 不会计算雄关漫道真如铁 而今迈步从头越
      

  3.   

    HAVING COUNT() 是对同一分组下记录数的累计
    怎么个累计法呢
    一般我用count(*)
    如果用count(列名),是要考虑null的情况,
       即由from和where子句得到的结果集里,该字段是否有可能是null
      

  4.   

    zjdyzwx(十一月猪) 怎么回事
    我这sqlserver 2000
    count(1)与count(*)都算 null的
      

  5.   

    count(1)和count(*)本來就算null的...