`
yzl495
  • 浏览: 54209 次
  • 性别: Icon_minigender_1
  • 来自: 赣州
文章分类
社区版块
存档分类
最新评论

GROUP BY分组查询与SQL执行顺序 .

 
阅读更多

在SQL中使用GROUP BY来对SELECT的结果进行数据分组,在具体使用GROUP BY之前需要知道一些重要的规定。

  • GROUP BY子句可以包含任意数目的列。也就是说可以在组里再分组,为数据分组提供更细致的控制。
  • 如果在GROUP BY子句中指定多个分组,数据将在最后指定的分组上汇总。
  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用了表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
  • 除了聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出。
  • 如果分组列中有NULL值,则NULL将作为一个分组返回。如果有多行NULL值,它们将分为一组。
  • GROUP BY子句必须在WHERE子句之后,ORDER BY之前。

过滤分组

对分组过于采用HAVING子句。HAVING子句支持所有WHERE的操作。HAVING与WHERE的区别在于WHERE是过滤行的,而HAVING是用来过滤分组。

另一种理解WHERE与HAVING的区别的方法是,WHERE在分组之前过滤,而HAVING在分组之后以每组为单位过滤。

分组与排序

一般在使用GROUP BY子句时,也应该使用ORDER BY子句。这是保证数据正确排序的唯一方法。

SQL SELECT语句的执行顺序:

  1. from子句组装来自不同数据源的数据;
  2. where子句基于指定的条件对记录行进行筛选;
  3. group by子句将数据划分为多个分组;
  4. 使用聚集函数进行计算;
  5. 使用having子句筛选分组;
  6. 计算所有的表达式;
  7. 使用order by对结果集进行排序;
  8. select 集合输出。

举个例子吧。

1 select 考生姓名, max(总成绩) as max总成绩
2 from tb_Grade
3 where 考生姓名 is not null
4 group by 考生姓名
5 having max(总成绩) > 600
6 order by max总成绩

在上面的示例中 SQL 语句的执行顺序如下:

  1. 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
  2. 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
  3. 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
  4. 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
  5. 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
  6. 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.
注:如果使用了连接join和on,则会在where执行之前先执行on,然后执行join,接着才去执行where。

 
附:
MySQL中的聚集函数:
1、count()返回某列的行数
2、avg()返回某列的平均值
3、max()返回某列的最大值
4、min()返回某列的最小值
5、sum()返回某列的和
6、distinct 去除重复值
注:avg()忽略值为null的行,count(*)时统计所有行,count(列)时忽略为null的行

MySQL的语句执行顺序

MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。

下面我们来具体分析一下查询处理的每一个阶段

  1. FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
  2. ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
  3. JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
  4. WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
  5. GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
  6. CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
  7. HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
  8. SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
  9. DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
  10. ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
  11. LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。
分享到:
评论

相关推荐

    分组查询GROUP BY的使用与SQL执行顺序的讲解

    分组查询GROUP BY是SQL语言中用于对查询结果进行数据分组的关键子句,它允许我们将数据按照一个或多个列的值进行聚合。在使用GROUP BY时,有一些基本规则需要遵循: 1. GROUP BY子句可以包含任意数量的列,这意味着...

    当数据库复杂查询执行顺序与编写顺序原理及sql案例:同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序

    当同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序时的用法

    SQL查询原理及执行顺序

    9. **执行计划运行**:最后,按照选定的执行计划,数据库开始读取数据并执行查询。 #### Oracle共享原理与查询效率提升 Oracle数据库通过共享池(Shared Pool)机制来存储已执行的SQL语句,实现资源的高效利用。当...

    sql执行顺序大总结

    SQL 执行顺序大总结 SQL 执行顺序是一个非常重要的概念,对于任何一个 SQL 开发者来说都非常重要。今天,我们将深入探讨 SQL 执行顺序的每一个步骤,从 FROM 到 SELECT,了解每一个步骤的执行顺序和细节。 FROM ...

    sql查询的逻辑执行顺序

    ### SQL查询的逻辑执行顺序详解 #### 一、引言 SQL(Structured Query Language)作为数据库操作的标准语言,在数据检索、管理和分析方面扮演着至关重要的角色。为了更高效地理解和优化SQL查询,了解其背后的执行...

    数据库笔试题之查询语句where,group by,having,order by执行与编写顺序详解

    数据库查询语句执行顺序与编写顺序详解 数据库查询语句的执行顺序和编写顺序是数据库开发中非常重要的知识点。特别是在WHERE、GROUP BY、HAVING、ORDER BY同时出现时,执行顺序和编写顺序变得尤为重要。本文将详细...

    SQL语句执行顺序说明

    4. **HAVING子句**:HAVING子句用于对分组后的结果进行进一步的过滤,其执行顺序在GROUP BY之后。 5. **SELECT子句**:最后是SELECT子句,选择需要返回的数据列。这里需要注意的是,少用通配符“*”,而是明确指定...

    MySQL DQL - 执行顺序.md

    这些子句按照特定的顺序执行,这对于正确地理解和编写有效的SQL查询至关重要。 #### 1. `FROM` 子句 **作用:**`FROM`子句指定了查询的目标表或视图。它是所有其他子句的基础,因为所有的操作都是基于所指定的表或...

    SQL Select语句完整的执行顺序

    5. **GROUP BY 子句**:如果查询中包含聚合函数(如SUM、AVG等),则会使用`GROUP BY`子句来对数据进行分组。这一步骤发生在`WHERE`子句之后,因为`GROUP BY`只能作用于经过`WHERE`筛选后的数据。 6. **WITH CUBE |...

    SQL Server分组排序取数据的实现

    `ORDER BY`语句用于指定查询结果的排列顺序,通常与`GROUP BY`一起使用。在示例中,`ORDER BY maturity ASC`表示按照`maturity`列的值以升序排序。这有助于确定每组中的行位置。 要获取每组的第N行数据,我们可以...

    SQL语句执行深入讲解(MySQL架构总览-查询执行流程-SQL解析顺序)

    本文将深入探讨MySQL数据库系统中的SQL语句执行过程,包括MySQL的架构总览、查询执行流程以及SQL语句的解析顺序。 首先,我们来看MySQL的架构总览。MySQL架构分为两个主要层次:SQL Layer(SQL层)和Storage Engine...

    T-SQL语句执行的顺序

    了解T-SQL语句的执行顺序对于优化查询性能和编写更高效的代码至关重要。以下是对标题和描述中所述知识点的详细说明: 1. **SELECT**: SELECT语句用于从一个或多个表中选取数据。在T-SQL中,这是执行的第一步,它...

    SQL语句的执行原理及顺序

    了解 SQL 语句的执行顺序可以帮助开发人员更好地优化查询语句,提高数据库性能。 SQL 语句的执行顺序可以分为 11 个步骤: 1. FROM 子句:首先对 FROM 子句中的前两个表执行一个笛卡尔乘积,生成虚拟表 vt1。 2. ...

    SQL基础知识.pdf

    这些函数执行的顺序通常是在GROUP BY之后,HAVING之前。 3. 基本操作: - 创建数据库:`CREATE DATABASE [数据库名]`。 - 创建表格:`CREATE TABLE [表名]`。 - 修改表结构,包括添加或删除列:`ALTER TABLE`。 ...

    SQL 提升SQL执行效率诀窍

    下面将详细解释如何根据查询逻辑执行顺序来优化SQL语句。 首先,理解SQL的逻辑执行顺序是优化的前提。按照标准的SQL解析顺序,它依次为: 1. FROM子句:此阶段将从各个数据源(如表或视图)中组合数据,生成初步的...

    SQL语句手册.chm

    可以结合WHERE子句进行条件筛选,使用GROUP BY进行分组,HAVING来过滤分组后的结果,以及ORDER BY进行排序。JOIN操作用于连接两个或更多表的数据。 6. **更新与删除**: UPDATE语句用于修改已存在的数据,DELETE语句...

    取SQL分组中的某几行数据.docx

    这是一般情况下最常用的分组聚合操作,可以直接使用`GROUP BY`语句完成: ```sql SELECT UserID, MAX(OrderID) AS MaxOrderID FROM testGroup GROUP BY UserID; ``` ##### 2. 取出分组中某列的最大/最小值,同时...

    sql解析顺序

    在这篇文章中,我们将详细地讲述 SQL 语句的解析顺序,包括 FROM、WHERE、GROUP BY、HAVING、SELECT 等子句的执行顺序。 首先,FROM 子句是 SQL 语句的第一步骤,它标识了需要查询的表,并生成一个虚拟表 VT1。FROM...

    SQL语句中SELECT语句的执行顺序

    ### SQL语句中SELECT语句的执行顺序 在SQL语言中,`SELECT`语句是进行数据查询的核心工具。为了确保查询结果的准确性和效率,理解`SELECT`语句内部的执行顺序至关重要。本文将详细解析`SELECT`语句各子句的执行...

Global site tag (gtag.js) - Google Analytics