zoukankan      html  css  js  c++  java
  • GROUP BY,WHERE,HAVING间的区别和用法

    having子句与where都是过滤语句。

    where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行

    having 子句的作用是筛选满足条件的组,即在分组之后过滤数据条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

    总之,select 用where过滤,找到符合条件的元组。

    而having 用在group by后,配合使用,过滤结果。过滤条件使用聚集函数。即一旦查询结果需要按某个值分组(group by语句),在组内进行过滤时,就用having,如having sum(某列)>4。

    具体的区别:

    聚合语句(sum,min,max,avg,count)在having 里,where 外,所以里先执行,外部的后执行。

    where子句:
    select sum(num) as rmb from order where id>10
    //先where,后sum。只有先查询出id大于10的记录才能执行聚合语句。

    在having里优先执行:
    select reportsto as manager, count(*) as reports from employees
    group by reportsto having count(*) > 4

    分组时用having弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。

    聚合函数和group by都只返回一条结果:
    聚合函数,例如SUM, COUNT, MAX, AVG等,区别于其他函数,他们作用在多条记录上。只返回一个结果,
    如SELECT SUM(population) FROM tablename,SUM作用在所有返回记录的population字段上,返回所有
    家的总人口数。

    GROUP BY 子句,可以让SUM 和 COUNT 等函数只在一组内的数据起作用。

    但返回结果只有一组内的一行。如GROUP BY region 时,同组(同一个region)的数据只返回一行值。表中的其他字段也只能返回一个值.

    HAVING子句在聚合后对组内记录筛选.

    例子:

    一、显示每个地区的总人口数和总面积.
    SELECT region, SUM(population), SUM(area)
    FROM bbc
    GROUP BY region
    先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

    二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
    SELECT region, SUM(population), SUM(area)
    FROM bbc
    GROUP BY region
    HAVING SUM(area)>1000000
    在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
    相反,HAVING子句可以让我们筛选成组后的各组数据.

    以下示例使用的数据库是MySQL 5。
    数据表:student
    表结构:
    Field Name DataType Len
    id int 20
    name varchar 25
    major varchar 25
    score int 20
    sex varchar 20

    表数据:
    编号/姓名/专业/学分/性别
    id name major score sex
    1 jak Chinese 40 f
    2 rain Math 89 m
    3 leo Phy 78 f
    4 jak Math 76 f
    5 rain Chinese 56 m
    6 leo Math 97 f
    7 jak Phy 45 f
    8 jak Draw 87 f
    9 leo Chinese 45 f

    现在我们要得到一个视图:
    要求查询性别为男生,并且列出每个学生的总成绩:
    SQL:
    select s.*,sum(s.score) from student s where sex='f' group by s.name

    Result:
    id name major score sex
    sum(s.score)
    1 jak Chinese 40 f 248
    3 leo Phy 78 f 220

    可以看到总共查到有两组,两组的学生分别是jak和leo,每一组都是同一个学生,这样我们就可以使用
    聚合函数了。
    只有使用了group by语句,才能使用如:count()、sum()之类的聚合函数。

    下面我们再对上面的结果做进一步的筛选,只显示总分数大于230的学生:
    SQL:
    select s.*,sum(s.score) from student s where sex='f' group by s.name having sum(s.score)>230

    Result:
    id name major score sex sum(s.score)
    1 jak Chinese 40 f 248

  • 相关阅读:
    .net2.0 母板页面和自定义控件有冲突我的错
    ASP.NET程序中常用的三十三种代码
    sql server日期时间函数
    控制面板里的CPL
    [原创]ASP.NET MVC多域名多站点解析问题
    SQL获取字段html代码中的img标签图片文件的路径
    [原创]ASP.NET MVC控制器中动态解析用户控件
    EasyUI的treegrid组件动态加载数据问题解决办法
    ASP.NET MVC使用EasyUI的datagrid多选提交保存教程
    [原创]IE6下wbox弹出iframe窗口加载页面空白问题解决
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205516.html
Copyright © 2011-2022 走看看