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