SQL DML增加数据

SQL 主要提供了两种增加数据的方法:

  1. INSERT INTO … VALUES … ;
  2. INSERT INTO … SELECT … ;

首先,第一种形式的语法如下:

INSERT INTO t(col1, col2, ...)
VALUES (value1, value2, ...);

其中,t 是表名;VALUES 子句中提供的值与 INSERT INTO 中的字段数量必须相同,并且数据类型能够兼容。

举例来说:

-- 只有 Oracle 需要执行以下 alter 语句
-- alter session set nls_date_format = 'YYYY-MM-DD';
INSERT INTO employee(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
VALUES ( 26, '张三', '男', 5, 18, '2019-12-25', 10, 6000, NULL, 'zhangsan@shuguo.com');

以上语句为员工表增加了一个员工。如果 VALUES 值列表与表中的字段顺序完全一致,可以省略字段列表;以上示例也可以简写成:

-- 只有 Oracle 需要执行以下 alter 语句
-- alter session set nls_date_format = 'YYYY-MM-DD';
INSERT INTO employee
VALUES ( 26, '张三', '男', 5, 18, '2019-12-25', 10, 6000, NULL, 'zhangsan@shuguo.com');

如果同时执行了上面的两个插入语句,第 2 次执行时将会产生主键冲突的错误。因为数据库在插入数据之前将会执行完整性检查,对于违反约束的数据提示错误,而不会生成新的数据。以下两个语句分别违反了外键约束和非空约束:

-- 违反外键约束,职位不存在
INSERT INTO employee(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
VALUES ( 27, '李四', '男', 5, 18, '2019-12-25', 0, 6000, NULL, 'lisi@shuguo.com');

-- 违反非空约束,姓名不能为空
INSERT INTO employee(emp_id)
VALUES ( 28 );

第二种插入数据的语法通过 SELECT 语句查询出一个结果集,然后将该结果集插入表中。我们先创建一个新表 emp_devp:

CREATE TABLE emp_devp
    ( emp_id    INTEGER NOT NULL PRIMARY KEY
    , emp_name  VARCHAR(50) NOT NULL
    , sex       VARCHAR(10) NOT NULL
    , dept_id   INTEGER NOT NULL
    , manager   INTEGER
    , hire_date DATE NOT NULL
    , job_id    INTEGER NOT NULL
    , salary    NUMERIC(8,2) NOT NULL
    , bonus     NUMERIC(8,2)
    , email     VARCHAR(100) NOT NULL
    ) ;

然后通过一个查询语句,将研发部的员工信息复制到 emp_devp 表中:

INSERT INTO emp_devp(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
SELECT *
  FROM employee
 WHERE dept_id = (SELECT dept_id FROM department WHERE dept_name = '研发部');

这种语法通常用于数据仓库中的 ETL(抽取、转换和加载)或者生成测试数据。

赞(1)
未经允许不得转载:极客笔记 » SQL DML增加数据
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址