15.1数据插入
插入可以用几种方式使用:
(1)插入完整的行
(2)插入行的一部分
(3)插入某些查询的结果
15.1.1插入完整的行
INSERT INTO CustomersVALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
对每个列必须提供一个值,如果某个列没有值,应该用NULL值。
保证INSERT语句的更安全
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按各个列出现在实际表中的次序。其优点是,即使表的结构改变,此INSERT语句仍然能正确工作。
总是使用列的列表:一般不要使用没有明确给出列的列表的INSERT语句。使用列的列表能使SQL代码继续发挥作用,即使表结构发生了变化。
15.1.2插入部分行
使用INSERT的推荐方法是明确给出表的列名。使用这种语法,还可以省略列。
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA');
省略列:如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件:
(1)该列定义为允许NULL值。
(2)在表定义中给出默认值。这表示如果不给出值,将使用默认值。
15.1.3插入检索出的数据
INSERT可以利用它将一条SELECT语句的结果插入表中。这就是所谓的INSERT SELECT。
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)SELECT cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_countryFROM CustNew;
不一定要求列名相同。
INSERT SELECT 中SELECT语句可包含WHERE子句过滤插入的数据。
插入多行:INSERT通常只插入一行。为了插入多行,必须执行多个INSERT语句。INSERT SELECT是个例外,它可以用单条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。
15.2从一个表复制到另一个表
为了将一个表复制到另一个表(在运行中创建的表)。可使用SELECT INTO语句。
INSERT SELECT和SELECTINTO:他们之间的一个重要差别是前者导出数据,而后者导入表。
SELECT *INTO CustCopyFROM Customers;
MySQL和Oracle使用的语法稍有不同
CREATE TABLE CustCopy ASSELECT *FROM Customers;
在使用SELECT INTO时,需要注意:
(1)任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY。
(2)可利用联结从多个表插入数据。
(3)不管从多少个表中检索数据,数据都只能插入到单个表中。