--047 SQL汇总 /* MINUSE,UNION,INTERSECT的用法 */ DROP TABLE T1; DROP TABLE T2; CREATE TABLE T1 (A VARCHAR(2),B INT); CREATE TABLE T2 (A VARCHAR(2),B INT); INSERT INTO T1 VALUES('A',1); INSERT INTO T1 VALUES('B',2); INSERT INTO T1 VALUES('C',3); INSERT INTO T2 VALUES('A',1); INSERT INTO T2 VALUES('B',2); COMMIT; SELECT * FROM T1; A B -- ---------- A 1 B 2 C 3 SELECT * FROM T2; A B -- ---------- A 1 B 2 SELECT * FROM T1 MINUS SELECT * FROM T2; A B -- ---------- C 3 --查询在T1而不在T2中的数据 SELECT * FROM T1 INTERSECT SELECT * FROM T2; A B -- ---------- A 1 B 2 --查询T1与T2表的交集 SELECT * FROM T1 UNION SELECT * FROM T2; A B -- ---------- A 1 B 2 C 3 --查询T1表与T2表的合并集合(出去掉重复) SELECT * FROM T1 UNION ALL SELECT * FROM T2; A B -- ---------- A 1 B 2 C 3 A 1 B 2 --查询T1表与T2表的合并集合(无出去重复操作) ---------------------------------------------------------------------------------------------------------------------- --ROLLUP用法 SELECT OWNER, STATUS, OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN('BI','GOSALES') GROUP BY OWNER, STATUS, OBJECT_TYPE ORDER BY OWNER,STATUS; OWNER STATUS OBJECT_TYPE COUNT(*) ------------------------------ ------- ------------------- ---------- ADMIN INVALID PROCEDURE 1 ADMIN VALID INDEX 15 ADMIN VALID LOB 19 ADMIN VALID PACKAGE 1 ADMIN VALID PROCEDURE 1 ADMIN VALID SEQUENCE 2 ADMIN VALID TABLE 37 ADMIN VALID TABLE PARTITION 23 ADMIN VALID TABLE SUBPARTITION 26 ADMIN VALID TRIGGER 3 ADMIN VALID TYPE 5 GOSALES VALID INDEX 45 GOSALES VALID PROCEDURE 1 GOSALES VALID TABLE 24 SELECT OWNER, STATUS, OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN('ADMIN','GOSALES') GROUP BY ROLLUP(OWNER, STATUS, OBJECT_TYPE) ORDER BY OWNER,STATUS; OWNER STATUS OBJECT_TYPE COUNT(*) ------------------------------ ------- ------------------- ---------- ADMIN INVALID PROCEDURE 1 ADMIN INVALID 1 ADMIN VALID INDEX 15 ADMIN VALID LOB 19 ADMIN VALID PACKAGE 1 ADMIN VALID PROCEDURE 1 ADMIN VALID SEQUENCE 2 ADMIN VALID TABLE 37 ADMIN VALID TABLE PARTITION 23 ADMIN VALID TABLE SUBPARTITION 26 ADMIN VALID TRIGGER 3 ADMIN VALID TYPE 5 ADMIN VALID 132 ADMIN 133 GOSALES VALID INDEX 45 GOSALES VALID PROCEDURE 1 GOSALES VALID TABLE 24 GOSALES VALID 70 GOSALES 70 203 --从结果可以看出ROLLUP的效果:按照统计括号里面的维度顺序进行一级级向上小计。(注意”顺序“两个字) --等同于增加了GROUP BY OWNER,STATUS和 GROUP BY OWNER和 全部的COUNT(*) SELECT OWNER, STATUS, OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN('ADMIN','GOSALES') GROUP BY OWNER,ROLLUP(STATUS, OBJECT_TYPE) ORDER BY OWNER,STATUS; OWNER STATUS OBJECT_TYPE COUNT(*) ------------------------------ ------- ------------------- ---------- ADMIN INVALID PROCEDURE 1 ADMIN INVALID 1 ADMIN VALID INDEX 15 ADMIN VALID LOB 19 ADMIN VALID PACKAGE 1 ADMIN VALID PROCEDURE 1 ADMIN VALID SEQUENCE 2 ADMIN VALID TABLE 37 ADMIN VALID TABLE PARTITION 23 ADMIN VALID TABLE SUBPARTITION 26 ADMIN VALID TRIGGER 3 ADMIN VALID TYPE 5 ADMIN VALID 132 ADMIN 133 GOSALES VALID INDEX 45 GOSALES VALID PROCEDURE 1 GOSALES VALID TABLE 24 GOSALES VALID 70 GOSALES 70 --这个结果不太好理解 --我的理解是是对括号内STATUS,OBJECT_TYPE进行计算小计,那么就是统计STATUS的小计,但还是要包含到rollup外的维度。 --统计的最高层次是owner SELECT OWNER, STATUS, OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN('ADMIN','GOSALES') GROUP BY OWNER,STATUS,ROLLUP(OBJECT_TYPE) ORDER BY OWNER,STATUS; OWNER STATUS OBJECT_TYPE COUNT(*) ------------------------------ ------- ------------------- ---------- ADMIN INVALID PROCEDURE 1 ADMIN INVALID 1 ADMIN VALID INDEX 15 ADMIN VALID LOB 19 ADMIN VALID PACKAGE 1 ADMIN VALID PROCEDURE 1 ADMIN VALID SEQUENCE 2 ADMIN VALID TABLE 37 ADMIN VALID TABLE PARTITION 23 ADMIN VALID TABLE SUBPARTITION 26 ADMIN VALID TRIGGER 3 ADMIN VALID TYPE 5 ADMIN VALID 132 GOSALES VALID INDEX 45 GOSALES VALID PROCEDURE 1 GOSALES VALID TABLE 24 GOSALES VALID 70 --维度层次向上汇总,但汇总的最高层次OWNER,STATUS --GROUPING 的用法 SELECT GROUPING(STATUS), OWNER, STATUS, OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN('ADMIN','GOSALES') GROUP BY ROLLUP(OWNER,STATUS,OBJECT_TYPE) ORDER BY OWNER,STATUS; GROUPING(STATUS) OWNER STATUS OBJECT_TYPE COUNT(*) ---------------- ------------------------------ ------- ------------------- ---------- 0 ADMIN INVALID PROCEDURE 1 0 ADMIN INVALID 1 0 ADMIN VALID INDEX 15 0 ADMIN VALID LOB 19 0 ADMIN VALID PACKAGE 1 0 ADMIN VALID PROCEDURE 1 0 ADMIN VALID SEQUENCE 2 0 ADMIN VALID TABLE 37 0 ADMIN VALID TABLE PARTITION 23 0 ADMIN VALID TABLE SUBPARTITION 26 0 ADMIN VALID TRIGGER 3 0 ADMIN VALID TYPE 5 0 ADMIN VALID 132 1 ADMIN 133 0 GOSALES VALID INDEX 45 0 GOSALES VALID PROCEDURE 1 0 GOSALES VALID TABLE 24 0 GOSALES VALID 70 1 GOSALES 70 1 203 --GROUPING 表示对STATUS的小计的记录标示 --STATUS为空的记录都是STATUS的小计记录 -------------------------------------------------------------------------------------------------------------------- --CUBE的使用 --CUBE是立方体的意思,是对各个维度,各个层次的汇总。 SELECT GROUPING(STATUS),OWNER, STATUS, OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN('ADMIN','GOSALES') GROUP BY CUBE(OWNER,STATUS,OBJECT_TYPE) ORDER BY OWNER,STATUS; GROUPING(STATUS) OWNER STATUS OBJECT_TYPE COUNT(*) ---------------- ------------------------------ ------- ------------------- ---------- 0 ADMIN INVALID PROCEDURE 1 0 ADMIN INVALID 1 0 ADMIN VALID INDEX 15 0 ADMIN VALID LOB 19 0 ADMIN VALID PACKAGE 1 0 ADMIN VALID PROCEDURE 1 0 ADMIN VALID SEQUENCE 2 0 ADMIN VALID TABLE 37 0 ADMIN VALID TABLE PARTITION 23 0 ADMIN VALID TABLE SUBPARTITION 26 0 ADMIN VALID TRIGGER 3 0 ADMIN VALID TYPE 5 0 ADMIN VALID 132 1 ADMIN INDEX 15 1 ADMIN LOB 19 1 ADMIN PACKAGE 1 1 ADMIN PROCEDURE 2 1 ADMIN SEQUENCE 2 1 ADMIN TABLE 37 1 ADMIN TABLE PARTITION 23 1 ADMIN TABLE SUBPARTITION 26 1 ADMIN TRIGGER 3 1 ADMIN TYPE 5 1 ADMIN 133 0 GOSALES VALID INDEX 45 0 GOSALES VALID PROCEDURE 1 0 GOSALES VALID TABLE 24 0 GOSALES VALID 70 1 GOSALES INDEX 45 1 GOSALES PROCEDURE 1 1 GOSALES TABLE 24 1 GOSALES 70 0 INVALID PROCEDURE 1 0 INVALID 1 0 VALID INDEX 60 0 VALID LOB 19 0 VALID PACKAGE 1 0 VALID PROCEDURE 2 0 VALID SEQUENCE 2 0 VALID TABLE 61 0 VALID TABLE PARTITION 23 0 VALID TABLE SUBPARTITION 26 0 VALID TRIGGER 3 0 VALID TYPE 5 0 VALID 202 1 INDEX 60 1 LOB 19 1 PACKAGE 1 1 PROCEDURE 3 1 SEQUENCE 2 1 TABLE 61 1 TABLE PARTITION 23 1 TABLE SUBPARTITION 26 1 TRIGGER 3 1 TYPE 5 1 203 ---从结果可以看出,CUBE是对三个维度OWNER,STATUS,OBJECT_TYPE,多个层次的汇总。 --cube(OWNER,STATUS,OBJECT_TYPE)等价于group by (owner,status)+group by (owner,object_type),group by (status,object_type) --+group by (owner)+group by (status)+group by (object_type) --GROUPING(STATS)为1 代表去除掉STATUS字段后所有的汇总,从STATUS为空,结果为1的记录可以看出。 ----------------------------------------------------------------------------------------------------------------------------------- --GROUPING SETS语法,只有10.1.0以上的版本才支持,下面的数据是DUMMY的,帮助理解 SELECT WINDOW,ROOM_STYPE,ROUND(SUM(SQ_FT),2) SUM_SQ_FT FROM SHIP_CABINS WHERE SHIP_ID = 1 GROUP BY GROUPING SETS((WINDOW,ROOM_STYLE),(ROOM_TYPE),NULL) ORDER BY WINDOW,ROOM_STYLE,ROOM_TYPE; WINDOW ROOM_STYPE ROOM_TYPE SUM_SQ_FT ---------------- ------------------------------ --------- ---------- NONE STATEROOM 616 NONE SUITE 2261 OCEAN STATEROOM 365 OCEAN SUITE 4524 LARGE 436 PRESIDENTIAL 1142 ROYAL 3269 SKYLOFT 722 STANDARD 2197 7766 ---------------------------------------------------------------------------------------------------------------------------------- --INSERT MUTIPLE TABLES admin@ORCL> DESC T_TAB 名称 是否为空? 类型 ----------------------------------------------------- -------- ------------- TABLE_NAME VARCHAR2(30) TABLESPACE_NAME VARCHAR2(30) OBJECT_TYPE VARCHAR2(30) admin@ORCL> DESC T_IDX 名称 是否为空? 类型 ----------------------------------------------------- -------- ------------- TABLE_NAME VARCHAR2(30) TABLESPACE_NAME VARCHAR2(30) INDEX_NAME VARCHAR2(30) OBJECT_TYPE VARCHAR2(30) admin@ORCL> DESC T_OTHERS; 名称 是否为空? 类型 ----------------------------------------------------- -------- ------------- OBJECT_NAME VARCHAR2(30) OBJECT_TYPE VARCHAR2(30) --数据同时插入两个表 INSERT ALL INTO T_TAB(TABLE_NAME,TABLESPACE_NAME) VALUES(TABLE_NAME,TABLESPACE_NAME) INTO T_IDX(TABLE_NAME,TABLESPACE_NAME) VALUES(TABLE_NAME,TABLESPACE_NAME) SELECT TABLE_NAME,TABLESPACE_NAME FROM DBA_TABLES; SELECT COUNT(*) FROM T_TAB; COUNT(*) ---------- 1755 SELECT COUNT(*) FROM T_IDX; COUNT(*) ---------- 1755 --数据根据不同条件插入 INSERT ALL WHEN (OBJECT_TYPE = 'TABLE') THEN INTO T_TAB(TABLE_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) WHEN (OBJECT_TYPE = 'INDEX') THEN INTO T_IDX(INDEX_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) ELSE INTO T_OTHERS(OBJECT_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) SELECT OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS; SELECT COUNT(*) FROM DBA_OBJECTS; COUNT(*) --------- 50834 SELECT COUNT(*) FROM T_TAB; COUNT(*) --------- 1811 SELECT COUNT(*) FROM T_IDX; COUNT(*) ---------- 1955 SELECT COUNT(*) FROM T_OTHERS; COUNT(*) ---------- 47068 --ALL 与 FIRST 的区别 --ALL与判断所有的条件,而FRIST满足一个条件就会返回。 TRUNCATE TABLE T_TAB; TRUNCATE TABLE T_IDX; TRUNCATE TABLE T_OTHERS; INSERT ALL WHEN (OBJECT_TYPE = 'TABLE') THEN INTO T_TAB(TABLE_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) WHEN (OBJECT_TYPE = 'TABLE') THEN INTO T_IDX(INDEX_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) ELSE INTO T_OTHERS(OBJECT_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) SELECT OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS; SELECT COUNT(*) FROM T_TAB; COUNT(*) ---------- 1811 SELECT COUNT(*) FROM T_IDX; COUNT(*) ---------- 1811 ---修改为FIRST TRUNCATE TABLE T_TAB; TRUNCATE TABLE T_IDX; TRUNCATE TABLE T_OTHERS; INSERT FIRST WHEN (OBJECT_TYPE = 'TABLE') THEN INTO T_TAB(TABLE_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) WHEN (OBJECT_TYPE = 'TABLE') THEN INTO T_IDX(INDEX_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) ELSE INTO T_OTHERS(OBJECT_NAME,OBJECT_TYPE) VALUES(OBJECT_NAME,OBJECT_TYPE) SELECT OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS; SELECT COUNT(*) FROM T_TAB; COUNT(*) ---------- 1810 SELECT COUNT(*) FROM T_IDX; COUNT(*) ---------- 0
OCP 047 SQL例子1
猜你喜欢
转载自yangeoo.iteye.com/blog/1850734
今日推荐
周排行