设为首页 收藏本站
查看: 968|回复: 0

[经验分享] MySQL入门-9:分组数据

[复制链接]

尚未签到

发表于 2018-10-4 12:57:28 | 显示全部楼层 |阅读模式
  大纲
  1、创建分组
  2、过滤分组
  3、SELECT 子句顺序
  分组允许把数据分为多个逻辑组,以便能对每个分组进行聚集计算。
  
一、创建分组
mysql> SELECT vend_id, COUNT(*) AS num_prods  
    -> FROM products
  
    -> GROUP BY vend_id;
  
+---------+-----------+
  
| vend_id | num_prods |
  
+---------+-----------+
  
|    1001 |         3 |
  
|    1002 |         2 |
  
|    1003 |         7 |
  
|    1005 |         2 |
  
+---------+-----------+
  GROUP BY子句指示MySQL分组数据,然后对每个分组而不是整个结果集进行聚集, 引擎会自动完成这种工作。
  在具体使用 GROUP BY 子句前,需要知道一些重要的规定。

  •   GROUP BY 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
      group by a,b,c   -- 先按a分组,如果a相同,再按b分组,如果b相同,再按c分组,最终统计的是最小分组的信息如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。如果使用了聚集函数,那么聚合函数针对操作的是最小的分组后的信息, 根据最小分组来分别统计信息
  •   GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。因为GROUP BY优先于SELECT执行。
      除聚集计算语句外,SELECT 语句中的每个列都必须在GROUP BY子句中列出。
      使用group by 分组之后, select 语句只能指定聚合函数或者包含在group by中指定的字段(SELECT只能出现分组后的整体信息,不能出现组内的详细信息),否则返回的行数不一致
  •   如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
  •   GROUP BY子句必须出现在WHERE子句之后,ORDER BY 子句之前。
  构建查询时,Projection 子句的投影列表中的所有非聚集列还必须包含在 GROUP BY 子句中。具有 GROUP BY 子句的 SELECT 语句必须针对每一组返回一行。列示在 GROUP BY 后面的列能够在一组中只反映一个特异值,并且可以返回该值。但是,未列示在 GROUP BY 后面的列可在包含在组中的行中包含不同的值。
二、过滤分组 HAVING
  除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。基于【完整的分组】而不是【个别的行】进行过滤。
  提到过滤,肯定想到WHERE子句。不过WHERE过滤指定的是"行"而不是"分组"。事实上,WHERE没有分组的概念。
  为此MySQL提供了另外一个子句,HAVING。HAVING 非常类似于WHERE 。唯一的差别是WHERE 过滤“行”,而HAVING 过滤“分组”。所有关于WHERE 的技术和选项都适用于HAVING,它们的句法是相同的,只是关键字不同而已。HAVING支持所有WHERE操作符。
  HAVING 和 WHERE 区别:
  WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。WHERE是过滤行,而HAVING必须基于完整的分组过滤。(其他用法都相同)
三、SELECT 子句顺序
SELECT  
FROM
  
WHERE      -- 行级过滤
  
GROUP BY
  
HAVING      -- 组级过滤
  
ORDER BY
  
LIMIT
  SQL执行的逻辑顺序:
  (1) FROM left_table  
  (3) join_type JOIN right_table (2) ON join_condition  
  (4) WHERE where_condition  
  (5) GROUP BY group_by_list  
  (6) WITH {cube | rollup}  
  (7) HAVING having_condition  
  (8) SELECT (9) DISTINCT (11) top_specification select_list  
  (9) ORDER BY order_by_list
  (10) LIMIT
  逻辑查询处理阶段简介

  •   FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
  •   ON:对VT1应用ON筛选器。只有那些使为真的行才被插入VT2。
  •   OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER
    JOIN),保留表(preserved
    table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到
    VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
  •   WHERE:对VT3应用WHERE筛选器。只有使为true的行才被插入VT4.
  •   GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
  •   CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
  •   HAVING:对VT6应用HAVING筛选器。只有使为true的组才会被插入VT7.
  •   SELECT:处理SELECT列表,产生VT8.
  •   DISTINCT:将重复的行从VT8中移除,产生VT9.
  •   ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
  •   LIMIT:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。
  注:步骤10,按ORDER
BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。
  因为这一步不返回表(而是返回游标),使用了ORDER BY子句的查询不能用作表表达式。表表达式包括:视图、内联表值函数、子查询、派生表和共用表达式。它的结果必须返回给期望得到物理记录的客户端应用程序。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-611868-1-1.html 上篇帖子: MySQL中级:用户管理 下篇帖子: MYSQL 导出多个库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表