1、八八.操作数据操作数据-DML语句语句目标目标l结束本节课后,应当达到如下目标结束本节课后,应当达到如下目标:l描述每个描述每个DML语句语句l向一个表中插入数据向一个表中插入数据l更新一个表中数据行更新一个表中数据行l从一个表中删除行从一个表中删除行l控制事务控制事务数据操作语言数据操作语言lDML语句在下列情况下发生语句在下列情况下发生:l往一个表中增加新行往一个表中增加新行l更改一个表中现有的行更改一个表中现有的行l从一个表中删除掉现有的行从一个表中删除掉现有的行l一个事务由一组构成一个逻辑操作的一个事务由一组构成一个逻辑操作的DML语句语句组成组成 DEPTNO DNAME LOC -
2、10 ACCOUNTING NEW YORK 20 RESEARCHDALLAS 30 SALESCHICAGO 40 OPERATIONS BOSTON 50DEVELOPMENTDETROIT DEPTNO DNAME LOC -10 ACCOUNTING NEW YORK 20 RESEARCHDALLAS 30 SALESCHICAGO 40 OPERATIONS BOSTON 50DEVELOPMENTDETROIT向一个表中增加新行向一个表中增加新行INSERT INTOtable(column,column.)VALUES(value,value.);INSERT语句语句l使用使
3、用 INSERT 语句向表中增加新行语句向表中增加新行.l使用这种方法只能一次插入一行数据使用这种方法只能一次插入一行数据.SQL INSERT INTOdept(deptno,dname,loc)2 VALUES(50,DEVELOPMENT,DETROIT);插入新行插入新行l插入包含每一个列值的新行插入包含每一个列值的新行.l按缺省顺序列出表中所有的列值按缺省顺序列出表中所有的列值.l列出列出 INSERT 子句中所有的列,这是可选的子句中所有的列,这是可选的.l日期值和字符值要用单引号括起来日期值和字符值要用单引号括起来.SQL INSERT INTOdept(deptno,dname
4、)2 VALUES(60,MIS);SQL INSERT INTOdept 2 VALUES(70,FINANCE,NULL);插入带有空值的行插入带有空值的行省略的方法省略的方法:从列的链表忽略有空值的列从列的链表忽略有空值的列明确的方法明确的方法:指定指定 NULL 关键字关键字SQL INSERT INTOemp(empno,ename,job,2mgr,hiredate,sal,comm,3deptno)4 VALUES(7196,GREEN,SALESMAN,57782,SYSDATE,2000,NULL,610);插入特殊的值插入特殊的值 SYSDATE函数取出当前的日期的时间函数
5、取出当前的日期的时间.SQL INSERT INTO emp 2 VALUES (2296,AROMANO,SALESMAN,7782,3 TO_DATE(03-2月月 1997,DD-MON,YYYY),4 1300,NULL,10);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO-2296 AROMANO SALESMAN 7782 03-2月月-97 1300 10插入特殊的日期值插入特殊的日期值增加一个新的员工增加一个新的员工检验结果检验结果.SQL INSERT INTO managers(id,name,salary,hiredate)2
6、SELECT empno,ename,sal,hiredate 3 FROM emp 4 WHEREjob=MANAGER;从另一个表中拷贝行从另一个表中拷贝行l创建带有子查询的创建带有子查询的 INSERT语句。语句。l不要使用不要使用 VALUES 子句子句.l子查询中的列要与子查询中的列要与INSERT子句中的列相匹配子句中的列相匹配.l通过使用通过使用SQL*Plus的替代参数创建交互脚本的替代参数创建交互脚本SQL INSERT INTOdept(deptno,dname,loc)2 VALUES (&department_id,3&department_name,&location
7、);Enter value for department_id:Enter value for department_name:Enter value for location:1 row created.替代变量插入值替代变量插入值INSERT INTO (SELECT employee_id,last_name,email,hire_date,job_id,salary,department_id FROM employees WHERE department_id=50)VALUES(99999,Taylor,DTAYLOR,TO_DATE(07-7月-99,DD-MON-RR),ST_
8、CLERK,5000,50);1 row created.在在INSERTINSERT语句中使用子查询语句中使用子查询 EMPNO ENAME JOB.DEPTNO 7839 KINGPRESIDENT 10 7698 BLAKEMANAGER 30 7782 CLARKMANAGER 10 7566 JONESMANAGER 20 .20 EMPNO ENAME JOB.DEPTNO 7839 KINGPRESIDENT 10 7698 BLAKEMANAGER 30 7782 CLARKMANAGER 10 7566 JONESMANAGER 20 .改变一个表中的数据改变一个表中的数据U
9、PDATEtableSETcolumn=value,column=value,.WHERE condition;UPDATE 语句语句l使用使用 UPDATE 语句更改现有的行语句更改现有的行.l如果需要,可以一次更改多行如果需要,可以一次更改多行.SQL UPDATE emp 2 SET deptno=20 3 WHERE empno=7782;SQL UPDATE employee 2 SET deptno=20;更改表中的行更改表中的行l使用使用 WHERE 子句来指定要修改的行子句来指定要修改的行.l如果忽略如果忽略WHERE子句,那么句子中所有的值都子句,那么句子中所有的值都将被更改
10、将被更改.SQL UPDATE emp 2 SET (job,deptno)=3 (SELECT job,deptno 4 FROM emp 5 WHERE empno=7499)6 WHERE empno=7698;用多列子查询进行修改用多列子查询进行修改l 更改更改7698号雇员的工作和部门,与第号雇员的工作和部门,与第 7499号雇员号雇员进行匹配进行匹配.SQL UPDATEemployee 2SETdeptno=(SELECTdeptno 3FROMemp 4WHEREempno=7788)5WHEREjob =(SELECTjob 6FROMemp 7WHEREempno=7788
11、);使用子查询更新两列使用子查询更新两列l 在在 UPDATE语句中,使用子查询来进行更改,更改语句中,使用子查询来进行更改,更改的数据与其它表中的数据有关的数据与其它表中的数据有关.UPDATE employeesSET 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 row updated.使用子查询更新两列使用子查询更新两列l 将员工号为114的工
12、作岗位和工资改成与员工205相同的 DEPTNO DNAME LOC -10 ACCOUNTING NEW YORK 20 RESEARCHDALLAS 30 SALESCHICAGO 40 OPERATIONS BOSTON 50DEVELOPMENTDETROIT 60 MIS .DEPTNO DNAME LOC -10 ACCOUNTING NEW YORK 20 RESEARCHDALLAS 30 SALESCHICAGO 40 OPERATIONS BOSTON 60 MIS .从一个表中移去一行从一个表中移去一行 DELETE FROM tableWHERE condition;D
13、ELETE语句语句 可以使用可以使用 DELETE 语句从表中删去现存的行语句从表中删去现存的行.SQL DELETE FROMdepartment 2 WHERE dname=DEVELOPMENT;SQL DELETE FROMdepartment;从一个表中删去行从一个表中删去行l使用使用 WHERE 子句以指定哪些行应当被删去子句以指定哪些行应当被删去.l如果忽略如果忽略WHERE 子句,那么表中所有的数据子句,那么表中所有的数据.SQL DELETE FROMemployee 2 WHEREdeptno=3 (SELECT deptno 4 FROM dept 5 WHERE dna
14、me=SALES);参照另一个表来删除行参照另一个表来删除行l 使用子查询,使得使用子查询,使得 DELETE 语句能从另一个表中删语句能从另一个表中删除某些行除某些行.TRUNCATETRUNCATE语句语句l删除表中的所有数据,保留表结构l是DDL语句,不是DML语句lSyntax:lExample:TRUNCATE TABLE table_name;TRUNCATE TABLE copy_emp;数据库事务数据库事务l要么全部完成,要么全部废弃的操作集合。要么全部完成,要么全部废弃的操作集合。l一个事务可以包含下列语句一个事务可以包含下列语句:l对数据做出一致性修改的对数据做出一致性修改
15、的DML语句。语句。l一个一个 DDL 语句语句l一个一个 DCL语句语句数据库事务数据库事务l以第一个可执行的以第一个可执行的 SQL 语句开始。语句开始。l以下列情况结束以下列情况结束:l执行执行COMMIT 或者或者 ROLLBACK 语句语句l执行执行DDL或者或者 DCL语句语句l用户退出用户退出l系统崩溃系统崩溃l保证数据的一致性保证数据的一致性l在数据永久改变之前,检查数据的改变在数据永久改变之前,检查数据的改变l对逻辑相关的操作进行分组对逻辑相关的操作进行分组COMMIT和和ROLLBACK语句的优点语句的优点隐式事务处理隐式事务处理l在下列环境下,一个自动提交发生在下列环境下
16、,一个自动提交发生:l处理处理DDL语句语句l处理处理DCL 语句语句l从从 SQL*Plus中退出中退出,而没有明确指定而没有明确指定COMMIT或者或者 ROLLBACKl当当 SQL*Plus中断或者系统失败时自动进行回滚中断或者系统失败时自动进行回滚.l之前的状态可以被恢复之前的状态可以被恢复.l当前的用户可以用当前的用户可以用SELECT语句来查看语句来查看DML操作操作后的结果后的结果.l其它用户看不到当前用户使用其它用户看不到当前用户使用 DML语句进行数语句进行数据操纵的结果据操纵的结果.l产生改变的数据被加锁,其它用户不能改变这产生改变的数据被加锁,其它用户不能改变这些行些行
17、.COMMIT 或或ROLLBACK之前数据状态之前数据状态在在 COMMIT之后的数据状态之后的数据状态l 数据的改变将被永久的反应到数据库中去数据的改变将被永久的反应到数据库中去.l 事务前面的数据状态将被永久地丢弃事务前面的数据状态将被永久地丢弃.l 所有的用户可以查看结果所有的用户可以查看结果.l 加在产生改变的行上的数据被解锁加在产生改变的行上的数据被解锁;这些行对这些行对于其他用户是可用的于其他用户是可用的.l 所有的保存点被释放所有的保存点被释放.SQL UPDATEemp 2 SET deptno=10 3 WHEREempno=7782;SQL COMMIT;提交数据提交数据
18、产生改变产生改变.Commit the changesSQL DELETE FROMemployee;SQL ROLLBACK;回滚后的数据状态回滚后的数据状态l使用使用 ROLLBACK语句丢弃所有的数据改变语句丢弃所有的数据改变.l数据的改变失效数据的改变失效.l事务之前的数据状态改变事务之前的数据状态改变.l在改变行的上的锁被释放在改变行的上的锁被释放.控制事物控制事物SAVEPOINT BSAVEPOINT ADELETEINSERTUPDATEINSERTCOMMITTimeTransactionROLLBACK to SAVEPOINT BROLLBACK to SAVEPOINT
19、 AROLLBACKSQL UPDATE.SQL SAVEPOINT update_done;SQL INSERT.SQL ROLLBACK TO update_done;回滚到某个标记回滚到某个标记l使用使用 SAVEPOINT语句在当前事务中产生一个标语句在当前事务中产生一个标记记.l使用使用ROLLBACK TO SAVEPOINT语句回滚到那个语句回滚到那个标记标记.锁定锁定l Oracle 锁锁:l在并发事务之间,阻止可能产生的破坏性相互影响。在并发事务之间,阻止可能产生的破坏性相互影响。l不需要用户进行干预,自动使用。不需要用户进行干预,自动使用。l在事务期间使用,事务结束时释放。在事务期间使用,事务结束时释放。l有两种基本的模式有两种基本的模式:l排它排它l共享共享描述描述向表中增加一个新的行向表中增加一个新的行更改表中现存的行更改表中现存的行从表中删除现存的行从表中删除现存的行提交一个事务提交一个事务允许回滚到保存点标记允许回滚到保存点标记废弃所有未提交的改变废弃所有未提交的改变语句语句INSERTUPDATEDELETECOMMITSAVEPOINTROLLBACK总结总结