?? oracle(day5).txt
字號:
一、alter table命令
alter table 命令用于修改表的結構(這些命令不會經常用):
增加字段:
alter table 表名 add(字段字,字段類型)
刪除字段:
alter tbale 表名 drop column 字段; (8i 以后才支持)
給列改名:9.2.0才支持
alter table 表名 rename column 舊字段名 to 新字段名;
修改字段
alter table 表名 modify( 字段,類型)
(此時應注意的問題,更改時要看具體值情況之間的轉達換, 改為字符類型時,必須要為空)
not null約束是使用alter table .. modify (..,not null),來加上的。
增加約束:
alter table 表名 add constraint [約束名] 約束(字段);
只能夠增加表級約束。
解除約束:(刪除約束)
alter table 表名 drop 約束;
(對于主鍵約束可以直接用此方法,因為一張表中只有一個主鍵約束名, 注意如果主鍵此時還有其它表引用時刪除主鍵時會出錯)
alter table father drop primary key cascade;
(如果有子表引用主鍵時,要用此語法來刪除主鍵,這時子表還存在只是子表中的外鍵約束被及聯刪除了)
alter table 表名 drop constraint 約束名;
(怎樣取一個約束名:
a、人為的違反約束規定根據錯誤信息獲取!
b、查詢示圖獲取約束名!)
使約束失效或者生效
alter table 表名 disable from primary key; (相當于把一個表的主鍵禁用)
alter table 表名 enable primary key;
(enable 時會自動去檢查表的記錄是不是符合要求,如果有臟數據時必須要先刪除臟數據才可以 enable)
更改表名
rename 舊表名 to 新表名;
刪除表:
trucate table 表名;
(表結構還在,數據全部刪除,釋放表所占的空間,不支持回退,常用刪除大表)
二、索引(index)
創建索引:Creating indexes(概念很重要對系統的性能影響非常大)
建索引的目的就是為了加快查詢速度。
索引就相于一本的書的目錄。索引點系統空間,屬于表的附屬物。刪除一個表時,相對應的索引也會刪除。索引是會進行排序。
truncate 表時索引結構在,但是數據不存在。
FTS --- full table scan 全表掃描
用索引就是為了快速定位數據:(理解時就以字典的目錄為例)
創建索引就是創建key和記錄的物理位置(rowid)組成的鍵值對。索引是有獨立的存儲空間,但是和表是邏輯關聯的,索引和表的關系是依附關系,表被刪除了,索引也沒有存在的意義也就被刪除了
在建表時會根據表中的PK或UK自動的建立唯一性索引。
查看表的rowid:
select rowid,first_name from s_emp;
rowid 定義的信息有:object block table
每條記錄都有自己的rowid
索引由誰創建:用戶,建索引后會使DML操作效率慢,但是對用戶查詢會提高效率,這就是我們建索引的最終目的。
創建一個索引:
create index 索引名 on 表名 (字段名);
create index testindex on test(c1, c2);
索引分為唯一性索引,聯合索引。索引中是不會維護空值的。
哪些字段應該建索引:創建索引就是為了減少物理讀,索引會減少掃描的時間。
經常要用where的子句的地方,所以要用索引.用不用索引,關鍵要看所查詢的數據與所有數據的百分比,表越大,查詢的記錄越少,索引的效率就越高.
替換變量:用&符號來定義替換變量支持交互性提示,對于字符性的數字,一定要寫在單引號之間
set verify on
set verify off;
相當于開關變量,用于控制是否顯示新舊的sql語句
select id,last_name,salary from s_emp where title='&job_title';
更改交互的提示信息:
accept p_dname prompt ' 提示信息';
定義變量:
define p_dname='abc';
三、關于oralce中產生序列(sequence)
create sequence 序列名;
(不帶參數時默認為從1 開始每次遞增 1,oracle中為了提高產生序列的效率一般一次性產生20個序列放入當前會話的序列池中備用以加快效率,序列會出現不連續的動作回退操作不會影響序列取值)
sequence 的參數:
increment by n 起始值
start with n 遞增量
maxvalue n 最大值
minvalue n 最小值
cycle|no cycle 輪回
cache n 緩存(第一次取時會一次取多少個id存起來)
查看sequence 示圖:
desc user_sequences ;
select sequence_name , cache_size , last_number from user_sequences where sequence_name like 's_';
select 序列名.currval from dual 查看當前的序列數
select 序列名.nextval from dual 查看下一個序列數,它會自動給當前的序列加1
為列:nextval currval
(開另一個session時取當前值不成功時,應該先取下一個值,再取當前值)
清空當前會話的內存:
alter system flush shared_pool;(執行此命令要有DBA權限,一般用戶執行出錯)
修改序列:(此命令不常用,只需了解就行不必深究)
alter sequence 序列名 修改項;
刪除序列sequence
drop sequence 序列名;
四、視圖
創建視圖:
creating views 視圖名;
視圖就相當于一條select 語句,定義了一個視圖就是定義了一個sql語句,視圖不占空間,使用view 不會提高性能,但是能簡單化sql語句
(擴展知識: oracle 8i 以后的新示圖)
MV 物化視圖(占存儲空間,把select 結果存在一個空間,會提高查詢視圖,增強實時性,但是存在刷新問題,物化示圖中的數據存在延遲問題,主要應用在數據倉庫中用要用于聚合表)
使用視圖的好處:控制數據訪問權限。
如何創建一個視圖的例子:
create or replace views test_vi as select * from test1 where c1=1;
or replace的意義,如果view存在就覆蓋,不存在才創建。
force|no force ,基表存在是使用,不存在是則創建該表。
此時往表test1(base table 基表)中插入數據時:表中沒能變化,視圖中的數據發生改變
從示圖中插數據時相對應的表會發生改變:
往示圖中插數據時,會直接插進基表中,查看視圖中的數據時,相當于就是執行創建時的select語句。
限制對數據庫的訪問,簡化查詢。
簡單視圖:來自于單表,且select語句中不能包括函數,能進行DML操作。
復雜視圖:來源于多張表,不能執行DML操作。
視圖的約束
with read only 視圖只讀約束(O)
with check option 不允許插入與where條件不符的記錄,類似于check約束的功能(V)
在select from 后也可以使用子查尋,這個寫法也叫做內嵌視圖
例:
select first_name,salary,avgsal from s_emp e,(select dept_id,avg(salary) avgsal from s_emp group by dept_id) s where e.dept_id=s.dept_id and e.salary>s.avgsal;
刪除視圖 drop views 示圖名;
行號(rownum)
關于rownum:
rownum 有個特點要么等于1 要么小于某個值, 不能直接等于某個值, 不能大于某個值。
rownum常用于分頁顯示。
rownum只用于讀入內存的數據。
關于同義詞:
同義詞:相當于別名的作用(***只需了解***)系統自建的同義詞:
user_tables
create synonym asd_s_emp for asd_0606.s_emp ;
目的就是為了給asd_0606_s_emp表起另一個代替的名稱asd.s_emp;注意這個同義詞只能自己使用;
create public synonym p_s_emp fro asd_0606.s_emp; 創建公共的同義詞,但是要權限.
刪除同義詞:
drop synonym 同義詞名稱
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -