Oracle笔记13——Oracle数据操作与事务控制

Oracle数据库五大语言:

数据查询语言 DQL(Data Query Language): SELECT
数据操作语言 DML(Data Manipulation Language): INSERT UPDATE DELETE
事务处理语言 TPL(Transaction Process Language):COMMIT ROLLBACK SAVEPOINT
数据定义语言 DDL(Date Definition Language):CREATE ALTER DROP TRUNCATE
数据控制语言 DCL(Date Control Language): GRANT REVOKE

 

插入数据

一.新增数据(插入数据)

语法INSERT INTO 表名(列1,列2....) VALUES(值1,值2....); 一次新增一行
INSERT INTO 表名(列1,列2....) 子查询; 一次新增N行

注意
1.列名列表与值列表的个数、类型必须保持一致
2.列名列表可以省略,默认值列表给所有列赋值
 3.值列表中日期、字符串必须使用''单引号括起来

二、插入空值NULL

(1)隐含法: 在列名列表中忽略该列。
(2)显示法: 指定 NULL关键字或者''
注意

列名列表可以省略,默认值列表给所有列赋值

INSERT INTO dept(deptno,dname) values(50,'开发部');--隐含法
INSERT INTO dept(deptno, dname, loc) VALUES(60, '需求部', '东软大厦');
INSERT INTO dept(deptno, dname, loc) VALUES(70, '需求部', '');--显示法
INSERT INTO dept VALUES(70, '需求部', NULL);--于上面效果相同
SELECT * FROM dept;

三、插入日期值

--插入日期值  SYSDATE 函数记录当前日期和时间
INSERT INTO emp(empno,ename,hiredate) VALUES(7777,'李四',SYSDATE);

--插入日期值   可以使用RR日期格式,也可以使用TO_DATE()函数转换YY日期格式
INSERT INTO emp(empno,ename,hiredate) VALUES(8888,'李二','2019-08-01');--文字与格式字符串不匹配
INSERT INTO emp(empno,ename,hiredate) VALUES(8888,'李二','1-8月-19'); --RR日期格式
INSERT INTO emp(empno,ename,hiredate) VALUES(8888,'李二',TO_DATE('2019-08-01','yyyy-mm-dd'));--YY日期格式

四、插入特殊字符

1.ASCII() :查看指定字符的ascii编码

2.CHR() :查看指定ascii编码代表的字符

INSERT INTO dept(deptno,dname) VALUES(50,'~!@#$%^*()-+');--ok
INSERT INTO dept(deptno,dname) VALUES(50,'&');           --ok   
INSERT INTO dept(deptno,dname) VALUES(50,'&需求部');-- not OK    &修饰的字符表示一个变量,等待用户输入变量值

INSERT INTO dept(deptno,dname) VALUES(50,'\&需求部');--not ok
INSERT INTO dept(deptno,dname) VALUES(50,'&' || '需求部'); --ok
INSERT INTO dept(deptno,dname) VALUES(50,CHR(38) || '需求部'); --ok

--ASCII() 查看指定字符的ascii编码
SELECT ASCII('&') FROM dual; --38

--CHR() 查看指定ascii编码代表的字符
SELECT CHR(38) FROM dual;

五、批量新增(备份数据)

1. 将部门10所有的员工信息备份到emp_dept10表中
①复制表结构:创建表emp_dept10,且结构与emp表一致
CREATE TABLE emp_dept10 AS SELECT * FROM emp;           --1.复制emp表的表结构与所有数据    
CREATE TABLE emp_dept10 AS SELECT * FROM emp WHERE 1=0; --1.仅复制emp表的表结构
② 使用子查询批量新增数据:将部门10的员工数据备份到emp_dept10表中
INSERT INTO emp_dept10 SELECT * FROM emp WHERE deptno = 10;--2.复制所有列数据   
INSERT INTO emp_dept10(empno,ename,hiredate) SELECT empno,ename,hiredate FROM emp WHERE deptno = 10;--2.复制指定列数据

 

修改数据

一、修改数据语法

UPDATE 表名 SET 列名1=值1[,列名2=值2.....] [WHERE 限制条件];

1.把员工编号为7782的部门编号修改为20
UPDATE emp SET deptno = 20 WHERE empno = 7782;
SELECT * FROM emp WHERE empno = 7782;

--如果要修改所有记录,WHERE子句可以忽略
2.把所有员工的部门编号修改为20
UPDATE emp SET deptno = 20;

--一次修改多列
3.把部门编号为10的员工,部门编号为20,工资增加100
UPDATE emp SET deptno = 20, sal = sal + 100 WHERE deptno = 10;

--嵌入子查询修改
4.把部门编号为10的员工,部门编号调整为20,工资在原有的基础上,增加所有人的平均工资
SELECT AVG(sal) FROM emp;--所有人的平均工资
UPDATE emp SET deptno = 20, sal = sal + (SELECT AVG(sal) FROM emp) WHERE deptno = 10;

--修改记录时的完整性约束错误
5.把部门编号为10的员工,部门编号调整为55
UPDATE emp SET deptno=55 WHERE deptno =10;--not ok 未找到父项关键字  emp.deptno 的数据来源于 dept.deptno,此时dept中没有55编号的部门存在

--相关子查询修改
1.在emp中新增dname列
ALTER TABLE emp ADD(dname varchar2(14));
2.将emp表中的dname更新为实际部门的名称
UPDATE emp SET dname = (SELECT dname FROM deptWHERE dept.deptno = emp.deptno);

 

删除数据

一、语法:

DELETE [FROM] 表名  [WHERE 限制条件];

--删除选中记录
1.删除职位是CLERK的员工记录
DELETE FROM emp WHERE job = 'CLERK';

--删除全部记录
2.删除所有员工记录
DELETE FROM emp;
DELETE emp;

--基于另一个表删除本表记录
3.删除部门SALES的员工
SELECT deptno FROM dept WHERE dname = 'SALES';--1.SALES的部门编号为多少?  30
DELETE FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'SALES');

--删除记录时的完整性约束错误
4.删除部门编号为10的部门记录
DELETE FROM dept WHERE deptno = 10; --not ok 已找到子记录  因为emp.deptno引用dept.deptno,而dept.deptno为10的部门已经存在3个员工

--相关DELETE
5.删除曾经做过入职的员工记录
DELETE FROM emp WHERE 曾经做过入职;
delete FROM emp WHERE EXISTS (SELECT * FROM emp_jobhistory WHERE empno = emp.empno);

6.删除没有员工的部门记录
DELETE FROM dept WHERE 没有员工的部门;
DELETE FROM dept WHERE NOT EXISTS (SELECT * FROM emp WHERE deptno = dept.deptno);

 

事务管理

一、事务管理定义:

由一组SQL语句组成的管理单元,要么全部执行成功,要么全部执行失败

二、事务四大特性

1. 原子性:一个事务中所有的SQL语句,执行时,要么全部执行成功,要么全部执行失败
2. 一致性:不论SQL语句执行成功,还是失败,整个数据处于平衡状态。
3. 隔离性:事务与事务之间相互隔离,互不影响
4. 持久性:一旦数据被提交,永久性被保存到数据库中,不能再撤回

三、事务开始与结束

事务开启:上一个事务结束以后,执行下一个DML(增、删、改)语句即开始新的事务
事务结束
1.显式结束
commit:显示提交
rollback:显示回滚(撤销所有的操作)

2.隐式结束
 隐式提交:当下列任意一种情况发生时,会发生隐式提交
 1.执行一个DDL(CREATE、ALTER、DROP、TRUNCATE、RENAME)语句;
 2.执行一个DCL(GRANT、REVOKE)语句;
 3.从SQL*Plus正常退出(即使用EXIT或QUIT命令退出);
 

隐式回滚:当下列任意一种情况发生时,会发生隐式回滚
1. 从SQL*Plus中强行退出
2. 客户端连接到服务器端异常中断
3. 系统崩溃

--开启事务
INSERT INTO dept(deptno,dname) VALUES(50,'财务部');
INSERT INTO dept(deptno,dname) VALUES(60,'人力资源部');
ROLLBACK;--显示回滚,事务结束

INSERT INTO dept(deptno,dname) VALUES(70,'后勤部');
COMMIT;--显示提交,事务结束

--设置保存点
INSERT INTO dept(deptno,dname) VALUES(81,'需求部');
savepoint poin1;--设置保存点1
INSERT INTO dept(deptno,dname) VALUES(82,'UI部');
INSERT INTO dept(deptno,dname) VALUES(83,'前端部');
SAVEPOINT poin2;--设置保存点2
INSERT INTO dept(deptno,dname) VALUES(84,'开发部');
INSERT INTO dept(deptno,dname) VALUES(85,'测试部');
SAVEPOINT poin3;--设置保存点3
INSERT INTO dept(deptno,dname) VALUES(86,'实施部');

ROLLBACK TO poin2;--回滚保存点2的位置
COMMIT; --提交部分事务SQL语句

ROLLBACK;--事务已经被提交,不可能再被回滚

 

一、分类:

行级锁  和  表级锁 (悲观锁 和  乐观锁)

行级锁: ORACLE默认的机制是在DML操作影响的行记录上自动加锁
当会话1在修改指定行数据,且没有commit提交事务或者rollback回滚事务之前,
该数据行被锁定,其他会话2不允许修改该数据。
如果会话1结束事务,锁释放,其他会话2可以继续操作该数据


表级锁:当会话1在操作指定数据时,表将被锁定,其他会话不允许对表结构进行修改(新增列、修改列、删除列)

--会话1 (执行一个事务)
UPDATE dept SET loc='125C教室' WHERE deptno = 83;
SELECT * FROM dept;

--会话2(执行一个事务)
DELETE FROM dept WHERE deptno = 50;
SELECT * FROM dept;

--先插入一条新纪录,然后分析如下两个会话,执行完每一步时的数据库状态
新纪录:
INSERT INTO emp(empno, ename, job, sal) VALUES(8888, 'test', 'Test', 500);
COMMIT;


会话A
1.UPDATE emp SET sal = sal + 500 WHERE empno = 8888;--(1)此时sal为1000
3.SELECT * FROM emp WHERE empno = 8888;--(3)此时sal为1000
5.COMMIT;--(5)提交,此时两个会话的sal都为1000
7.SELECT * FROM emp WHERE empno = 8888;--(7)此时sal为2000

会话B
2.SELECT * FROM emp WHERE empno = 8888;    --(2)此时sal还是500
4.UPDATE emp SET sal = sal + 1000 WHERE empno = 8888;--(4)等待会话A提交,会话A提交后,得到的sal为2000
6.COMMIT;--(6)提交,此时两个会话的sal都为2000

 

posted @ 2021-11-05 14:22  `青红造了个白`  阅读(205)  评论(0编辑  收藏  举报