zoukankan      html  css  js  c++  java
  • Mysql——group by

    group by 分组,可以有多个字段 GROUP BY Customer,OrderDate

    根据我们需要的来分组,并且分组是建立在视图的基础之上的,也就是说在一个sql执行查询的过程中分了很多视图,在上一个过程的视图基础之上建立这个分组条件。

    SELECT s.* FROM student s,sc a WHERE s.sid=a.sid  GROUP BY a.sid;

    拿这个举例:

    from两个表名查询出来的这个视图经过where条件的筛选,一个学生id对应三个值,我们group by之后只显示了一条数据,而如果用这条sql就会报错,

     报错的sql :  SELECT s.*,sc.score FROM student s,sc a WHERE s.sid=a.sid  GROUP BY a.sid;

    这是为什么呢?

    1. Group By 语句简介:

    Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

    P.S. 这里真是体会到了一个好的命名的力量,Group By从字面是直接去理解是非常好理解的。恩,以后在命名的环节一定要加把劲:)。话题扯远了。

    2. Group By 的使用:

    上面已经给出了对Group By语句的理解。基于这个理解和SQL Server 2000的联机帮助,下面对Group By语句的各种典型使用进行依次列举说明。

    2.1 Group By [Expressions]:

    这个恐怕是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(出产国), 一个是水果种类。如果我们这里水果种类不是用Count(*),而是类似如下写法的话:

    SELECT  FruitName,ProductPlace  FROMT_TEST_FRUITINFO  GROUP BY ProductPlace

    那么SQL在执行此语句的时候会报如下的类似错误:

    选择列表中的列'T_TEST_FRUITINFO.FruitName'无效,因为该列没有包含在聚合函数或GROUPBY子句中。

    这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。我们可以将Group By操作想象成如下的一个过程,首先系统根据SELECT 语句得到一个结果集,如最开始的那个水果、出产国家、单价的一个详细表。然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。这个时候剩下的那些不存在于Group By语句后面作为分组依据的字段就有可能出现多个值,但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate functions)了。

     

    总结:

    group by就是在视图的基础之上分组再组成一张视图,是显示一条数据的,而我们要求平均数等这些操作的话,执行顺序决定了要先求出要先分组再求平均数,可以把group by理解为把数据分为一个rows数据的集合,而呈现出来的是我们需要的分组相同数据或者平均数据等。

  • 相关阅读:
    凡是可能出错的事必定会出错
    php session 前后台同域名下
    mysql常用; group by 高级
    Thread 学习记录 <1> -- volatile和synchronized
    VBA学习
    EXPLAINING WHAT ACTION AND FUNC ARE
    Unslider.js Tiny Sample
    jQuery操作DOM元素
    在.net中使用GAC
    Sql Server 分区演练 【转】
  • 原文地址:https://www.cnblogs.com/wy20110919/p/8098934.html
Copyright © 2011-2022 走看看