INSERT SELECT 语句
INSERT VALUE 语句在向表中插入几个数据的时候非常有用但显然这是不够的如
果你想向表中插入25,000 行数据时怎么办在这种情况下INSERT SELECT 语句就非常有
效它允许程序员拷贝一个或一组表的信息到另外一个表中你可以在下边这几种情况下
使用该语句需要查询的表经常产生利润的增加需要查询的表可以从多个数据库或表中
获得外部数据由于多个表的查询要比单一表的查询速度慢得多因此对单个表的查询速
度要远远高于复杂而缓慢的多个表查询在服务器/客户机系统上需要查询的表的数据经常
存储在客户机上以减少网络中的数据传输速度
见下例
INPUT
SQL> insert into tmp_tbl
2 select * from table;
OUTPUT
19,999 rows inserted.
分析
你可以将所有的数据都插入到一个临时表中
注并不是所有的数据库管理系统都支持临时表请检查你的数据库系统的文档看看它
是否支持临时表在第14 天中你将会知道对于它的更详细的内容
INSERT SELECT 语句的语法格式如下
SQL 21 日自学通(V1.0) 翻译人笨猪
164
语法
INSERT INTO table_name (col1, col2...)
SELECT col1, col2... FROM tablename WHERE search_condition
本质上来说它是将一个SELECT 语句的输出结果在输入到另一个表格中去在INSERT
VALUE 中的规则也适用于INSERT SELECT 语句如果想把表COLLECTION 中的内容复
制到另一个叫INVENTORY 的表中去你可以使用例8.3 中的语句
例8.3
本例将创建一个叫INVENTORY 的表
INPUT
SQL> CREATE TABLE INVENTORY
2 (ITEM CHAR(20),
3 COST NUMBER,
4 ROOM CHAR(20),
5 REMARKS CHAR(40));
OUTPUT
Table created.
下边的语句将向表中插入COLLECTION 表中的数据
INPUT/OUTPUT
SQL> INSERT INTO INVENTORY (ITEM, COST, REMARKS)
2 SELECT ITEM, WORTH, REMARKS
3 FROM COLLECTION;
6 rows created.
你可以使用SELECT 语句来检验INSERT 的结果
INPUT/OUTPUT
SQL> SELECT * FROM INVENTORY;
ITEM COSTROOM REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
MALIBU BARBIE 150 TAN NEEDS WORK
STAR WARS GLASS 5.5 HANDLE CHIPPED
LOCK OF SPOUSES HAIR 1 HASN'T NOTICED BALD SPOT YET
SUPERMANS CAPE 250 TUGGED ON IT
SQL 21 日自学通(V1.0) 翻译人笨猪
165
ITEM COSTROOM REMARKS
STRING 1000 SOME DAY IT WILL BE VALUABLE
注数据已经出现在表中了可是在你使用COMMIT 语句之前它并不会真正生效事务
处理工作可以由COMMIT 确认或只是简单地放弃关于COMMIT 的详细内容可见第
11 天
分析
你已经成功了虽然有些费力但是你已经将COLLECTION 中的数据复制到了
INVERTORY 表中
INSERT SELECT 语句要求你遵循如下规则
l SELECT 语句不能从被插入数据的表中选择行
l INSERT INTO 中的列数必须与SELECT 语句返回的列数相等
l INSERT INTO 中的数据类型要与SELECT 语句返回的数据类型相同
INSERT SELECT 语句的另外一个用处是当你需要对表进行重新定义时对表进行备份
这时需要你通过选择原始表中的所有数据并将其插入到一个临时表中来完成例如
SQL> insert into copy_table
2 select * from original_table;
然后你就可以放心地对原始表进行变更了
注在今天的晚些时候你将会学习如何向一个表中导入其它数据库中的数据几乎每一种
商用的数据库都有它们自己的数据存储格式编程人员经常需要对其进行格式转换
你将学习有关这方法的通用方法