数据操纵语言( DML )是SQL的核心部分。当你想要增加,更新或者删除数据库中的数据的时候,你可以通过执行DML语句来实现。一组DML语句的集合组成了一个逻辑工作单元称为事务。
想想银行业的数据库,当银行顾客将金钱从一个储蓄账户转移到一个核算帐户,该事务可能由三个独立的操作组成:减少储蓄帐户的金额,增加核算帐户的金额,在事务日志中记录该事务。Oracle服务器必须保证所有的这些SQL语句执行后帐户间数目的平衡。当某些事情阻止了事务中一个语句的执行,那么事务中其他语句必须被撤销。
DML的分类
- 增 insert into
- 删 delete from (对比truncate)
- 改 update
- 合并行 merge
- 控制事务处理
insert
使用 INSERT 语句可在表中添加新行:
INSERT INTO table [(column [, column...])] |
update
使用 UPDATE 语句修改表中的现有值:
UPDATE table |
如果需要,可以一次更新多行。
delete
使用 DELETE 语句可以从表中删除现有行:
DELETE [FROM] table |
truncate
TRUNCATE 语句
- 从表中删除所有行,使表为空并保留表结构不变
- 是数据定义语言 (DDL) 语句而不是 DML 语句,无法轻易将其取消
- 语法:
TRUNCATE TABLE table_name;
事务
- commit 提交
- rollback 回滚到事务开始之前
- savepoint A 保存状态
- rollback to savepoint A 回滚到状态A
操作实践
1. 向emp表中添加新行:
对所有列赋值
desc emp |
对指定的列赋值insert into emp (empno,ename) values (2,'Jerry');
sql脚本inst.sql
insert into dept values (&deptno,upper('&dname'),upper('&loc')); |
2. 子查询拷贝行
emp表中有奖金的员工存放在新创建的表bonus中 |
3. 修改表中数据
smith工资涨百分之10 |
4. 向虚拟表中插入行
insert into (select empno,ename,deptno from emp where deptno=10) |
5. with check option 选项
设置with check option选项 |
如果设置了该选项,那么插入的新记录,必须和where后面的匹配,比如案例中,where指定了部门为10,那么插入的也必须为10部门的记录。
6. merge合并行
- 数据源:emp
- 目标表:copy_emp
create table copy_emp as select * from emp where deptno=10; |
- matched—> 目标表中的主键值在数据源中被找到
- not matched —> 数据源中主键在目标表中不存在
merge into copy_emp c |
操作记录
SQL> create table copy_emp as select * from emp where deptno=10; |
源表进行了修改SQL> insert into emp (empno,ename,sal) values (1,'Alvin',1400);
1 row created.
SQL> update emp set sal=1111 where empno=7788;
1 row updated.
目标表与源表不一致了SQL> select * from copy_emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
900 booboo dba 7782 31-JUL-17 7000 8000 10
901 booboo2 dba 7782 31-JUL-17 7000 8000 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7369 SMITH CLERK 7902 17-DEC-80 800 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
16 rows selected.
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
900 booboo dba 7782 31-JUL-17 7000 8000 10
901 booboo2 dba 7782 31-JUL-17 7000 8000 10
1 Alvin 1400
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 1111 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
17 rows selected.
再次合并
merge into copy_emp c |
合并后与源表一致
SQL> select * from copy_emp; |
这是数据仓库的一些用法
修改目标表后再此合并
SQL> update copy_emp set sal=1499 where empno=1; |