select S#,avg(GRADE)
from SC
group by S#
having min(GRADE) >= 60
select S#,avg(GRADE)
from SC
where GRADE >=60
group by S#
请问上述两个查询的结果区别..最好求达人也解释下where 和 having 在筛选查询结果的区别~ 谢谢

解决方案 »

  1.   

    having 用于分组统计的条件判别.
    where用于查询的条件判别.两这在原理上一致,用法上有所不同.
      

  2.   


    HAVING为组指定条件
    通过为作为一个整体的组指定条件(即 HAVING 子句),可限定查询中出现的组。在对数据进行分组和聚合后,将用到 HAVING 子句中的条件。只有符合条件的组才出现在查询中。例如,可能想在 titles 表中看到每个出版商出版的所有书的平均价格,但只显示平均价格超过 10.00 美元的书。在这种情况下,可为 HAVING 子句指定这样的条件:AVG(price) > 10。注意   在某些情况下,在对作为一个整体的组应用条件之前,可能需要从组中排除个别的行。有关详细信息,请参见在同一查询中使用 HAVING 子句和 WHERE 子句。可以通过使用 AND 和 OR 联接条件,为 HAVING 子句创建复杂的条件。有关在搜索条件中使用 AND 和 OR 的详细信息,请参见为一列指定多个搜索条件。为组指定条件 为查询指定组。有关详细信息,请参见对查询结果中的行分组。
    如果网格窗格中还没有条件所基于的列,请添加该列。(大多数情况下,条件包含已是组的列或汇总列。)不能使用不是聚合函数或 GROUP BY 子句的一部分的列。
    在"准则"列中,指定应用于组的条件。 
    查询设计器自动在 SQL 窗格的语句中创建 HAVING 子句,如下例所示:SELECT pub_id, AVG(price)
    FROM titles
    GROUP BY pub_id
    HAVING (AVG(price) > 10)对要指定的其它条件重复步骤 2 和 步骤 3。 使用 HAVING 子句选择行
    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。下面的查询得到本年度截止到目前的销售额超过 $40,000 的出版商:USE pubs
    SELECT pub_id, total = SUM(ytd_sales)
    FROM titles
    GROUP BY pub_id
    HAVING SUM(ytd_sales) > 40000下面是结果集:pub_id total       
    ------ ----------- 
    0877   44219       (1 row(s) affected)为了确保对每个出版商的计算中至少包含六本书,下面示例使用 HAVING COUNT(*) > 5 消除返回的总数小于六本书的出版商:USE pubs
    SELECT pub_id, total = SUM(ytd_sales)
    FROM titles
    GROUP BY pub_id
    HAVING COUNT(*) > 5下面是结果集:pub_id total       
    ------ ----------- 
    0877   44219       
    1389   24941       (2 row(s) affected)理解应用 WHERE、GROUP BY 和 HAVING 子句的正确序列对编写高效的查询代码会有所帮助: WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
    GROUP BY 子句用来分组 WHERE 子句的输出。
    HAVING 子句用来从分组的结果中筛选行。 
    对于可以在分组操作之前或之后应用的搜索条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 HAVING 子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。Microsoft® SQL Server™ 2000 查询优化器可处理这些条件中的大多数。如果查询优化器确定 HAVING 搜索条件可以在分组操作之前应用,那么它就会在分组之前应用。查询优化器可能无法识别所有可以在分组操作之前应用的 HAVING 搜索条件。建议将所有这些搜索条件放在 WHERE 子句中而不是 HAVING 子句中。以下查询显示包含聚合函数的 HAVING 子句。该子句按类型分组 titles 表中的行,并且消除只包含一本书的组:USE pubs
    SELECT type
    FROM titles
    GROUP BY type
    HAVING COUNT(*) > 1下面是结果集:type
    ------------------
    business
    mod_cook
    popular_comp
    psychology
    trad_cook(5 row(s) affected)以下是没有聚合函数的 HAVING 子句的示例。该子句按类型分组 titles 表中的行,并且消除不是以字母 p 开头的那些类型。USE pubs
    SELECT type
    FROM titles
    GROUP BY type
    HAVING type LIKE 'p%'下面是结果集:type
    ------------------
    popular_comp
    psychology(2 row(s) affected)如果 HAVING 中包含多个条件,那么这些条件将通过 AND、OR 或 NOT 组合在一起。以下示例显示如何按出版商分组 titles,只包括那些标识号大于 0800、支付的总预付款已超过 $15,000 且销售书籍的平均价格小于 $20 的出版商。SELECT pub_id, SUM(advance) AS AmountAdvanced,
           AVG(price) AS AveragePrice
    FROM pubs.dbo.titles
    WHERE pub_id > '0800'
    GROUP BY pub_id
    HAVING SUM(advance) > $15000
       AND AVG(price) < $20ORDER BY 可以用来为 GROUP BY 子句的输出排序。下面的示例显示使用 ORDER BY 子句以定义返回 GROUP BY 子句中的行的顺序:SELECT pub_id, SUM(advance) AS AmountAdvanced,
           AVG(price) AS AveragePrice
    FROM pubs.dbo.titles
    WHERE pub_id > '0800'
      AND price >= $5
    GROUP BY pub_id
    HAVING SUM(advance) > $15000
       AND AVG(price) < $20
    ORDER BY pub_id DESC
      

  3.   

    用 WHERE 和 HAVING 筛选行
    SELECT 语句中的 WHERE 和 HAVING 子句控制用源表中的那些行来构造结果集。WHERE 和 HAVING 是筛选。这两个子句指定指定一系列搜索条件,只有那些满足搜索条件的行才用来构造结果集。我们称满足搜索条件的行符合参与行集的限定条件。例如,下列 SELECT 语句中的 WHERE 子句将限定只选择地区为华盛顿州 (WA) 的行:SELECT CustomerID, CompanyName
    FROM Northwind.dbo.Customers
    WHERE Region = 'WA'HAVING 子句通常与 GROUP BY 子句结合使用,尽管指定该子句时也可以不带 GROUP BY。HAVING 子句指定在应用 WHERE 子句的筛选后要进一步应用的筛选。例如,下列 WHERE 子句仅限定以高于 $100 的单价销售产品的订单,而 HAVING 子句进一步将结果限制为只包括 100 件以上的订单:SELECT OrdD1.OrderID AS OrderID,
           SUM(OrdD1.Quantity) AS "Units Sold",
           SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
    FROM [Order Details] AS OrdD1
    WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID
                            FROM [Order Details] AS OrdD2
                            WHERE OrdD2.UnitPrice > $100)
    GROUP BY OrdD1.OrderID
    HAVING SUM(OrdD1.Quantity) > 100WHERE 和 HAVING 子句中的搜索条件或限定条件可包括: 比较运算符(如 =、< >、< 和 >)。例如,下列查询从 Products 表中检索产品分类为 2 的行: 
    SELECT ProductID, ProductName
    FROM Northwind.dbo.Products
    WHERE CategoryID = 2
    ORDER BY ProductID范围(BETWEEN 和 NOT BETWEEN)。例如,下列查询从 Products 表中检索产品分类从 2 到 4 的行: 
    SELECT CategoryID, ProductID, ProductName
    FROM Northwind.dbo.Products
    WHERE CategoryID BETWEEN 2 and 4
    ORDER BY CategoryID, ProductID列表(IN、NOT IN)。例如,下列查询从 Products 表中检索产品分类 ID 与列表中某一 ID 匹配的行: 
    SELECT CategoryID, ProductID, ProductName
    FROM Northwind.dbo.Products
    WHERE CategoryID IN (1,4,5,7)
    ORDER BY CategoryID, ProductID模式匹配(LIKE 和 NOT LIKE)。例如,下列查询从 Products 表中检索产品名称以 Ch 开头的行: 
    SELECT CategoryID, ProductID, ProductName
    FROM Northwind.dbo.Products
    WHERE ProductName LIKE 'Ch%'
    ORDER BY CategoryID, ProductID说明  可用于 text 列的 WHERE 条件只有返回其它数据类型的函数(如 PATINDEX())或运算符(如 IS NULL、IS NOT NULL、LIKE 和 NOT LIKE)。空值(IS NULL 和 IS NOT NULL)。例如,下列查询从 Customers 表中检索客户地区不为 NULL 的行: 
    SELECT CompanyName, City, Region, Country
    FROM Northwind.dbo.Customers
    WHERE Region IS NOT NULL
    ORDER BY CompanyName说明  比较空值时请谨慎从事。例如,指定 = NULL 与指定 IS NULL 是不同的。有关更多信息,请参见空值。所有记录(=ALL、>ALL、<= ALL、ANY)。例如,下列查询从 Order Details 表中检索装运产品数量大于分类 1 中任意产品的装运数量的订单和产品 ID: 
    USE Northwind
    GO
    SELECT OrdD1.OrderID, OrdD1.ProductID
    FROM "Order Details" OrdD1
    WHERE OrdD1.Quantity > ALL
          (SELECT OrdD2.Quantity
           FROM "Order Details" OrdD2 JOIN Products Prd
                 ON OrdD2.ProductID = Prd.ProductID
           WHERE Prd.CategoryID = 1)
    GO上述条件的组合(AND、OR、NOT)。例如,下列查询检索库存水平低于再订购点,或来自供应商 15 并属于分类 4 的所有产品: 
    SELECT ProductID, ProductName
    FROM Northwind.dbo.Products
    WHERE UnitsInStock < ReorderLevel
       OR (SupplierID = 15 AND CategoryID = 4)说明  当在 WHERE 子句中搜索 Unicode 字符串时,请在搜索字符串之前加字符 N,例如:SELECT CompanyName, ContactName, Phone, Fax
    FROM Northwind.dbo.Customers
    WHERE CompanyName = N'Berglunds snabbköp'
    在同一查询中使用 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.   

    having min(GRADE) >= 60
    这句在统计分组后统计分组之后的分组应该是
    S# average_grade吧我不知道我们讲义里用min(GRADE)干吗?分组之后不是没有GRADE这个字段么? 那这句判别有啥意义
      

  5.   

    select S#,avg(GRADE)
    from SC
    group by S#
    having min(GRADE) >= 60--这个用法没有意义,
    --建议改为:即计算所有人的平均分,并显示平均分>=60的s#
    select S#,avg(GRADE)
    from SC
    group by S#
    having avg(GRADE) >= 60--这个用法有意义.即查询分数>= 60的数据,并计算平均分.
    select S#,avg(GRADE)
    from SC
    where GRADE >=60
    group by S#