Oracle筆記.6

 

序列:

自動產生的唯一值;
一個共享的對象;
典型的用法是作爲主鍵的值;
insert into 給主鍵提供值。
替代了應用的代碼;
通過將序列CACHE(預先生成一部分序列號,放入到內存中)到內存中,可以加速對序列的訪問。

CREATE SEQUENCE sequence_name
  [increment by n]//步長
  [start with n]//起始點
  [maxvalue n/nomaxvalue]//遞增
  [minvalue n/nominvalue]//遞減
  [cycle/nocycle]//循環
  [cache n/nocache];//n爲預先生成序列號的個數,默認爲20。

查詢序列:
user_sequences
last_number 序列將要產生的下一個號是多少;

select sequence_name,min_value,max_value,increment_by last_number from user_sequences;

僞列:NEXTVAL 引用下一個可用的序列值,不同的用戶每次引用都會獲得一個唯一的值。
      CURRVAL 得到當前的值(剛被領走的號)。
在CURRVAL執行前必須先通過NEXTVAL得到一個初始的值。

序列名.NEXTVAL/CURRVAL
  
序列發生間隙是正常的,保證唯一即可。


序列的修改:
   ALTER SEQUENCE sequence_name 
   increment by
  maxvalue
  cycle    
  cache;

start with 不能修改。

刪除序列:

drop  SEQUENCE sequence_name;

 


索引:

一個方案中的對象;
被ORACLE服務器用來加速對錶的查詢;
通過使用快速路徑訪問方法快速定位數據;
與表獨立存放;
被ORACLE服務器使用和維護。

一定是 WHERE 條件的纔有可能使用索引。


手動創建索引:
CREATE INDEX index_name on table_name (col_name);

考慮創建索引的情況:
*、包含了大量不同值的列;
*、包含了大量空值的列;
*、一個或者多個列經常被一起出現在 WHERE 條件中或者作爲連接的條件出現;
*、表的數據量很大,而且對錶的查詢經常是得到表中數據的2%到4%(少量數據).


不應該創建索引的情況:
*、一個很小的表;
*、列很少被用於查詢的條件;
*、表上的大多數查詢是得到大量數據的;
*、表中的數據經常發生變動;
*、要被索引的列被作爲條件表達式的一部分。


查看:
user_indexes得到索引的定義和唯一性。

user_ind_columns 得到索引的名稱,表名和列名。
select ic.index_name,ic.column_name,ic.column_position,
 ic.uniquenes
from user_indexes ix,user_ind_columns ic
where ic.index_name=ix.index_name and ic.table_name='table_name';

刪除索引:
DROP INDEX index_name;
爲了刪除索引,必須擁有索引或者擁有DROP ANY INDEX 權限。 

 

控制用戶的訪問

數據庫的安全性

系統安全性:
 系統權限(system privilege),獲得訪問數據庫的能力。
  超過一百個
  創建新用戶:
   CREATE USER user_name IDENTIFIED BY password;
  刪除用戶
  刪除表
 授予權限:
  GRANT priv_list TO user/public/role(角色);
  grant create session ,create table,create sequence to user_name;   
  在授予建表權限的同時也應該賦予存儲空間。
 分配配額:ALTER  USER user_name QUOTA nM ON space_name;

數據安全性:
 對象權限(object privilege),獲得維護數據庫的能力。
 
 每種對象的權限都不相同。
 對象的所有者擁有對象的所有權限。
 對象的所有者可以將自己的對象權限賦予其他人。   

 GRANT object_priv_list [(col_list)]
 ON owner.object TO user/role/public
 [WITH GRANT OPTION];--將權限授予用戶的同時,該用戶也擁有了授予其他用戶對象權限的功能。
 (及聯授予)會導致及聯移除。

 移除權限:
 REVOKE priv_list/all  ON object FROM user;
 
方案:數據庫對象的集合,包括表、視圖、序列.....。


角色:
 CREATE ROLE role_name;
 GRANT priv_list TO role_name;
 GRANT role_name TO user_list/role_list;

修改口令:
方法 (1)ALTER USER user_name IDENTIFIED BY password;
 (2)password + 回車
 
USER_SYS_PRIVS 當前用戶的系統權限。
USER_ROLE_PRIVS 當前用戶的角色權限。
USER_tab_privs_made 用戶對象被授予的他人的信息。

 


使用集合操作

UNION

select employee_id,job_id from employees
union
select employee_id,job_id from job_history;

兩個表的並集,但不顯示重複行。
執行的時候要先排序再剔重,所以結果集是有序的。

union all

也是兩個表的並集,而且顯示重複行。
語法同上。

intersect

select employee_id,job_id from employees
intersect
select employee_id,job_id from job_history;


minus

select employee_id,job_id from employees
minus
select employee_id,job_id from job_history;

e-j=e-e與j的交集;
j-e=j-j與e的交集;

注:
在select 列表中的表達式必須有同樣的數目和類型。

 匹配 SELECT 語句
 select employee_id,job_id,salary from employees
 union
 select employee_id,job_id,0      from job_history; 

括號可以用拉修改序列的執行順序。

ORDER BY 子句:
 只能在整個集合的最後出現;
 可以按照第一個 SELECT 語句中的列名,別名或者位置號排序。  

 

 


GROUP BY 子句的增強

CUBE 操作符的 GROUP BY

在 GROUP BY 子句中使用 ROLLUP 或者 CUBE 來產生分組小計;


ROLLUP 分組產生包括規則的分組結果和小計的結果的組合;
GROUP BY [ROLLUP](col_name_list)
ROLLUP:
a       ab abc

  abc
 ab ab
a a a
all all all

CUBE 分組產生包括 ROLLUP 產生的結果和交叉分組小計。
cube:

a ab abc

a ab abc
all a ab
 b ac
 all bc
  a
  b
  c
  all

GROUPING 函數
參數一定是在CUBE或ROLLUP裏進行分組排序的字段或表達式之一。

通過1或0來判斷結果集中的空值是由於本身列的值是空的,還是由於使用CUBE或ROLLUP產生的空值。
1 代表是由於分組產生的空值,沒有參與分組。
0 代表是由於列本身產生的空值,參與了分組,但分組中沒有包含它。

GROUPING SETS

可以使用 GROUPING SETS 在同一個語句中定義多個組集。

只需要訪問一次基表。
不需要寫很複雜的UNION語句。
GROUPING SETS 子句中組合的元素越多,語句的執行性能就越好。

group by GROUPING SETS((abc),(ab),(bc),(a),(b))


組合列:

是一個列的組合,在分組計算時被作爲一個單元處理。

 


高級子查詢

成對子查詢:
行內視圖的性能比成對子查詢的性能高。

相關子查詢:
主查詢的字段在子查詢裏做條件(特徵)。
主查詢先執行,取出第一條數據,把該數據傳入子查詢做比較,返回查詢結果給主查詢,主查詢根據這個結果再做查詢
依次類推
直到主查詢中沒有可查詢列爲止。

 

EXISTS操作符

EXISTS 操作符測試子查詢的結果是否存在;
返回 TRUE 或 FALSE
查詢機制:


如果一個子查詢找到了結果:

在內部子查詢中不在繼續執行
條件被設爲TRUE

如果一個子查詢沒有找到結果:
條件被設爲FALSE

select col_list from table_name tab_alias

where exists (select 'x' from table_name where col=tab_alias.col);
用的是相關子查詢

NO EXISTS操作符

和NOT IN 相對應,速度要快,性能好。

UPDATE 中的相關子查詢

update emp e
set department_name in(select d.department_name from departments d where e.department_id=d.department_id);

delete 中的相關子查詢

 

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