什么是INSERT
INSERT(插入)的流程
INSERT语句的基本语法
INSERT 语句的基本语法如下所示。
例如,我们要向 ProductIns 表中插入一行数据,各列的值如下所示。
向表中插入一行数据如下
由于 product_id 列(商品编号)和 product_name 列(商品 名称)是字符型,所以插入的数据需要像 '0001' 这样用单引号括起来。 日期型的 regist_date(登记日期)列也是如此。
将列名和值用逗号隔开,分别括在()内,这种形式称为清单。上面代码清单中的 INSERT 语句包含如下两个清单。
A 列清单→ (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
B 值清单→ ('0001', 'T恤衫', '衣服', 1000, 500,'2009-09-20')
当然,表名后面的列清单和 VALUES 子句中的值清单的列数必须保 持一致。如下所示,列数不一致时会出错,无法插入数据。
此外,原则上,执行一次 INSERT 语句会插入一行数据 C。因此, 插入多行时,通常需要循环执行相应次数的 INSERT 语句。
但它也仅仅是原则而已,其实很多 RDBMS 都支持一 次插入多行数据,这样的功能称为多行 INSERT(multi row INSERT)。
该语法很容易理解,并且减少了书写语句的数量,非常方便。但是要确定INSERT 语句的书写内容及插入的数据是否正确。若不正确会发生 INSERT 错误,但是由于是多行插入,和特定的单一行插入相比,想要找出到底是 哪行哪个地方出错了,就变得十分困难。
列清单的省略
对表进行全列 INSERT 时,可以省略表名后的列清单。这时 VALUES 子句的值会默认按照从左到右的顺序赋给每一列。因此,下列代码清单中的两个 INSERT 语句会插入同样的数据。
插入NULL
INSERT 语句中想给某一列赋予 NULL 值时,可以直接在 VALUES 子句的值清单中写入 NULL。例如,要向 purchase_price 列(进货 单价)中插入 NULL,就可以使用下列代码清单中的 INSERT 语句。
但是,想要插入 NULL 的列一定不能设置 NOT NULL 约束。向设置 了 NOT NULL 约束的列中插入 NULL 时,INSERT 语句会出错,导致 数据插入失败。
插入失败指的是希望通过 INSERT 语句插入的数据无法正常插入到表中,但之前已经插入的数据并不会被破坏。
插入默认值
我们还可以向表中插入默认值(初始值)。可以通过在创建表的 CREATE TABLE 语句中设置 DEFAULT 约束来设定默认值。
开头创建的 ProductIns 表的定义部分。 其中 DEFAULT 0 就是设置 DEFAULT 约束的部分。像这样,我们可以 通过“DEFAULT < 默认值 >”的形式来设定默认值。
通过显式方法设定默认值
这样一来,RDBMS 就会在插入记录时自动把默认值赋给对应的列。
省略INSERT语句中的列名,就会自动设定为该列的默认值(没有默认值时会设定 为NULL)。
从其他表中复制数据
要插入数据,除了使用 VALUES 子句指定具体的数据之外,还可以 从其他表中复制数据。
INSERT ... SELECT语句
接下来我们尝试一下使用包含 GROUP BY 子句的 SELECT 语句进 行插入。
创建ProductType表的CREATE TABLE语句
该表是用来存储根据商品种类(product_type)计算出的销售单 价合计值以及进货单价合计值的表。下面就让我们使用代码清单 4-12 中 的 INSERT … SELECT 语句,从 Product 表中选取出数据插入到这张 表中吧。
插入其他表中数据合计值的INSERT ... SELECT语句
通过 SELECT 语句对插入结果进行确认,我们发现 ProductType 表 中插入了以下 3 行数据。
INSERT语句的SELECT语句中,可以使用WHERE子句或者GROUP BY子句等任 何 SQL语法(但使用ORDER BY子句并不会产生任何效果)。
表的复制
语法:
create table 表名 as select语句;
将查询结果当做表创建出来。