欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

day03: oracle的sql增 、删、改,事务处理

发布时间:2025/4/16 编程问答 96 豆豆
生活随笔 收集整理的这篇文章主要介绍了 day03: oracle的sql增 、删、改,事务处理 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一 数据更新(重点)

===============
增删改      查  

  •     数据更新包括数据的增加、修改、删除。
  •     为了做实验,我们将emp表复制一份,使用以下指令:
  •     create table myemp as select * from emp;
  •     这种语法是oracle支持的,其他的数据库不一样

1、数据的增加(insert)

语法: INSERT INTO 表名称 [(字段1,字段2,字段3,...)] VALUES(值1,值2,值3,...)注意:如果需要进行增加数据的话,则以下的几种数据类型要分别处理:增加数字:直接编写数字,如:123;增加字符串:字符串应该使用"'"声明;增加DATE数据:第一种:可以按照已有的字符串的格式编写字符串,如:‘20-6月-06’;第二种:利用TO_DATE函数将字符串变为DATE型数据;第三种:如果设置的时间为当前系统时间,则使用SYSDATE; 对于数据的增加有两种操作格式:完整型: SQL> insert into myemp(empno,ename,hiredate, sal,mgr,job,comm)2 values (8888,'reyn',to_date('1990-11-13','yyyy-mm-dd'),8000,7369,'daza',1000); SQL> insert into myemp (empno,ename,hiredate,sal,mgr,job,deptno) 2 values(8889,'hahah',sysdate,3000,7369,'daza',30);简单型:(不写列名称) SQL> insert into myemp2 values(8890,'xixi',sysdate,3000,7369,'daza',40); XXXX ORA-00947: not enough values正确:需要按照列名称的顺序来写,必须符合字段的要求,一般开发中不使用 SQL> insert into myemp values(2 8899,'xixi','daza',7369,sysdate,3000,null,30);

2、数据的修改(update)

语法: UPDATE 表名称 SET 更新字段1=更新值1,更新字段2=更新值2,...[WHERE 更新条件(s)];SQL> update myemp set sal=7000,comm=3000,job='manager',hiredate=sysdate where empno=7369;//更新编号为7369的员工,工资为7000,奖金3000,职位 manager,职位更新时间为当前时间 SQL> update myemp set sal=7500; //更新所有员工工资为7500 SQL> rollback; //回滚数据 SQL> update myemp set empno=7788 where empno=7369; //更新编号为7369的员工部门为7788

3、数据的删除(dalete)

数据的删除 语法: DELETE FROM 表名称 [WHERE 删除条件(s)];SQL> delete from myemp where to_char(hiredate,'yyyy')=1987; //删除1987年入职的员工注意:如果删除的时候没有相应匹配条件的时候,则更新记录为0,更新操作也一样。 SQL> delete from myemp; //删除myemp表中所有数据 SQL> select * from myemp;注意:对于删除操作,尽可能少使用,因为删除操作对于查询操作要危险许多。提示:对于删除操作,在开发时对于所有的删除操作之前先给出一个提示框,以防止误删除。

 二  事务处理

=========
    对于数据表的操作,查询要比更新操作更安全,因为更新操作有可能会出现错误,导致没有按照既定的要求正确的完成更新操作。
    在很多时候更新可能由多条语句共同完成,如银行转账:
        -判断A的账户上是否有5000W     select yue+shouxufei>5000+sxf from zhanghu where id=a
        -判断B的账户状态是否正常      select id,status from zhanghu where id=b
        -从A的账户上移走5000W         update zhanghu set yue-5000 where id=a
        -向B的账户上增加5000W          update zhanghu set yue+5000 where  id=b
        -向银行支付手续费5W           update zhanghu set yue+shouxufei where id=yinhang
    以上五个数据操作是一个整体,可以理解为一个完整的业务,如果其中第三点出错,其他操作该怎么办?
    如果有操作出现错误,那么其他操作应该不再继续执行,并且都回归到最原始的状态,而这一个流程的操作实际上就是事务的操作。
#回滚之前的操作
rollback;

#再次查看myemp表,确认其中的数据情况 SQL> select * from myemp;所有的事务处理都是针对每一个会话进行的,在oracle中,把每一个连接到数据库的用户都称为一个会话,每一个会话之间彼此独立,互不通信,每一个会话独享自己的事务控制,而事务控制之中主要使用两个命令:事务的回滚:ROLLBACK,更新操作回到原点事务的提交:COMMIT,真正的发出更新请求,一旦提交后无法回滚eg: #在会话1中删除一条数据,从另一个会话来查询数据会话1 delete from myemp where empno=7369;会话1 select * from myemp;会话2 select * from myemp;#在会话1中回滚之前的更新操作,再次删除数据,然后提交,再在两个会话中查询数据,在会话1中进行回滚发现已经无法回滚了。会话1 delete from myemp where empno=7369;会话1 commit;会话1 select * from myemp;会话2 select * from myemp;注意:这种事务控制会出现一些问题,例如,某一个会话在更新数据表的时候还没有提交事务,其他会话是无法进行更新的,必须等待之前的会话提交后才可以。 eg: #死锁,会话1执行更新后,在没有提交之前,会话2进行更新会出现等待会话1 update myemp set sal=9000 where empno=7839;会话2 update myemp set sal=8000 where empno=7839;这种问题从大的方面来讲可以称作死锁,但是在oracle之中死锁有很多种类.所有的数据更新一定都会受到事务的控制。

三 数据伪列

ROWNUM(重点)
    ROWNUM为每一个显示的记录都会自动的随着查询生成的行号。 

SQL> select rownum,empno,ename,job,hiredate,sal from emp;//#查询emp表的rownum,empno,ename,job,hiredate和sal 该行号不是永久的,会随着查询的显示变化而变化SQL> select rownum,empno,ename,job,hiredate,sal from emp where deptno=30;//#查询emp表的rownum,empno,ename,job,hiredate和sal SQL> select rownum,empno,ename,job,hiredate,sal from emp where rownum<=5;//#查询前五条记录#查询6-10行记录 错误查询: SQL> select rownum,empno,ename,job,hiredate,sal from emp where rownum between 6 and 10; //执行完成后并没有返回任何数据,因为rownum不是真实列,正确的思路是先查询前10条记录,然后再查询后5条记录,需要使用子查询 正确查询: SQL> select * from (select rownum rn,empno,ename,job,hiredate,sal from emp2 where rownum<=10) temp where temp.rn> 5;

ROWID
    ROWID表示的是每一行数据保存的物理地址的编号。

SQL> select rowid, deptno, dname, loc from dept;每一条记录的ROWID都不会重复,所以即使所有列的内容重复,ROWID也不会重复. 格式为:AAAL+XAAEAAAAANAAA其中: 数据对象号:AAAL+X相对文件号:AAE数据块号: AAAAAN数据行号: AAA

 

总结:
1、多表查询:在进行查询语句编写的时候,一定要确定所需要关联的数据表,而且只要是表的关联查询,就一定会存在笛卡儿积的问题,使用关联字段消除此问题。在使用多表查询的时候要考虑到左右连接的问题,oracle之外的数据库可以使用SQL1999语法控制左右连接。
2、所有的统计函数是用于进行数据统计操作的,而统计要在分组中进行/或者是单独使用,分组使用GROUP BY子句,是在某一列上存在重复数据的时候才会使用分组操作,而分组后的过滤使用HAVING子句完成,所有的分组函数可以嵌套,但是嵌套之后的分组函数之中不能再有其他的查询字段,包括分组字段。
3、子查询:结合限定查询、多表查询、分组统计查询完成各个复杂查询的操作,子查询一般在WHERE和FROM之后出现较多。
4、数据库的更新操作一定要受到事务的控制,事务的两个命令:COMMIT,ROLLBACK,每一个连接到数据库上的用户都用一个会话来表示。
5、数据表的分页查询显示依靠ROWNUM伪列,这个在以后的开发当中必定要使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

总结

以上是生活随笔为你收集整理的day03: oracle的sql增 、删、改,事务处理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。