Orcale學習筆記(五)

本筆記包含:約束,視圖,TOP-N,序列,索引
一、約束——約束是表級的強制規定
創建時間是建表的同時,建表之後。約束分爲兩類:
表級約束——可以作用在多個列上,列級約束——只能作用在一個列上
1)NOT NULL——非空約束,只能定義在列上
Create Table table_name(
column_1 Number(6),
column_2 Varchar2(15),
column_3 Data NOT NULL,
column_4 Varchar2(10)
CONSTRAINT table_name_column_4_nn
NOT NULL,
……………);
當沒有顯示聲明約束名時,系統會自動指定約束名
2)UNIQUE——唯一標識約束,只能定義在列上
Create Table table_name(
column_1 Number(6) UNIQUE,
column_2 Varchar2(15),
column_3 Data NOT NULL,
column_4 Varchar2(10) NOT NULL UNIQUE,
………………
CONSTRAINT table_name_column_2 UNIQUE(column_2));
Prinmary Key 擁有自定義的唯一標識約束
3)Primary Key——主鍵,唯一標識約束
Create Table table_name(
column_1 Number(6) NOT NULL PRIMARY_KEY ,
column_2 Varchar2(15) UNIQUE,
column_3 Data NOT NULL,
column_4 Varchar2(10) ,
………………
–CONSTRAINT table_name_column_1_pk PRIMARY_KEY(column_1));
主鍵必須包含唯一的值,主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
4)Foreign Key——外鍵
Create Table table_name(
column_1 Number(6) NOT NULL PRIMARY_KEY ,
column_2 Varchar2(15) UNIQUE,
column_3 Data NOT NULL,
column_4 Varchar2(10) FOREIGN KEY REFERENCES table_name1(column_x),
………………
–CONSTRAINT table_name_column_4_fk FOREIGN_KEY(column_4) REFERENCES table_x(column_y));
FORFOREIGN KEY: 在表級指定子表中的列 REFERENCES: 標示在父表中的列
數據庫外鍵定義了一個可選項,用來設置當主鍵表中的被參考列的數據發生變化時,外鍵表中響應字段的變換規則的。
update 則是主鍵表中被參考字段的值更新,delete是指在主鍵表中刪除一條記錄:on update 和 on delete 後面可以跟的詞語有四個
no action , set null , set default ,cascade
no action 表示 不做任何操作, set null 表示在外鍵表中將相應字段設置爲null; set default 表示設置爲默認值
cascade 表示級聯操作,就是說,如果主鍵表中被參考字段更新,外鍵表中也更新,主鍵表中的記錄被刪除,外鍵表中改行也相應刪除
eg: constraint table_fk foreign key(column_x) references table_y(column_z) on delete cascade
5)Check——定義每一行必須滿足的條件
Create Table table_name(
column_1 Number(6) NOT NULL PRIMARY_KEY ,
column_2 Varchar2(15) UNIQUE,
column_3 Data NOT NULL,
column_4 Number(3) check (column_4 > 0 and column_4 < 999),
………………
);
二、視圖——基於 SQL 語句的結果集的可視化的表
對視圖進行操作會對原有基礎表的數據進行修改,其中當視圖定義時包含以下元素之一時,不能使用DML語句,但是在定義視圖的時候,使用 with read only 可以屏蔽DML操作。
組函數 GROUP BY DISTINCT(去重) ROWNUM(僞列)
列的定義爲表達式(不能進行 update 和 insert)
表中非空的列在視圖定義中未包括(不能進行insert)
1)創建視圖
Create View table_name12_vu(column_1, column_2,column_3)
AS Select tn1.column_x, MIN(tn2.column_y), AVG(tn1.column_z)
From table_name1 tn1, table_name2 tn2
Where condition
Group By tn1.column_x
With Read Only
2)修改視圖
Create Or Replace View table_name12_vu(column_1, column_2,column_3)
AS Select tn1.column_x, MIN(tn2.column_y), AVG(tn1.column_z)
From table_name1 tn1, table_name2 tn2
Where condition
Group By tn1.column_x
With Read Only
3)刪除視圖
DROP VIEW view_name;
刪除視圖只是刪除視圖的定義,並不會刪除基表的數據
三、TOP-N分析——分頁查詢
Select *
From(
Select ROWNUM as rn1, column_x, column_y, column_z ……
From (Select column_x, column_y, column_z …… From table_name
Order By column_x

)
Where rn1 <= 50 and rn1 >= 40
注意:ROWNUM僞列,是Oracle數據庫對查詢結果自動添加的一個僞列,編號從1開始。
ROWNUM在物理上(查詢目標表中)並不存在,是每一次查詢過程中動態生成的,所以稱爲“僞列”。
對 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都將不能返回任何數據。where中不能使用外層rownum列的別名
通常情況下,內層排序,外層設定範圍。子查詢和主查詢分別會產生各自的ROWNUM僞列,而此處用的是主查詢自己的僞列。
當進行分頁查詢的時候,通常需要進行三層Select。
最裏層進行排序,中間層產生用於選擇的僞劣,最外層將中間層的僞劣變成實列。
四、序列——生成主鍵
1)創建序列:
Create SEQUENCE sequence_name
Start with 1 –開始值
Increate by 1 –增量
Minvalue 1 | Nominvalue –最小值 | 沒有最小值
Maxvalue 999 | Nomaxvalue –最大值 | 沒有最大值
Cycle | Nocycle –循環 | 不需要循環
Cache 20 | Nocache –內存中 sequence 的數量 | 不在內存中放入序列值
注意:當設置了cache後,能夠增加系統的處理效率,但是當數據庫發生異常重啓後,內存中的 sequence 會丟失
序列出現裂縫的情況,1)回滾, 2)系統異常, 3)多個使用了同一個序列
當創建的序列可以循環的時候,序列達到最大值時,會從最小值開始新的循環
2)使用序列
使用序列的場合:
- 不包含子查詢、snapshot、VIEW的 SELECT 語句
- INSERT語句的子查詢中
- INSERT語句的values中
- UPDATE 的 SET中
Insert table_name(id,name,……) values(sequence_name.nextval, ‘xxx’, ……)
3)修改序列:
Alter SEQUENCE sequence _name Maxvalue 999999
Alter SEQUENCE sequence_name Increate by 2
………………
注:只能修改序列的增量、最大值、最小值、是否循環、是否放入內存,並且修改只對以後產生的序列有效
修改最大值,新的最大值需要比之前的最大值要大,若要修改開始值需要刪除序列再重建
4)刪除序列
Drop SEQUENCE sequence_name
五、索引——加快數據庫查詢速度
1)創建索引
Creat [UNIQUE] | [BITMAP] INDEX index_name –UNIQUE 唯一索引 BITMAP 位圖索引
On Table_name(column_x[ASC | DESC],column_y,…………) –ASC升序(缺省值) DESC降序
創建規則: 1)應該創建在Where子句,連接條件,Group By,Order By語句中常用的列上
2)表經常被訪問且表的數據量大,訪問的數據大概佔總量的2%~4%
3)Orcale在創建具有主鍵約束和唯一性約束的時候自動生成唯一索引
4)經常進行DML語句的列,不適合創建索引,因爲每次DML操作都需要維護索引
5)對於按範圍查找的列,數據量很大時,最好建立索引,因爲建立索引的時候就已經排序好了
6)在多個列上建立索引(複合索引)是,只有在Where語句中,包含建立索引時第一個列纔會使用索引
2)修改索引
Alter Index index_name0 rename to index_name1; –重命名索引
Alter Index index_name coalesce; –合併索引
Alter Index index_name rebuild; –重建索引
注:合併索引是整理數據庫中的冗餘空間,然後合併。
重建索引是將舊的索引進行刪除,然後生成新的索引。
3)刪除索引
Drop Index index_name
六、SQL優化
1)SQL語句最終執行效果的順序是:From -> Where -> Group By -> Order By
在From中,對錶的解析是從右到左,需要將小表放在右邊,使得生成的基礎表成本更低
在Where中,對條件的解析也是從後往前,需要優先將能過濾更多的數據的條件放在後面
2)在查詢條件(where)語句中,使用索引,並且在語句中儘量避免索引失效 ,索引會失效的情況如下:
–發生了隱式條件轉換 –進行了算術運算(+,-,*,/) –對生成了索引的列使用了函數
–使用<>,not in, not exist, !=, or –在like中’%_’在前 –使用複合索引時,單獨引用了非第一列的索引列
–當字符型數據爲全數字,在where中引用時未添加”單引號 –將空的變量值直接與運算符(符號)進行比較(應採用IS NULL, IS NOT NULL, ISNULL()函數進行操作)
3)用 exists 代替 in eg:select cloumn_x from table_namea where num in (select cloumn_x from table_nameb)
–> select column_x from table_namea where exists(selcet 1 form table_nameb where a.column_x = column_x)
4)使用 union 代替 or eg:select cloumn_x from table_name where clolumn_y = yyy or cloumn_z = zzz
–> select cloumn_x from table_name where cloumn_y = yyy union all (select cloumn_x from table_name where cloumn_z = zzz)
5)任何地方都不能使用 select * from table_name …………操作,用具體的字段代替 “ * ”
6)多使用 commit 語句, 使用 truncate 代替 delete ,使用 where 代替 having , 使用 >= 代替 >

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章