mysql中groupby的常规用法实例说明

上传人:m**** 文档编号:47196201 上传时间:2018-06-30 格式:DOCX 页数:4 大小:28.15KB
返回 下载 相关 举报
mysql中groupby的常规用法实例说明_第1页
第1页 / 共4页
mysql中groupby的常规用法实例说明_第2页
第2页 / 共4页
mysql中groupby的常规用法实例说明_第3页
第3页 / 共4页
mysql中groupby的常规用法实例说明_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《mysql中groupby的常规用法实例说明》由会员分享,可在线阅读,更多相关《mysql中groupby的常规用法实例说明(4页珍藏版)》请在金锄头文库上搜索。

1、mysqlmysql 中中 groupgroup byby 的常规用法实例说明的常规用法实例说明1.1. groupgroup byby 的常规用法的常规用法group by 的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合 max 等聚合函数筛选数据后分析,以及配合 having 进行筛选后过滤。假设现有数据库表如下:表 user_info,id 主键,user_id 唯一键? 1 2 3 4 5 6 7 8 9CREATE TABLE user_info (id INT(11) NOT NULL AUTO_INCREMENT COMMENT 主键 id,user_id VARC

2、HAR(50) NOT NULL DEFAULT COMMENT 用户编号,grade VARCHAR(50) NOT NULL DEFAULT COMMENT 年级,class VARCHAR(50) NOT NULL DEFAULT COMMENT 班级,PRIMARY KEY (id), 捕鱼游戏 UNIQUE INDEX uniq_user_id (user_id) ) ENGINE=InnoDB数据? 1 2 3 4 5 6 7 8 9 10INSERT INTO user_info (id, user_id, grade, class) VALUES (10, 10230, C,

3、B); INSERT INTO user_info (id, user_id, grade, class) VALUES (9, 10229, C, a); INSERT INTO user_info (id, user_id, grade, class) VALUES (8, 10228, B, b); INSERT INTO user_info (id, user_id, grade, class) VALUES (7, 10227, B, b); INSERT INTO user_info (id, user_id, grade, class) VALUES (6, 10226, B,

4、a); INSERT INTO user_info (id, user_id, grade, class) VALUES (5, 10225, B, a); INSERT INTO user_info (id, user_id, grade, class) VALUES (4, 10224, A, b); INSERT INTO user_info (id, user_id, grade, class) VALUES (3, 10223, A, b); INSERT INTO user_info (id, user_id, grade, class) VALUES (2, 10222, A,

5、a); 棋牌评测网 INSERT INTO user_info (id, user_id, grade, class) VALUES (1, 10221, A, a);idid user_iduser_idgradegrade classclass110221Aa210222Aa310223Ab410224Ab510225Ba610226Ba710227Bb810228Bb910229Ca10 10230Cb聚合函数 max? 1select max(user_id),grade from user_info group by grade ;结果max(user_id)max(user_id)

6、 gradegrade10224A10228B10230C这条 sql 的含义很明确,将数据按照 grade 字段分组,查询每组最大的 user_id 以及当前组内容。注意,这里分组条件是 grade,查询的非聚合条件也是 grade。这里不产生冲突。having? 1select max(user_id),grade from user_info group by grade having gradeA结果max(user_id)max(user_id) gradegrade10228B10230C这条 sql 与上面例子中的基本相同,不过后面跟了 having 过滤条件。将 grade 不

7、满足A的过滤掉了。注意,这里分组条件是 grade,查询的非聚合条件也是 grade。这里不产生冲突。2.2. groupgroup byby 的非常规用法的非常规用法? 1select max(user_id),id,grade from user_info group by grade结果max(user_id)max(user_id) idid gradegrade102241 A102285 B102309 C这条 sql 的结果就值得讨论了,与上述例子不同的是,查询条件多了 id 一列。数据按照 grade 分组后,grade 一列是相同的,max(user_id)按照数据进行计算也

8、是唯一的,id一列是如何取值的?看上述的数据结果,推论:id 是物理内存的第一个匹配项。究竟是与不是需要继续探讨。修改数据修改数据修改 id 按照上述数据结果,将 id=1,改为 id=99,执行 sql 后结论:max(user_id)max(user_id) idid gradegrade102242 A102285 B102309 C显然,与上述例子的结果不同。第一条数据 id 变成了 99,查出的结果第一条数据的id 从 1 变成了 2。表明,id 这个非聚合条件字段的取值与数据写入的时间无关,因为 id=1的记录是先于 id=2 存在的,修改的数据不过是修改了这条数据的内容。结合 m

9、ysql 的数据存储理论,由于 id 是主键,所以数据在检索是是按照主键排序后进行过滤的,因此推论:id 字段的选取是按照 mysql 存储的检索数据匹配的第一条。将 id 改为 1 后恢复了原始结果,无法推翻上述推论。更改查询条件? 1select max(user_id),user_id,id,grade from user_info group by grade1max(user_id)max(user_id) user_iduser_ididid gradegrade10224102211 A10228102255 B10230102299 C将数据 user_id 改为 10999

10、后,执行结果为max(user_id)max(user_id) user_iduser_ididid gradegrade10224109991 A10228102255 B10230102299 C修改了 user_id 后,并没有改变查询到的数据条目,因此得出修改唯一键并不能影响查询匹配的条目规则,所以条目规则依然是匹配第一条,即 id=1。结论结论当 group by 与聚合函数配合使用时,功能为分组后计算当 group by 与 having 配合使用时,功能为分组后过滤当 group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即 id 小的条目对应的字段内容。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 数据库

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号