前言:
這篇我們來看對數據庫的數據定義DDL,數據更新和 數據控制
一、數據定義
1.數據庫對象
什麼是數據庫對象?
數據庫對象是數據庫的組成部分,數據庫對象主要包含:表,索引,視圖,存儲過程,缺省值,規則,觸發器,用戶,函數等
數據庫對象 | 描述 |
---|---|
表 | 表是數據庫中的一種特殊數據結構,用於存儲數據對象以及對象之間的關係,由行和列組成的 |
索引 | 索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息 |
視圖 | 視圖是從一個或幾個基本表中導出的虛表,可用於控制用戶對數據訪問 |
存儲過程 | 存儲過程是一組爲了完成特定功能的SQL語句的集合。一般用於報表統計、數據遷移等 |
缺省值 | 缺省值是當在表中創建列或插入數據時,對沒有指定其具體值的列或列數據項賦予事先設定好的值 |
規則 | 規則是對數據庫表中數據信息的限制。它限定的是表的列 |
觸發器 | 觸發器是一種特殊類型的存儲過程,通過指定的事件觸發執行。一般用於數據審計、數據備份等 |
函數 | 函數是對一些業務邏輯的封裝,以完成特定的功能。函數執行完成後會返回執行結果 |
2、DDL分類
DDL(Data Definition Language數據定義語言),用於定義或修改數據庫中的對象,主要分爲三種類型語句:CREATE、ALTER和DROP
- CREATE用來創建數據庫對象;
- ALTER 用來修改數據庫對象的屬性;
- DROP則是用來刪除數據庫對象
涉及表的SQL語言
功能 | 相關SQL |
---|---|
創建表 | CREATE TABLE |
修改表屬性 | ALTER TABLE |
刪除表 | DROP TABLE |
刪除表中所有數據 | TRUNCATE TABLE |
3、創建表
語法格式:
CREATE [[ GLOBAL ] TEMPORARY ] TABLE [ IF NOT EXISTS ][ schema_name.] table_name
{ relational_properties
| [ ( column_name [ DEFAULT expr [ ON UPDATE expr ] ] [ AUTO_INCREMENT ]
[COMMENT 'string']
[COLLATE collation_name] [inline_constraint] | out_of_line_constraint [ ,...] ) ] AS query}
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
[ physical_properties ]
[ TABLESPACE tablespace_name ]
[ table_properties ]
[ CRMODE { PAGE | ROW } ]
[ NOLOGGING]
注意:
創建當前用戶的表,用戶需要被授予CREATE TABLE系統權限;如果是創建其他用戶的表,用戶需要被授予CREATE ANY TABLE系統權限,普通用戶不可以創建系統用戶對象。
其中,表名、列名(數據類型、 size)在創建表時必須指定。
參數說明:
參數 | 描述 |
---|---|
GLOBAL | 創建全局表。 |
TEMPORARY | 創建臨時表。臨時表只在當前會話可見,本會話結束後會自動刪除。創建臨時表時可以在TEMPORARY前指定GLOBAL。全局臨時表是所有連接都可以引用此臨時表,只有當創建全局臨時表的連接和引用全局臨時表的連接全部都斷開後,全局臨時表才被刪除 |
IF NOT EXISTS | 創建表時,如果表已經存在,則不做改動直接返回;如果表不存在,則創建新表。 |
[schema_name.]table_name | 表名,不能和用戶下表重名。 |
relational_properties | 表屬性,包括列名、類型、行內約束和行外約束 |
例子1
創建education表
CREATE TABLE education(staff_id INT, higest_degree CHAR(8) NOT NULL, graduate_school VARCHAR(64), graduate_date DATETIME, education_note VARCHAR(70));
例子2
創建分區表training。---->分區表是把邏輯上的一張表根據某種方案分爲幾張物理塊進行存儲,這張邏輯上的表稱之爲分區表,物理塊稱之爲分區。
CREATE TABLE training(staff_id INT NOT NULL, course_name CHAR(20), course_period DATETIME,
exam_date DATETIME, score INT)
PARTITION BY RANGE(staff_id)
(
PARTITION training1 VALUES LESS THAN(100),
PARTITION training2 VALUES LESS THAN(200),
PARTITION training3 VALUES LESS THAN(300),
PARTITION training4 VALUES LESS THAN(MAXVALUE)
);
4、修改表屬性
ALTER TABLE功能指通過更改、添加、刪除列和約束來更改表的定義,功能包括:
- 列的添加、刪除、修改、重命名。
- 約束的添加、刪除。
- 約束的啓動和禁用。
- 修改分區的名稱。
- 修改分區的表空間。
語法格式:
ALTER TABLE [ schema_name. ]table_name
{ alter_table_properties
| column_clauses
| references_clause
| constraint_clauses
| partition_clauses
| enable_disable_clause
| set_interval_clause
}
注意:
執行該語句的用戶需要有ALTER ANY TABLE系統權限,普通用戶不可以修改系統用戶對象。
增加表中列屬性時,保證表中無記錄。
修改表中列屬性時,保證表中所有記錄該列爲NULL。
例子:
training表中添加列full_masks
ALTER TABLE training ADD full_masks INT;
在training表中刪除列course_period
ALTER TABLE training DROP course_period;
修改列的數據類型
ALTER TABLE training MODIFY course_name VARCHAR(20);
添加約束
ALTER TABLE training ADD CONSTRAINT ck_training CHECK(staff_id>0);
ALTER TABLE training ADD CONSTRAINT uk_training UNIQUE(course_name);
補充:
- Unique表示唯一性約束,惟一約束列的列值不能重複,但可以爲NULL。
- check可以通過任何基於邏輯運算符返回 TRUE 或 FALSE 的邏輯(布爾)表達式創建 CHECK 約束。比如CHECK (salary BETWEEN 1000 AND 5000)表示列salary取值只能是1000到5000之間
5、刪除表
語法格式:
DROP [TEMPORARY] TABLE [ IF EXISTS ] [ schema_name. ]table_name [CASCADE CONSTRAINTS][ PURGE ]
參數說明
參數 | 描述 |
---|---|
TEMPORARY | 表示臨時表 |
IF EXISTS | 表示是否存在,存在就刪除 不存在執行刪除也不會報錯 |
CASCADE CONSTRAINTS | 如果被刪除的父表被別的子表的外鍵引用,那麼刪除父表會報錯,在這種情況下,使用CASCADE CONSTRAINTS則可以刪除父表,並且把引用該父表的外鍵也刪除 |
PURGE | 刪除表默認放入回收站, PURGE表示直接刪除 |
例子:
刪除表training,放到回收站
DROP TABLE IF EXISTS training;
直接刪除表training
DROP TABLE IF EXISTS training PURGE;
從回收站中恢復表training
FLASHBACK TABLE training TO BEFORE DROP;
查看回收站中的內容(通過語句)
select * from recyclebin$;
6、索引
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。
索引的SQL語句
功能 | 相關SQL |
---|---|
創建索引 | CREATE INDEX |
修改索引屬性 | ALTER INDEX |
刪除索引 | DROP INDEX |
索引的好處,以及理解?
索引可以大大提高SQL的檢索速度。拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查找到需要的字。
例如:有個員工表,存了20萬數據,想要查詢員工id爲10000的員工信息。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到爲止;在id上建了索引後,即可在索引中查找。由於索引是經過算法優化過的,因而查找次數要少的多。可見,索引可以快速訪問數據。
- 索引的分類
索引按照索引列數分爲單列索引和多列索引,按照索引使用方法可以分爲普通索引、唯一索引、函數索引、分區索引
按索引列數分 | 描述 |
---|---|
單列索引 | 僅在一個列上建立索引。 |
多列索引 | 多列索引又稱爲組合索引。一個索引中包含多個列,只有在查詢條件中使用了創建索引時的第一個字段,索引纔會被使用。 |
按索引使用方法分 | 描述 |
---|---|
普通索引 | 默認創建的B-Tree索引。 |
唯一索引 | 列值或列值組合唯一的索引。建表時會在主鍵上自動建立唯一索引。 |
函數索引 | 建立在函數基礎之上的索引。 |
分區索引 | 在表的分區上獨立創建的索引,在刪除某個分區時不影響該表的其他分區索引的使用。 |
- 創建索引
語法格式:
CREATE [ UNIQUE ] INDEX [IF NOT EXISTS ] [ schema_name. ]index_name ON table_index_clause [ CRMODE
{ PAGE | ROW } ]
table_index_clause 子句:
[ schema_name. ]table_name ( { [function_name()]column_name [ ASC | DESC ] } [ ,... ] )
index_attributes
注意:
同樣,要執行該語句也要權限。執行該語句的用戶需要有CREATE INDEX、 CREATE ANY
INDEX系統權限,普通用戶不可以創建系統用戶對象
索引自身也佔用存儲空間、消耗計算資源,創建過多的索引將對數據庫性能造成負面影響(尤其影響數據導入的性能,建議在數據導入後再建索引)。因此,僅在必要時創建索引。
參數說明:
參數 | 描述 |
---|---|
UNIQUE | 創建唯一性索引,每次添加數據時檢測表中是否有重複值。如果插入或更新的值會導致重複的記錄時將生成一個錯誤。 |
index_name | 要創建的索引名。 |
table_name | 要創建索引的表名,可以有用戶修飾。 |
ONLINE | 在線創建索引 |
CRMODE { PAGE | ROW } |
例子:
在普通表posts上在線創建索引
--創建普通表posts。
CREATE TABLE posts(post_id CHAR(2) NOT NULL, post_name CHAR(6) PRIMARY KEY, basic_wage INT,
basic_bonus INT);
--創建索引idx_posts。
CREATE INDEX idx_posts ON posts(post_id ASC, post_name) ONLINE;
- 修改索引
語法格式:
ALTER INDEX [ schema_name. ]index_name [ ON [schema_name.] table_name ]
{ rebuild_clauses
| rename_clauses
}
參數介紹:
參數 | 描述 |
---|---|
rebuild_clauses | |
REBUILD ONLINE | 在線創建或重建索引。這個功能的主要作用是在創建和重建索引過程中,大幅度減少對錶加排他鎖的時間,從而不阻塞在線業務的運行。 |
REBUILD TABLESPACE tablespace_name | 複製索引數據到其他表空間。 |
rename_clauses | |
RENAME TO [schema_name.] index_name_new | 待重命名的索引名。 |
例子:
在線重建索引
ALTER INDEX idx_posts REBUILD ONLINE;
重命名索引
ALTER INDEX idx_posts RENAME TO idx_posts_temp;
- 刪除索引
語法格式:
DROP INDEX [ IF EXISTS ] [ schema_name. ]index_name [ ON [schema_name.]table_name ]
參數說明
參數 | 描述 |
---|---|
IF EXISTS | 索引不存在時,直接返回成功。 |
[schema_name.] index_name | 待刪除索引名。 |
ON [ schema_name. ] table_name | 開啓ENABLE_IDX_CONFS_NAME_DUPL配置項後,不同表支持索引名重名,刪除索引時必須指定表名 |
例子:
DROP INDEX IF EXISTS idx_posts ON posts;
7、視圖
視圖是從一個或幾個基本表中導出的虛表,可用於控制用戶對數據訪問,所涉及的SQL語句,如下表所示
功能 | 相關SQL |
---|---|
創建視圖 | CREATE VIEW |
刪除視圖 | DROP VIEW |
理解視圖:
視圖與基本表不同,數據庫中僅存放視圖的定義,而不存放視圖對應的數據,這些數據仍存放在原來的基本表中。若基本表中的數據發生變化,從視圖中查詢出的數據也隨之改變。從這個意義上講,視圖就像一個窗口,透過它可以看到數據庫中用戶感興趣的數據及變化。
視圖的作用:
- 簡化了操作把經常使用的數據定義爲視圖。
- 安全性,用戶只能查詢和修改能看到的數據
- 邏輯上的獨立性,屏蔽了真實表的結構帶來的影響。有了視圖之後,程序可以建立在視圖之上,從而程序與數據庫表被視圖分割開來。
- 創建視圖
語法格式:
CREATE [ OR REPLACE ] VIEW [ schema_name. ]view_name [ ( alias [ ,... ] ) ] AS subquery
參數說明:
參數 | 描述 |
---|---|
[OR REPLACE] | 創建視圖時,若視圖存在則更新。 |
[schema_name.] view_name | 視圖名。 |
[( alias [ ,… ])] | 視圖列別名,若不給出,將根據後面子查詢自動推導列名。 |
AS subquery | 子查詢。 |
例子:
創建視圖privilege_view,若該視圖存在則更新該視圖
CREATE OR REPLACE VIEW training_view AS SELECT staff_id, score from training;
- 刪除視圖
語法格式
DROP VIEW [ IF EXISTS ] [ schema_name. ]view_name
參數說明
參數 | 描述 |
---|---|
IF EXISTS | 視圖存在,則執行刪除。 |
[schema_name.] view_name | 待刪除的視圖。 |
例子:
DROP VIEW IF EXISTS privilige_view;
8、序列
- 定義序列
序列可以產生一組等間隔的數值,能自增,主要用於表的主鍵。所涉及的SQL語句,如下表所示。
功能 | 相關SQL |
---|---|
創建序列 | CREATE SEQUENCE |
修改序列屬性 | ALTER SEQUENCE |
刪除序列 | DROP SEQUENCE |
- 創建序列
向當前數據庫中增加一個新的序列生成器。當前用戶爲該生成器的所有者
語法格式:
CREATE SEQUENCE [ schema_name. ]sequence_name
[ INCREMENT BY bigint
| START WITH bigint
| { MAXVALUE bigint | NOMAXVALUE }
| { MINVALUE bigint | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE bigint | NOCACHE }
| { ORDER | NOORDER }
] [ ... ]
例子:
創建序列seq_auto_extend,序列起點爲10,步長爲2,最大值爲200,序列到達最大值時可循環
CREATE SEQUENCE seq_auto_extend START WITH 10 MAXVALUE 200 INCREMENT BY 2 CYCLE;
得到序列的下一個值或當前值。
SELECT seq_auto_extend { NEXTVAL | CURRVAL } FROM DUAL;
通過序列實現id的自增,把創建好的序列加進去
CREATE TABLE test (id number(6), name varchar(20),constraint ts_id primary key(id));
insert into test values(seq_auto_extend.nextval,'weifan');
- 修改序列屬性
語法格式
ALTER SEQUENCE [ schema_name. ]sequence_name
[ INCREMENT BY bigint
| { MAXVALUE bigint | NOMAXVALUE }
| { MINVALUE bigint | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE bigint | NOCACHE }
| { ORDER | NOORDER }
] [ ... ]
例子:
修改序列seq_auto_extend。–修改步長爲4,最大值爲400。
ALTER SEQUENCE seq_auto_extend MAXVALUE 400 INCREMENT BY 4 CYCLE;
- 刪除序列
語法格式:
DROP SEQUENCE [ IF EXISTS ] [ schema_name. ]sequence_name
例子:
刪除序列seq_auto_extend。
DROP SEQUENCE IF EXISTS seq_auto_extend;
二、數據更新
1. 數據插入
在表中插入新的數據
注意事項:
• 只有擁有表INSERT權限的用戶,纔可以向表中插入數據。
• 如果使用RETURNING子句,用戶必須要有該表的SELECT權限。
• 如果使用query子句插入來自查詢裏的數據行,用戶還需要擁有在查詢裏使用的表的SELECT權限。
• INSERT事務提交是默認關閉的。會話退出時,需要顯式COMMIT,否則記錄將丟失。
• 執行該語句的用戶需要有表的INSERT權限或者INSERT ANY TABLE的系統權限。普通用戶不允許insert系統SYS用戶對象。
• INSERT …SELECT形式,select_list列數必須與待插入的字段數一樣。
• INSERT中單行數據量需小於64000字節。
語法格式:
格式一:
值插入,構造一行記錄並插入到表中。
INSERT [hint_info] [IGNORE] [ INTO ] [ schema_name. ]table_name [ ( column_name [ , ... ] ) ] VALUES ( expression [ , ... ] )
格式二:
查詢插入,通過SELECT子句返回的結果集構造一行或多行記錄插入到表中。
INSERT [IGNORE] [ INTO ] [ schema_name. ]table_name [table_alais][ ( column_name [ , ... ] ) ]select_clause
格式三:
先插入記錄,如果報主鍵衝突錯誤則執行UPDATE操作,更新指定字段值。
INSERT [ INTO ] [ schema_name. ]table_name [ ( column_name [ , ... ] ) ] VALUES ( expression [ , ... ] ) ON DUPLICATE KEY UPDATE {column_name = expression} [ , ... ]
參數說明
參數 | 描述 |
---|---|
IGNORE | 用於忽略會導致重複關鍵字錯誤的記錄,不支持和ON DUPLICATE KEY UPDATE 同時使用。 |
table_name | 待插入的表名。 |
column_name | 待插入的表字段名。如果insert語句所指定的字段名包含表中的所有字段,則可能省略字段名。取值範圍:已存在的字段名。 |
expression | 插入字段的值或表達式。 |
select_claus | SELECT查詢結果集作爲新值插入到表中 |
select_list | 指定查詢列。 |
ON DUPLICATE KEY UPDATE | 指定插入記錄的主鍵和已有記錄的主鍵衝突時執行UPDATE操作。根據索引定義的順序遍歷各列查找衝突記錄。例如,表t1包含三列,列名分別爲f1、f2、f3,索引建立順序爲f3->f2->f1 |
例子1
值插入:向表training1中插入一條記錄
INSERT INTO training1(staff_id,course_name,exam_date,score)VALUES(1,'information safety','2017-06-26 12:00:00',95);
例子2
查詢插入:通過子查詢向表training1表中插入training表的所有數據。
INSERT INTO training1 SELECT * FROM training;
例子3
主鍵衝突錯誤,執行UPDATE操作。
INSERT INTO training1 VALUES (1,'master all kinds of thinking methonds','2017-07-25 12:00:00',97) ON DUPLICATE KEY UPDATE course_name = 'master all kinds of thinking methonds', exam_date ='2017-07-25 12:00:00',score = 97
主鍵是staff_id。主鍵衝突錯誤,執行UPDATE操作。這裏由於training1表中主鍵staff_id已經存在值1,所以執行update操作
2. 數據修改
更新表中行的值
注意事項:
- UPDATE事務提交是默認關閉的。會話退出時,需要顯式COMMIT,否則記錄將丟失。
- 執行該語句的用戶需要有表的UPDATE權限或者UPDATE ANY TABLE的系統權限。
- 普通用戶不允許UPDATE系統SYS用戶對象。不支持臨時表的多表更新。
語法格式:
UPDATE table_reference SET { [col_name = expression] [ , ... ] | (col_name[,...]) = (SELECT expression[,...]) } [ WHERE condition ]
join_table子句
table_reference [LEFT [OUTER] | RIGHT [OUTER] | INNER ] JOIN table_reference ON conditional_expr
參數說明:
參數 | 描述 |
---|---|
table_reference | 要更新的表、表集合。取值範圍:已存在的表、表集合。 |
col_name | 要修改的字段名。取值範圍:已存在的字段名。 |
expression | 賦給字段的值或表達式。 |
condition | 一個返回布爾類型結果的表達式。只有這個表達式返回true的行纔會被更新。 |
例子
更新表training中staff_id和表education中staff_id相同的記錄的first_name字段。
UPDATE training INNER JOIN education ON training.staff_id = education.staff_id SET training.first_name = ‘ALAN’;
3. 數據刪除
從表中刪除行
注意事項:
執行該語句的用戶需要有表的DELETE權限或者DELETE ANY TABLE的系統權限。
DELETE事務提交是默認關閉的。會話退出時,需要顯式COMMIT,否則記錄將丟失。
語法格式:
DELETE FROM [ schema_name. ]table_name
[ WHERE condition ]
[ ORDER BY { column_name [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] } [ , ... ] ]
[ LIMIT [ start, ] count
| LIMIT count OFFSET start
| OFFSET start[ LIMIT count ] ]
例子
刪除表training中同時匹配course_name='INFORMATION SAFETY’和staff_id=10的記錄。
DELETE FROM training WHERE course_name='INFORMATION SAFETY' AND staff_id=10;
三、數據控制
- 事務控制
事務是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。
事務控制提供了事務的啓動、提交、兩階段提交準備、回滾、設置隔離級別操作,並支持在事務中創建保存點。
功能 | 相關SQL |
---|---|
提交事務 | COMMIT |
回滾事務 | ROLLBACK |
- 提交事務
該語句使當前事務工作單元中的所有操作“永久化”,並結束該事務。
語法格式:
COMMIT [ TRANSACTION | PREPARED transaction_id | FORCE xid ]
參數說明
參數 | 描述 |
---|---|
TRANSACTION | 可選關鍵字,用於增加語句可讀性。 |
PREPARED | 可選關鍵字,提交兩階段事務。 |
transaction_id | 待提交事務的標識符。 |
FORCE | 可選關鍵字,用於RESTRICT模式下強制提交殘留事務。不支持強制提交殘留兩階段事務。 |
xid | 待強制提交的殘留事務的標識符,可通過查詢視圖V$TRANSACTIONDV_TRANSACTION獲取, xid標識符由SEG_ID.SLOT.XNUM組成。 xid標識符需要由單引號(’’)括起來。 |
- 回滾事務
該語句回滾(廢除)當前事務工作單元中的所有操作,並結束該事務
語法格式:
ROLLBACK [ TO SAVEPOINT savepoint_name ]
參數說明
參數 | 描述 |
---|---|
TO SAVEPOINT | 回滾到保存點。 |
savepoint_name | 回滾點名 |
- 事務保存點
- SAVEPOINT語句用於在事務中設置保存點。
- 保存點提供了一種靈活的回滾,事務在執行中可以回滾到某個保存點。在該保存點以前的操作有效,而以後的操作被回滾掉。一個事務中可以設置多個保存點。
語法格式
SAVEPOINT savepoint_name
參數說明:
參數 | 描述 |
---|---|
savepoint_name | 回滾點名。 |
例子:
回滾後通過查詢表中數據可以發現表中只有記錄1 通過設置保存點,可以指定回滾到某個保存點的狀態,若沒有設置保存點,回滾後表中數據將爲空