Oracle数据库中GROUP BY 和 ORDER BY 一起使用需要注意的事项

本文介绍了如何在SQL查询中正确使用GROUP BY和ORDER BY,包括ORDER BY的位置要求,列选择规则,以及在使用SUM等聚集函数时的GROUP BY必要性。通过实例演示了如何确保查询结果按预期格式呈现,避免常见错误。
摘要由CSDN通过智能技术生成

GROUP BY 和 ORDER BY 一起使用需要注意的事项

经过一番查询实验之后得出以下结论:
1. ORDER BY 子句一定是出现在GROUOP BY 子句后面
2. ORDER BY 中的列要出现在GROUOP BY子句或者聚集函数中

例子如下:
图片描述


先建表和插入信息

--学生信息表
CREATE TABLE STU_INFO
(
      STU_NO   NUMBER(10),
      STU_NAME VARCHAR2(10),
      STU_AGE  NUMBER(10)
);          

--学生成绩表
CREATE TABLE STU_GRADE
(
      STU_NO  NUMBER(10),
      SUBJECT VARCHAR2(10),
      GRADE   NUMBER(3)
);


ALTER TABLE STU_INFO  ADD CONSTRAINTS STU_INFO_PK  PRIMARY KEY(STU_NO);
ALTER TABLE STU_GRADE ADD CONSTRAINTS STU_GRADE_PK PRIMARY KEY(STU_NO,SUBJECT);
ALTER TABLE STU_GRADE ADD CONSTRAINTS STU_GRADE_FK FOREIGN KEY(STU_NO) REFERENCES STU_INFO(STU_NO);

INSERT INTO STU_INFO VALUES(0001,'张三',18);
INSERT INTO STU_INFO VALUES(0002,'李四',20);
INSERT INTO STU_INFO VALUES(0003,'王五',19);

INSERT INTO STU_GRADE VALUES(0001,'语文',100);
INSERT INTO STU_GRADE VALUES(0001,'数学',93);
INSERT INTO STU_GRADE VALUES(0001,'英语',80);
INSERT INTO STU_GRADE VALUES(0002,'语文',80);
INSERT INTO STU_GRADE VALUES(0002,'数学',90);
INSERT INTO STU_GRADE VALUES(0002,'英语',100);
INSERT INTO STU_GRADE VALUES(0003,'语文',90);
INSERT INTO STU_GRADE VALUES(0003,'数学',85);
INSERT INTO STU_GRADE VALUES(0003,'英语',80);

题目:使学生姓名和科目成绩在同一行,要求如下格式显示(本体需要使用行转列的方法)
图片描述

SELECT T.姓名,SUM(语文) 语文,SUM(数学) 数学,SUM(英语) 英语
       FROM(SELECT I.STU_NO,I.STU_NAME 姓名,DECODE(G.SUBJECT,'语文',G.GRADE,0) 语文,
                   DECODE(G.SUBJECT,'数学',G.GRADE,0) 数学,
                   DECODE(G.SUBJECT,'英语',G.GRADE,0) 英语
                   FROM STU_INFO I,STU_GRADE G
                   WHERE G.STU_NO=I.STU_NO) T
       GROUP BY T.STU_NO,T.姓名                                       
       ORDER BY T.STU_NO;                                            

在PL/SQL Developer里,ORDER BY 后跟的列 T.STU_NO 如果没有出现在GROUP BY 中就会报错。
还有 GROUP BY 后不能缺少T.STU_NO和T.姓名,因为:
1. ORDER BY一定是在GROUOP BY 之后,且它的列要出现在GROUP BY或者聚集函数中
2. 使用了聚集函数SUM,那SELECT中的列如果不在聚集函数中,那就一定要出现在GROUP BY中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值