ORACLE 約束:
數據庫用來確保數據滿足業務的手段,強制數據符合某些特定條件或者規範纔可以插入
- 主鍵約束: primary key PK
- 唯一約束:unique
- 非空約束:not null
- 外鍵約束:foreign key FK
- 檢查約束: check
- 默認約束: default
主鍵約束:
主鍵是唯一表示某一行的數據方法。
特點:唯一、非空、一張表只有一個主鍵、主鍵列必須有索引,如果沒有會自動創建索引。
語法:
-- 創建表時添加 :
CREATE TABLE 表名(
列名 類型 pirimary key,
...
)
CREATE TABLE 表2(
列名1 類型,
列名2 類型,
... ,
CONSTRAINT 約束名 primary key(列名)
)
-- 創建表之後添加:
-- 表創建之後添加約束可以藉助於圖形界面
-- 也可以通過ALTER TABLE 去添加、修改約束
ALTER TABLE 表名 ADD CONSTRAINT 約束名 PRIMARY KEY(列名)
-- 爲了統一規範,一般通過 表名_關鍵詞來作爲約束名)
唯一約束:
唯一約束可以作用在一列或者多列上,用於確保數據的唯一性。
特點:唯一、會默認創建索引、唯一約束允許爲null(多個null)
外鍵約束:
外鍵約束定義在具有父子關係的子表中,外鍵約束使子表中的列必須對應父表中的主鍵列。用於確保數據的完整性。
特點: 外鍵約束的子表中的列和附表中的主鍵類型一致, 列名可以不同
對應父類中的列必須是主鍵或者唯一鍵
外鍵約束的列允許爲null
語法:
CREATE TABLE 表名(
列 類型 REFERENCES 父表(父表對應的主鍵的列)
)
-- 創建表之後添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 約束名 關鍵詞(子表列) REFERENCES 父表(父表的類)
案例:
--先建父表,後建子表
CREATE TABLE TYPE(
ID NUMBER(5) PRIMARY KEY,
NAME VARCHAR2(200) UNIQUE
)
CREATE TABLE GOODZ(
ID NUMBER(5) PRIMARY KEY,
NAME VARCHAR2(200),
PRICE NUMBER(9, 2),
--外鍵
TYPEID NUMBER(5) REFERENCES TYPE(ID)
)
ALTER TABLE GOODZ ADD CONSTRAINT
GOODZ_FK FOREIGN KEY(T_ID)
REFERENCES TYPE(ID)
注:
創建主外鍵約束時,先創建父表後創建子表
刪除表: 先刪除子表後刪除父表
刪除表中的數據時: 先刪除子表數據再刪除父表中的數據
檢查約束:
檢查約束可以用於給指定的列進行一些簡單的校驗。 比如:性別 男\女
設定某一些值的特定範圍
例子:
CREATE TABLE 表(
SEX VARCHAR2(10) CHECK(SEX IN ('男', '女')),
AGE NUMBER(4) CHECK(AGE > 0 AND AGE <= 100)
)
約束目的:保證存入數據庫的數據是正確的、有意義的數據
SQL語句分類
DDL(Data Defintion Language) 數據定義語言: 用來定義和修改數據庫對象(表結構)
包括:CREATE DROP ALTER TRUNCATE(截斷表)
DDL操作是隱式提交事務, 不需要手動提交,也不能使用rollback
DML(Data Manipulation Language) 數據操作語言:
包括:INSERT DELETE UPDATE
每一次操作都需要做事務 commit / rollback
DCL(Data Control Language) 數據控制語言::用於控制數據庫權限
包括:GRANT 授權 REVOKE 撤銷
GRANT CONNECT, RESOURCE TO ADMIN
REVOKE CONNECT TO ADMIN
TCL(Transaction Control Language) 事務控制語言: commit / rollback
DQL(Data Query Language) 數據查詢語言: SELECT
刪除表
DELETE 和 DROP 和 TRUNCATE 區別?
delete:只刪除表數據,不能刪除表定義,不釋放空間,可以提交或回滾事務,還會觸發觸發器。
truncate:使用語法類似於drop, 也是刪除表中的數據,不需要提交事務, 不能刪除表的定義,
可以釋放空間(相當於把表刪掉,又創建了一張新的表)。
drop:刪除表,會刪除表中的定義,並且會釋放空間,也不需要提交事務。
速度:DROP > TRUNCATE > DELETE
集合運算:
並集 UNION 和 UNION ALL
UNION:將兩個結果集合並, 去重, 會按照默認排序規則排序
UNION ALL : 將兩個結果集合並, 不去重, 不排序
注:合併的兩個結果集, 列的類型和個數相同, UNION 也可以作爲行轉列來使用
行轉列:
涉及的函數:
DECODE(列名,值1,結果1,… [,缺省值]);
CASE 列 WHEN 值1 THEN 結果1 WHEN 值2 THEN 結果2 [ELSE 缺省值] END
SELECT NAME, SUM(CASE COURSE WHEN '語文'
THEN SCORE ELSE 0 END) 語文,
SUM(CASE COURSE WHEN '數學'
THEN SCORE ELSE 0 END) 數學,
SUM(CASE COURSE WHEN '英語'
THEN SCORE ELSE 0 END) 英語
FROM TESTTABLE
GROUP BY NAME
列轉行:
SELECT NAME, '語文' COURSE, CH_SCORE
FROM TESTTABLE2
UNION ALL
SELECT NAME, '數學' COURSE, MA_SCORE
FROM TESTTABLE2
UNION ALL
SELECT NAME, '英語' COURSE, EN_SCORE
FROM TESTTABLE2
交集 INTERSECT :
獲取兩個結果集相同的部分 語法類似於並集
差集 MINUS:
兩個結果集不同的部分
索引:
索引的出現其實就是爲了提高數據查詢的效率,就像書的目錄一樣。
語法:CREATE INDEX 索引名 ON 表名(列[,列2,列3]) [tablespace 表空間名]
注: 主鍵和唯一鍵會默認創建索引
使用:1.如果查詢時使用了添加索引的列作爲查詢條件,則數據庫會默認走索引
2.如果對多列建立索引,代表聯合索引,查詢時條件順序是創建索引的順序來走索引。
EXPLAIN PLAN F5 如果走了索引,就看到了索引的執行計劃。
常見不走索引的情況:
1 . like 使用%進行模糊查詢 不走索引
(如:列 like ‘%xxxx’ 不走索引 列 like ‘xxx%’ 走索引)
2.使用 is null 或 is not null 不走索引
3.where子句中使用了函數 不走索引
4.使用<>, not 不走索引
什麼樣子的列適合加索引?
非空、唯一 且不經常修改的數據還有經常作爲查詢條件的數據。
總結: 索引並不是越多越好, 索引可以增加查詢的效率,但是會降低增刪改的效率。