数据操纵语句(DML)是在数据库上添加、更新,删除、合并数据时使用的,主要包括 INSERT 语句、UPDATE 语句和 DELETE 语句三个大类,今天我们先来学习一下 INSERT 语句
INSERT 语句用于向已有表中插入新数据。具体来说在新插入的行中,要指明表中全部的列或指定的若干列的数据。所以预先了解目标表的数据结构非常重要
DESC 指令
SQL> DESC EMP
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4)
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y
HIREDATE DATE Y
SAL NUMBER(7,2) Y
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2) Y
复制
上述表结构信息中除了列备注外的关键信息都可在 Oracle 数据字典 USER_TAB_COLUMNS(或 ALL_TAB_COLUMNS 或 DBA_TAB_COLUMNS)视图中检索到。数据字典包含 Oracle 数据库中大量的记录数据库对象信息的视图,它们都非常有用,我们将在课程中合适的时候不断接触到
SQL> SELECT c.column_name
2 ,c.data_type
3 ,CASE
4 WHEN c.data_type IN ('VARCHAR2', 'CHAR', 'DATE') THEN
5 c.data_length
6 ELSE
7 c.data_precision
8 END data_length
9 ,c.data_scale
10 ,c.nullable
11 ,c.data_default
12 FROM user_tab_columns c
13 WHERE c.table_name = 'EMP'
14 ORDER BY c.column_id;
COLUMN_NAM DATA_TYPE DATA_LENGTH DATA_SCALE NULLABLE DATA_DEFAULT
---------- ---------- ----------- ---------- -------- ---------------
EMPNO NUMBER 4 0 N
ENAME VARCHAR2 10 Y
JOB VARCHAR2 9 Y
MGR NUMBER 4 0 Y
HIREDATE DATE 7 Y
SAL NUMBER 7 2 Y
COMM NUMBER 7 2 Y
DEPTNO NUMBER 2 0 Y
8 rows selected
复制
单行插入
VALUES(value1, value2...);
INSERT INTO emp
(empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES
('6666', 'YUSUF', 'ANALYST', '7782', '25-7月-21', 3000, NULL, '10');
复制
插入后结果,查询表 EMP 内容

这里需要留意的几点规则有:
VALUES 部分中的列值要和前面指定的列名位置上一一对应。表名后的字段列表是可以省略的,这时表示语句涵盖表中所有的列,后面的 VALUES 部分也应按照全表字段的顺序一一列出值来。请注意,省略列名列表的写法是极不推荐的
VALUES 部分中的列值要和前面指定的列名数据类型一一对应。字符串内容应当以单引号括起来;至于日期类型的值,要么以数据库设置的默认日期时间格式的字符串表示,要么使用 TO_DATE 函数得到
SQL> SELECT *
2 FROM v$nls_parameters
3 WHERE parameter IN
4 ('NLS_DATE_FORMAT', 'NLS_DATE_LANGUAGE', 'NLS_TIME_FORMAT');
PARAMETER VALUE
-------------------- --------------------
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_TIME_FORMAT HH.MI.SSXFF AM
复制
如上查询中我们看到当前数据库默认的日期格式为“DD-MON-RR”,所以在前面的示例语句中,插入 HIREDATE 列的值写作'25-7月-21',这种情况下数据库能够将这个字符串隐默地转换成为日期数据
引用插入
SELECT expr1, expr2...
FEOM table_b
[<more SELECT staement components>]
INSERT INTO emp
(empno, ename, job, mgr, hiredate, sal, deptno)
SELECT empno, ename, job, mgr, hiredate, sal, deptno FROM emp_temp;
复制
插入后结果,查询表 EMP


插入空值
显式插入空值:指在 VALUES 部分中,对应要插入空值的列位置处,明示 NULL 值。例如前文例 1 中,就明示了要将 NULL 值插入到 COMM 列
隐式插入空值:指在列名列表中故意不提及某些列,以暗示数据库将 NULL 值插入它们。例如前文例 2 中,列名列表中没有 COMM 列,这表示想要将 NULL 值插入其中(更准确的讲,是语句不指示将什么数据插入 COMM 列中)
事务
