小议group by

来源:互联网 发布:网络资源管理系统 编辑:程序博客网 时间:2024/06/08 01:26

 本文摘自:http://hi.baidu.com/matrix286/item/1d5f6b852abb53d9d0f8cd65


数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。SQL语句中使用GROUP BY子句进行分组,使用方式为“GROUP BY 分组段”。分组语句必须和聚合函数一起使用,GROUP BY子句负责将数据分成逻辑组,而聚合函数则对每一个组进行统计计算。虽然GROUP BY子句常常和聚合函数一起使用,不过GROUP BY子句并不是不能离开聚合函数而单独使用的,虽然不使用聚合函数的GROUP BY子句看起来用处不大。


+---------------------《学生表》------------------------------+
|    学生姓名    |    性别    |    年龄    |    班级   | 
+-------------------------------------------------------------+

例(1):查看每个班的“班名”和“总人数”

Select 班级, count(班级) AS 每班的人数 From 学生表 Group by 班级


上面这个SQL语句处理表中的所有记录,并将“同属一个班级的学生”的数据行放到一组,(即:以“班级”为单位的多个逻辑组),分组后的数据可以看作一个临时的结果集。GROUP BY子句将检索结果划分为多个组,每个组是所有记录的一个子集,也就是说“所有子集的集合”就是所有数据。需要注意的是,分组的所有列都必须位于GROUP BY子句的列名列表中,也就是没有出现在GROUP BY子句中的列(聚合函数内的除外)是不能放到SELECT语句后的列名列表中的


例(2)下面的写法“理论上是错误”的:

Select 班级, 学生姓名, count(班级) AS 每班的人数 From 学生表 Group by 班级


为什么说是“理论上错误”的呢?因为从理论上讲,这样的逻辑是不正确的。因为每个逻辑组中有多个“学生姓名”,如果按上面的写法,那么应当示“逻辑组”中的那个人的“学生姓名”呢?所以无法显示。但是对有一些数据库来说(例如:MySQL) 对上面的SQL会正确的执行。原因是MySQL它会对未出现Group By子句内的“列” (例如:上面的“学生姓名”) 将自动取每组里的第一个数据 (哈~比较有个性)

      

例:查每个栏目下最贵商品(ecshop表中例子)

错误写法:select goods_id,cat_id,goods_name,max(shop_price) from goods group by cat_id;


正确写法一(from型子查询+group):mysql> select * from
    -> (select goods_id,goods_name,shop_price from goods order by shop_price desc limit 3) as tmp
    -> order by shop_price asc;


正确写法二(in+子查询):mysql> select * from 
    -> (
  -> select goods_id,cat_id,goods_name,shop_price 
    -> from goods 
    -> order by cat_id asc,shop_price desc
  -> ) as tmp
    -> group by cat_id;

原创粉丝点击