Oracle (group by, order by)

本文介绍了SQL中GROUP BY和HAVING子句的应用实例,展示了如何对数据进行分组统计及添加额外条件筛选,同时提供了ORDER BY子句的用法以实现查询结果的排序输出。

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

1.GROUP BY
主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       10         3      8750
       20         5     10875
       30         6      9400

 

2.HAVING
对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400


67.ORDER BY
用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;

   DEPTNO ENAME            SAL
--------- ---------- ---------
       10 KING            5000
       10 CLARK           2450
       10 MILLER          1300
       20 SCOTT           3000
       20 FORD            3000
       20 JONES           2975
       20 ADAMS           1100
       20 SMITH            800
       30 BLAKE           2850
       30 ALLEN           1600
       30 TURNER          1500
       30 WARD            1250
       30 MARTIN          1250
       30 JAMES            950

### Oracle SQL 中 `GROUP BY` 和 `ORDER BY` 同时使用的方法 在 Oracle 数据库中,`GROUP BY` 和 `ORDER BY` 可以同时用于同一个查询语句。为了确保查询能够正常工作并返回预期的结果集,遵循特定的规则至关重要。 #### 查询执行顺序 按照标准 SQL 执行流程,在包含 `WHERE`, `GROUP BY`, `HAVING`, 和 `ORDER BY` 子句的情况下,这些子句按如下顺序处理: 1. **FROM** 2. **WHERE** —— 对表中的记录应用过滤条件。 3. **GROUP BY** —— 将满足 WHERE 条件的数据分成若干逻辑组。 4. **HAVING** —— 进一步筛选由 GROUP BY 创建的分组。 5. **SELECT** —— 选择最终输出的列。 6. **ORDER BY** —— 排序最后得到的结果集[^2]。 #### 正确使用 `GROUP BY` 和 `ORDER BY` - 当 `ORDER BY` 跟随 `GROUP BY` 使用时,`ORDER BY` 列应当出现在 `GROUP BY` 或者是聚合函数的一部分。这意味着如果希望基于某个字段排序,则该字段要么被包含于 `GROUP BY` 子句内,要么通过聚合操作(如 SUM(), COUNT() 等)参计算[^1]。 - 若 SELECT 列表中含有非聚合表达式的列名,那么这些列也应加入到 `GROUP BY` 学生编号 (STU_NO) 和 姓名的例子说明了这一点;即当选择了 STU_NO 并对其进行统计分析的同时想要保持其原始值不变的话,就需要将其列入 `GROUP BY`。 ```sql -- 示例:正确的方式展示如何联合运用 GROUP BYORDER BY SELECT T.STU_NO, MAX(T.NAME), SUM(score) FROM STUDENTS T GROUP BY T.STU_NO ORDER BY T.STU_NO; ``` 此示例展示了如何根据学生编号对学生分数求和,并依据相同的学生编号进行升序排列。这里的关键在于 `MAX(T.NAME)` 是一种变通方法来保留每组内的名字信息,而实际上我们更推荐直接把 `T.NAME` 放入 `GROUP BY` 中除非有特殊需求。 另外值得注意的是,虽然可以采用数字索引来代替具体的列名称指定给 `GROUP BY` 或 `ORDER BY` (例如 `GROUP BY 1,2`),但是这种做法不够直观且容易引起混淆,因此建议始终明确写出所涉及的具体列名以便维护人员理解代码意图[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值