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