DML包括查询与更新。
数据的更新包括:增加,修改,删除
更新离不开查询
先复制一份原始数据
create table myemp as select * from emp;
数据的增加
insert into myemp() values(); # 值与字段对应即可。
常用的三种类型
字符串:‘字符串’
数值:直接编写
日期:有三种
sysdate
根据日期的保存结构编写字符串:‘天-年-月’
利用to_date()将字符串转换为date型数据
完整语法
insert into myemp(empno,job,sal,hiredate,ename,deptno,mgr,comm)
values(6668,'aa',2000,to_date('1988-09-08','yyyy-mm-dd'),'aa1',40,7396,null);
insert into myemp(empno,job,sal,hiredate,ename,deptno,mgr,comm)
values(6669,'aa',2000,to_date('1986-09-08','yyyy-mm-dd'),'aa2',40,7397,null);
省略字段语法
必须注意要与表中的字段顺序一致。
在开发时尽量使用完整语法,一条数据一行
####################################################################################
update 表名 set 字段=内容,字段=内容,...[where 更新条件(s)]
/*普通的*/
update myemp set sal=2500,comm=40 where ename='aa2';
/*带子查询的*/
update myemp set sal=(select avg(sal) from myemp)
where sal=(select min(sal) from myemp);
update myemp set hiredate=sysdate,sal=sal*1.2
where hiredate between '01-jan-81' and '31-dec-81';
where to_char(hiredate,'yyyy')=1981;
/*不带条件的,是修改所有的记录*/
update myemp set comm=null;
####################################################################################
删除
/*先查再删除*/
select * from myemp where empno=7369;
delete from myemp where empno=7369;
/*删除若干个数据*/
select * from myemp where empno in(7566,7788,7799);
delete from myemp where empno in(7566,7788,7799);
/*删除也可以结合子查询*/
select * from myemp order by sal desc;
delete from myemp where sal=(select max(sal) from myemp)
/*删除全部数据几乎是不可能的*/
delete from myemp;
####################################################################################
事务
事务处理的概念
保证数据完整性的一种手段
具有ACID原则
保证你一个人更新数据的时候,其它人不能更新。
sessionA
sessionB
每一个session有自己独立的事务。
缓冲区中的数据可以rollback
rollback;
commit;
更新操作被事务保护。要成功就一起成功,要失败就退回原点重新再来。
事务锁
两个session进行同一条数据的操作,谁手快谁成功。
sessionA操作了,但没提交,sessionB执行的时候会一直等待。也就是说A锁定了这条数据,在没有提交或回流之前,sessionB不能操作。只能等待它提交后才能操作。
update myemp set sal=5000 where empno=7566;
update myemp set sal=90000 where empno=7566; 一直等待。
事务处理的过程中,存在行级锁。事务的隔离性
在整个程序的世界里,只有两个方法可以评价程序:时间复杂度与空间复杂度
时间换空间,不加硬件的情况下,就等吧。
空间换时间。加硬件,不加硬件的话,用云计算,来临时空间换时间。
在不改变现有硬件的情况下,可以利用一个周期来完成,不是一次完成。可能需要半年时间,但不影响用户。活跃用户与僵shi用户。
####################################################################################
伪列,很多,重要的就这两个
列本身不存在,但却可以使用
rownum 行号
rowid 数据开发并不重要,数据分析时会用到
select rownum,empno,ename,job from emp;
不是固定的,是动态生成的。行号是根据查询结果动态生成的。
select rownum,empno,ename,job from emp where deptno=10;
rownum做两件事
1、取得第一行
select rownum,empno,ename,job from emp where deptno=10 and rownum=1;
一般不会做select * from 表名;的操作,因为如果表太大的话,会是灾难的
一般只查第一行。
2、取得前N行(一个更为重要的特性)
select * from emp where rownum<=10;
6到10行的记录,分页程序就是这样实现的,上一页与下一页。这是很普遍的
select *
from(
select rownum rn,ename,empno from emp where rownum <=10) temp
where temp.rn>5;
分页的固定格式
currentPage 当前页
lineSize 每页行数
select *
from (
select rownum rn,列,...
from 表名
where rownum<=currentPage*lineSize) temp
where temp.rn>(currentPage-1)*lineSize;
样例:
select *
from(
select rownum rn,ename,empno
from emp
where rownum <=9) temp
where temp.rn>6;
#############################
rowid 理解就可以了
分析上使用,开发时不常用。
针对每行数据提供一个物理地址。
select rowid,job,ename from emp;
AAAVREAAEAAAACXAAA
AAAVRE 数据对象编号
AAE 数据文件编号
AAAACX 数据块号
AAA 数据行号
题目:删除表中重复的数据,只保留最原始的一个。
create table mydept as select * from dept;
SQL> select rowid,deptno,dname,loc from mydept;
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------- -------------
AAAV5uAAEAAAAMzAAA 10 ACCOUNTING NEW YORK
AAAV5uAAEAAAAMzAAB 20 RESEARCH DALLAS
AAAV5uAAEAAAAMzAAC 30 SALES CHICAGO
AAAV5uAAEAAAAMzAAD 40 OPERATIONS BOSTON
插入测试数据
insert into mydept(deptno,dname,loc) values(10,'ACCOUNTING','NEW YORK');
insert into mydept(deptno,dname,loc) values(20,'RESEARCH','DALLAS');
insert into mydept(deptno,dname,loc) values(30,'SALES','CHICAGO');
insert into mydept(deptno,dname,loc) values(40,'OPERATIONS','BOSTON');
表的不正当设计,造成了表中有重复数据,所以为了删除,就要用到rowid来解决。
rowid是一直累加的,不会减小。原始数据的rowid较小,所以先分组,再将分组中较小的查出来,
然后取反(not in)删除即可。
select rowid,deptno,dname,loc from mydept;
delete from mydept where rowid not in(
select min(rowid)
from mydept
group by deptno,dname,loc);
min()是一个多行单列
select max(rowid),deptno,dname,loc
from mydept
group by deptno,dname,loc;
这只是rowid的一个使用说明,讲解索引的时候也会用到rowid