zoukankan      html  css  js  c++  java
  • having

    SqlServer中 Group by和Having子句用法  

    2010-10-14 11:15:28|  分类: 默认分类|举报|字号 订阅

    下载LOFTER客户端
     
     
    我们来看看SqlServer中group by语句和having语句的用法。其实在我们说这两个语句的用法的时候,必须先了解一些聚合函数的用法,比如,sum,count,max等,下面先来介绍一下这些语法。


    先来看看语法sum的使用吧。


    语句: select sum(age)from member


    这个sql语句的会返回一个字段,那就是members表中的所有人的年龄和,就是所有人的总年龄。


    那group by呢,它可以按照一定的条件使members表中的数据分组,然后分几组就会返回几行数据,并且字段是那些集合函数所得到的值,一般group by语句都和集合函数用在一起。


    如下例:


    select count(name)from member group by sex


    此语句的意思就是从member表中按sex(性别)分组,然后查出每组的总人数。

    Group By语句最常见的用法了,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。比如有如下数据集,其中水果名称(FruitName)和出产国家(ProductPlace)为联合主键:   

    FruitName

    ProductPlace

    Price

    Apple

    China

    $1.1

    Apple

    Japan

    $2.1

    Apple

    USA

    $2.5

    Orange

    China

    $0.8

    Banana

    China

    $3.1

    Peach

    USA

    $3.0


    如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成:

    SELECT      COUNT(*) AS 水果种类, ProductPlace AS 出产国
    FROM          T_TEST_FRUITINFO
    GROUP BY ProductPlace

    这个SQL语句就是使用了Group By + 分组字段的方式,那么这句SQL语句就可以解释成“我按照出产国家(ProductPlace)将数据集进行分组,然后分别按照各个组来统计各自的记录数量。”很好理解对吧。这里值得注意的是结果集中有两个返回字段,一个是ProductPlace(出产国), 一个是水果种类。

    2.2 Group By All [expressions] :

    Group By All + 分组字段, 这个和前面提到的Group By [Expressions]的形式多了一个关键字ALL。这个关键字只有在使用了where语句的,且where条件筛选掉了一些组的情况才可以看出效果。在SQL Server 2000的联机帮助中,对于Group By All是这样进行描述的:

    如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组

    其中有这么一句话“如果使用ALL关键字,那么查询结果将包含由Group By子句产生的所有组...没有ALL关键字,那么不显示不符合条件的行组。”这句话听起来好像挺耳熟的,对了,好像和LEFT JOIN 和 RIGHT JOIN 有点像。其实这里是类比LEFT JOIN来进行理解的。还是基于如下这样一个数据集:


     

    首先我们不使用带ALL关键字的Group By语句:

    SELECT      COUNT(*) AS 水果种类, ProductPlace AS 出产国
    FROM          T_TEST_FRUITINFO
    WHERE      (ProductPlace <> 'Japan')
    GROUP BY ProductPlace

    那么在最后结果中由于Japan不符合where语句,所以分组结果中将不会出现Japan。

    现在我们加入ALL关键字:

    SELECT      COUNT(*) AS 水果种类, ProductPlace AS 出产国
    FROM         T_TEST_FRUITINFO
    WHERE      (ProductPlace <> 'Japan')
    GROUP BY ALL ProductPlace

    重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。

    查询每天信息数量
    select count(*) as '信息数量',CONVERT(CHAR(8),n_addtime,112) as '时间'  from zy_news  group by CONVERT(CHAR(8),n_addtime,112) order by '时间' desc

    下面我们再来看HAVING子句,HAVING子句可以让我们筛选成组后的各组数据,WHERE子句只能聚合前先筛选记录.但是不能筛选聚合后的组记录,where只能作用在GROUP BY 子句和HAVING子句前。但是HAVING子句能在聚合后对组记录进行筛选。


    下面来看一个例子:


    select sum(age) from member group by sex having sum(age)>400


    这条申请量语句的意思就是:从member表中按sex(性别)分组,然后求出各组的年龄总和,至于后面的having是筛选出那些年龄总和大于400的组,在这样的sql语句中我们不能用where来筛选超过年龄超过400的组,因为表中不存在这样一条记录。这时只能用HAVING子句筛选成组后的各组数据。

  • 相关阅读:
    6410实现网卡(DM9000A)收发功能及ARP协议实现
    Shuffling Machine和双向链表
    Have Fun with Numbers及循环链表(约瑟夫问题)
    Tiny6410 LCD设置
    RAM与内存
    inet_addr解析
    map容器find用法
    WinSock编程(TCP)
    Python 时间序列作图及注释
    无法打开之前cuda的vs项目,打开之后变灰色
  • 原文地址:https://www.cnblogs.com/moonwind/p/4547787.html
Copyright © 2011-2022 走看看