Oracle約束 SQL語句分類 集合運算 索引 相關知識點講解

ORACLE 約束:

數據庫用來確保數據滿足業務的手段,強制數據符合某些特定條件或者規範纔可以插入

  1. 主鍵約束: primary key PK
  2. 唯一約束:unique
  3. 非空約束:not null
  4. 外鍵約束:foreign key FK
  5. 檢查約束: check
  6. 默認約束: default

主鍵約束:

主鍵是唯一表示某一行的數據方法。
特點:唯一、非空、一張表只有一個主鍵、主鍵列必須有索引,如果沒有會自動創建索引。
語法:

-- 創建表時添加 :
CREATE TABLE 表名(
列名  類型 pirimary key...
)

CREATE TABLE2(
列名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 不走索引

什麼樣子的列適合加索引?

非空、唯一 且不經常修改的數據還有經常作爲查詢條件的數據。
總結: 索引並不是越多越好, 索引可以增加查詢的效率,但是會降低增刪改的效率。

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