八.操作数据-DML语句目标结束本节课后,应当达到如下目标:描述每个DML语句向一个表中插入数据更新一个表中数据行从一个表中删除行控制事务数据操作语言DML语句在下列情况下发生:往一个表中增加新行更改一个表中现有的行从一个表中删除掉现有的行一个事务由一组构成一个逻辑操作的DML语句组成DEPTDEPTNODNAMELOC------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON新行50DEVELOPMENTDETROITDEPTDEPTNODNAMELOC------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50DEVELOPMENTDETROIT向一个表中增加新行“…向DEPT表中增加新行…”INSERTINTOtable[(column[,column...])]VALUES(value[,value...]);INSERT语句使用INSERT语句向表中增加新行.使用这种方法只能一次插入一行数据.SQLINSERTINTOdept(deptno,dname,loc)2VALUES(50,'DEVELOPMENT','DETROIT');1rowcreated.插入新行插入包含每一个列值的新行.按缺省顺序列出表中所有的列值.列出INSERT子句中所有的列,这是可选的.日期值和字符值要用单引号括起来.SQLINSERTINTOdept(deptno,dname)2VALUES(60,'MIS');1rowcreated.SQLINSERTINTOdept2VALUES(70,'FINANCE',NULL);1rowcreated.插入带有空值的行省略的方法:从列的链表忽略有空值的列明确的方法:指定NULL关键字SQLINSERTINTOemp(empno,ename,job,2mgr,hiredate,sal,comm,3deptno)4VALUES(7196,'GREEN','SALESMAN',57782,SYSDATE,2000,NULL,610);1rowcreated.插入特殊的值•SYSDATE函数取出当前的日期的时间.SQLINSERTINTOemp2VALUES(2296,'AROMANO','SALESMAN',7782,3TO_DATE('03-2月1997','DD-MON,YYYY'),41300,NULL,10);1rowcreated.EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO-----------------------------------------------2296AROMANOSALESMAN778203-2月-97130010插入特殊的日期值增加一个新的员工检验结果.SQLINSERTINTOmanagers(id,name,salary,hiredate)2SELECTempno,ename,sal,hiredate3FROMemp4WHEREjob='MANAGER';3rowscreated.从另一个表中拷贝行创建带有子查询的INSERT语句。不要使用VALUES子句.子查询中的列要与INSERT子句中的列相匹配.通过使用SQL*Plus的替代参数创建交互脚本SQLINSERTINTOdept(deptno,dname,loc)2VALUES(&department_id,3'&department_name','&location');Entervaluefordepartment_id:80Entervaluefordepartment_name:EDUCATIONEntervalueforlocation:ATLANTA1rowcreated.替代变量插入值INSERTINTO(SELECTemployee_id,last_name,email,hire_date,job_id,salary,department_idFROMemployeesWHEREdepartment_id=50)VALUES(99999,'Taylor','DTAYLOR',TO_DATE('07-7月-99','DD-MON-RR'),'ST_CLERK',5000,50);1rowcreated.在INSERT语句中使用子查询EMP“…更改EMP表中的一行数据…”EMPEMPNOENAMEJOB...DEPTNO7839KINGPRESIDENT107698BLAKEMANAGER307782CLARKMANAGER107566JONESMANAGER20...20EMPNOENAMEJOB...DEPTNO7839KINGPRESIDENT107698BLAKEMANAGER307782CLARKMANAGER107566JONESMANAGER20...改变一个表中的数据UPDATEtableSETcolumn=value[,column=value,...][WHEREcondition];UPDATE语句使用UPDATE语句更改现有的行.如果需要,可以一次更改多行.SQLUPDATEemp2SETdeptno=203WHEREempno=7782;1rowupdated.SQLUPDATEemployee2SETdeptno=20;14rowsupdated.更改表中的行使用WHERE子句来指定要修改的行.如果忽略WHERE子句,那么句子中所有的值都将被更改.SQLUPDATEemp2SET(job,deptno)=3(SELECTjob,deptno4FROMemp5WHEREempno=7499)6WHEREempno=7698;1rowupdated.用多列子查询进行修改更改7698号雇员的工作和部门,与第7499号雇员进行匹配.SQLUPDATEemployee2SETdeptno=(SELECTdeptno3FROMemp4WHEREempno=7788)5WHEREjob=(SELECTjob6FROMemp7WHEREempno=7788);2rowsupdated.使用子查询更新两列在UPDATE语句中,使用子查询来进行更改,更改的数据与其它表中的数据有关.UPDATEemployeesSETjob_id=(SELECTjob_idFROMemployeesWHEREemployee_id=205),salary=(SELECTsalaryFROMemployeesWHEREemployee_id=205)WHEREemployee_id=114;1rowupdated.使用子查询更新两列将员工号为114的工作岗位和工资改成与员工205相同的“…从一个表中删去一行…”DEPTDEPTNODNAMELOC------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50DEVELOPMENTDETROIT60MIS...DEPTDEPTNODNAMELOC------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON60MIS...从一个表中移去一行DELETE[FROM]table[WHEREcondition];DELETE语句可以使用DELETE语句从表中删去现存的行.SQLDELETEFROMdepartment2WHEREdname='DEVELOPMENT';1rowdeleted.SQLDELETEFROMdepartment;4rowsdeleted.从一个表中删去行使用WHERE子句以指定哪些行应当被删去.如果忽略WHERE子句,那么表中所有的数据.SQLDELETEFROMemployee2WHEREdeptno=3(SELECTdeptno4FROMdept5WHEREdname='SALES');6rowsdeleted.参照另一个表来删除行使用子查询,使得DELETE语句能从另一个表中删除某些行.TRUNCATE语句删除表中的所有数据,保留表结构是DDL语句,不是DML语句Syntax:Example:TRUNCATETABLEtable_name;TRUNCATETABLEcopy_emp;数据库事务要么全部完成,要么全部废弃的操作集合。一个事务可以包含下列语句:对数据做出一致性修改的DML语句。一个DDL语句一个DCL语句数据库事务以第一个可执行的SQL语句开始。以下列情况结束:执行COMMIT或者ROLLBACK语句执行DDL或者DCL语句用户退出系统崩溃保证数据的一致性在数据永久改变之前,检查数据的改变对逻辑相关的操作进行分组COMMIT和ROLLBACK语句的优点隐式事务处理在下列环境下,一个自动提交发生:处理DDL语句处理DCL语句从SQL*Plus中退出,而没有明确指定COMMIT或者ROLLBACK当SQL*Plus中断或者系统失败时自动进行回滚.之前的状态可以被恢复.当前的用户可以用SELECT语句来查看DML操作后的结果.其它用户看不到当前用户使用DML语句进行数据操纵的结果.产生改变的数据被加锁,其它用户不能改变这些行.COMMIT或ROLLBACK之前数据状态在COMMIT之后的数据状态数据的改变将被永久的反应到数据库中去.事务前面的数据状态将被永久地丢弃.所有的用户可以查看结果.加在产生改变的行上的数据被解锁;这些行对于其他用户是可用的.所有的保存点被释放.SQLUPDATEemp2SETdeptno=103WHEREempno=7782;1rowupdated.SQLCOMMIT;Commitcomplete.提交数据产生改变.CommitthechangesSQLDELETEFROMemployee;14rowsdeleted.SQLROLLBACK;Rollbackcomplete.回滚后的数据状态使用ROLLBACK语句丢弃所有的数据改变.数据的改变失效.事务之前的数据状态改变.在改变行的上的锁被释放.控制事物SAVEPOINTBSAVEPOINTADELETEINSERTUPDATEINSERTCOMMITTimeTransactionROLLBACKtoSAVEPOINTBROLLBACKtoSAVEPOINTAROLLBACKSQLUPDATE...SQLSAVEPOINTupdate_done;Savepointcreated.SQLINSERT...SQLROLLBACKTOupdate_done;Rollbackcomplete.回滚到某个标记使用SAVEPOINT语句在当前事务中产生一个标记.使用ROLLBACKTOSAVEPOINT语句回滚到那个标记.锁定Oracle锁:在并发事务之间,阻止可能产生的破坏性相互影响。不需要用户进行干预,自动使用。在事务期间使用,事务结束时释放。有两种基本的模式:排它共享描述向表中增加一个新的行更改表中现存的行从表中删除现存的行提交一个事务允许回滚到保存点标记废弃所有未提交的改变语句INSERTUPDATEDELETECOMMITSAVEPOINTROLLBACK总结