9.处理数据——Oracle数据库学习日记

处理数据

数据控制语言

  • DML可以在下列条件下执行:
    • 向表中插入数据
    • 修改现存数据
    • 删除现存数据
  • 事务是由完成若干项工作DML语句组成的

1、INSERT语句

使用INSERT语句向表中插入数据

INSERT INTO table [(column [,column...])]
VALUES      (values [,value...]);

使用这种语法一次只能向表中插入一条数据

1.1插入数据

insert into dept
values (50,'IT','BeiJing');
或者
insert into dept(deptno,loc,dname)
values (50,'BeiJing','IT');

表名后不加列名时,只要按照默认表顺序就可添加;表名后加列名可以打乱顺序添加。字符和日期型数据应包含在单引号中。

1.2插入空值

隐式方式:在列名表中省略该列的值
insert into dept(deptno,loc)
	values (70,'Beijing');
显示方式:在VALUES子句中指定空值
insert into dept
	values (70,null,'Beijing');

1.3插入指定的值

插入当前系统时间sysdate函数
insert into emp(empno,ename,hiredate)
	values (8000,'XIAOMING',sysdate);

1.4创建脚本

可以使用&变量指定列值
insert into emp(empno,ename,hiredate,deptno)
	values (&NUMBER,'xiaohong',to_date('20190701','yyyymmdd'),50);

1.5从其他表中拷贝数据

insert into cp_cmp
	select empno,ename,hiredate,sal
	from emp;
  • 在INSERT语句中加入子查询
  • 不必书写VALUES子句
  • 子查询中的值列表应于INSERT子句中的列名对应

2、UPDATE语句

  • 使用UPDATE语句更新数据
UPDATE   table
SET         column=value [, column = value,...]
[WHERE   condition];
  • 可以一次更新多条数据(如果有需求)

2.1使用WHERE更新数据

使用WHERE子句指定需要更新的数据
update emp
	set deptno=50
	where deptno=30;
如果省略WHERE子句,则表中的所有数据都将被更新

2.2使用子查询更新两列

update emp
	set (sal,job)=(select sal,job
					from emp
					where ename='KING')
	where job='MANAGER';

2.3基于另一张表更新数据

update emp2
	set comm=null,deptno=44
	where ename in (select e.ename
					from emp e,(select deptno,avg(sal) sal_avg
								from emp
								group by deptno) s
					where e.deptno=s.deptno
					and e.sal<s.sal_avg);

3、DELETE语句

  • 使用DELETE语句从表中删除数据
DELETE  [FROM]   table
[WHERE          condition];

3.1从表中删除数据

  • 使用WHERE子句指定删除的记录
delete from emp
	where ename in ('XIAOMING','xiaohong');

如果省略WHERE子句,则表中的全部数据将被删除。

3.2基于另一张表删除数据

delete from emp2
	where ename in (select e.ename
					from emp e,(select deptno,min(sal) sal
								from emp
								group by deptno) s
					where e.deptno=s.deptno
					and e.sal=s.sal
					and e.ename not in (select distinct p.ename
										from emp e,emp p
										where e.mgr=p.empno));

4、TRUNCATE语句

  • 从表中删除所有的行,保留了空表和完整的表结构
  • 数据定义语言(DDL),不是DML语句,不能使用撤销
TRUNCATE    TABLE   table_name;

5、数据库事务

数据库事务由以下的部分组成:

  • 一个或多个DML语句
  • 一个DDL语句
  • 一个DCL语句

数据库事务:开始和结束

  • 以第一个DML语句的执行作为开始
  • 以下面的其中之一作为结束:
    • COMMIT或ROLLBACK语句
    • DDL或DCL语句(自动提交)
    • SQL Developer or SQL*Plus用户退出
    • 系统崩溃

COMMIT和ROLLBACK语句的优点
使用COMMIT和ROLLBACK语句,可以:

  • 确保数据完整性
  • 数据改变被提交之前预览
  • 将逻辑上相关的操作分组

回滚到保存点

  • 使用SAVEPOINT语句在当前事务中创建保存点
  • 使用ROLLBACK TO SAVEPOINT语句回滚到创建的保存点。
UPDATE...
SAVEPOINT name_1
INSERT...
UPDATE...
DELETE ...
ROLLBACK TO name_1

隐式事务处理

  • 自动提交在以下情况中执行
    • DDL语句
    • DCL语句
    • 不使用COMMIT或ROLLBACK语句提交或回滚,正常结束会话.
  • 会话异常结束或系统异常会导致自动回滚

6、行级锁

00060:死锁错误代码

  • 改变前的数据状态时可以恢复的
  • 执行DML操作的用户可以通过SELECT 语句查询之前的修正
  • 其他用户不能看到当前用户所作的改变,知道当前用户结束事务
  • DML语句所涉及到的行被锁定,其他用户不能操作

COMMIT后数据的状态

  • 数据的改变被保存在数据库中
  • 以前的数据被覆盖
  • 所有用户都可以查看结果
  • 受影响的行上的锁被释放,可供其他用户来操作的那些行
  • 所有保存点都将被删除

SELECT 语句中的FOR UPDATE子句

示例

SELECT  employee_id,salary,commission_pct,job_id
FROM    employees
WHERE   job_id = 'SA_REP'
FRO UPDATE
ORDER BY employee_id;

锁定EMPLOYEES表中job_id为SA_REP的行
当发出ROLLBACK或COMMIT命令,锁即被释放
如果SELECT语句试图锁定被另一个用户锁定的行,那么数据库将等待,知道该行可用,才返回SELECT语句的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值