SELECT: INTO

说明

根据查询结果创建表

语法

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;