难点重点
回滚实物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;
来源:http://www.cnblogs.com/bingo584235807/p/6040745.html