– 数据操作语言:DML(Data Manipulation Language) :insert update delete
插入数据 insert
– 语法:insert into 表名(列名1,[列名2….]) values(值1,[值2…..])
– 注意:
– 列名列表与值列表个数、数据类型保持一致
– 字符类型与日期类型用”单引号引起来
– 列名列表可省略,则需要向所有列赋值插入单行数据
-- 隐含法:在列名列表中忽略该列 -- 向dept表新增一个部门 insert into dept(deptno,dname) values(50,'baby'); -- 显示法:指定 null关键字或者'' -- 向dept表新增一个部门 insert into dept values(50,'baby',''); -- 不指定列 -- 向dept表新增一个部门 insert into dept values(50,'baby','beijing'); -- 插入日期值 -- sysdate 系统当前时间 insert into emp (empno,hiredate) values (3322,sysdate); -- 插入指定日期 insert into emp (empno,hiredate) values (3322,to_date('2018-07-30','yyyy-mm-dd')); -- 插入特殊字符'&'(有变量的含义) insert into dept (deptno,dname,loc) values (24,'&' || 'hello','shanghai');
插入多行数据
-- 创建表 create table -- 创建表manager,并且结构与emp表一样 create table manager as select * from emp; -- 复制表结构与数据 create table manager as select * from emp where 1=0; -- 复制表结构 -- 向manager表中插入emp表中职位为manager的员工信息 insert into mannager select * from emp where job = manager;
修改数据 update
– 语法: update 表名 set 列名=新值,[列名1=新值1…] where 限制条件修改指定数据
-- 把工号为7782的部门编号修改为20 update emp set deptno = 20 where empno = 7782;
修改所有记录
update emp set deptno = 20;
一次修改多列
update emp deptno = 20,sal = sal + 100 where deptno = 10;
嵌入式查询修改
update emp set deptno = 20, sal = sal + (select avg(sal) from emp) where deptno = 10;
相关更新update
-- 在emp表中增加一个列dname,用来存储部门名称 alter table emp add(dname varchar2(14)); -- 使用相关子查询更新dname列为正确的部门名称 update emp e set dname = (select dname from dept d where deptno = e.deptno);
修改记录时的完整性约束错误
-- 把部门编号为10的员工,部门编号调整为55 update emp set deptno=55 where deptno=10; -- 错误 未找到父项关键字 外键(emp.deptno)对应的值 -> 不在主键(dept.deptno)范围之内
删除数据 delete
– 语法: delete [from] 表名 where 限制条件
– 注意:用delete删除表只是删除表的数据且可回滚,保留表的结构和对事务提交的确认删除选中记录
-- 删除职位是CLERK的员工记录 delete from emp where job = 'CLERK';
删除全部记录
-- 删除所有员工记录 delete from emp;
基于另一个表删除本表记录
-- 在DELETE语句中使用子查询可以基于另一个表删除本表记录。 -- 删除部门SALES的员工记录。 delete from emp where deptno = (select deptno from dept where dname ='SALES');
相关删除 delete
-- 删除曾经做过入职的员工记录 DELETE FROM emp e WHERE 0 < (SELECT count(empno) FROM emp_jobhistory WHERE empno = e.empno); -- 删除没有员工的部门记录 DELETE FROM dept d WHERE not exists (SELECT empno FROM emp WHERE deptno = d.deptno);
– 事务处理语言:TPL(Transaction Process Language):commit rollback
– 一组SQL语句的管理单元(针对增、删、改语句做事务管理)
四个特性:
– 1.原子性:所有sql语句执行成功都成功,任意一个失败,全部必须执行失败(回滚00 )
– 2.一致性:不论失败或成功,数据库数据保持一致性
– 3.隔离性:事务之间相互独立,互不影响
– 4.持久性:事务一旦被提交,永久保存在数据库中,无法撤回事务组成:
在数据库中,事务由一组相关的DML或SELECT语句,加上一个TPL语句(COMMIT、
ROLLBACK)或一个DDL语句(CREATE、ALTER、DROP、TRUNCATE等)或一个DCL(GRANT、REVOKE)语句事务开始:当上一个事务结束,第一个新的DML(增删改)语句执行开始,事务开始
事务结束:
显示结束:
--显示结束:事务提交commit insert into dept(deptno,dname,loc) values(50,'开发部','北京'); commit;--提交事务(增删改操作均需要提交事务) --显示结束:事务回滚rollback insert into dept(deptno,dname,loc) values(60,'运维部','北京'); insert into dept(deptno,dname,loc) values(70,'IT部','北京'); rollback;--回滚事务
隐式结束:
-- 隐式提交:执行DDL 或 DCL 或 从SQL*PLUS正常退出 -- 隐式回滚:从SQL*Plus中强行退出 -- 客户端连接到服务器端异常中断 -- 系统崩溃
设置保存点
insert into dept(deptno,dname) values(80,'实施部'); savepoint point1;--设置保存点1 insert into dept(deptno,dname) values(90,'测试部'); insert into dept(deptno,dname) values(91,'需求部'); savepoint point2;--设置保存点2 insert into dept(deptno,dname) values(92,'产品部'); savepoint point3;--设置保存点3 --回滚到保存点1的位置 rollback to point1; commit;--提交事务 rollback; -- 回滚提交,事务已经被提交,回滚无效
锁: 表级锁 与 行级锁
行级锁:当用户在会话1中对数据进行DML操作时,
– 如果事务没提交或回滚,当前行数据将被锁定
– 当用户执行完commit或rollback之后,其他会话才能执行该行的DML(SQL增删改)操作表级锁:当用户在会话1中对数据进行DML操作时,其他会话不允许对该表进行DDL(列删除、表删除、或表修改)操作