您的位置:首页 > 数据库 > Oracle

Oracle基础学习三之数据操作及伪列

2012-06-25 21:59 507 查看
------数据更新操作
create table myemp as select * from emp;复制一份emp表。这仅是Oracle支持的操作,其他的数据库不一样。
数据增加
insert into 表名 [(字段1, 字段2,...)] values(值1,值2,...);
类型格式书写:
|-:数字直接写,没有任何修饰
|-:字符串要使用单引号修饰
|-:date数据有几种形式:
1、可以按照已有的字符串格式编写。
2、利用to_date()函数来转换。
3、设置当前时间使用sysdate。
可是对于数据的增加由两种操作方式:完整型、轻便型:
范例:完整型:insert into myapp(empno, ename, hiredate, sal,mgr,job, comm) values(5555,'zhangsan',to_DATE('1222-09-12',yyyy-mm-dd'),4444,7654,'qingjiegong',1000);
简便型:insert into myapp values(2223,'ccc','dddd',3333,sysdate,3333,null,3)这种写法在实际中很少,因为它要按照数据表的顺序来写,不利于维护。
数据更新
update 表名 set 更新字段1=更新值1, 更新字段2=更新值2,...[where(s)];
udpdate myemp set sal=5000, comm=2000,job='manager' where empno=3333;
注意:如果更新是不加上更新条件,则意味作更新全部的数据,但是这种做法绝对不可取,如果现在表中的数据较大的话,这种更新性能明显降低。
数据删除
语法格式:delete from 表名 [where 删除条件(s)];
没有写删除条件,则删除整张表数据
范例:delete from myemp where to_char(hireDate,'yyyy')=1987;
删除表的全部记录
delete from myemp;
注意:以后再开发中在删除之前最好先给出一个提示框,防止勿删。rollback;
-------------------------------------------事务处理
对于数据表的操作,很明显查询要比更新操作
更加安全,因为更新操作有可能会出现错误,以导致没有按规既定的要求正确的完成更新操作。
但是在很多时候更新有可能会有多条指令共同完成,如银行转账:
.判断A的帐户是否有500k;
.判断B的帐户是否存在并且状态是否正常;
.从A的帐户上移走500k;
.向B的帐户之中增加500k;
.向银行支付手续费用500;
以上五个数据操作时一个整体,可以理解为一个完整的业务,其中的任何一点出错,它的其他所有操作不应该再执行,而是应该回归到原始的状态,这样的操作流程就是事务操作。
所有的事务处理操作都是针对于每一个 session进行的,在oracle数据库中,把每一个连接到数据库上的用户称为一个session,每一个session之间彼此独立,不会有任何的通讯,而每一个session独享自己的事务控制,而事务控制之中主要使用两个命令:
.事务的回滚:Rollback,更新操作回到原点。
.事务的提交:Commit,真正的发出更新操作,一旦提交后无法回滚。
但是这样一来也会出现一些问题,例如:某一个session在更新数据表的时候还没有提交事务,其他session是无法更新的,必须等待之前的那个session提交后才可以。
这种问题从大的方面上讲可以称为死锁,但是在oracle之中死锁有很多的种类,所以我个人觉得所有的数据更新一定都会受到事务的控制。
-------------------------------------------
数据伪列(是指用户不需要处理的列,而是由Oracle自行维护的数据列,在oracle之中有两个数据伪列:Rownum、Rowid:
RowNum从单词含义上讲应该表示的是行号,实际上RowNum为每一个显示的记录都会自动的随着查询生成行号,例如:
select RowNum,empno, ename,job ,hiredate,sal from emp; 此时的行号并不是永久固定的.

select RowNum, empno, ename,job,hiredate,sal from emp where deptno=30;
每次动态的重新生成的,那么既然有了RowNum之后,下面就可以实现数据的部分显示;
范例: 查询前5条记录
select RowNum, empno, ename, job, hiredate, sal from emp where rownum<=5;
范例:查询6-10条记录
.按照正常的思维肯定是直接进行Between..and的判断。
select rownum, empno, ename, job, hiredate ,sal from emp
where rownum between 6 and 10;
这个时候并没返回任何数据,因为rownum不是真实列,而要想实现这种查询思路是:先查询前10条记录,之后再显示5条记录,要依靠查询完成。
select * from (select rownum m, empno,ename,job,hiredate,sal from emp
where rownum<=10) temp
where temp.m>5;
范例:显示前5条记录
当前所在页为1;
每页显示的记录长度为5;
第一页:
select * from (
select rownum m, empno,job, hiredate,sal from emp
where rownum<=5) temp
where temp.m>0;
范例:显示前5条记录
当前所在页为2;
每页显示的记录长度为5;
第二页:
select * from (
select rownum m, empno,job, hiredate,sal from emp
where rownum<=10) temp
where temp.m>5;
范例:显示前5条记录
当前所在页为1;
每页显示的记录长度为5;
第三页:
select * from (
select rownum m, empno,job, hiredate,sal from emp
where rownum<=15) temp
where temp.m>10;
这是分页显示的核心的代码。
RowID(表示的是每一行数据保存的物理地址的编号) select RowId, deptno, dname, loc from dept;
返回的记录如下所示:
ROWID DEPTNO DNAME LOC
------------------ ----- ------------ --------
AAAQ+hAAEAAAAAOAAA 10 ACCOUNTING NEW YORK
AAAQ+hAAEAAAAAOAAB 20 RESEARCH DALLAS
AAAQ+hAAEAAAAAOAAC 30 SALES CHICAGO
AAAQ+hAAEAAAAAOAAD 40 OPERATIONS BOSTON
每一条记录的Rowid都不会重复,所以即便表中所有列的数据内容都重复了,rowid也是不会重复的,而且以一个rowid为例,说明rowid组成.
例如: AAAL+XAAEAAAAANAAA
数据对象号:AAAL+X;
相对文件号:AAE;
数据块号:AAAAAN;
数据行号:AAA
范例:删除如下表中的重复记录
DEPTNO DNAME LOC
------ -------------- -------------
21 RESEARCH DALLAS
31 SALES CHICAGO
32 SALES CHICAGO
41 OPERATIONS BOSTON
42 OPERATIONS BOSTON
43 OPERATIONS BOSTON
44 OPERATIONS BOSTON
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
最终要显示成:
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
分析步骤:
1、找出重复的数据
select dname, loc, min(RowID)
from dept
group by dname, loc
having count(deptno)>1;
这里先按照查询的方式做,首先找到所有重复的数据,重复的数据就比较容易了,按照部门分组\位置分组,之后统计个数,如果个数大于1,则表示重复。显示如下:
DNAME LOC MIN(ROWID)
----------- -------- ----------------
RESEARCH DALLAS AAAQ+hAAEAAAAANAAA
SALES CHICAGO AAAQ+hAAEAAAAANAAB
OPERATIONS BOSTON AAAQ+hAAEAAAAANAAD
2、确定不能删除的Rowid,去掉之前的限制(count()>1),表示按照部门和位置分组,取出每个最小的rowid。
select min(rowid)
from dept
group by dname, loc;
3、根据最小的rowid进行删除
delete from dept
where rowid not in(
select min(rowid)
from dept
group by dname, loc); commit;
-------------------------------------------
总结:1、多表查询:在进行查询语句编写的时候,一定要确定所需要关联的数据表,而且只要是表的关联查询,就一定会存在笛卡尔积的问题,使用关联字段消除此问题。
在使用多表查询的时候要考虑到左右连接的问题,Oracle之外的数据库可以使用SQL1999语法控制左右连接;
2、所有统计函数是用于进行数据统计操作的,而统计要在分组中进行(或者是单独使用),分组适用Groupby子句,是在某一列上存在重复数据的时候才会使用分组操作,而分组后的过滤使用Having子句完成,所有的分组函数可以嵌套,但是嵌套之后的分组函之中不能再有其他的查询字段,包括分组字段;
3、子查询:结合限定查询、多表查询、分组统计查询完成各个复杂查询操作,子查询一般在where和from之后出现较多;
4、数据表的分页查询显示依靠rowumn伪列,重点。 --------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: