zoukankan      html  css  js  c++  java
  • HAVING 语句

     有的时候需要对部分分组进行过滤,比如只检索人数多余1个的年龄段,有的开发人员会使用下面的SQL语句:


    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1
    可以在数据库系统中执行下面的SQL的时候,数据库系统会提示语法错误,这是因为聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如:


    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
    执行完毕我们就能在输出结果中看到下面的执行结果:


    FAge CountOfThisAge

    23         2

    25         2

    28         3
    HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件,比如下面的SQL用来检索人数为1个或者3个的年龄段,可以使用下面的SQL:


    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) =1 OR COUNT(*) =3
    执行完毕我们就能在输出结果中看到下面的执行结果:


    FAge CountOfThisAge

    22         1

    27         1

    28         3
    也可以使用IN操作符来实现上面的功能,SQL语句如下:


    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) IN (1,3)
    执行完毕我们就能在输出结果中看到下面的执行结果:


    FAge CountOfThisAge

    22         1

    27         1

    28         3
    HAVING语句能够使用的语法和WHERE几乎是一样的,不过使用WHERE的时候GROUP BY子句要位于WHERE子句之后,而使用HAVING子句的时候GROUP BY子句要位于HAVING子句之后,比如下面的SQL是错误的:


    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee HAVING COUNT(*) IN (1,3) GROUP BY FAge
    需要特别注意,在HAVING语句中不能包含未分组的列名,比如下面的SQL语句是错误的:


    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING FName IS NOT NULL
    执行的时候数据库系统会提示类似如下的错误信息:

    HAVING 子句中的列"T_Employee.FName" 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。

    需要用WHERE语句来代替HAVING,修改后的SQL语句如下:


    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge
    执行完毕我们就能在输出结果中看到下面的执行结果:


    FAge CountOfThisAge

    22 1

    23 2

    25 2

    28 3
  • 相关阅读:
    重建二叉树
    数值的整数次方
    二维数组查找
    二进制中1的个数
    LRU算法的精简实现(基于Java)
    华为18.9.5校招笔试题AK
    避免反射和序列化来破坏单例
    Markdown图片存储解决方法-利用阿里云OSS
    基于Java反射的map自动装配JavaBean工具类设计
    多态与类初始化的底层原理
  • 原文地址:https://www.cnblogs.com/yuyu666/p/9820070.html
Copyright © 2011-2022 走看看