zoukankan      html  css  js  c++  java
  • SQL中where, group by, having的用法和区别

    group by,where,having 是数据库查询中最常用的几个关键字。在工作中,时常用到,那么,当一个查询中使用了where ,group by ,having及聚集函数时 ,执行顺序是怎么样的?为了回答这个问题,将这个三个关键字的用法整理一下。

    where:数据库中常用的是where关键字,用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。如下面这个例子,从user表中查询出userDepartmentId等于2的数据

    select * from dbo.user where userDepartmentId=2
    • 1

    group by:对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值。
    在说group by的时候,我们还需要了解聚合函数,聚合函数是SQL语言中一种特殊的函数。例如:

    • count(*):获取数量
    • sum():求和(这里要注意求和是忽略null值的,null与其他数值相加结果为null,所以可以通过ifnull(xxx,0)将null的值赋为0)
    • avg():求平均数
    • max():求最大值
    • min():求最小值

    这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

    我们需要注意的是:在使用group by的SQL语句中,select中返回的字段,必须满足以下两个条件之一:

    1. 包含在group by语句的后面,作为分组的依据;
    2. 这些字段包含在聚合函数中。

    从刚才的那个例子中,我们查询出每个城市,相同年龄的员工数量:

    select city, count(*),age from dbo.user where departmentID=2 group by city,age
    • 1

    having:用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作。
    所以having的使用需要注意以下几点:

    1. having只能用于group by(分组统计语句中)
    2. where 是用于在初始表中筛选查询,having用于在where和group by 结果分组中查询
    3. having 子句中的每一个元素也必须出现在select列表中
    4. having语句可以使用聚合函数,而where不使用。

    还是刚才的例子,我们进一步整理,查询员工数量大于20的城市和年龄段

    select city, count(*),age from dbo.user where departmentID=2 group by city,age having age >40
    • 1

    回到开头的那个问题:当一个语句中同时含有where、group by 、having及聚集函数时,执行顺序如下:

    1. 执行where子句查找符合条件的数据;
    2. 使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;
    3. 最后用having 子句去掉不符合条件的组。

    需要注意的是,

    1. having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.
    2. having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
    3. having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

    当加上其他sql语句时,执行顺序如下:
    S-F-W-G-H-O 组合

    select –>where –> group by–> having–>order by

    顺序是不能改变的

  • 相关阅读:
    Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
    Docker配置LNMP环境
    Docker安装mysqli扩展和gd扩展
    Docker常用命令
    Ubuntu常用命令
    单例模式的优缺点和使用场景
    ABP 多租户数据共享
    ABP Core 后台Angular+Ng-Zorro 图片上传
    ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
    AbpCore 执行迁移文件生成数据库报错 Could not find root folder of the web project!
  • 原文地址:https://www.cnblogs.com/starliang/p/8377040.html
Copyright © 2011-2022 走看看