在Oracle總結的第一篇中,咱們已經總結了一些經常使用的SQL相關的知識點了...那麼本篇主要總結關於Oralce視圖、序列、事務的一些內容...html
在數據庫中,咱們能夠把各類的SQL語句分爲四大類...程序員
何爲批量操做,就是一次性插入多條數據....在SQL中,咱們查詢出來的數據可當作是一張表,那麼咱們在插入數據的時候,能夠根據查詢出來的數據進行插入...這就能夠當作是批量操做...sql
值得注意的是,若是沒有指定插入哪些字段的話,那麼查詢出來的所有字段均會插入表中..數據庫
將xxx_emp表中全部20號部門的員工,複製到emp表中,批量插入,insert into 表名 select ...語法 insert into emp select * from xxx_emp where deptno=20;
咱們的刪除語法有三種:c#
咱們來對比一下他們的區別:服務器
drop table微信
truncate tablesession
delete fromoracle
事務其實咱們在JDBC章節中已經講解過了,詳情可查看我JDBC的博文。ide
再次明確一下:事務就是讓一個不可分割的子操做造成一個總體,該總體要麼所有執行成功,要麼所有執行失敗
咱們值得注意的是Oracle中的事務與Mysql中的事務操做是有些不一樣的:
Oracle的事務開始:
Oracle的提交事務
Oracle的回滾事務
由於Oracle有實例池這個概念,因此Oracle支持回滾...
Oracle默認支持的隔離級別是:read commited
Mysql默認支持的隔離級別是:reapatable read
Oracle中設置事務隔離級別爲serializable set transaction isolation level serializable;
在上一篇博文已經說了,Oracle將表/用戶都當作是對象...那麼咱們怎麼在scott用戶下訪問hr用戶下的表呢???
其實,咱們只要在訪問表的時候,指定具體的用戶.數據庫表就好了,可是呢,還要看看該用戶有沒有權限查詢別的用戶的數據表,因而就須要賦予權限了...
聲明:scott或hr叫用戶名/方案名/空間名 scott--tiger hr-----lion 查詢當前用戶是誰 show user; 查詢scott本身表空間下的全部對象時,可加,或不加用戶名select * from emp; select * from emp; 或 select * from scott.emp; 以sysdba身份解鎖hr普通賬戶 alter user hr account unlock; 以sysdba身份設置hr普通賬戶的密碼 alter user hr identified by lion; 當scott查詢hr表空間下的全部表時,必須得加用戶名 select * from hr.jobs; 在默認狀況下,每一個用戶只能查詢自已空間下的對象的權限,不能查詢其它用戶空間下的對象 以sysdba身份角色,授予scott用戶查詢全部用戶空間下的對象權限 grant select any table to scott; 以sysdba身份,撤銷scott用戶查詢全部用戶空間下的對象權限 revoke select any table from scott; scott自已查看本身所擁有的權限 select * from user_sys_privs; 從scott用戶空間導航到sysdba用戶空間 conn / as sysdba; 從sysdba用戶空間導航到scott用戶空間 conn scott/tiger; 從scott用戶空間導航到hr用戶空間 conn hr/lion; 查詢hr用戶空間中的全部對象 select * from tab; 從hr用戶空間導航到scott用戶空間 conn scott/tiger; 在scott用戶空間下,查詢hr用戶空間下的jobs表,必須加上hr用戶空間名 select * from hr.jobs;
視圖是一種基於數據表的一種虛表
有的時候,咱們可能只關係一張數據表中的某些字段,而另外的一些人只關係同一張數據表的某些字段...
那麼把所有的字段都都顯示給他們看,這是不合理的。咱們應該作到:他們想看到什麼樣的數據,咱們就給他們什麼樣的數據...一方面就可以讓他們只關注本身的數據,另外一方面,咱們也保證數據表一些保密的數據不會泄露出來...
還有另一個緣由:
咱們在查詢數據的時候,經常須要編寫很是長的SQL語句,幾乎每次都要寫很長很長....上面已經說了,視圖就是基於查詢的一種虛表,也就是說,視圖能夠將查詢出來的數據進行封裝。。。那麼咱們在使用的時候就會變得很是方便...
小總結:
基於emp表全部列,建立視圖emp_view_1,create view 視圖名 as select對一張或多張基表的查詢 create view emp_view_1 as select * from emp; 默認狀況下,普通用戶無權建立視圖,得讓sysdba爲你分配creare view的權限 以sysdba身份,受權scott用戶create view權限 grant create view to scott; 以sysdba身份,撤銷scott用戶create view權限 revoke create view from scott; 基於emp表指定列,建立視圖emp_view_2,該視圖包含編號/姓名/工資/年薪/年收入(查詢中使用列別名) create view emp_view_2 as select empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年收入" from emp; 基於emp表指定列,建立視圖emp_view_3(a,b,c,d,e),包含編號/姓名/工資/年薪/年收入(視圖中使用列名) create view emp_view_3(a,b,c,d,e) as select empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年收入" from emp; 查詢emp_view_3建立視圖的結構 desc emp_view_3; 修改emp_view_3(id,name,salary,annual,income)視圖,create or replace view 視圖名 as 子查詢 create or replace view emp_view_3(id,name,salary,annual,income) as select empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年收入" from emp; 查詢emp表,求出各部門的最低工資,最高工資,平均工資 select min(sal),max(sal),round(avg(sal),0),deptno from emp group by deptno; 建立視圖emp_view_4,視圖中包含各部門的最低工資,最高工資,平均工資 create or replace view emp_view_4 as select deptno "部門號",min(sal) "最低工資",max(sal) "最高工資",round(avg(sal),0) "平均工資" from emp group by deptno; 建立視圖emp_view_5,視圖中包含員工編號,姓名,工資,部門名,工資等級 create or replace view emp_view_5 as select e.empno "編號",e.ename "姓名",e.sal "工資",d.dname "部門名",s.grade "工資等級" from emp e,dept d,salgrade s where (e.deptno=d.deptno) and (e.sal between s.losal and s.hisal); 刪除視圖emp_view_1中的7788號員工的記錄,使用delete操做,會影響基表嗎 delete from emp_view_1 where empno=7788;寫法正確,會影響基表 修改emp_view_1爲只讀視圖【with read only】,再執行上述delete操做,還行嗎? create or replace view emp_view_1 as select * from emp with read only; 不能進行delete操做了 刪除視圖中的【某條】記錄會影響基表嗎? 會影響基表 將【整個】視圖刪除,會影響表嗎? 不會影響基表 刪除視圖,會進入回收站嗎? 不會進入回收站 刪除基表會影響視圖嗎? 會影響視圖 閃回基表後,視圖有影響嗎? 視圖又能夠正常工做了
咱們在使用多表查詢,或者查詢出來的表字段意義不清晰的時候,咱們就使用別名來替代....固然了,別名只針對列名或表名
如今,咱們已經知道的對象有用戶/視圖/表等等其餘對象了,Oracle也提供了同義詞【相似於別名】給咱們進行使用
同義詞的做用
建立與salgrade表對應的同義詞,create synonym 同義詞 for 表名/視圖/其它對象 create synonym e for salgrade; create synonym ev5 for emp_view_5; 以sys身份授予scott普通用戶create synonym權限 grant create synonym to scott; 以sys身份從scott普通用戶撤銷create synonym權限 revoke create synonym from scott; 使用同義詞操做salgrade表 select * from s; 刪除同義詞 drop synonym ev5; 刪除同義詞,會影響基表嗎? 不會影響基表 刪除基表,會影響同義詞嗎? 會影響同義詞
Mysql的自動增加能夠直接在建立表的時候,在字段後面跟上auto increament關鍵字就好了。那Oracle 有沒有自動增加策略呢???
Oracle使用的是序列這麼一個對象....
聲明:**oracle中,只有rownum永遠保持從1開始,且繼續**
那oralce中的序列和Mysql中的自動增加有啥區別???
有的同窗可能會疑問,咱們在分頁的時候用到了rownum這麼一個僞列,爲啥不用它來作自動增加的呢???
rownum的值雖然是惟一和連續的,可是不能一直惟一標識該記錄...也就是說,一旦該記錄刪除了,那麼rownum的值是會變的。
爲何要用序列
爲emp表的empno字段,建立序列emp_empno_seq,create sequence 序列名 create sequence emp_empno_seq; 刪除序列emp_empno_seq,drop sequence 序列名 drop sequence emp_empno_seq; 查詢emp_empno_seq序列的當前值currval和下一個值nextval,第一次使用序列時,必須選用:序列名.nextval select emp_empno_seq.nextval from dual; select emp_empno_seq.currval from dual; 使用序列,向emp表插入記錄,empno字段使用序列值 insert into emp(empno) values(emp_empno_seq.nextval); insert into emp(empno) values(emp_empno_seq.nextval); insert into emp(empno) values(emp_empno_seq.nextval); 修改emp_empno_seq序列的increment by屬性爲20,默認start with是1,alter sequence 序列名 alter sequence emp_empno_seq increment by 20; 修改修改emp_empno_seq序列的的increment by屬性爲5 alter sequence emp_empno_seq increment by 5; 修改emp_empno_seq序列的start with屬性,行嗎 alter sequence emp_empno_seq start with 100; 有了序列後,還能爲主健手工設置值嗎? insert into emp(empno) values(9999); insert into emp(empno) values(7900); 刪除表,會影響序列嗎? 你沒法作insert操做,表真正亡,序列亡 刪除序列,會影響表嗎? 不會 在hibernate中,若是是訪問oracle數據庫服務器,那麼User.hbm.xml映射文件中關於<id>標籤如何配置呢? <id name="id" column="id"> <generator class="increment/identity/uuid/【sequence】/【native】"/> </id>
什麼是索引【Index】
(1)是一種快速查詢表中內容的機制,相似於新華字典的目錄
(2)運用在表中某個/些字段上,但存儲時,獨立於表以外
爲何要用索引
rowid是oracle中惟一肯定每張表不一樣記錄的惟一身份證
索引表把數據變成是有序的....
快速定位到硬盤中的數據文件...
rowid的特色
索引的特色
須要注意的是:Oracle是自動幫咱們管理索引的,而且若是咱們指定了primary key或者unique約束,系統會自動在對應的列上建立索引..
何時【要】建立索引
何時【不要】建立索引
爲emp表的empno單個字段,建立索引emp_empno_idx,叫單列索引,create index 索引名 on 表名(字段,...) create index emp_empno_idx on emp(empno); 爲emp表的ename,job多個字段,建立索引emp_ename_job_idx,多列索引/聯合索引 create index emp_ename_job on emp(ename,job); 若是在where中只出現job不使用索引 若是在where中只出現ename使用索引 咱們提倡同時出現ename和job 注意:索引建立後,只有查詢表有關,和其它(insert/update/delete)無關,解決速度問題 刪除emp_empno_idx和emp_ename_job_idx索引,drop index 索引名 drop index emp_empno_idx; drop index emp_ename_job_idx;
通過@雷厲*風行評論,在建立用戶的時候不用加C##的,若是是12c的話,那麼能夠參考連接:http://www.cnblogs.com/joker-zhao/p/4715052.html
一)用戶 Oracle中的用戶分爲二大類 1)Oracle數據庫服務器建立時,由系統自動建立的用戶,叫系統用戶,如sys。 2)利用系統用戶建立的用戶,叫普通用戶,如scott,hr,c##tiger,zhaojun,... 》用sys登陸,查詢當前Oracle數據庫服務器中已有用戶的名字和狀態 username表示登陸名 expired&locked表示賬號過時和鎖定 open表示賬號如今可用 sqlplus / as sysdba; col username for a30; col account_status for a30; set pagesize 100; select username,account_status from dba_users; 查詢Oracle中有哪些用戶 select * from all_users; 二)建立與刪除普通用戶 能夠在Oracle中建立新的普通用戶,建立普通用戶命令是:create user,在建立普通用戶的同時,應該爲其分配一個具體的表空間,一般叫users。 》用sys登陸,查詢Oracle中有哪些可用存儲空間,全部普通用戶默認爲users存儲空間 select * from v$tablespace; 》用sys登陸,建立普通用戶c##tiger,密碼爲abc,默認使用users存儲空間,即對應硬盤上的一個DBF二進制文件 sqlplus / as sysdba; create user c##tiger identified by abc default tablespace users; 》用sys登陸,爲c##tiger分配users空間無限制使用,即數據庫中DBF文件能夠無限增長,一個DBF文件不夠,會建立第二個DBF文件 sqlplus / as sysdba; alter user c##tiger quota unlimited on users; 》用c##tiger登陸,能進orcl數據庫嗎? sqlplus c##tiger/abc 進不去orcl數據庫 》用sys登陸,刪除普通用戶c##tiger sqlplus / as sysdba; drop user c##tiger cascade; 三)瞭解系統用戶 sys是Oracle中一個重要的系統用戶,sys是Oracle中最高權限用戶,其角色爲SYSDBA(系統管理員) sqlplus / as sysdba 四)權限 權限的最終做用於用戶。即全部用戶在數據庫內的操做對象和可執行的動做都是受到限制的。 Oracle中權限分爲二大類: 1)系統權限 2)對象權限 五)系統權限 針對數據庫中特定操做的許可,例如:讓c##tiger能登陸到orcl數據庫,能在orcl數據庫中建立表 》用sys登陸,獲取系統權限的相關信息,例如:select any table表示針對全部表的select權限 sqlplus / as sysdba; select distinct privilege from dba_sys_privs; 》用sys登陸,爲c##tiger分配create session與數據庫創建會話的權限,即容許該用戶登陸 sqlplus / as sysdba; grant create session to c##tiger; 》用c##tiger登陸,能進orcl數據庫嗎? sqlplus c##tiger/abc 能進去orcl數據庫 》用c##tiger登陸,建立一張tiger的表,能建立嗎? sqlplus c##tiger/abc create table tiger( name varchar2(20) ); 這時c##tiger沒有權限建立表 》用sys登陸,爲c##tiger分配create table權限,即容許建立表 sqlplus / as sysdba; grant create table to c##tiger; 》用c##tiger登陸,建立一張tiger的表,能建立嗎? sqlplus c##tiger/abc create table tiger( name varchar2(20) ); 能夠建立c##tiger表 》用sys登陸,查詢c##tiger所擁有的系統權限 sqlplus / as sysdba; select grantee,privilege from dba_sys_privs where lower(grantee) = 'c##tiger'; grantee表示普通用戶名 privilege權限名 》用sys登陸,撤銷c##tiger的create table權限 sqlplus / as sysdba; revoke create table from c##tiger; 六)對象權限 用戶對已有對象的操做權限,包括: 1)select可用於表,視圖和序列 2)insert向表或視圖中插入新的記錄 3)update更新表中數據 4)delete刪除表中數據 5)execute函數,過程的執行 6)index爲表建立索引 7)references爲表建立外健 8)alter修改表或者序列的屬性 》用sys登陸,查詢c##tiger所擁有的對象權限 sqlplus / as sysdba; col grantee for a10; col table_name for a10; col privilege for a20; select grantee,table_name,privilege from dba_tab_privs where lower(grantee) = 'c##tiger'; 》用sys登陸,爲c##tiger分配對tiger表的全部權限,即增刪改查操做 sqlplus / as sysdba; grant all on c##tiger.tiger to c##tiger; 注意:c##tiger表示空間名 tiger表示該空間下的表名 C##TIGER TIGER FLASHBACK C##TIGER TIGER DEBUG C##TIGER TIGER QUERY REWRITE C##TIGER TIGER ON COMMIT REFRESH C##TIGER TIGER REFERENCES C##TIGER TIGER UPDATE C##TIGER TIGER SELECT C##TIGER TIGER INSERT C##TIGER TIGER INDEX C##TIGER TIGER DELETE C##TIGER TIGER ALTER 》用c##tiger登陸,對tiger表進行增刪改查操做 sqlplus c##tiger/abc; insert into tiger(name) values('AA'); update tiger set name = 'BB'; delete from tiger where rownum = 1; select * from tiger;
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:Java3y