`
lsp1988
  • 浏览: 11328 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

order by 、group by 、having的用法区别

 
阅读更多

 

order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。

group by 从英文里理解就是分组。必须有聚合函数来配合才能使用,使用时至少需要一个分组标志字段。

什么是聚合函数
sum()count()avg()等都是聚合函数
使用group by 的目的就是要将数据分类汇总。

一般如:
select 单位名称,count(职工id),sum(职工工资) form [某表]
group by 单位名称
这样的运行结果就是以单位名称为分类标志统计各单位的职工人数和工资总额。

sql命令格式使用的先后顺序上,group by 先于 order by

select 命令的标准格式如下:

SELECT select_list 
[ INTO new_table ] 
FROM table_source 
[ WHERE search_condition ] 
[ GROUP BY group_by_expression ] 
[ HAVING search_condition ]

1. GROUP BY 是分组查询一般 GROUP BY 和聚合函数配合使用

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)

例如,有如下数据库表:

A    B 
1    abc 
1    bcd

1    asdfg

如果有如下查询语句(该语句是错误的,原因见前面的原则

select A,B from table group by A

该查询语句的意图是想得到如下结果(当然只是一相情愿)

A     B 
       abc 
1     bcd

       asdfg

右边3条如何变成一条,所以需要用到聚合函数,如下(下面是正确的写法):

select A,count(B) as 数量 from table group by A 
这样的结果就是 
数量 
1    3

2. Having

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。例如:

SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

 

Grouping 的用法:

指示是否聚合 group by 列表中的指定表达式。在结果集中,如果 Grouping 返回 ,表示聚合;如果 Grouping 返回 ,表示非聚合。如果指定了 Group by ,那么只能用在 Select , Having , Order by 中。 

注释: 

GROUPING 用于区分标准空值和由 ROLLUP 、 CUBE 或 GROUPING SETS 返回的空值。作为 ROLLUP 、 CUBE 或 GROUPING SETS 操作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符,表示全体。 

举例: 

CREATE TABLE tt ( 产地 CHAR ( 8), 水果 CHAR ( 8), 重量 INT   ) 

INSERT tt VALUES ( ' 北方 ' , ' 香蕉 ' , 3) 

INSERT tt VALUES ( ' 北方 ' , ' 水蜜桃 ' , 2) 

INSERT tt VALUES ( ' 南方 ' , ' 桔子 ' , 3) 

INSERT tt VALUES ( ' 北方 ' , ' 水蜜桃 ' , 5) 

INSERT tt VALUES ( ' 南方 ' , ' 香蕉 ' , 3) 

INSERT tt VALUES ( ' 南方 ' , ' 水蜜桃 ' , 6) 

INSERT tt VALUES ( ' 北方 ' , ' 桔子 ' , 8) 

select 

CASE WHEN ( GROUPING ( 产地 ) = 1) THEN ' 总计 

    ELSE ISNULL ( 产地 , 'UNKNOWN' ) 

END AS 产地 

CASE WHEN ( GROUPING ( 水果 ) = 1) THEN ' 小计 

    ELSE ISNULL ( 水果 , 'UNKNOWN' ) 

END AS 产地 

SUM ( 重量 总重量 

FROM TT 

GROUP BY 产地 水果 

WITH ROLLUP 

结果: 

/************************ 

北方      桔子      

北方      水蜜桃    

北方      香蕉      

北方      小计      18 

南方      桔子      

南方      水蜜桃    

南方      香蕉      

南方      小计      12 

总计     小计       30 

*************************/ 

 

GROUPING(字段)=1的是对应字段汇总的 
GROUPING(字段)=0的是对应字段原来的明细的信息

分享到:
评论

相关推荐

    order by 、group by 、having的用法

    总的来说,`ORDER BY`、`GROUP BY` 和 `HAVING` 是SQL中进行数据组织和分析的关键工具,掌握它们的用法对于高效地处理大数据至关重要。正确地运用这些子句可以帮助我们更好地理解和分析数据,从而做出更明智的决策。

    order_by_、group_by_、having的用法区别

    order_by_、group_by_、having的用法区别

    order_by_、group_by_、having的用法

    在SQL查询中,`order_by_`、`group_by_`和`having`是三个非常重要的关键字,它们分别用于不同的数据处理操作。 1. `ORDER BY`:此关键字用于对查询结果进行排序,默认是升序(ASC),也可以指定降序(DESC)。在`...

    order_by_、group_by_、having的用法区别.doc

    ### SQL中的ORDER BY, GROUP BY, HAVING 的用法区别详解 #### 一、概述 在SQL查询语言中,`ORDER BY`, `GROUP BY`, 和 `HAVING` 是三个非常重要的概念,它们分别用于对查询结果进行排序、分组以及在分组后进一步...

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

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

    group by,having,order by的用法详解

    在实际使用中,`GROUP BY`、`HAVING` 和 `ORDER BY` 的组合可以帮助我们更有效地分析和展示大量数据,例如找出特定群体的统计特征、查找异常值或进行复杂的数据比较。理解并熟练掌握这三个子句的用法对于数据库查询...

    mysql group by having 实例代码

    `GROUP BY`和`HAVING`结合使用,可以实现更复杂的分组统计和过滤,尤其在需要对分组结果进行进一步分析时非常有用。例如,我们可以根据`work_date`统计每个月的平均打字页数,或者找出每月打字最多的员工。这在数据...

    group by的详解

    3. **排序顺序**:当同时使用`GROUP BY`、`HAVING`和`ORDER BY`时,`ORDER BY`通常放在最后。在示例中,`ORDER BY p.name`确保结果按供应商名字排序,而Oracle会默认按照`GROUP BY`中的列顺序进行排序,即先按年份、...

    sql中 order by 和 group by的区别

    当同时使用 `GROUP BY` 和 `ORDER BY` 时,`ORDER BY` 会决定分组后的结果集如何排序。例如: ```sql SELECT Department, AVG(Salary) FROM Employees GROUP BY Department ORDER BY AVG(Salary) DESC; ``` ...

    group by用法.doc

    当需要去除重复值时,可以在聚合函数中使用`DISTINCT`,如`SELECT CategoryID, AVG(DISTINCT UnitPrice), COUNT(DISTINCT UnitPrice) FROM Products WHERE UnitPrice > 30 GROUP BY CategoryID ORDER BY CategoryID...

    一篇文章带你了解数据库中group by的用法

    这篇文章将深入探讨`GROUP BY`的用法,以及如何结合其他数据库语言元素如`ORDER BY`和`HAVING`来优化查询。 首先,`GROUP BY`的基本概念是将数据按照指定的字段值进行分类,这样就可以对每个类别的数据进行单独的...

    on与where、group by的用法

    - `GROUP BY`用于对数据进行分组和汇总,`HAVING`子句用于对汇总结果进行过滤,而`ORDER BY`则用于对结果集进行排序。 通过理解这些关键词的基本用法及其区别,我们可以更高效地编写SQL查询语句,从而更好地管理和...

    Sequelize中用group by进行分组聚合查询

    在SQL中,分组查询是通过`GROUP BY`子句来实现的,它可以将数据按照一个或多个列的值进行分组,通常结合聚合函数一起使用,以便对每个分组执行计算。 1. SQL中的分组查询 在SQL中,使用`GROUP BY`语句进行分组操作...

    深度分析mysql GROUP BY 与 ORDER BY

    这两种方法都可以解决在`GROUP BY`和`ORDER BY`结合使用时获取每个分组内特定行的问题。在实际的数据库查询优化中,可能需要根据数据量和性能需求选择更适合的方法。对于大数据量的表,子查询可能会导致性能下降,...

    Oracle中分组查询group by用法规则详解

    `HAVING`子句用于在`GROUP BY`后过滤数据,类似于`WHERE`子句,但它作用于分组后的数据,因此可以使用聚合函数。例如,以下查询返回部门总薪水大于8500的部门编号和总薪水: ```sql SELECT deptno, SUM(sal) ...

    mysql group by用法

    - **分组后排序:**在`GROUP BY`后使用`ORDER BY`可以对分组后的结果进行排序,如`ORDER BY column1 ASC/DESC`。 **4. 注意事项** - 在`SELECT`列表中,除了聚合函数外,只能包含`GROUP BY`子句中出现的列。 - `...

    浅谈sql语句中GROUP BY 和 HAVING的使用方法

    在更复杂的查询中,GROUP BY和HAVING可以结合使用。例如,如果我们有一个名为`orders`的订单表和一个名为`customer`的客户表,我们可以统计每个客户的订单数量: ```sql SELECT c.name, COUNT(o.order_number) as ...

    group by 语法大全,内附列子

    接下来,我们将通过具体的例子来展示`GROUP BY`的使用方法。 ##### 示例1:去重复,统计不同学生的人数 ```sql SELECT COUNT(DISTINCT name) AS NumOfStudents FROM score_table; ``` 这里使用`COUNT(DISTINCT ...

Global site tag (gtag.js) - Google Analytics