oracle 从入门到精通二

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

猜你喜欢

转载自blog.csdn.net/ccbulougen/article/details/82116532