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

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

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

例子如下:
Oracle数据库中GROUP BY 和 ORDER 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);

题目:使学生姓名和科目成绩在同一行,要求如下格式显示(本体需要使用行转列的方法)
Oracle数据库中GROUP BY 和 ORDER BY 一起使用需要注意的事项

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中。

上一篇:MySQL如何做如等级/成色等特殊顺序的排序


下一篇:使用java回调函数来实现常见的生活场景