索引
什么是索引?
-- 索引就類似于書的目錄,根據目錄查詢內容會快很多,提高資料查詢效率
創建索引有倆種方式
1、Oracle會自動為主鍵和唯一鍵創建索引
2、手動創建約束,
那么表中什么樣的欄位應該添加索引?
在查詢的時候,經常被用來做為查詢的欄位,應該添加索引
-- 創建索引
create index 索引名字 on 表名(欄位);
create index ename_index on emp(ename);
select * from emp where ename='SMITH';
-- 索引是看不見摸不著的,現在我們的的表資料太少,看不出效果,其實我們已經給ename做了索引,這樣查詢遠比我們之前沒做索引的時候要快很多,
洗掉索引
-- 洗掉索引
drop index 索引名字;
drop index ename_index;
-- 自動創建的約束是無法洗掉的,但是在洗掉主鍵約束和唯一約束的時候才會被洗掉,
視圖
什么是視圖?
-- 我們之前做的子查詢就是一個視圖
-- 視圖也就是虛表,實際上是一個命名的查詢,用戶改變資料的顯示形式,簡化查詢,訪問視圖與表的訪問方式一樣,
視圖有什么好處?
-- 1、可以限制對資料的訪問,讓用戶通過視圖可以看到表中的一部分資料
-- 2、可以使復雜的查詢變得簡單
-- 3、提供了資料的獨立性,用戶不知道資料來源處
-- 4、提供了對相同資料的不同顯示
-- 視圖,就是一個虛表,我們可以從這個表中查詢資料
-- 視圖,就是一個命名的查詢陳述句
-- 任何有效的查詢陳述句都可以作為視圖
創建視圖
create view 視圖名字 as 查詢陳述句;
create view HR_VIEW as select * from emp;
create view XM_VIEW as select empno,ename,mgr,hiredate,deptno from emp;
分配創建視圖權限
-- 一般為了方便,我們都是直接賦值dba權限給用戶
grant dba to scott;
-- 或者只賦值一個創建視圖的權限
grant create view to scott;
查看視圖表結構
-- 我們可以在命令列視窗模式下查看表的結構,也可以查看視圖的結構
desc emp;
desc HR_VIEW;
替換視圖
-- or replace:如果視圖存在,則替換舊視圖,
create or replace view HR_VIEW as select * from emp;
洗掉視圖
drop view 視圖名字;
-- 洗掉視圖不會影響原來的資料,
注意事項
-- 我們平常在做表連接的時候,會出現相同的列,但是不影響我們查詢,但是在創建視圖的時候,不能出現相同列,這個時候我們就不能創建視圖了,
-- 比如
create or replace view view_empinfo
as
select e.*,d.* from emp e,dept d where e.deptno = d.deptno; -- 這條查詢陳述句是沒有問題的,但是在創建視圖的時候,就會報錯,
-- 這個時候,我們就需要用別名,將每個列都查詢出來 或者相同的列只顯示一個
create or replace view view_empinfo
as
select e.empno,e.ename,e.job,e.mgr,e.sal,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno;
視圖有多方便?
-- 假如我們在計算員工年收入的時候,我們每次都需要查詢,非常麻煩,那么我們就可以把年收入計算出來做成視圖,以后就只要在視圖中查詢就可以了
create or replace view view_name
as
select e.empno,e.ename,e.job,e.mgr,e.sal,d.dname,d.loc,sal+nvl(comm,0) 年薪 from emp e,dept d where e.deptno = d.deptno;
-- 那么我以后查詢年薪的時候就可以從視圖中查詢了
select 年薪 from view_name;
視圖可以操作資料嗎,可以做DML操作嗎?
-- 視圖一般用于查詢,不建議DML操作
-- 如果我需要創建一個視圖,并且不能進行DML操作,那么我就要用到下面的寫法
-- with read only 創建只讀視圖,不能執行DML操作
create or replace view view_name
as
select * from emp
with read only;
-- 同樣的,如果我們需要對視圖進行DML操作時,那么我們可以省略 with read only 或者 改為with check option
create or replace view view_name
as
select * from emp
[with check option;]
對視圖進行DML的需要注意什么?
-- 1、如果違反基表的約束條件時,則不能更新,
-- 2、如果視圖中包含鏈接運算子、distnct關鍵字、聚合函式、集合運算子或group by 子查詢的時候,不能更新
-- 3、如果視圖存在偽劣的時候,則不能更新
序列
什么是序列?
-- 序列是Oracle自動給我們生成的一個序列的物件
序列什么用?
-- 序列一般用于生成主鍵或者達到主鍵自增的效果
創建序列
-- 語法
create sequence 序列名字(
start with 1 -- 表示從1開始
increment by 1 -- 表示每次執行的時候,增加多少,一般用1
minvalue 1 -- 序列最小值,一般用了 start with 不會用minvalue(可以省略)
maxvalue 10 -- 序列最大值,表示序列到最大值是停止(可省略)
cache|nocache -- 快取,可省略,默認為 20 , 省略不寫就是 nocache
cycle|nocycle -- 是否生成回圈,一邊和maxvalue使用,表示到maxvalue后從start whit 使用,可省略,省略不寫就代表 nocycle
)
序列的倆個屬性
-- nextval:取序列的值,并且序列的值增加,
-- currval:取序列當前的值,不能直接去當前值,需要執行nextval后才可以
修改序列
alter sequence 序列名字 maxvalue 5000;
-- 注意,不能修改序列的 start whit 值,但是能修改maxvalue、cache、cycle、increment by,
洗掉序列
drop sequence 序列名字;
如何利用序列創建主鍵自增?
-- 創建一個序列
create sequence mysqe
start whit 1
increment by 1
insert into 表名 values(myseq.nextval,'值','值'...)
如何查看序列的值?
-- Oracle為我們提供了一個虛表 dual,序列的值就保存到dual中
select myseq.nextval from dual;
select myseq.currval from dual;
注意:如果序列達不到順序自增的話怎么辦?
-- 關閉延遲技術
ALTER SYSTEM SET deferred_segment_creation=FALSE;
同義詞
什么都是同義詞?
-- 同義詞,就是資料庫物件的一個別名,可以簡化訪問其他用戶的資料庫物件,縮短了物件名稱的長度,同時屏蔽了物件的名稱,使用戶不知道最終的資料來源與那個物件,
創建同義詞的語法
create synonym 同義詞名字 for 表(物件);
create synonym stu for student;
-- 那么以后查詢的時候,我就可以這么使用
select * from stu;
賦值創建同義詞的權限
grant create any synonym to 用戶名;
洗掉同義詞
drop synonym 同義詞;
事務
什么是事務?
-- 一組相關的資料改變SQL陳述句,這組SQL陳述句對資料的改變要么同時成功,要么同時失敗,
-- 自我理解:如果理解事務這個詞呢?在資料庫中,事務指的是可以實作資料庫中的存盤的資料的改變,也就是說insert、update、dalete陳述句,一組sql陳述句,可以實作資料的改變,
/*
事務必須具備以下四個屬性,簡稱ACID 屬性:
原子性(Atomicity):事務是一個完整的操作,事務的各步操作是不可分的(原子的);要么都執行,要么都不執行
一致性(Consistency):當事務完成時,資料必須處于一致狀態
隔離性(Isolation):對資料進行修改的所有并發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴于或影響其他事務
永久性(Durability):事務完成后,它對資料庫的修改被永久保持,事務日志能夠保持事務的永久性
例如銀行轉賬,
孫昊賬戶有1000元,大哥0元,所謂原子性就是孫昊給大哥轉錢,孫昊轉錢和大哥收錢,這兩步必須是同時發生的,如果某一步出錯或者不發生,業務就出現問題,那么這個事務肯定出錯,所謂一致性就是,孫昊和大哥一共1000元,轉完錢后還是1000元,
*/
查看事務
show autocommit;
開啟或關閉事務
set autocommit on|off;
顯式事務
set autocommit off; -- 關閉事務的自動提交
-- 手動呼叫
commit; -- 提交
rollback; -- 回滾 類似于撤銷
隱式事務
set autocommit on; -- 打開事務的自動提交
-- 打開后 create、drop、grant等操作事務是自動提交的
-- 每一個insert、update、delete執行后都會提交到資料庫
事務保存點
-- 語法
savepoint 名字;
-- 用法
insert into stu values(1,'aa');
savepoint s1;
insert into stu values(2,'aa');
savepoint s2;
insert into stu values(3,'aa');
savepoint s3;
insert into stu values(4,'aa');
savepoint s4;
-- 假如在第三條陳述句出錯了,我單純的用回滾的話,那么我之前的陳述句就需要再次添加了,那么我就可以這么回滾
rollback to s3;
鎖
鎖的概念
/*
鎖是用來對資料庫的共享資源并發機制的控制,也就是說鎖是用來保護正在修改的資料,
知道這些資料提價或者回滾事務之后,其他用戶才可以進行修改,
如果沒有鎖,那特么就亂了套了,假如十八和艷子同時對一張表進行操作,
再都沒進行事務提交或回滾的情況下,此時我資料庫該聽誰的命令?
總不能誰漂亮聽誰的吧?聽十八的艷子不服氣,聽艷子的十八又不服氣,
總不能讓倆人打一架吧,誰贏聽誰的?所以只有艷子提交了事務之后,十八才能更新資料,
*/
鎖的型別
-- 分為兩種,行級鎖和表級鎖,
/* 行級鎖:是一種排他鎖,防止其他事務修改此行
在使用 insert、update、delete、select .... for update[WAIT n (等幾秒)| NOWAIT(不等待)|skip locked(跳過)]陳述句的時候,Oracle會自動啟動行級鎖,
當使用commit或者rollback的時候才會釋放鎖
假如一個用戶占據鎖的時候過長怎么辦? 利用管理殺掉該session
select * from v$lock; 查看鎖 拿到sid
select sid,serial# from v$session where sid='141'; 查看sid和 serial
然后執行
alter system kill session 'sid,serial';
*/
/*
表級鎖:鎖定整個表
lock table 表名 in mode(mode就是鎖的模式) mode;
共享鎖:只允許用戶select,不能做insert、update、delete操作,多個用戶可以同時對同一張表進行表級鎖
行共享(row share) -- 禁止排他鎖定表
行排他(row exclusive) -- 禁止使用排他鎖和共享鎖
共享行排他(SHARE ROW EXCLUSIVE) – 比共享鎖更多的限制,禁止使用共享鎖及更高的鎖
排他(EXCLUSIVE) – 限制最強的表鎖,僅允許其他用戶查詢該表的行,禁止修改和鎖定表
*/
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/293247.html
標籤:其他
