一、約束
❤ 1、約束概述
約束作用:
(1)定義規則
(2)確保完整性:包括數據的精確性、可靠性。以確保數據不會出錯,或者盡量減少出錯。
約束的類型:
(1)非空約束
(2)主鍵約束
(3)外鍵約束(右外鍵約束)(左外鍵約束)
(4)唯一約束
(5)檢查約束
❤ 2、非空約束
(1)在創建表時設置非空約束
語法:CREATE TABLE table_name(column_name datatype NOT NULL,...);
(2)在修改表時添加非空約束
語法:ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
注:添加非空約束的字段不能有null數據存在。
(3)在修改表時去除非空約束
語法:ALTER TABLE table_name MODIFY column_name datatype NULL;

在修改表的時候添加非空約束時,先把原有數據刪除:
delete from userinfo;
然后再修改表:
alter table userinfo modify username varchar2(20) not null;
❤ 3、主鍵約束
作用:確保表中的每一行數據的唯一性。
設置了主鍵約束的字段,這個字段必須是非空且值是唯一的;
一個表中只能設置一個主鍵約束;
一個主鍵約束可以有多個字段組成(這個被稱為聯合主鍵或復合主鍵)。
在創建表時設置主鍵約束:
(1)在創建表時設置主鍵約束(列級)
語法:CREATE TABLE table_name(column_name datatype PRIMARY KEY,...);

創建了主鍵約束時它會自動加上非空約束。
(2)在創建表時設置主鍵約束(表級)
語法:CREATE TABLE table_name(column_name datatype,...,CONSTRAINT pk_name PRIMARY KEY(column_name1,...));

在修改表時設置主鍵約束:
(1)在修改表時添加主鍵約束
語法:ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(column_name1,...);
注:如果表中有內容時,准備添加主鍵的字段里的數據必須唯一。


(2)更改約束名稱
語法:ALTER TABLE table_name RENAME CONSTRAINT old_pk_name TO new_pk_name;

(3)禁用主鍵約束
語法:ALTER TABLE table_name DISABLE|ENABLE CONSTRAINT pk_name;

(4)刪除主鍵約束
語法:ALTER TABLE table_name DROP CONSTRAINT pk_name;
或ALTER TABLE table_name DROP PRIMARY KEY [CASCADE]; [CASCADE]為可選項,在級聯操作中使用。

❤ 4、外鍵約束
在創建表時添加外鍵約束:外鍵約束(表示主從表之間的關系)
(1)在創建表時設置外鍵約束(列級)
語法:CREATE TABLE table1(column_name datatype REFERENCES table2(column_name),...); --其中table2為主表,table1為從表
注:1)設置外鍵約束時,主表字段必須為該表的主鍵字段
2)主從表中相應的字段必須是同一個數據類型(外鍵約束的字段和主表的主鍵字段)
3)從表中外鍵字段的值必須來自主表中相應字段的值,或者為null值



(2)在創建表時設置外鍵約束(表級)
語法:CREATE TABLE table_name(column_name datatype,...,CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCES table_name2(column_name)[ON DELETE CASCADE]);
注:1)table_name2為主表名;
2)[ON DELETE CASCADE]表示級聯刪除的意思;
3)約束的名字也是唯一的。

在修改表時添加外鍵約束:
語法:ALTER TABLE table_name ADD CONSTRAINT fk_name FOREIGN KEY(column_name) REFERENCES table_name2(column_name)[ON DELETE CASCADE];
注:1)table_name2為主表名;
2)[ON DELETE CASCADE]表示級聯刪除的意思;
3)約束的名字也是唯一的。
❤ 5、刪除主鍵約束
(1)查看約束
語法:select constrain_name,constraint_type,status from user_constraints where table_name='XXXX';
- status P代表主鍵 R代表外鍵

(2)禁用外鍵約束
語法:ALTER TABLE table_name DISABLE|ENABLE CONSTRAINT fk_name;

(3)刪除外鍵約束
語法:ALTER TABLE table_name DROP CONSTRAINT pk_name;

❤ 6、唯一約束
作用:保證設置唯一約束的字段值的唯一性
唯一約束與主鍵約束的區別:
(1)主鍵約束的字段為非空的,而唯一約束只允許有一個值為null
(2)一張表只能有一個主鍵約束,而唯一約束可以有多個
在創建表時設置唯一約束:
(1)在創建表時設置唯一約束(列級)
語法:CREATE TABLE table_name(column_name datatype UNIQUE,...);

(2)在創建表時設置唯一約束(表級)
語法:CREATE TABLE table_name(column_name datatype,...,CONSTRAINT u_name UNIQUE(column_name));
注:1)唯一約束的名稱(u_name)必須唯一;
2)如果想設置多個唯一約束字段,需要將子句(CONSTRAINT u_name UNIQUE(column_name))重復書寫即可。

在修改表時添加唯一約束:
語法:ALTER TABLE table_name ADD CONSTRAINT u_name UNIQUE(column_name);

禁用唯一約束:
語法:ALTER TABLE table_name DISABLE|ENABLE CONSTRAINT u_name;

刪除唯一約束:
語法:ALTER TABLE table_name DROP CONSTRAINT u_name;

❤ 7、檢查約束
作用:讓表中的值更具有實際意義。
注:檢查約束在一張表中也是可以有多個的。
在創建表時設置檢查約束:
(1)在創建表時設置檢查約束(列級)
語法:CREATE TABLE table_name(column_name datatype CHECK(expressions),...);
注:expressions為條件表達式

(2)在創建表時設置檢查約束(表級)
語法:CREATE TABLE table_name(column_name datatype,...,CONSTRAINT c_name CHECK(expressions));

在修改表時添加檢查約束:
語法:ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK(expressions);

禁用檢查約束:
語法:ALTER TABLE table_name DISABLE|ENABLE CONSTRAINT ck_name;

刪除檢查約束:
語法:ALTER TABLE table_name DROP CONSTRAINT ck_name;

❤ 8、約束小結
- 非空約束 NOT NUL (禁止插入字段為空)
- 主鍵約束 PRIMARY KEY (每張表只能有一個,可以由多個字段構成)
- 外鍵約束 FOREIGN KEY (涉及兩張表之間的關系,約束字段與外表字段匹配,類型相同,數據必須 IN {外表數據})
- 唯一約束 UNIQUE (保證數據的唯一性,可以由多字段構成)
- 檢查約束 CHECK (保證數據值的安全可靠,並允許范圍內)
在創建表時設置約束:

只有非空約束是只有列級設置且非空約束是沒有名字的,其他約束即可以列級設置也可以表級設置。
在修改表時添加約束:
(非空)alter table table_name modify column_name datatype not null;
只有非空約束是用修改字段的方式添加約束的,其他的雷同。
更改約束的名稱:
非空約束是沒有名字的,
所以其他的約束都可以通過以下語法修改:ALTER TABLE table_name RENAME CONSTRAINT old_name TO new_name;可以通過數據字典(user_constraints)來查看。
禁用約束:
非空約束不需要禁用,
其他約束的禁用語法是:ALTER TABLE table_name DISABLE|ENABLE CONSTRAINT constraint_name;可以通過數據字典(user_constraints)來查看。
刪除約束:
非空約束的刪除還是通過修改字段的方式來刪除,即在字段類型后加個NULL即可,
其他的都可以通過語法:ALTER TABLE table_name DROP CONSTRAINT constraint_name;來刪除;
主鍵約束還可以通過語法:ALTER TABLE table_name DROP CONSTRAINT PRIMARY KEY;來刪除;
可以通過數據字典(user_constraints)來查看。
練習知識點:
Oracle中規定一張表中只能有一個主鍵,因此主鍵約束只能有一個。
外鍵約束涉及到兩個表,比如部門表dept包括部門編號(deptno),員工表employee中的部門(deptnum)作為外鍵參照部門表中的deptno字段。
唯一約束要求每個字段不能有重復值,可以有空值,但是空值只能有一個。
二、查詢語句
❤ 查詢概述
- 查詢基本語句;
- 在SQL*PLUS中設置格式(對查詢結果的格式設置);
- 查詢表中的所有字段及指定字段;
- 給字段設置別名(針對查詢結果進行的,並沒有更改字段的名字);
- 運算符和表達式;
- 在select語句中使用運算符;
- 帶條件的查詢;
- 模糊查詢;
- 范圍查詢;
- 對查詢結果排序;
- case...when語句的使用(條件語句);
- decode函數的使用
❤ 1、基本查詢語句
語法:SELECT [DISTINCT] column_name1,...|* FROM table_name [WHERE conditions];
即:Select [Distinct] 列名 .. From 表名 (使用 distinct 不顯示重復數據)
❤ 2、在SQL*PLUS中設置格式
作用:配合select語句使用,設置查詢結果顯示的格式,不會修改數據庫表字段。
(1)設置字段顯示樣式
語法:COLUMN column_name HEADING new_name;
注:COLUMN 可以簡寫成COL

(2)設置字段的格式化樣式
語法:COLUMN column_name FORMAT dataformat;
注:如果是字符類型的值,只能設置它顯示的長度。其中a后面跟數字表示字符串顯示長度,例:a10 表示顯示10位的長度的字符串;數字則用‘9’代表一位,例:999.9 表示整數位為三位,小數位為一位。如果設置的長度超出數據最大長度,則用‘#’顯示。還可以在數字前面加‘$’,例:$999.9 則查詢后顯示的結果會在結果前加上'$'符。




(3)清除設置格式
語法:COLUMN column_name CLEAR;

❤ 3、查詢表中的所有字段及指定字段
(1)查詢所有字段:
語法:select * from table_name;

設置格式:

(2)查詢指定字段:
語法:select column1, ... from table_name;

❤ 4、給字段設置別名
語法:SELECT column_name AS new_name,... FROM table_name;
其中:as是可以省略的,用空格來隔開原字段名和新字段名即可。
注釋:
1)column(col) col_name heading new_name;//設置的是字段的查詢結果的名字
2)column(col) col_name format datatype;//設置的是字段的查詢結果的類型范圍
3)column(col) col_name clear; //清除所設置的格

❤ 5、運算符和表達式
(1)表達式 = 操作數 + 運算符
(2)oracle中的操作數可以是常量、變量和表當中的字段
(3)oracle中的運算符:
算數運算符(+ - * /);
比較運算符(> < = >= <= <>);(如5>2結果為true,布爾類型 )
邏輯運算符(and,or, not)

在select語句中使用運算符:
(1)使用算數運算符

所有工資結果加200,但並不會影響表中的數據。(表中數據進行算術運算后,數據值並不會正真的被改變,改變需要使用update語句)
(2)使用比較運算符


注釋:不等於用!=或者<>表示
❤ 6、帶條件的查詢(where語句)
(1)單一條件查詢


(2)多條件的查詢(利用邏輯運算符來連接表達式)
例:查詢員工姓名是aaa,或者工資大於2000的員工信息




可以注意:運算符是有優先級的。
- 邏輯運算符的優先級:按not、and、or的順序依次遞減
- 比較運算符的優先級高於邏輯運算符
❤ 7、模糊查詢
(1)通配符('_','%')的使用:
一個‘_’代表一個字符,一個‘%’代表0到多個任意字符。
(2)使用LIKE查詢:




❤ 8、范圍查詢
(1)between……and
between ~ and ~查詢的區間包含兩個范圍限制值;
not between ~and~ 查詢不包含在此范圍的值;
范圍查詢,如查找工資在800到2000的(包括了800和2000):
select * from users where salary between 800 and 2000;
如果想要不包括800和2000這兩個數,就可以這樣寫:
select * from users where salary not between 800 and 2000;
(2)in/not in
select * from users where username in('aaa','bbb');
select * from users where username not in('aaa','bbb');
❤ 9、對查詢結果進行排序
語法:SELECT [DISTINCT] column_name1,...|* FROM table_name [WHERE conditions] ORDER BY column_name1 DESC|ASC,...
其中,DESC是降序排序,ASC是升序排序,默認情況下是升序排序


❤ 10、case...when語句
基本語法:([when后面跟的是判斷的條件,then是條件為真是顯示出來的東西])
語法1:CASE column_name WHEN value1 THEN result1, ... [ELSE resultn] END;
語法2:CASE WHEN column_name=value1 THEN result1, ...[ELSE resultn] END;
注:value1、result1需要加單引號,表示字符串,當多個when...then...使用時,中間用空格隔開即可,不能用逗號隔開
語法1示例:

語法二示例:

❤ 11、decode函數的使用
與前面的case ...when .. then (else) end 類似
語法:DECODE(column_name,value1,result1,...,defaultvalue);
( decode與case ...when .. then (else) end 類似,但decode的條件指定為==的意思)
解釋:Select decode(columnname,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)From talbename;

