关于数据操纵语言 (DML) 语句

数据操纵语言 (Data manipulation language,DML) 语句可访问和操作现有表中的数据。

在 SQL*Plus 环境中,可以在 SQL> 提示符后输入 DML 语句。

在 SQL Developer 环境中,可以在工作表中输入 DML 语句。或者,可以使用 SQL Developer Connections 框架和工具访问和操作数据。

要在 SQL Developer 中查看 DML 语句的效果,您可能需要在“Connections(连接)”框架中选择已更改对象的方案对象类型,然后单击“Refresh(刷新)”图标。

除非提交包含 DML 语句的事务处理,否则其效果不是永久性的。事务处理是 Oracle Database 将其视为一个单元的一系列 SQL 语句(可以是单个 DML 语句)。只有在提交事务处理之后,才能回退 (撤消) 该事物处理。有关事务处理的详细信息,请参阅“关于事务处理控制语句”。

另请参阅: Oracle Database SQL Language Reference 以了解有关 DML 语句的更多信息

关于 INSERT 语句

INSERT 语句可将行插入现有表。

建议使用的最简单的 INSERT 语句形式采用下列语法:

INSERT INTO table_name (list_of_columns)
VALUES (list_of_values);

list_of_columns 中的每一列必须在 list_of_values 中的相应位置具有有效值。因此,在向表插入行之前,您必须了解表所包含的列及其具体有效值。要使用 SQL Developer 获取此信息,请参见教程:使用 SQL Developer 查看 EMPLOYEES 表属性和数据。要使用 SQL*Plus 获取此信息,请使用 DESCRIBE 语句。例如:

DESCRIBE EMPLOYEES;

结果:

Name                                      Null?    Type
----------------------------------------- -------- ------------

EMPLOYEE_ID                               NOT NULL NUMBER(6)
FIRST_NAME                                         VARCHAR2(20)
LAST_NAME                                 NOT NULL VARCHAR2(25)
EMAIL                                     NOT NULL VARCHAR2(25)
PHONE_NUMBER                                       VARCHAR2(20)
HIRE_DATE                                 NOT NULL DATE
JOB_ID                                    NOT NULL VARCHAR2(10)
SALARY                                             NUMBER(8,2)
COMMISSION_PCT                                     NUMBER(2,2)
MANAGER_ID                                         NUMBER(6)
DEPARTMENT_ID                                      NUMBER(4)

示例 3-1 中的 INSERT 语句会向 EMPLOYEES 表插入一行,该表所对应的员工的所有列值都是已知的。

您无需知道所有列值也可将行插入表中,但必须知道所有 NOT NULL 列的值。如果您不了解可以为 NULL 的列的值,可以从 list_of_columns 中省略该列。其值默认为 NULL。

示例 3-2 中的 INSERT 语句会向 EMPLOYEES 表插入一行,该表所对应的员工除 SALARY 以外的所有列值都是已知的。目前,SALARY 可以具有值 NULL。如果您了解薪资,可以使用 UPDATE 语句更改该值(请参阅示例 3-4 )。

示例 3-3 中的 INSERT 语句尝试向 EMPLOYEES 表插入一行,该表所对应的 LAST_NAME 是未知的员工。

示例 3-1 在所有信息都可用的情况下使用 INSERT 语句

INSERT INTO EMPLOYEES (
  EMPLOYEE_ID,
  FIRST_NAME,
  LAST_NAME,
  EMAIL,
  PHONE_NUMBER,
  HIRE_DATE,
  JOB_ID,
  SALARY,
  COMMISSION_PCT,
  MANAGER_ID,
  DEPARTMENT_ID
)
VALUES (
  10,              -- EMPLOYEE_ID
  'George',        -- FIRST_NAME
  'Gordon',        -- LAST_NAME
  'GGORDON',       -- EMAIL
  '650.506.2222',  -- PHONE_NUMBER
  '01-JAN-07',     -- HIRE_DATE
  'SA_REP',        -- JOB_ID
  9000,            -- SALARY
  .1,              -- COMMISSION_PCT
  148,             -- MANAGER_ID
  80               -- DEPARTMENT_ID
);

结果:

1 row created.

示例 3-2 在所有信息都可用时使用 INSERT 语句

INSERT INTO EMPLOYEES (
  EMPLOYEE_ID,
  FIRST_NAME,
  LAST_NAME,
  EMAIL,
  PHONE_NUMBER,
  HIRE_DATE,
  JOB_ID,          -- Omit SALARY; its value defaults to NULL.
  COMMISSION_PCT,
  MANAGER_ID,
  DEPARTMENT_ID
)
VALUES (
  20,              -- EMPLOYEE_ID
  'John',          -- FIRST_NAME
  'Keats',         -- LAST_NAME
  'JKEATS',        -- EMAIL
  '650.506.3333',  -- PHONE_NUMBER
  '01-JAN-07',     -- HIRE_DATE
  'SA_REP',        -- JOB_ID
  .1,              -- COMMISSION_PCT
  148,             -- MANAGER_ID
  80               -- DEPARTMENT_ID
);

结果:

1 row created.

示例 3-3:错误地使用 INSERT 语句

INSERT INTO EMPLOYEES (
  EMPLOYEE_ID,
  FIRST_NAME,      -- Omit LAST_NAME (error)
  EMAIL,
  PHONE_NUMBER,
  HIRE_DATE,
  JOB_ID,
  COMMISSION_PCT,
  MANAGER_ID,
  DEPARTMENT_ID
)
VALUES (
  20,              -- EMPLOYEE_ID
  'John',          -- FIRST_NAME
  'JOHN',          -- EMAIL
  '650.506.3333',  -- PHONE_NUMBER
  '01-JAN-07',     -- HIRE_DATE
  'SA_REP',        -- JOB_ID
  .1,              -- COMMISSION_PCT
  148,             -- MANAGER_ID
  80               -- DEPARTMENT_ID
);

结果:

ORA-01400: cannot insert NULL into ("HR"."EMPLOYEES"."LAST_NAME")

另请参见:

关于 UPDATE 语句

UPDATE 语句可更新一组现有表行(或更改其值)。

简单形式的 UPDATE 语句采用以下语法:

UPDATE table_name
SET column_name = value [, column_name = value]...
[ WHERE condition ];

每个值都必须对其 column_name 有效。如果包含 WHERE 子句,则此语句只会更新满足条件的行中的列值。

示例 3-4 中的 UPDATE 语句会更新插入示例 3-2 的 EMPLOYEES 表中的行中的 SALARY 列的值,然后才知道员工的薪金。

示例 3-5 中的 UPDATE 语句更新部门 80 中每个员工的佣金百分比。

示例 3-4 使用 UPDATE 语句添加数据

UPDATE EMPLOYEES
SET SALARY = 8500
WHERE LAST_NAME = 'Keats';

结果:

1 row updated.

示例 3-5:使用 UPDATE 语句更新多个行

UPDATE EMPLOYEES
SET COMMISSION_PCT = COMMISSION_PCT + 0.05
WHERE DEPARTMENT_ID = 80;

结果:

34 rows updated.

另请参见:

关于 DELETE 语句

DELETE 语句可删除表中的行。

DELETE 语句的简单形式采用以下语法:

DELETE FROM table_name [ WHERE condition ];

如果包含 WHERE 子句,则此语句只会删除满足条件的行。如果省略 WHERE 子句,则此语句会删除表中的所有行,但空表仍存在。要删除表,请使用 DROP TABLE 语句。

Example 3-6 中的 DELETE 语句将删除在 Example 3-1Example 3-2 中插入的行。

示例 3-6 使用 DELETE 语句

DELETE FROM EMPLOYEES
WHERE HIRE_DATE = TO_DATE('01-JAN-07', 'dd-mon-yy');

结果:

2 rows deleted.

另请参见: