DML 可以在下列条件下执行:
Ø 向表中插入数据
Ø 修改现存数据
Ø 删除现存数据
事务是由完成若干项工作的DML 语句组成的。
1-1 insert语句
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
使用这种语法一次只能向表中插入一条数据。
1-1-1 插入数据
为每一列添加一个新值。
按列的默认顺序列出各个列的值。
在 INSERT 子句中随意列出列名和他们的值。
字符和日期型数据应包含在单引号中。
INSERT INTO departments(department_id, department_name, manager_id, location_id) VALUES (70, 'Public Relations', 100, 1700);
指定插入的值
SYSDATE 记录当前系统的日期和时间
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100);
1-1-2 从其它表中拷贝数据
INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE job_id LIKE '%REP%';
1-1-3 在 DML 语句中使用 WITH CHECK OPTION 关键字
INSERT INTO (SELECT employee_id, last_name, email,
hire_date, job_id, salary
FROM employees
WHERE department_id = 50 WITH CHECK OPTION)
VALUES (99998, 'Smith', 'JSMITH',
TO_DATE('07-JUN-99', 'DD-MON-RR'),
'ST_CLERK', 5000);
1-1-4 合并语句
按照指定的条件执行插入或更新操作
如果满足条件的行存在,执行更新操作;否则执行插入操作:
避免多次重复执行插入和删除操作
提高效率而且使用方便
可以使用 merge 语句,根据指定的条件进行插入或更新操作
MERGE INTO table_name table_alias USING (table|view|sub_query) alias ON (join condition) WHEN MATCHED THEN UPDATE SET col1 = col_val1, col2 = col2_val WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);
在对表COPY_EMP 使用merge 语句,根据指定的条件从表EMPLOYEES 中插入或更新数据
MERGE INTO copy_emp c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET c.first_name = e.first_name, c.last_name = e.last_name, ... c.department_id = e.department_id WHEN NOT MATCHED THEN INSERT VALUES(e.employee_id, e.first_name, e.last_name, e.email, e.phone_number, e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.department_id);
1-2 UPDATE 语句
使用 UPDATE 语句更新数据,可以一次更新多条数据
UPDATE table SET column = value [, column = value, ...] [WHERE condition];
1-2-1 更新语句
使用 WHERE 子句指定需要更新的数据
UPDATE copy_emp SET department_id = 110 where employee_id = 50
1-2-2 在 UPDATE 语句中使用子查询
更新 114 号员工的工作和工资使其与 205 号员工相同
UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205), salary = (SELECT salary FROM employees WHERE employee_id = 205) WHERE employee_id = 114;
1-3 delete语句
使用 DELETE 语句从表中删除数据
DELETE [FROM] table [WHERE condition];
1-3-1 删除数据
使用WHERE 子句指定删除的记录
DELETE FROM departments WHERE department_name = 'Finance';
如果省略 WHERE 子句,则表中的全部数据将被删除
1-3-2 在 DELETE 中使用子查询
在 DELETE 中使用子查询,使删除基于另一个表中的数据。
DELETE FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE '%Public%');
1-4 数据库事务
数据库事务由以下的部分组成
Ø 一个或多个DML 语句
Ø 一个 DDL 语句
Ø 一个 DCL 语句
数据库事务起至标志
以第一个 DML 语句的执行作为开始
以下面的其中之一作为结束:
Ø COMMIT 或 ROLLBACK 语句
Ø DDL 或 DCL 语句(自动提交)
Ø 用户会话正常结束
Ø 系统异常终止
1-4-1 COMMIT 和 ROLLBACK 语句
使用 COMMIT 和 ROLLBACK 语句 , 我们可以 :
Ø 确保数据完整性。
Ø 数据改变被提交之前预览。
Ø 将逻辑上相关的操作分组。
UPDATE... SAVEPOINT update_done; Savepoint created. INSERT... ROLLBACK TO update_done; Rollback complete.
1-4-2 事务进程
自动提交在以下情况中执行:
Ø DDL 语句。
Ø DCL 语句。
Ø 不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。
会话异常结束或系统异常会导致自动回滚。
提交或回滚前的数据状态
Ø 改变前的数据状态是可以恢复的
Ø 执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
Ø 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
Ø DML 语句所涉及到的行被锁定, 其他用户不能操作
提交后的数据状态
Ø 数据的改变已经被保存到数据库中。
Ø 改变前的数据已经丢失。
Ø 所有用户可以看到结果。
Ø 锁被释放, 其他用户可以操作涉及到的数据。
Ø 所有保存点被释放。
使用 ROLLBACK 语句可使数据变化失效:
Ø 数据改变被取消。
Ø 修改前的数据状态可以被恢复。
Ø 锁被释放。
DELETE FROM copy_emp; 22 rows deleted. ROLLBACK; Rollback complete.