Oracle的對象——表,同義詞,序列,視圖,索引和簇

一:表 數據庫

 

a.建立表語法格式 安全

create table table_name
(
 字段1 類型1,
 字段2 類型2,
 字段3 類型3(也能夠給字段設置默認值)
 ...
); oracle

 

Sql代碼   收藏代碼
  1. create table student  
  2. (  
  3.  stuno int,  
  4.  stuname varchar(10) not null,  
  5.  stuBirth date default to_date('1980-1-1','YYYY-MM-DD')  
  6. );  

 

查詢一下表的結構:desc table_name 分佈式

Sql代碼   收藏代碼
  1. SQL> desc student;  
  2. Name     Type         Nullable Default                          Comments   
  3. -------- ------------ -------- -------------------------------- --------   
  4. STUNO    INTEGER      Y                                                    
  5. STUNAME  VARCHAR2(10)                                                      
  6. STUBIRTH DATE         Y        to_date('1980-1-1','YYYY-MM-DD')     

 

b.給已存在的表增長新列:alter table tablen_ame add(列名1 列類型, 列名2 列類型...);  函數

Sql代碼   收藏代碼
  1. alter table student add(t3 varchar(10),t4 varchar2(10), t5 number(18,2));  

 

查詢結果以下: 性能

Sql代碼   收藏代碼
  1. SQL> desc student;  
  2. Name     Type         Nullable Default                          Comments   
  3. -------- ------------ -------- -------------------------------- --------   
  4. STUNO    INTEGER      Y                                                    
  5. STUNAME  VARCHAR2(10)                                                      
  6. STUBIRTH DATE         Y        to_date('1980-1-1','YYYY-MM-DD')            
  7. T3       VARCHAR2(10) Y                                                    
  8. T4       VARCHAR2(10) Y                                                    
  9. T5       NUMBER(18,2) Y  

 

新增了T3,T4和T5三列。 spa

 

c.給已存在的表刪除一個列:alter table table_name drop column column_name; 對象

Sql代碼   收藏代碼
  1. alter table student drop column t3;  

 

查詢結果將發現T3列已經刪除。 索引

 

d.給已存在的表中的列重命名:alter table table_name rename column ole_col_name to new_col_name; rem

Sql代碼   收藏代碼
  1. alter table student rename column t4 to hello;  

 

查詢結果將發現T4列已經更名爲hello。

 

e.給已存在的表中的列更改類型
若是表中無數據:alter table 表名 modify 列名 新類型;

Sql代碼   收藏代碼
  1. alter table student modify(hello number);  

 

查詢結果將發現hello列的類型由varchar2類型變成了number類型。

 

若是表中有數據:
alter table 表名 add 新列名 新列類型;
update 表名 set  新列名=舊列名;
alter table 表名 drop column 舊;
alter table 表名 rename column 舊列名 to 新列名;(這句有玄機,好好理解)

 

這種方法會使列名發生變化,並且字段順序增長 有可能發生行遷移,對應用程序會產生影響,使用起來要慎重。

 

f.設置某字段無用:alter table table_name set unused column column_name;

Sql代碼   收藏代碼
  1. alter table student set unused column t5;  

 

這個時候你不管查詢表中的數據仍是查看錶的結構,你都看不到t5這個列了。可是此列仍然存在表中,只不過被Oracle給「關」起來了。無用的字段是沒法恢復的,由於這是DDL語句,要想恢復,只能恢復庫了。

 

刪除無用字段(會把字段刪除掉):alter table student drop unused column;

Sql代碼   收藏代碼
  1. alter table student drop unused column;  

 

這時候這個無用字段被Oracle給「槍斃」了。不再存在了。

 

g.給表增長約束:alter table table_name add constraint constraint_name primary key(column_name);

給一個表中的某個字段增長主鍵或者外鍵約束。

Sql代碼   收藏代碼
  1. alter table student add constraint pk_stuno primary key(stuno);  

 

刪除約束:alter table table_name drop constraint constraint_name;

Sql代碼   收藏代碼
  1. alter table student drop constraint pk_stuno;  

 

表的數據字典爲user_tables,

約束的數據字典爲user_constraints,

 

另外一樣也能夠給一個表中的多個列同時設置爲主鍵,即複合主鍵,這裏就不作介紹了。

 

二:同義詞

 

同義詞是簡化的SQL語句,隱藏對象的名稱和全部者,爲分佈式數據庫的遠程對象提供了位置透明性,提供對對象的公共訪問。其語法以下:
create synonym 命令用於建立同義詞
drop synonym 命令用於刪除同義詞
user_synonyms 包含同義詞的數據字段

 

建立一個同義詞,就用上面的student表。若是你的當前用戶沒有建立同義詞的權限,你要首先用SYS用戶登陸受權。我用的是scott用戶,我就須要SYS用戶給scott用戶受權建立同義詞。

Sql代碼   收藏代碼
  1. grant create synonym to scott;  

 

而後切換回scott用戶,建立student表的同義詞:

Sql代碼   收藏代碼
  1. create synonym ghk_student for student;  

 

這個時候,同義詞ghk_student和表student效力是同樣的。可是我隱藏了student表(還有他的用戶scott,我只須要對同義詞進行操做便可)。

 

爲了說明問題,向ghk_student表中插入試驗數據:

Sql代碼   收藏代碼
  1. insert into ghk_student values(12, 'huangkai', to_date('19830326','YYYYMMDD'), 322);  

 

這個時候查詢student表和ghk_student同義詞的結果是同樣的。

 

刪除同義詞:drop synonym synonym_name;

Sql代碼   收藏代碼
  1. drop synonym ghk_student;  

 

三:序列

 

序列是數據庫提供一種對象,可以提供自動的連續的惟一的值。其建立於法格式以下:

Sql代碼   收藏代碼
  1. create sequence sequence_name  
  2.     [increment by n] 指定增加間隔數  
  3.     [start with n] 初始值  
  4.     [{maxvalue n | nomaxvalue}] 最大值,再增加轉爲起始值  
  5.     [{minvalue n | nominvalue}] 最小值  
  6.     [{cycle | nocycle}] 是否循環,在最大值和初始值間輪迴  
  7.     [{cache n | nocache}]; 自動在緩衝區生成,速度快  

 

序列兩個重要屬性:nextval,currval,實際上是兩個函數
nextval產生下一個值,初始化序列值;
currval獲取當前序列值

下面咱們來作實驗,建立一個序列:

Sql代碼   收藏代碼
  1. create sequence numseq increment by 1 start with 1 maxvalue 999;  

 

建個臨時表:

Sql代碼   收藏代碼
  1. create table temp_test(sno int);  

 

而後向表中插入序列,能夠反覆插入:

Sql代碼   收藏代碼
  1. insert into temp_test(sno) values(numseq.nextval);  
  2. insert into temp_test(sno) values(numseq.nextval);  
  3. insert into temp_test(sno) values(numseq.nextval);  
  4. insert into temp_test(sno) values(numseq.nextval);  
  5. insert into temp_test(sno) values(numseq.nextval);  

 

查詢temp_test表中的內容,能夠看到sno是連續的1,2,3,4,5。這裏我就不截圖了。

 

查詢序列當前值:select numseq.currval from dual;

查詢序列下一個值:select numseq.nextval from dual;

 

再次插入序列,看看結果如何?答曰:temp_test中的sno已經出現了跳點,再也不是6,7,8……等連續的了。

當你在select numseq.nextval from dual時候序列已經增長,再次插入的時候就是增長後的值了,因此和前面不連續了。可是連續插入的話,插入的值仍是連續的。

 

刪除序列語法:drop sequence sequence_name。

序列的數據字典:user_sequence。

 

四:視圖

 

視圖用來顯示一個或多個表中的數據。視圖不真正存儲數據,只是一些查詢語句,成爲「虛表」或「已存儲的查詢」。

視圖優勢:提供另一種級別的表安全性查詢;隱藏數據的複雜性;簡化用戶的SQL命令;將應用程序與基表定義的修改隔離開來;從另外一個角度提供數據。

 

scott用戶沒有建立視圖的權限,能夠用SYS用戶授予其權限,受權語句:

Sql代碼   收藏代碼
  1. grant create any view to scott;  

 

而後切換回scott用戶,建立一個視圖:

Sql代碼   收藏代碼
  1. create or replace view v_student as select stuno,stuname from student;  

 

一個視圖創建完畢。

 

這個視圖就是截取表中的stuno字段和stuname字段,咱們查詢視圖的內容和查詢表中的內容是同樣的(除了列數不一樣)。向表中插入數據在查詢視圖的時候也能查出來,向視圖中插入數據在查詢表的時候也能查出來(沒有的列以默認或空做爲顯示,前提是視圖中沒有的列在表中是容許爲空的,不然視圖插不進去數據)。

 

刪除視圖:drop view view_name;

 

從新編譯視圖:alter view view_name compile;

爲何要從新編譯呢?
咱們建立視圖,在後臺數據庫建立了視圖對象,把語句進行編譯,把編譯後的對象存在視圖裏面,時間長了之後,可能源表發生變化,致使無效,因此須要按期從新編譯視圖。

 

視圖的數據字典:user_views。

 

五:索引

 

索引,又稱爲「快表」,提供快速檢索表中數據的機制,Oracle有索引段用於存儲索引。表更新時,索引亦會連帶更新。索引會加快SQL語句的執行,減小磁盤I/O,create index語句用於建立索引,在物理上和邏輯上獨立於表中的數據,oracle自動維護索引。

 

a.惟一值索引:定義在索引列中的值是不重複的;
oracle自動爲主鍵和惟一鍵建立惟一索引;
create unique index 語句用於建立惟一索引。

 

給上面的student表建立惟一值索引:

Sql代碼   收藏代碼
  1. create unique index idx_stuno on student(stuno);  

 

原來student表中的stuno不是主鍵,也不是惟一的,這回爲其創建惟一值索引。向表中插入數據時候若stuno重複會報錯。

 

b.組合索引:將表中某幾列字段的值合在一塊兒:

Sql代碼   收藏代碼
  1. create index idx_stunoandstuname on student(stuno, stuname);  

 若是我要查詢stuno和stuname,Oracle會從索引段中查詢,而不是從整個表中查詢,提升效率。

 

c.反向鍵索引:會把索引表中的值按位反轉,適合向表中填入數據而不是更新輸入的場合:

Sql代碼   收藏代碼
  1. create reverse index idx_xx on table(column);  

 

d.位圖索引:建立重複率比較大的數據列:

Sql代碼   收藏代碼
  1. create bitmap index idx_job on emp(job);  

 

索引數據字典:user_indexes。

——(索引須要繼續完善)——

 

六:簇

 

簇的含義是彙集的意思,其實和表差很少,create cluster語句用於建立簇,應首先建立簇,而後建立組成簇的表。
優勢:減小磁盤I/O,節省磁盤空間;
缺點:插入操做的性能下降;

 

有主外鍵關係表能夠考慮建立簇。

 

例子:

Sql代碼   收藏代碼
  1. create cluster class_cluster  
  2. (  
  3.     classno varchar2(10)  
  4. );  
  5.   
  6. create table stuClass(classno varchar2(10), classname varchar2(20))  
  7. cluster class_cluster(classno);  
  8.   
  9. create table stuInfo(studentno varchar2(10), stuname varchar(20),  
  10. classno varchar2(10)) cluster class_cluster(classno);  

 

說明:首先建立一個簇class_cluster,簇包括一個字段classno。再建立兩個表stuClass和stuInfo,這兩個表都含有classno字段,類型也和簇同樣,語法格式如上。那麼向表中操做數據和普通表同樣,若是插入數據到表中,那麼classno是存儲在簇當中的。

 

另外,刪除簇時應先刪除含有簇的表。

 

簇的數據字典:user_clasters。

相關文章
相關標籤/搜索