是的~~
但是在having中做统计时,where就无能为力了
要走了,明天看看有没有时间给你分析:)

解决方案 »

  1.   

    是的可以把WHERE中的语句拿到HAVING语句中去用
    但是HAVING中的语句有些就不能移到WHERE中去当有聚合函数的时候,就一定要用HAVING,用WHERE不得行
    就是sum/avg/max/min等等函数就这么简单
      

  2.   

    强烈期待 CoolSlob() (  ) 信誉:112 的进一步讲解啊。
      

  3.   

    copy from sql server 2000 online help:
     
    在同一查询中使用 HAVING 子句和 WHERE 子句
    在某些情况下,在对作为一个整体的组应用条件之前(使用 HAVING 子句),可能需要从组中排除个别的行(使用 WHERE 子句)。HAVING 子句与 WHERE 子句类似,但只应用于作为一个整体的组(即应用于在结果集中表示组的行),而 WHERE 子句应用于个别的行。查询可同时包含 WHERE 子句和 HAVING 子句。在这种情况下: 首先将 WHERE 子句应用于表中的个别行或关系图网格中的表结构化对象。只对符合 WHERE 子句条件的行进行分组。
    然后将 HAVING 子句应用于由分组生成的结果集中的行。只有符合 HAVING 子句条件的组才出现在查询输出中。只能将 HAVING 子句应用于也出现在 GROUP BY 子句或聚合函数中的列。 
    例如,假设联接 titles 和 publishers 表以创建一个查询,显示一组出版商出版的书的平均价格。只想看到一组特定出版商(可能只是加利福尼亚州 (CA) 的出版商)出版的书的平均价格。甚至只想看到超过 10.00 美元的平均价格。在计算平均价格前,可以包含 WHERE 子句以建立第一个条件,该条件将放弃不在加利福尼亚州 (CA) 的出版商。第二个条件需要 HAVING 子句,因为该条件基于数据的分组和汇总结果。所得到的 SQL 语句可能象下面这样:SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
       ON titles.pub_id = publishers.pub_id
    WHERE publishers.state = 'CA'
    GROUP BY titles.pub_id
    HAVING AVG(price) > 10
    可在查询设计器的网格窗格中创建 HAVING 和 WHERE 子句。默认情况下,如果为列指定了搜索条件,该条件就成为 HAVING 子句的一部分。但可以将条件改为 WHERE 子句。可以创建包含同一列的 WHERE 子句和 HAVING 子句。为此,必须将该列向网格窗格中添加两次,然后将一个实例指定为 HAVING 子句的一部分,将另一个实例指定为 WHERE 子句的一部分。在聚合查询中指定 WHERE 条件 为查询指定组。有关详细信息,请参见对查询结果中的行分组。
    如果网格窗格中还没有 WHERE 条件所基于的列,请添加该列。
    清除"输出"列,除非数据列是 GROUP BY 子句的一部分或包含在聚合函数中。
    在"准则"列中指定 WHERE 条件。查询设计器将该条件添加到 SQL 语句的 HAVING 子句中。 
    注意   该过程示例中所显示的查询联接两个表:titles 和 publishers。 在此时的查询中,SQL 语句中包含 HAVING 子句:SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers 
       ON titles.pub_id = publishers.pub_id
    GROUP BY titles.pub_id
    HAVING publishers.state = 'CA'
    在"分组"列中,从分组和汇总选项列表中选择"Where"。查询设计器将该条件从 SQL 语句的 HAVING 子句中删除并将其添加到 WHERE 子句中。 
    SQL 语句改为包含 WHERE 子句:SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers 
       ON titles.pub_id = publishers.pub_id
    WHERE publishers.state = 'CA'
    GROUP BY titles.pub_id
      

  4.   

    copy from sql server 2000 online help:
     
    在同一查询中使用 HAVING 子句和 WHERE 子句
    在某些情况下,在对作为一个整体的组应用条件之前(使用 HAVING 子句),可能需要从组中排除个别的行(使用 WHERE 子句)。HAVING 子句与 WHERE 子句类似,但只应用于作为一个整体的组(即应用于在结果集中表示组的行),而 WHERE 子句应用于个别的行。查询可同时包含 WHERE 子句和 HAVING 子句。在这种情况下: 首先将 WHERE 子句应用于表中的个别行或关系图网格中的表结构化对象。只对符合 WHERE 子句条件的行进行分组。
    然后将 HAVING 子句应用于由分组生成的结果集中的行。只有符合 HAVING 子句条件的组才出现在查询输出中。只能将 HAVING 子句应用于也出现在 GROUP BY 子句或聚合函数中的列。 
    例如,假设联接 titles 和 publishers 表以创建一个查询,显示一组出版商出版的书的平均价格。只想看到一组特定出版商(可能只是加利福尼亚州 (CA) 的出版商)出版的书的平均价格。甚至只想看到超过 10.00 美元的平均价格。在计算平均价格前,可以包含 WHERE 子句以建立第一个条件,该条件将放弃不在加利福尼亚州 (CA) 的出版商。第二个条件需要 HAVING 子句,因为该条件基于数据的分组和汇总结果。所得到的 SQL 语句可能象下面这样:SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
       ON titles.pub_id = publishers.pub_id
    WHERE publishers.state = 'CA'
    GROUP BY titles.pub_id
    HAVING AVG(price) > 10
    可在查询设计器的网格窗格中创建 HAVING 和 WHERE 子句。默认情况下,如果为列指定了搜索条件,该条件就成为 HAVING 子句的一部分。但可以将条件改为 WHERE 子句。可以创建包含同一列的 WHERE 子句和 HAVING 子句。为此,必须将该列向网格窗格中添加两次,然后将一个实例指定为 HAVING 子句的一部分,将另一个实例指定为 WHERE 子句的一部分。在聚合查询中指定 WHERE 条件 为查询指定组。有关详细信息,请参见对查询结果中的行分组。
    如果网格窗格中还没有 WHERE 条件所基于的列,请添加该列。
    清除"输出"列,除非数据列是 GROUP BY 子句的一部分或包含在聚合函数中。
    在"准则"列中指定 WHERE 条件。查询设计器将该条件添加到 SQL 语句的 HAVING 子句中。 
    注意   该过程示例中所显示的查询联接两个表:titles 和 publishers。 在此时的查询中,SQL 语句中包含 HAVING 子句:SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers 
       ON titles.pub_id = publishers.pub_id
    GROUP BY titles.pub_id
    HAVING publishers.state = 'CA'
    在"分组"列中,从分组和汇总选项列表中选择"Where"。查询设计器将该条件从 SQL 语句的 HAVING 子句中删除并将其添加到 WHERE 子句中。 
    SQL 语句改为包含 WHERE 子句:SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers 
       ON titles.pub_id = publishers.pub_id
    WHERE publishers.state = 'CA'
    GROUP BY titles.pub_id
      

  5.   

    我来了~现丑了 :(
    其实 funboy88(司令) 以经说明了 :-)在这里,我举个例子好了,table1
      Name    Score
      aaa      50    
      aaa      60
      aaa      70
      bbb      5
      bbb      60 
      ccc      32
      ccc      30
      bbb      170 
    -----------------------------------------
    我现在要求找出Score大于或等于180的名字!你可以这样
    Select Name From Table1
    Group By Name
    Having Sum(Score)>=180
    当然,你可以找出Score的直
    Select Name, Sum(Score) as Score From Table1
    Group By Name
    Having Sum(Score)>=180
    ----------------------------
    而,这时,你不能用Where替代Having
    Select Name From Table1
    Group By Name
    Where Sum(Score)>180 
    上面的语句,行吗?
    如果我没记错的话,Where子句中不允许用集合含数!!
    -------------------------------------------
    明白了没有?
      

  6.   


    哇~一提交`` Yang_(扬帆破浪) 斑主都来了~~
    5555555~~55~~~~~早知道不说了~~
      

  7.   

    简单的说就是where在分组前限制那些行参与分组,having就是在对分组后的限制要显示出那些满足条件的组当然wheree  和having的使用限制上面说的很详细了,我就不多 说了
      

  8.   

    简单的说就是where在分组前限制那些行参与分组,having就是在对分组后的限制要显示出那些满足条件的组当然wheree  和having的使用限制上面说的很详细了,我就不多 说了
      

  9.   

    简单的说就是where在分组前限制那些行参与分组,having就是在对分组后的限制要显示出那些满足条件的组当然wheree  和having的使用限制上面说的很详细了,我就不多 说了
      

  10.   

    to:CoolSlob() 
       1、你的解释很精彩!
       2、我不是斑竹了,你知道的,而且到了这里更是小学生一个。
       3、我的只是COPY。
      

  11.   

    Yang_(扬帆破浪) 原样考了t-sql的帮助……
      

  12.   

    谢谢Yang_斑主的夸奖~~很难得到别人的夸奖 :-)
    头一回~
    为什么说自己是小学生呢?太过谦了吧?!知道Copy也不错,我就不知道往哪里Copy来~~呵呵~不知道Yang_还会不会回来看看这贴~
    我想问问:以后你还来吗?
      

  13.   

    to:CoolSlob
      现在不是还来吗!?以后也还来!