国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

4.約束&&視圖

2024-07-21 02:53:05
字體:
供稿:網(wǎng)友

什么是約束

約束是表級的強(qiáng)制規(guī)定

有以下五種約束: - NOT NULL - UNIQUE - PRIMARY KEY - FOREIGN KEY - CHECK

表級約束和列級約束

作用范圍:

① 列級約束只能作用在一個列上② 表級約束可以作用在多個列上(當(dāng)然表級約束也可以作用在一個列上)

定義方式: 列約束必須跟在列的定義后面,表約束不與列一起,而是單獨(dú)定義。

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

1.添加約束

alter table [表名] add constraint [約束別名] [約束類別(字段名)]

向表emp2的id列中添加PRIMARY KEY約束(my_emp_id_pk)

ALTER table emp2ADD constraint my_emp_id_pk primary key(id);

2. 修改約束

alter table modify [字段名] [約束]

或者

alter table modify [字段名] [constraint] [別名] [約束] - 例如:把 name 字段修改為 not null約束

alter table emp2 modify name not null;

修改的時候增加別名

alter table emp2 modify salary constraint my_emp2_salary_n not null;

3.check約束

alter table [表名] add constraint [約束別名] check([約束條件])

例子:給表中添加約束,使得salary大于0

alter table emp2 add constraint emp2_salary_min check(salary>0);

4.刪除約束

alter table [表名] drop constraint [約束別名]

5. 約束要注意的地方

非空約束(not null)只能定義在列級唯一約束(unique)的列值可以為空外鍵(foreign key)引用的列起碼要有一個唯一的約束

6.級聯(lián)操作

當(dāng)一個表進(jìn)行操作的時候會影響和他有外檢約束的另外一張表

ON DELETE CASCADE(級聯(lián)刪除): 當(dāng)父表中的列被刪除時,子表中相對應(yīng)的列也被刪除ON DELETE SET NULL(級聯(lián)置空): 子表中相應(yīng)的列置空

假如表emp有一個外鍵dept_id連接到表deptdept_id

constraint dept_fk foreign key(dept_id) references dept(dept_id) on delete cascade;

在創(chuàng)建表的時候就設(shè)置

on delete cascade

on delete set null

視圖

視圖和子表類似,不同的是,對視圖的操作會影響原表的內(nèi)容

視圖是一種虛表。 視圖建立在已有表的基礎(chǔ)上, 視圖賴以建立的這些表稱為基表。向視圖提供數(shù)據(jù)內(nèi)容的語句為 SELECT 語句, 可以將視圖理解為存儲起來的 SELECT 語句. 視圖向用戶提供基表數(shù)據(jù)的另一種表現(xiàn)形式

簡單視圖和復(fù)雜視圖區(qū)別:

特性 簡單視圖 復(fù)雜視圖
表的數(shù)量 一個 一個或多個
函數(shù) 沒有
分組 沒有
DML操作 可以 有時候可以

簡單視圖

創(chuàng)建視圖

注意: 使用scott用戶登陸的時候默認(rèn)是沒有創(chuàng)建視圖權(quán)限的 解決方式: 1. 打開cmd 2. 使用system用戶登錄:sqlplus system/root@orcl 3. 賦權(quán)限:grant create view to scott; 4. 此時scott用戶就獲得了創(chuàng)建view的權(quán)限

實(shí)例:創(chuàng)建視圖empview,來自于對employees的查詢

create view empview as select employee_id,last_name,salary from employees where department_id=80

desc empview查看一下

SQL> desc empview Name Null? Type ----------------------------------------- -------- --------------- EMPLOYEE_ID NOT NULL NUMBER(6) LAST_NAME NOT NULL VARCHAR2(25) SALARY NUMBER(8,2)

此時看到創(chuàng)建的視圖符合我們的意圖

修改視圖

添加上or replace即刻

create or replace view empview as select employee_id,last_name,salary from employees where department_id=80

復(fù)雜視圖

使用組合函數(shù)的查詢創(chuàng)建的視圖為復(fù)雜視圖

實(shí)例:查詢所有部門的平均工資,賦值給empview2

SQL> create view empview2 as select department_id,avg(salary) avg_salary from employees group by department_id;

使用權(quán)限

在創(chuàng)建一個view的時候后面加上with read only表示只讀; 例如:

create view empview3 as select employee_id,last_name,salary from employees where department_id=80 with read only;

此時進(jìn)行uodate操作會提示錯誤

SQL> update empview3 set salary=8000 where last_name='Jhonson';update empview3 set salary=8000 where last_name='Jhonson' *ERROR at line 1:ORA-42399: cannot perform a DML Operation on a read-only view

刪除視圖

很簡單 drop view [視圖圖名]

TOP-N分析

選取前n行的值,或者第n到m行之間的值

實(shí)例說明: 現(xiàn)在想選取出來工資前十名的人員的信息 創(chuàng)建一個empview4

SQL> create view empview4 as select employee_id,last_name,salary from employeesorder by salary desc;

此時要想選擇前十個,是無從下手的,這個時候就要借助rownum這個偽列 例如:

select rownum,employee_id,last_name,salary from employeesorder by salary desc;

但是此時還不能夠使用rownum來作為查詢的條件,因?yàn)閭瘟惺翘摂M的

然后把上面的查詢結(jié)果,作為一個新的表再次查詢

select rownum,employee_id,salary from (select employee_id,salary from employees order by salary desc )where rownum < 11;

輸出:

ROWNUM EMPLOYEE_ID SALARY---------- ----------- ---------- 1 100 24000 2 101 17000 3 102 17000 4 145 14000 5 146 13500 6 201 13000 7 205 12000 8 147 12000 9 108 12000 10 168 1150010 rows selected.

注意 : 對 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都將不能返回任何數(shù)據(jù)。 想要查詢第40–第50的員工信息,只能再次嵌套一次,將rawnum作為一個真實(shí)的一列查詢。

select * from( select rownum rn,employee_id,salary from (select employee_id,salary from employees order by salary desc ) ) where rn>40 and rn<50;

輸出結(jié)果:

RN EMPLOYEE_ID SALARY---------- ----------- ---------- 41 154 7500 42 171 7400 43 172 7300 44 164 7200 45 179 7000 46 161 7000 47 178 7000 48 155 7000 49 113 69009 rows selected.
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 和田市| 民和| 铁岭县| 温宿县| 大石桥市| 资兴市| 岚皋县| 开封县| 吐鲁番市| 庆阳市| 绩溪县| 北安市| 辽中县| 德安县| 金堂县| 通渭县| 遵义市| 南部县| 山西省| 绵竹市| 汉川市| 香格里拉县| 堆龙德庆县| 凌源市| 望城县| 靖江市| 延川县| 嘉善县| 云南省| 忻州市| 长汀县| 大埔县| 水富县| 蚌埠市| 青州市| 滨海县| 措美县| 大洼县| 洛阳市| 大悟县| 雷波县|