SELECT: INTO¶
说明¶
根据查询结果创建表
参数¶
[ LOCAL | GLOBAL ] { TEMPORARY | TEMP }
指定创建一个临时表,使用SELECT:INTO创建临时表是不支持指定ON COMMIT选项,只能创建默认临时表,即事务级临时表。
new_table
要创建的表的名称。
注解
INTO子句首先进行建表操作,然后将SELECT语句的执行结果插入到该表中。SELECT INTO语句与CREATE AS语句的作用是相同的。
可以使用TEMPORARY或TEMP关键字指定创建一个临时表,该表只对当前连接有效,在连接退出时就会被自动删除。
可以使用GLOBAL TEMPORARY创建全局临时表,不支持ON COMMIT选项,只能创建会话级临时表,不支持创建事务级临时表。临时表的定义对所有有权限的会话可见,各个会话临时表中的数据是相互隔离的。临时表需要记录日志,以支持事务级临时表的回滚等操作。事务级临时表的数据在事务提交或回滚时会被截断,会话级临时表的数据在会话结束时会被截断。临时表不会自动删除,只能在没有其他会话绑定时使用 DROP TABLE 语句显示删除。
若通过SELECT INTO语句创建的表不是本地临时表,则不能与现有的非本地临时表重名;若创建的表是本地临时表,则可以与现有的非本地临时表重名,但不能与现有的本地临时表重名。
示例¶
示例1: 使用 SELECT INTO 创建表
-- 清理环境
DROP TABLE tab1 CASCADE;
DROP TABLE tab2 CASCADE;
-- 创建表并插入数据
CREATE TABLE tab1 (a INT, b INT, c INT);
INSERT INTO tab1 VALUES(1, 10, 900);
INSERT INTO tab1 VALUES(2, 20, 500);
INSERT INTO tab1 VALUES(2, NULL, 200);
INSERT INTO tab1 VALUES(3, 30, 1000);
SELECT * FROM tab1 ORDER BY a, b, c;
A(int) |B(int) |C(int) |
------------------------------------
1 |10 |900 |
------------------------------------
2 |20 |500 |
------------------------------------
2 |null |200 |
------------------------------------
3 |30 |1000 |
总数目:4
-- 使用 SELECT INTO 创建表
SELECT * INTO tab2 FROM tab1 WHERE a != 2;
SELECT * FROM tab2 ORDER BY a, b, c;
A(int) |B(int) |C(int) |
------------------------------------
1 |10 |900 |
------------------------------------
3 |30 |1000 |
总数目:2
-- 删除表
DROP TABLE tab2;
DROP TABLE tab1;