1. 程式人生 > >SQL四種語言:DDL DML DCL TCL 及例項

SQL四種語言:DDL DML DCL TCL 及例項

作者:泥瓦匠 原文連結:傳送門

1. DDL – Data Definition Language

資料庫定義語言:定義資料庫的結構。

其主要命令有CREATE,ALTER,DROP等,下面用例子詳解。該語言不需要commit,因此慎重。

CREATE – to create objects in the database   在資料庫建立物件

例:CREATE DATABASE test; // 建立一個名為test的資料庫

ALTER – alters the structure of the database   修改資料庫結構

例:ALTER TABLE test ADD birthday date; // 修改test表,新增date型別的birthday列

DROP – delete objects from the database   從資料庫中刪除物件

例:DROP DATABASE test;// 刪除test資料庫

還有其他的:

TRUNCATE – 截斷表內容(開發期,還是挺常用的)

COMMENT – 為資料字典新增備註

2. DML – Data Manipulation Language

資料庫操作語言:SQL中處理資料庫中的資料

其主要命令有SELECT,INSERT,UPDATE,DELETE等,這些例子大家常用就不一一介紹了。該語言需要commit。還有常用的 LOCK TABLE ,記得寫過鎖的部落格 – 

傳送門

還有其他不熟悉的:

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

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資料庫事務回滾:

/**
 * 描述: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資料庫事務回滾,回滾到特定的儲存點:

/**
 * 描述: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

最後來張圖總結:

QQ20160608-0@2x

附錄:鎖例項

一、前言

針對併發,老生常談了。目前一個通用的做法有兩種:鎖機制:1.悲觀鎖;2.樂觀鎖。

但是這篇我主要用於記錄我這次處理的經歷,另外希望能看的大神,大牛,技師者,學長,兄長,大哥們能在評論中發表自己的看法和解決技巧等。

二、故事是這樣的

一個表,暫且叫 wallet,其中3個欄位是 金額。初始值為0,如下圖所示:
image

然後我們寫了一個極為簡單的Controller,並寫了下面的Service程式碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Override public void testLock(int lockId) { Wallet wallet = walletMapper.selectByPrimaryKey(4); BigDecimal one = new BigDecimal(1.00); BigDecimal two = new BigDecimal(2.00); BigDecimal three = new BigDecimal(3.00); wallet.setWalletAmount(wallet.getWalletAmount().add(one)); wallet.setWalletAvailableAmount(wallet.getWalletAvailableAmount().subtract(two)); wallet.setOldAmount(wallet.getOldAmount().add(three));      walletMapper.updateByPrimaryKeySelective(wallet); }

就簡單的通過主鍵讀取到一個物件,注意這個物件是沒加鎖的。也就是說,所對應的SQL如下:

?
1 2 3 4 SELECT <include refid="Base_Column_List" /> FROM wallet WHERE wallet_id = #{walletId,jdbcType=INTEGER}

我這邊是MyBiatis,大家應該看得懂的。然後一個增加1 一個減少2 一個增加 3。

三、測試是這樣

我用了Web應用壓力測試工具:Boomhttps://github.com/rakyll/boom Go編寫的HTTP(S)負載生成器,ApacheBench(AB)的替代工具。Boom是一個微型程式,能夠對Web應用程式進行負載測試。它類似於 Apache Bench ,但在不同的平臺上有更好的可用性,安裝使用也比較簡單。

簡單使用方式如下:

?
1 2 3 4

相關推薦

SQL語言DDL DML DCL TCL 例項

作者:泥瓦匠 原文連結:傳送門 1. DDL – Data Definition Language 資料庫定義語言:定義資料庫的結構。 其主要命令有CREATE,ALTER,DROP等,下面用例子詳解。該語言不需要commit,因此慎重。 CREA

【轉】SQL語言DDL,DML,DCL,TCL

1.DDL(Data Definition Language)資料庫定義語言statements are used to define the database structure or schema. DDL是SQL語言的四大功能之一。 用於定義資料庫的三級結構,包括外模式、概念模式、內模式及

資料庫必會必知 之 SQL語言DDL DML DCL TCL

作者:泥瓦匠 原文連結:傳送門 今天群裡面討論,DDL 還是 DML,我這種小白還是總結下他們的區別吧。 1. DDL – Data Definition Language 資料庫定義語言:定義資料庫的結構。 其主要命令有CREATE,ALTER,DROP等,下面用例子詳解。該語言不需要co

SQL語言DDL,DML,DCL,TCL

1.DDL(Data Definition Language)資料庫定義語言statements are used to define the database structure or schema. DDL是SQL語言的四大功能之一。 用於定義資料庫的三級結構,包括外

詳解SQL語言DDL DML DCL TCL

1. DDL – Data Definition Language資料庫定義語言:定義資料庫的結構。DDL包含以下語句: - CREATE : 在資料庫中建立新的資料物件 - ALTER : 修改資料庫中物件的資料結構 - DROP : 刪除資料庫中的物件(可以刪除資料

SQL語言DDLDMLDCLTCL

edi xpl bottom cts 創建 實現 pad lang create 1. DDL(Data?Definition Language) 數據庫定義

資料庫DDL/DML/DCL/TCL基本概念

DDL(Data Definition Language) 資料定義語言, 用於定義/修改/刪除資料物件(如表)的資料結構。DDL語言操作的物件是資料庫中的物件而非物件所包含的資料。 DDL包含以下語句: - CREATE : 在資料庫中建立新的資料物件

SQL中的語言DDL,DML,DCL,TCL

保存 ant ren lte call schema 過程 操作 run 1.DDL(Data Definition Language)數據庫定義語言statements are used to define the database structure or schema

SQL語言DDL DML DCL TCL語言

man tro DC init base 獲取數據 保存 更新 fin 1.DDL(Data Definition Language)數據庫定義語言:DDL使我們有能力創建或刪 除表格。可以定義索引(鍵),規定表之間的鏈接,以及施加表間的 約束。 ? 常見DDL 語句:

SQL語言DDL/DML/DQL/DCL

SQL 的發展是從1974年開始的,其發展過程如下:  1974年-----由Boyce和Chamberlin提出,當時稱SEQUEL。  1976年-----IBM公司的Sanjase研究所在研製RDBMS SYSTEM R時改為SQL 。  1979年-----ORACLE公司發表第一個基於SQL 的商

SQL 四大功能DDL/DML/DCL/TCL

nsa 定義數據 角色控制 poi lte pla ans 用戶 within SQL主要分成四部分:(1)數據定義。(SQL DDL)用於定義SQL模式、基本表、視圖和索引的創建和撤消操作。(2)數據操縱。(SQL DML)數據操縱分成數據查詢和數據更新兩類。數據更新又分

分享php中webservice實現的簡單架構方法例項

本人所瞭解的webservice有以下幾種:PHP本身的SOAP,開源的NUSOAP,商業版的PHPRPC,以及使用二進位制傳輸資料流的HessianPHP,那麼一下就簡單的介紹下這幾種webservice在php中的使用,雖然網上也有很多這方面的資料,但是這是我個人實踐所得,當然也是從網上找的資料

SQL語句常見DDL/DML/DCL操作部分試題(一)

增加 數據 scott from 當前 領導 name 員工 emp 創建三個空表emp1,emp2,emp3,結構參考emp表 CREATE TABLE EMP1 AS SELECT * FROM EMP WHERE 1=2; CREATE TABLE EMP2 AS S

SQL分類,DDL,DML,DCL

control 建立 tro eat 禁止 sel 產品 alter 用戶表 SQL分類 DDL(Data Definition Languages)   數據定義語言,這些語句定義了不同的數據字段、數據庫、表、列、索引等數據。   常用的語句關鍵字主要包括     cr

Oracle DDL+DML+DCL實例

ora 定義 格式 和數 滿足 名稱 影響 技術 並不是 SQL語言共分為四大類: 數據查詢語言DQL: 數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊。 數據操縱語言DML: DML是“數據操縱語言”( Data Manipu

oracle DDL,DML,DCL, 基礎概念詳解

aud ase class con ani 概念 ddl 數據庫狀態 修改 一、SQL語言,有兩個組成部分:   DML(data manipulation language):它們是SELECT、UPDATE、INSERT、DELETE,命令是用來對數據庫裏的數據進行操作

Oracle中的DDL,DML,DCL總結

不能 ces star n-1 jdb rec 自動 庫服務器 word 轉自http://blog.csdn.net/w183705952/article/details/7354974 DML(Data Manipulation Language,數據操作語言):用於檢

一張表格闡釋DDL,DML,DCL,DQL

upd 表格 中文 query con delete body 語言 rop 名稱 英文 中文釋義 涉及的命令關鍵字 關系 DDL Data Definition Language 數據庫模式定義語言 CREATE,TRUNCATE ,DROP,ALTER 共同組

清除浮動的方法額外標簽法,overflowhidden,單偽元素法和雙偽元素法

new ont nbsp ola 圖片 分享 col ons pac 當給浮動的元素增加了一個父級元素,但是又不方便給高度的情況下 (父盒子給高度也是一個解決方法,但是大多數情況下,因為盒子的內容會經常改變,父盒子高度固定,需要每次去調整) 此時可以使用下面的四種方法來清

資料庫的語言

SQL語言共分為四大類:資料查詢語言DQL,資料操縱語言DML,資料定義語言DDL,資料控制語言DCL。1. 資料查詢語言DQL資料查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊:SELECT <欄位名錶>FROM <表或檢視名>WHERE <