难点重点
难点重点 回滚实物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;