詳解SQL四種語言:DDL DML DCL TCL
1. DDL – Data Definition Language
資料庫定義語言:定義資料庫的結構。
DDL包含以下語句:
- CREATE : 在資料庫中建立新的資料物件
- ALTER : 修改資料庫中物件的資料結構
- DROP : 刪除資料庫中的物件(可以刪除資料表、索引、觸發程式、條件約束以及資料表的許可權等)
- DISABLE/ENABLE TRIGGER : 修改觸發器的狀態
- UPDATE STATISTIC : 更新表/檢視統計資訊
- TRUNCATE TABLE : 清空表中資料
- COMMENT : 給資料物件添加註釋
- RENAME : 更改資料物件名稱
其主要命令有CREATE,ALTER,DROP
等,下面用例子詳解。該語言不需要commit,因此慎重。
CREATE – to create objects in the database 在資料庫建立物件
例:
1 | CREATE DATABASE test; // 建立一個名為test的資料庫 |
ALTER – alters the structure of the database 修改資料庫結構
例:
1 | ALTER TABLE test ADD birthday date ; // 修改test表,新增 date 型別的birthday列 |
DROP – delete objects from the database 從資料庫中刪除物件
例:
1 | DROP DATABASE test;// 刪除test資料庫 |
還有其他的:
TRUNCATE
– 截斷表內容(開發期,還是挺常用的)
COMMENT
– 為資料字典新增備註
2. DML – Data Manipulation Language
DML包含以下語句:
- INSERT :將資料插入到表或檢視
- DELETE :從表或檢視刪除資料
- SELECT :從表或檢視中獲取資料
- UPDATE :更新表或檢視中的資料
- MERGE : 對資料進行合併操作(插入/更新/刪除)
DML用於操作資料庫物件中包含的資料,也就是說操作的單位是記錄。
資料庫操作語言:SQL中處理資料庫中的資料
其主要命令有INSERT,UPDATE,DELETE
還有其他不熟悉的:
CALL
– 呼叫一個PL/SQL或Java子程式
EXPLAIN PLAN
– 解析分析資料訪問路徑
3. DCL – Data Control Language
資料庫控制語言:授權,角色控制等
GRANT
– 為使用者賦予訪問許可權
REVOKE
– 撤回授權許可權
4. TCL – Transaction Control Language
事務控制語言
COMMIT
– 儲存已完成的工作
SAVEPOINT
– 在事務中設定儲存點,可以回滾到此處
ROLLBACK
– 回滾
SET TRANSACTION
– 改變事務選項
例子:Java中JDBC封裝了對事務的支援。比如我們首先新建一個表:test
test.sql
12345678910111213141516 | SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `city` -- ---------------------------- DROP TABLE IF EXISTS `city`; CREATE TABLE `city` ( `id` int (11) NOT NULL DEFAULT '0' COMMENT '城市ID' , ` name ` varchar (20) DEFAULT NULL COMMENT '名稱' , `state` varchar (20) DEFAULT NULL COMMENT '狀態' , `country` varchar (20) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; SET FOREIGN_KEY_CHECKS = 1; |
JDBC事務回滾第一個例子 -JDBC資料庫事務回滾:
1234567891011121314151617181920212223242526272829303132333435363738394041424344 | /** * 描述:JDBC資料庫事務回滾 * * Created by bysocket on 16/6/6. */ public class TransactionRollBack extends BaseJDBC { public static void main(String[] args) throws SQLException { Connection conn = null ; try { // 載入資料庫驅動 Class.forName(DRIVER); // 資料庫連線 conn = DriverManager.getConnection(URL, USER ,PWD); // 關閉自動提交的事務機制 conn.setAutoCommit( false ); // 設定事務隔離級別 SERIALIZABLE conn.setTransactionIsolation( Connection .TRANSACTION_SERIALIZABLE); Statement stmt = conn.createStatement(); int rows = stmt.executeUpdate( "INSERT INTO city VALUES (3,'china',1,'cc')" ); rows = stmt.executeUpdate( "UPDATE city set country = 'TAIWAN' WHERE id = 4" ); // 提交事務 conn. commit (); } catch (Exception e) { e.printStackTrace(); // 回滾事務 if (conn != null ) { conn. rollback (); } } finally { /** 關閉資料庫連線 */ if (conn != null ) { try { conn. close (); } catch (SQLException e) { e.printStackTrace(); } } } } } |
第 19 行:設定了事務隔離級別為 SERIALIZABLE 底層呼叫的是TCL語言的SET TRANSACTION
第 22 行:執行通過,插入資料
第 23 行:執行不通過,沒有主鍵為4的記錄,直接丟擲異常
第 31 行:事務回滾,封裝的就是 TCL 語句的ROLLBACK
JDBC事務回滾第二個例子-JDBC資料庫事務回滾,回滾到特定的儲存點:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546 | /** * 描述:JDBC資料庫事務回滾,回滾到特定的儲存點 * * Created by bysocket on 16/6/6. */ public class TransactionRollBack2 extends BaseJDBC { public static void main(String[] args) throws SQLException { Connection conn = null ; Savepoint svpt = null ; try { // 載入資料庫驅動 Class.forName(DRIVER); // 資料庫連線 conn = DriverManager.getConnection(URL, USER ,PWD); // 關閉自動提交的事務機制 conn.setAutoCommit( false ); // 設定事務隔離級別 SERIALIZABLE conn.setTransactionIsolation( Connection .TRANSACTION_SERIALIZABLE); Statement stmt = conn.createStatement(); int rows = stmt.executeUpdate( "INSERT INTO city VALUES (3,'china',1,'cc')" ); // 設定事務儲存點 svpt = conn.setSavepoint(); rows = stmt.executeUpdate( "UPDATE city set country = 'TAIWAN' WHERE id = 4" ); // 提交事務 conn. commit (); } catch (Exception e) { e.printStackTrace(); // 回滾事務 if (conn != null ) { conn. rollback (svpt); } } finally { /** 關閉資料庫連線 */ if (conn != null ) { try { conn. close (); } catch (SQLException e) { e.printStackTrace(); } } } } } |
和第一個例子重複的就不提了。
第 9 行:聲明瞭一個儲存點
第 24 行:設定了儲存點
第 33 行:回滾事務到該儲存點
上面的程式碼涉及到的是 TCL語言中的 SAVEPOINT
最後來張圖總結:(SELECT屬於DQL哈。)