約束是表級的強(qiáng)制規(guī)定
有以下五種約束: - NOT NULL - UNIQUE - PRIMARY KEY - FOREIGN KEY - CHECK
作用范圍:
① 列級約束只能作用在一個列上② 表級約束可以作用在多個列上(當(dāng)然表級約束也可以作用在一個列上)定義方式: 列約束必須跟在列的定義后面,表約束不與列一起,而是單獨(dú)定義。
非空(not null) 約束只能定義在列上
alter table [表名] add constraint [約束別名] [約束類別(字段名)]
向表emp2的id列中添加PRIMARY KEY約束(my_emp_id_pk)
ALTER table emp2ADD constraint my_emp_id_pk primary key(id);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;
alter table [表名] add constraint [約束別名] check([約束條件])
例子:給表中添加約束,使得salary大于0
alter table emp2 add constraint emp2_salary_min check(salary>0);
alter table [表名] drop constraint [約束別名]
當(dāng)一個表進(jìn)行操作的時候會影響和他有外檢約束的另外一張表
ON DELETE CASCADE(級聯(lián)刪除): 當(dāng)父表中的列被刪除時,子表中相對應(yīng)的列也被刪除ON DELETE SET NULL(級聯(lián)置空): 子表中相應(yīng)的列置空假如表emp
有一個外鍵dept_id
連接到表dept
的dept_id
在創(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操作 | 可以 | 有時候可以 |
注意: 使用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=80desc 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
即刻
使用組合函數(shù)的查詢創(chuàng)建的視圖為復(fù)雜視圖
實(shí)例:查詢所有部門的平均工資,賦值給empview2
SQL> create view empview2 as select department_id,avg(salary) avg_salary from employees group by department_id;在創(chuàng)建一個view的時候后面加上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 [視圖圖名]
選取前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
這個偽列
例如:
但是此時還不能夠使用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.新聞熱點(diǎn)
疑難解答
圖片精選