4-1 数据的插入(INSERT 语句的使用方法)

SQL
Author

Rui

Published

November 15, 2022

一些未知的原因导致我不能使用 SQL 代码块创建表,但可以可以查询。所以我事先使用以下代码把示例数据在 PostgreSQL 中创建好,之后再通过 SQL 代码块查询。

4-1 数据的插入(INSERT 语句的使用方法)

INSERT 语句

-- 创建表
CREATE TABLE ProductIns
(product_id      CHAR(4)      NOT NULL,
  product_name    VARCHAR(100) NOT NULL,
  product_type    VARCHAR(20)  NOT NULL,
  sale_price      INTEGER      DEFAULT 0,
  purchase_price  INTEGER      ,
  regist_date     DATE         ,
PRIMARY KEY (product_id)); 

CREATE TABLE 创建的是一个空表格,如何往其中输入数据?

INSERT INTO <表名> (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);

插入一行数据:

INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
     VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
  • 列清单:(product_id, product_name, product_type, sale_price, purchase_price, regist_date)

  • 值清单:(‘0001’, ‘T恤衫’, ‘衣服’, 1000, 500, ‘2009-09-20’)

Note
  • 表名后的列清单和 VALUES 子句后的值清单的列数必须保持一致;

  • 原则上,执行一次 INSERT 语句只会插入一行数据。要插入多行数据时需要多次写 INSERT 语句。

列清单的省略

若对表进行全列的 INSERT 时,可以省略表名后的列清单。比如:

INSERT INTO ProductIns VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15')

多行 INSERT

前面讲过:原则上,执行一次 INSERT 语句只会插入一行数据。但实际上很多 RDBMS 支持多行 INSERT

-- 多行INSERT(Oracle以外)
INSERT INTO ProductIns 
VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11'),
       ('003', '运动T恤', '衣服', 4000, 2800, NULL),
       ('004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');

插入 NULL

要时刻对 NULL 保持警惕。一般来说将某个值赋值为 NULL 没有问题,但如果所在的列已经设置了 NOT NULL 约束,插入 NULL 就会报错。

插入默认值

设置默认值

之前在创建表 ProductIns 时设置列 sale_price INTEGER DEFAULT 0,就是设置了售价的默认值为 0。

显式插入默认值

在 VALUES 子句中使用 DEFAULT 关键字指定某一列的值为其对应的默认值。

INSERT INTO ProductIns 
VALUES ('0006', '叉子', '厨房用具', DEFAULT, 320, '2009-09-11');

隐式插入默认值

在列清单和值清单中将要使用默认值的列省略,比如以下省略了 sale_price 列:

INSERT INTO ProductIns (product_id, product_name, product_type, purchase_price, regist_date)
VALUES ('0007', '擦菜板', '厨房用具', 790, '2009-04-28');

从其他表中复制数据

使用 SELECT 子句

首先创建一张空表 ProductCopy,这个表中的的结构与表 Product 一样:

CREATE TABLE ProductIns
(product_id      CHAR(4)      NOT NULL,
  product_name    VARCHAR(100) NOT NULL,
  product_type    VARCHAR(20)  NOT NULL,
  sale_price      INTEGER      DEFAULT 0,
  purchase_price  INTEGER      ,
  regist_date     DATE         ,
PRIMARY KEY (product_id)); 

再将 Product 中的数据复制到空表 ProductCopy 中,具体方法是用 SELECT 和 FROM 子句替代 VALUES 子句:

INSERT INTO ProductCopy (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_date
  FROM Product;
Tip

可以使用 INSERT … SELECT 语句来为数据进行备份。

还可以添加其他子句

还可以向 INSERT … SELECT 语句中添加其他子句,比如 WHERE、GROUP BY 等。

创建一个用于存储商品种类的空的表:

CREATE TABLE ProductType
(product_type        VARCHAR(20)  NOT NULL,
 sum_sale_price      INTEGER      ,
 sum_purchase_price  INTEGER      ,
 PRIMARY KEY (product_type)); 

向其中复制数据:

INSERT INTO ProductType (product_type, sum_sale_price, sum_purchase_price)
SELECT product_type, SUM(sale_price), SUM(purchase_price)
  FROM Product
 GROUP BY product_type;
SELECT * FROM ProductType;
3 records
product_type sum_sale_price sum_purchase_price
衣服 5000 3300
办公用品 600 320
厨房用具 11180 8590