难点重点

难点重点

回滚实物rollback  提交事务commit
在数据更新时,oracle会默认开始一个数据库事务,在这个事务没有提交以前,其他人或其他窗口查询不到这里新增或修改的数据
  --这种现象称为数据库的锁---数据查询不到,因为该行数据表被锁住了,称为行级锁.
  --在进行数据库操作时,数据一会可见,一会不可见这样的现象称为:脏读
  --脏读什么时候出现?在更新数据时,如果发生了事务的回滚,且在事务回滚前进行了数据的查询,这样的查询就会造成数据的脏读.

--回滚事务使用rollback命令
 rollback;--事务一旦回滚,则事务结束,当前更新的数据会回滚更新之前.且不能再提交
 
 
 --执行数据更新后,如果没有问题时需要提价事务,提交事务使用commit命令
 --数据一旦提交,则永久性保存到数据库中(一旦提交则事务结束,不能再回滚)
 commit;
 
 --数据事务的几个特性
 --原子性 :执行数据更新时,要么一起成功要么一起失败.即在事务中的更新操作时一个不可分割的原子操作.
 
 --一致性:在事务操作的前后(回滚前后,提交前后),每次查询到的数据都是一样的.
 --开始事务前,每次查询到的数据一定是相同的;回滚事务后,每次查询到的数据一定是相同的;提交事务后,每次查询到的数据一定是相同的;
 
 --隔离性:事务一旦开启,如果没有提交或回滚,其他窗口(事务)是无法看到当前事务修改后的内容的
 
 --持久性:数据一旦提交,则永久性保存到数据库中(一旦提交则事务结束,不能再回滚);
 --       事务一旦回滚,则事务结束,当前更新的数据会回滚更新之前.且不能再提交

 --关于行级锁的更多理解:在事务中数据一旦被修改,该行记录就被事务锁住;其他事务在该事务完成前无法修改数据.
 -- 一个程序在事务中修改了数据,如果它不结束事务.此时有其他程序对数据进行更新操作,后来的程序会被事务锁住.
 -- 如果事务永远不结束,称为数据库事务的死锁

--行级锁与表级锁
-- 对单行数据的锁定称为行级锁,行级锁发生在两个事务之间,进行了同一条数据的更新操作.
-- 对数据库表的锁定称为表级锁,表级锁发生在一个事务修改了表数据,另一个事务进行表结构的调整.对表结构的修改会被数据修改事务锁定.



To_ char(regdate,’yyyy-mm-dd  hh24:mi:ss’) 时间加格式多用于查询
To_date(‘2016-06-12 15:45:53’ , ‘yyyy-mm-dd hh24:mi:ss’)


--使用时间函数进行时间查询
--使用to_char函数进行时间转换:to_char(时间,时间格式)
-- yy,yyyy年  mm月份  dd日期  hh表示12小时  hh24表示24小时  mi 分钟 ss秒钟
select userid,uaccount,age,to_char(regdate,'yyyy-mm-dd hh24:mi:ss') from libuser; 
--时间到分钟
select userid,uaccount,age,to_char(regdate,'yyyy-mm-dd hh24:mi') from libuser; 
--时间到小时
select userid,uaccount,age,to_char(regdate,'yyyy-mm-dd hh24') from libuser; 
--时间到日期
select userid,uaccount,age,to_char(regdate,'yyyy-mm-dd') from libuser; 

--使用to_date函数把时间字符串转换成时间
-- 语法:to_date('时间字符串','时间格式'),注意时间字符串一定要和时间格式匹配
update libuser set regdate=to_date('2016-6-12 15:45:53','yyyy-mm-dd hh24:mi:ss') where userid=10007;


增加列的数值

--把linling的年龄增加1
  update libuser set age =age-1 where uaccount='linling';     
  commit;
  

  --查询linling十年后有多少岁
  --在查询列中,如果包含有表达式或函数,则查询的列名会发生改变.此时可以使用别名进行显示(使用别名时可以包含<或不包含>as)
  select userid,uaccount,passwd,age+10  ,to_char(regdate,'yyyy-mm-dd hh24:mi:ss') from libuser where uaccount='linling'; 
  
  select userid,uaccount,passwd,age+10 as age ,to_char(regdate,'yyyy-mm-dd hh24:mi:ss') regdate from libuser where uaccount='linling';   





插入序列号,理解序列号

 --注意,在表关系数据操作中,必须先添加主键表的数据才能增加或修改外键表的数据
  
  --创建序列的语法
  --在进行数据库数据操作时,经常需要一组不重复的数字作为序号使用.在oracle可以使用序列进行实现.[在sql server和mysql中还有自增列可用]
  create sequence SEQ_booktype;
  
  --创建序列的完整脚本
  create sequence SEQ_BOOKTYPE 
    minvalue 1
    maxvalue 9999999999999999999999999999
    start with 1
    increment by 1
    cache 20;
    
   --新增一个书籍分类,使用序列生成表的主键
    insert into booktype(bid,btname) values(seq_booktype.nextval,'计算机');
    insert into booktype(bid,btname) values(seq_booktype.nextval,'文学');
    insert into booktype(bid,btname) values(seq_booktype.nextval,'历史');
    insert into booktype(bid,btname) values(seq_booktype.nextval,'地理');
    
    
     insert into booktype(bid,btname) values(seq_booktype.nextval,'医疗卫生');
     insert into booktype(bid,btname) values(seq_booktype.nextval,'航空航天3');
    
    commit;
    
    --使用序列可以生成一组连续的号码,可以使用(序列名.nextval)进行序列的调用;
    --但是这组号码一旦被使用则无法重用(说明:currval可以取出最后一条进行重用)
    --
    select seq_booktype.currval as 序号 from dual; 
   
   select * from booktype;
   
   
   --序列的一些特性:
   --1.序列创建不能直接使用currval读取当前值,即序列创建后默认是没有值的,必须先调用nextval生成序列号
   --2.当调用 nextval生成序列号时,会根据cache的大小一次生成一批序列号(注意:生成的序列号需要调用nextval才会被消费掉)
   --3.当使用nextval消费完一批序列号时,该序列又会根据cache大小生成一批  -----在实际应用中,可以根据系统需要设置cache大小进行程序优化
   --4.cycle可以循环生成序列号,循环时会从minvalue开始增长;第一次使用时会从start with开始
   --5.
   -- Create sequence 
    create sequence SEQ_TEST
    minvalue 20
    maxvalue 200
    start with 41
    increment by 1
    cache 20
    cycle
    order;
    
   select seq_test.currval as 序号 from dual;
   
   select seq_test.nextval as 序号 from dual;
   
   
   
   --使用主键表的主键更新外键表的外键
   
   --根据书名和分类名修改书籍的分类
   --把<oracle项目化编程>的分类设置成"计算机"
   --子查询:在sql命令中,如果某个条件是一个查询语句,则该查询语句称为子查询语句
   --在包含子查询的语句中,会先执行子查询再执行主查询(也可能是更新语句)
   update book set btype=(select bid from booktype where btname='航空航天3') where bookname='oracle项目化编程';
    update book set btype=(select bid from booktype where btname='计算机') where bookname='JAVA项目化编程';
    update book set btype=(select bid from booktype where btname='医疗卫生') where bookname='WEB项目化编程';
   commit;
   



表关联设置


使用index对数据查询进行优化


  --使用索引index对数据查询进行优化
  --当数据量达到一定程度时,查询消耗的时间会越来越长.可以考虑建立索引优化查询
  --索引适合在更新(增,删,改)操作很少的表中进行创建,通常这张会有密集的查询,当数据量很大时才考虑建立索引
  --索引适合创建在查询条件最多的列中,如果经常查询的列有多个,可以考虑创建联合索引
  --注意:索引并非越多越好,索引一旦创建则每次更新数据时都会重建索引;索引太多会导致每次更新数据的事务时间变长,导致更新性能严重下降
  --创建索引的语法:
  -- Create/Recreate indexes 
  --单一索引
   create index IDX_BOOK_BOOKNAME on BOOK (bookname);
  
  -- Drop indexes --索引不可以修改,索引的修改叫重建Recreate索引;索引可以删除
   drop index IDX_BOOK_BOOKNAME;
  -- Create/Recreate indexes 
  --组合索引
   create index idx_book_namepa on BOOK (bookname, author, publisher);



使用视图进行查询优化


--使用视图进行查询优化
  --视图是一种虚拟的表,它不占用数据库的表空间
  --视图的数据不能通过增,删除,改命令进行修改(对视图数据的修改,不会影响到原始数据表的数据)-----视图对数据的使用具有很好的隔离性(安全性)
  --视图的新增和修改的语法是一致的
  --视图的删除使用drop命令
  create or replace view Bookview as
  select isbn,bookname,publisher,publishdate,btname
    from book b,booktype bt
   where b.btype=bt.bid

  select * from bookview;
  
  --删除视图
  drop view bookView;
  

 

posted @ 2016-11-07 21:31  binbgo  阅读(152)  评论(0编辑  收藏  举报