(4)Oracle——————約束,視圖,序列和索引

1,約束

2,視圖

3,視圖

4,索引

約束

1,什麼是約束?
  • 約束是表級的強制規定
  • 有以下五種約束:
    NOT NULL
    UNIQUE
    PRIMARY KEY
    FOREIGN KEY
    CHECK
  • 如果不指定約束名 ,Oracle server 自動按照 SYS_Cn 的格式指定約束名
2,表級約束和列級約束?
  • 作用範圍:
    ①,列級約束只能作用在一個列上
    ②,表級約束可以作用在多個列上(當然表級約束也 可以作用在一個列上)

  • 定義方式:列約束必須跟在列的定義後面,表約束不與列一起,而是單獨定義。

  • 非空(not null) 約束只能定義在列上

3,NOT NULL 約束
CREATE TABLE employees(
       employee_id  NUMBER(6),
       first_name VARCHAR2(20) NOT NULL,//系統命名
       job_id CONSTRAINT ji_nn NOT NULL VARCHAR2(10),//用戶命名
       CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID)
);
4, UNIQUE 約束
CREATE TABLE employees(
    employee_id      NUMBER(6),
    last_name        VARCHAR2(25) UNIQUE,--系統命名
    email            VARCHAR2(25),
    salary           NUMBER(8,2),
    commission_pct   NUMBER(2,2),
    hire_date        DATE NOT NULL,
    CONSTRAINT emp_email_uk UNIQUE(email) --用戶命名
    );
5,PRIMARY KEY 約束
CREATE TABLE departments(
    department_id        NUMBER(4),
    department_name      VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL,
    manager_id           NUMBER(6),
    location_id          NUMBER(4),
    CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
6,FOREIGN KEY 約束
CREATE TABLE employees(
    employee_id      NUMBER(6),
    last_name        VARCHAR2(25) NOT NULL,
    email            VARCHAR2(25) UNIQUE,
    salary           NUMBER(8,2),
    commission_pct   NUMBER(2,2),
    hire_date        DATE NOT NULL,
    department_id    NUMBER(4),
    CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
    REFERENCES departments(department_id) on delete cascade
);
  • FOREIGN KEY: 在表級指定子表中的列
  • REFERENCES: 標示在父表中的列
  • ON DELETE CASCADE(級聯刪除): 當父表中的列被刪除時,子表中相對應的列也被刪除
  • ON DELETE SET NULL(級聯置空): 子表中相應的列置空
7,添加約束
ALTER TABLE employees 
      ADD CONSTRAINT  emp_manager_fk 
      FOREIGN KEY(manager_id) REFERENCES employees(employee_id);
8,刪除約束
ALTER TABLE employees DROP CONSTRAINT  emp_manager_fk;

9,無效化約束
  • 在ALTER TABLE 語句中使用 DISABLE 子句將約束無效化。
ALTER TABLE employees DISABLE CONSTRAINT emp_manager_fk;
10,激活約束
  • ENABLE 子句可將當前無效的約束激活
ALTER TABLE	employees ENABLE CONSTRAINT	emp_manager_fk;
  • 當定義或激活UNIQUE 或 PRIMARY KEY 約束時系統會自動創建UNIQUE 或 PRIMARY KEY索引
11,查詢約束
  • 查詢數據字典視圖 USER_CONSTRAINTS
SELECT constraint_name, constraint_type, search_condition
  FROM user_constraints
 WHERE table_name = 'EMPLOYEES';

視圖

1,視圖的概念
  • 視圖是一種虛表。
  • 視圖建立在已有表的基礎上, 視圖賴以建立的這些表稱爲基表。
  • 向視圖提供數據內容的語句爲 SELECT 語句, 可以將視圖理解爲存儲起來的 SELECT 語句.
  • 視圖向用戶提供基表數據的另一種表現形式
2,爲什麼使用視圖
  • 控制數據訪問
  • 簡化查詢
  • 避免重複訪問相同的數據
3,簡單視圖和複雜視圖

在這裏插入圖片描述

4,創建,查詢,修改,刪除視圖
  • 創建視圖
create or replace view empview 
as 
select employee_id emp_id,last_name name,department_name
from employees e,departments d
Where e.department_id = d.department_id
  • 查詢視圖
SELECT * FROM	empview;
  • 修改視圖(使用CREATE OR REPLACE VIEW 子句修改視圖)
CREATE OR REPLACE VIEW empview
  (emp_id, name,  department_id)
AS SELECT  employee_id, first_name || ' ' || last_name, 
           department_id
   FROM    employees
   WHERE   department_id = 80;
  • 刪除視圖(刪除視圖只是刪除視圖的定義,並不會刪除基表的數據)
drop view empview
5, 視圖中使用DML的規定
  • 可以在簡單視圖中執行 DML 操作
  • 當視圖定義中包含以下元素之一時不能使用delete:
    組函數
    GROUP BY 子句
    DISTINCT 關鍵字
    ROWNUM 僞列
  • 例如:
create or replace view sal_view
as select
avg(salary) avg_sal from employees
group by department_id
  • 當視圖定義中包含以下元素之一時不能使用update:
    組函數
    GROUP BY子句
    DISTINCT 關鍵字
    ROWNUM 僞列
    列的定義爲表達式

  • 當視圖定義中包含以下元素之一時不能使insert:
    組函數
    GROUP BY 子句
    DISTINCT 關鍵字
    ROWNUM 僞列
    列的定義爲表達式
    表中非空的列在視圖定義中未包括

6, 屏蔽 DML 操作
  • 可以使用 WITH READ ONLY 選項屏蔽對視圖的DML 操作
  • 任何 DML 操作都會返回一個Oracle server 錯誤
CREATE OR REPLACE VIEW empvu10
    (employee_number, employee_name, job_title)
AS SELECT	employee_id, last_name, job_id
   FROM     employees
   WHERE    department_id = 10
   WITH READ ONLY;
7, Top-N 分析
`
  • 查詢最大的幾個值的 Top-N 分析:
SELECT ROWNUM, e.empno, e.ename
  FROM emp e
 WHERE ROWNUM <= 5
 ORDER BY e.empno;
  • 注意:
    對 ROWNUM (僞列)只能使用 < 或 <=, 而用 =, >, >= 都將不能返回任何數據。

序列

1,什麼是序列?
  • 序列:
    可供多個用戶用來產生唯一數值的數據庫對象
    自動提供唯一的數值
    共享對象
    主要用於提供主鍵值
    將序列值裝入內存可以提高訪問效率
  • 創建序列CREATE SEQUENCE 語句
CREATE SEQUENCE sequence
       [INCREMENT BY n]  --每次增長的數值
       [START WITH n]    --從哪個值開始
       [{MAXVALUE n | NOMAXVALUE}]
       [{MINVALUE n | NOMINVALUE}]
       [{CYCLE | NOCYCLE}]     --是否需要循環
       [{CACHE n | NOCACHE}];  --是否緩存登錄
2, 創建序列
  • 創建序列EMP_SEQ爲表 emp提供主鍵
CREATE SEQUENCE EMP_SEQ
                INCREMENT BY 10
                START WITH 120
                MAXVALUE 9999
                NOCACHE
                NOCYCLE;
3,查詢序列
  • 查詢數據字典視圖 USER_SEQUENCES 獲取序列定義信息
SELECT	sequence_name, min_value, max_value, 
	increment_by, last_number
FROM	user_sequences;
  • 如果指定NOCACHE 選項,則列LAST_NUMBER 顯示序列中下一個有效的值
  • NEXTVAL 和 CURRVAL 僞列
  • NEXTVAL 返回序列中下一個有效的值,任何用戶都可以引用
  • CURRVAL 中存放序列的當前值
  • NEXTVAL 應在 CURRVAL 之前指定 ,否則會報CURRVAL 尚未在此會話中定義的錯誤。
Insert into emp(empno,ename) values(seq.nextval,’c’);
4,刪除序列
  • 使用 DROP SEQUENCE 語句刪除序列
  • 刪除之後,序列不能再次被引用
DROP SEQUENCE emp_seq;

索引

  • 一種獨立於表的模式對象, 可以存儲在與表不同的磁盤或表空間中
  • 索引被刪除或損壞, 不會對錶產生影響, 其影響的只是查詢的速度
  • 索引一旦建立, Oracle 管理系統會對其進行自動維護, 而且由 Oracle 管理系統決定何時使用索引。用戶不用在查詢語句中指定使用哪個索引
  • 在刪除一個表時,所有基於該表的索引會自動被刪除
  • 通過指針加速 Oracle 服務器的查詢速度
  • 通過快速定位數據的方法,減少磁盤 I/O
1,創建索引
  • 自動創建: 在定義 PRIMARY KEY 或 UNIQUE 約束後系統自動在相應的列上創建唯一性索引
  • 手動創建: 用戶可以在其它列上創建非唯一的索引,以加速查詢
  • 在表 EMP的列 LAST_NAME 上創建索引
CREATE INDEX 	emp_last_name_idx
ON 		emp(last_name);
2,什麼時候需要創建索引
  • 以下情況可以創建索引:
    列中數據值分佈範圍很廣
    列經常在 WHERE 子句或連接條件中出現
    表經常被訪問而且數據量很大 ,訪問的數據大概佔數據總量的2%到4%
3,什麼時候不要創建索引
  • 下列情況不要創建索引:
    表很小
    列不經常作爲連接條件或出現在WHERE子句中
    查詢的數據大於2%到4%
    表經常更新

  • 索引不需要用,只是說我們在用name進行查詢的時候,速度會更快。當然查的速度快了,插入的速度就會慢。因爲插入數據的同時,還需要維護一個索引。

4,查詢索引
  • 可以使用數據字典視圖 USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息
SELECT	ic.index_name, ic.column_name,
	    ic.column_position col_pos,ix.uniqueness
FROM	user_indexes ix, user_ind_columns ic
WHERE	ic.index_name = ix.index_name
AND	ic.table_name = 'EMP';
5,刪除索引
  • 使用DROP INDEX 命令刪除索引
DROP INDEX emp_last_name_idx;
  • 只有索引的擁有者或擁有DROP ANY INDEX 權限的用戶纔可以刪除索引,刪除操作是不可回滾的
6,同義詞-synonym
  • 使用同義詞訪問相同的對象:
    方便訪問其它用戶的對象
    縮短對象名字的長度
CREATE SYNONYM e FOR emp;
select * from e;
7,創建和刪除同義詞
  • 爲視圖DEPT_SUM_VU 創建同義詞
CREATE SYNONYM  d_sum
FOR  dept_sum_vu;
  • 刪除同義詞
DROP SYNONYM d_sum;

下一章,(5)Oracle——————控制用戶權限,SET 操作符和高級子查詢

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