group by ,order by ,having 简单用法

本文介绍了SQL中oraderby、groupby及having子句的基本用法,并通过具体实例展示了如何进行数据排序、分组及聚合列筛选。了解这些操作对于有效管理和分析数据库中的大量信息至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

orader by:就是排序,默认升序,desc就是降序。

group by:分组,前面必须有聚合函数,分组后面跟的是非聚合列,sql语句循序优先于orader by。

having :用于聚合列的筛选。


举例说明:

SQL> select tablespace_name,sum(extents),sum(blocks),sum(bytes)/1024/1024 total_MB from dba_segments group by tablespace_name;

TABLESPACE_NAME                                              SUM(EXTENTS) SUM(BLOCKS)   TOTAL_MB
------------------------------------------------------------ ------------ ----------- ----------
SYSAUX                                                               4859       92848    725.375
EAS_D_TEST0319_STANDARD                                             20677     2270920 17741.5625
UNDOTBS1                                                              128        4864         38
EAS_D_ZYWYDB_STANDARD                                               23819     2674256  20892.625
EAS_D_TEST0319_TEMP2                                                  776        6208       48.5
EAS_D_ZYTEST0228_STANDARD                                           25870     2276664 17786.4375
USERS                                                                   6          48       .375
SYSTEM                                                               3461      164544     1285.5
EAS_D_ZYWYDB_TEMP2                                                   7996       63968     499.75
EAS_D_ZYDB_STANDARD                                                 20393     2332464  18222.375
EAS_D_ZYTEST0228_TEMP2                                               5445       43560   340.3125
EAS_D_TEST1201_TEMP2                                                 5820       46560     363.75
EAS_D_ZYDB_TEMP2                                                     7999       63992   499.9375
EAS_D_TEST1201_STANDARD                                             20705     2046832  15990.875
PERFSTAT                                                             2308       63840     498.75

已选择15行。

SQL> select tablespace_name,sum(extents),sum(blocks),sum(bytes)/1024/1024 total_MB from dba_segments order by tablespace_name group by tablespace_name;
select tablespace_name,sum(extents),sum(blocks),sum(bytes)/1024/1024 total_MB from dba_segments order by tablespace_name group by tablespace_name
                                                                                                                         *
第 1 行出现错误:
ORA-00933: SQL command not properly ended


SQL> select tablespace_name,sum(extents),sum(blocks),sum(bytes)/1024/1024 total_MB from dba_segments group by tablespace_name order by tablespace_name;

TABLESPACE_NAME                                              SUM(EXTENTS) SUM(BLOCKS)   TOTAL_MB
------------------------------------------------------------ ------------ ----------- ----------
EAS_D_TEST0319_STANDARD                                             20677     2270920 17741.5625
EAS_D_TEST0319_TEMP2                                                  776        6208       48.5
EAS_D_TEST1201_STANDARD                                             20705     2046832  15990.875
EAS_D_TEST1201_TEMP2                                                 5820       46560     363.75
EAS_D_ZYDB_STANDARD                                                 20393     2332464  18222.375
EAS_D_ZYDB_TEMP2                                                     7999       63992   499.9375
EAS_D_ZYTEST0228_STANDARD                                           25870     2276664 17786.4375
EAS_D_ZYTEST0228_TEMP2                                               5445       43560   340.3125
EAS_D_ZYWYDB_STANDARD                                               23819     2674256  20892.625
EAS_D_ZYWYDB_TEMP2                                                   7996       63968     499.75
PERFSTAT                                                             2308       63840     498.75
SYSAUX                                                               4859       92848    725.375
SYSTEM                                                               3461      164544     1285.5
UNDOTBS1                                                              128        4864         38
USERS                                                                   6          48       .375

已选择15行。

SQL> select tablespace_name,sum(extents),sum(blocks),sum(bytes)/1024/1024 total_MB from dba_segments group by tablespace_name having sum(blocks) > 200000
  2   order by tablespace_name;

TABLESPACE_NAME                                              SUM(EXTENTS) SUM(BLOCKS)   TOTAL_MB
------------------------------------------------------------ ------------ ----------- ----------
EAS_D_TEST0319_STANDARD                                             20677     2270920 17741.5625
EAS_D_TEST1201_STANDARD                                             20705     2046832  15990.875
EAS_D_ZYDB_STANDARD                                                 20393     2332464  18222.375
EAS_D_ZYTEST0228_STANDARD                                           25870     2276664 17786.4375
EAS_D_ZYWYDB_STANDARD                                               23819     2674256  20892.625



<think>嗯,用户想了解SQL中GROUP BYHAVINGORDER BY用法,需要提供示例教程。首先,我需要回顾这些关键字的基本功能和执行顺序。根据引用[1],GROUP BY必须在WHERE之后,ORDER BY之前,而HAVING是在GROUP BY之后用来过滤分组。 首先,应该从GROUP BY开始解释。GROUP BY用于将数据按指定列分组,通常与聚合函数如SUM、COUNT一起使用。例如,引用[2]中的示例展示了按Customer分组并计算订单总价。需要详细说明这个例子,并可能添加更多例子,比如按地区或产品类别分组。 接下来是HAVING,它与WHERE的区别在于,WHERE过滤行,而HAVING过滤分组后的结果。比如,选择总订单金额超过1000的客户。需要强调HAVING必须跟在GROUP BY之后,并且可以使用聚合函数作为条件。 然后是ORDER BY,用于排序结果集,可以指定升序或降序。例如,按总订单金额降序排列。这里要注意ORDER BY在SELECT之后执行,所以可以使用别名。 执行顺序是关键。根据引用[1],顺序是WHERE → GROUP BYHAVINGORDER BY。需要明确说明每个步骤的作用,比如先过滤行,再分组,再过滤分组,最后排序。 需要提供综合示例,将这三个子句结合起来使用,比如先筛选状态为“已发货”的订单,按客户分组,筛选总金额超过500的,最后按总金额排序。这样用户能清楚看到整个流程。 可能还需要常见问题解答,比如能否在GROUP BY中使用别名,或者HAVING能否不使用聚合函数。根据引用[3],GROUP BY处理的是原始列名,而HAVING通常涉及聚合条件,但也可以有其他条件。 最后,生成相关问题,帮助用户进一步学习,比如执行顺序、优化技巧或性能影响。确保回答结构清晰,分步骤讲解,并附上代码示例,让用户容易理解。</think>以下是对SQL中GROUP BYHAVINGORDER BY用法解析,结合执行顺序和实际示例说明: --- ### 一、核心功能与执行顺序 根据SQL标准,关键子句的执行顺序为: $$ \text{WHERE} \rightarrow \text{GROUP BY} \rightarrow \text{HAVING} \rightarrow \text{ORDER BY} $$ 这意味着: 1. **WHERE**先过滤原始数据行 2. **GROUP BY**对过滤后的数据分组 3. **HAVING**筛选分组结果 4. **ORDER BY**对最终结果排序[^1] --- ### 二、GROUP BY 分组聚合 **功能**:将数据按指定列分组,常与聚合函数(SUM/COUNT/AVG等)联用 **语法**: ```sql SELECT 列1, 聚合函数(列2) FROM 表名 GROUP BY 列1 ``` **示例**:统计每个客户的订单总金额 ```sql SELECT Customer, SUM(OrderPrice) AS Total FROM Orders GROUP BY Customer ``` 结果会按Customer分组,显示每个客户的消费总额[^2] --- ### 三、HAVING 分组过滤 **功能**:对GROUP BY的分组结果进行筛选(类似于WHERE对行的过滤) **注意**:HAVING必须与GROUP BY联用,且条件中可包含聚合函数 **示例**:筛选总订单金额超过$1000的客户 ```sql SELECT Customer, SUM(OrderPrice) AS Total FROM Orders GROUP BY Customer HAVING SUM(OrderPrice) > 1000 ``` --- ### 四、ORDER BY 结果排序 **功能**:对最终结果按指定列排序 **语法**: ```sql ORDER BY 列名 [ASC|DESC] ``` **示例**:按消费总额降序排列 ```sql SELECT Customer, SUM(OrderPrice) AS Total FROM Orders GROUP BY Customer HAVING Total > 1000 ORDER BY Total DESC ``` *注意:ORDER BY可以使用SELECT中定义的别名[^3]* --- ### 五、综合应用示例 查询2023年订单中,总消费超过$500且订单数≥3的客户,按消费额降序排列: ```sql SELECT Customer, COUNT(*) AS OrderCount, SUM(OrderPrice) AS TotalSpent FROM Orders WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31' GROUP BY Customer HAVING TotalSpent > 500 AND OrderCount >= 3 ORDER BY TotalSpent DESC ``` --- ### 六、常见问题 1. **GROUP BY能否使用列别名?** 不行!GROUP BY处理阶段SELECT尚未执行,需使用原始列名 2. **HAVING能否不使用聚合函数?** 可以,但此时等效于WHERE过滤(效率更低) 3. **多列分组如何操作?** ```sql GROUP BY Country, City -- 先按国家分组,再按城市细分 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值