小议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;
- 小议group by
- connect by 用法小议
- group by
- group by
- group by
- group by
- group by
- group by
- GROUP BY
- group by
- group by
- GROUP BY
- group by
- group by
- group by
- group by
- Group by
- group by
- hadoop深入研究:(十七)——Avro Datafile
- python中获取指定目录下所有文件名列表的程序
- 浅谈CSS选择器中的空格
- 解决rpm conflicts with file from package的两个方法
- Csharp:字符串操作
- 小议group by
- hdu2065(母函数)
- Csharp:字符串操作
- Android详细的对话框AlertDialog.Builder使用方法
- 获取Oracle数据库awr报告方法
- 我的JAVA之路
- 学生信息管理系统---数据库的建立
- Android客户端与Servlet通过AES加密通信
- 日期和时间