作者:泥瓦匠 今天群里面讨论,DDL 还是 DML,我这种小白还是总结下他们的区别吧。

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

休息下,一个例子不够,再来一个。代码都在github主页上。https://github.com/JeffLi1993/jee-component-learning

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   最后来张图总结: 如以上文章或链接对你有帮助的话,别忘了分享到朋友圈,让更多的人阅读这篇文章。

数据库必会必知 之 SQL四种语言:DDL DML DCL TCL的更多相关文章

  1. SQL中的四种语言DDL,DML,DCL,TCL

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

  2. SQL 的四种分类 DDL,DML,DCL,TCL

    DDL (数据定义问题) 数据定义语言 - Data Definition Language 用来定义数据库的对象,如数据表.视图.索引等DDL不需要commit.CREATEALTERDROPTRU ...

  3. SQL语言DDL DML DCL TCL四种语言

    1.DDL(Data Definition Language)数据库定义语言:DDL使我们有能力创建或删 除表格.可以定义索引(键),规定表之间的链接,以及施加表间的 约束. • 常见DDL 语句: ...

  4. 数据库必会必知 之 SQL四种语言:DDL DML DCL TCL(转)

    今天群里面讨论,DDL 还是 DML,我这种小白还是总结下他们的区别吧. 1. DDL – Data Definition Language 数据库定义语言:定义数据库的结构. 其主要命令有CREAT ...

  5. SQL四种语言:DDL,DML,DCL,TCL

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

  6. 数据库的四种语言(DDL、DML、DCL、TCL)

    1.DDL (Data Definition Language )数据库定义语言 statements are used to define the database structure or sch ...

  7. SQL四种语言

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

  8. SQL四种语言:DDL,DML,DCL,TCL 的区别

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

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

    SQL主要分成四部分:(1)数据定义.(SQL DDL)用于定义SQL模式.基本表.视图和索引的创建和撤消操作.(2)数据操纵.(SQL DML)数据操纵分成数据查询和数据更新两类.数据更新又分成插入 ...

随机推荐

  1. Windows 8.0上Eclipse 4.4.0 配置CentOS 6.5 上的Hadoop2.2.0开发环境

    原文地址:http://www.linuxidc.com/Linux/2014-11/109200.htm 图文详解Windows 8.0上Eclipse 4.4.0 配置CentOS 6.5 上的H ...

  2. C++ Base64 编码 解码

    C++实现 base64 字符串编码解码(GCC编译). /** * @brief C++ base64 编解码 * @author wid * @date 2013-20-25 * * @note ...

  3. input text 的事件及方法

    事件 描述onactivate 当对象设置为活动元素时触发.onafterupdate 当成功更新数据源对象中的关联对象后在数据绑定对象上触发.onbeforeactivate 对象要被设置为当前元素 ...

  4. Linux:用户&用户组操作

    用户:查看用户:whoami.who am i.who mom likes创建用户:adduser dgw切换登录用户:su -l dgw退出当前用户: exit删除用户:deluser dgw -- ...

  5. 简单理解ECMAScript2015中的Promise

    ECMAScript6中新增了Promise对象, 所谓Promise对象,即代表着一个还未完成,但将来某时会完成的操作(通常是异步操作).使用Promise对象,我们就可以避免陷入函数层层嵌套的‘回 ...

  6. windows下python检查文件是否被其它文件打开.md

    有时候我们需要能够判断一个文件是否正在被其它文件访问,几乎不可避免的要调用操作系统接口 from ctypes import cdll import os _sopen = cdll.msvcrt._ ...

  7. paip.操作符重载的缺失 Java 的一个大缺点

    paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如   java代码会直接移植到 ...

  8. paip.cache 缓存架构以及性能提升总结

    paip.cache 缓存架构以及性能提升总结 1         缓存架构以及性能(贯穿读出式(LookThrough) 旁路读出式(LookAside) 写穿式(WriteThrough) 回写式 ...

  9. js解析格式化json日期

    代码: function jsonDateFormat(jsonDate) {//json日期格式转换为正常格式    try {        var date = new Date(parseIn ...

  10. Leetcode 20 Valid Parentheses stack的应用

    判断括号是否合法 1.用stack存入左括号“([{”,遇到相应的右括号“)]}”就退栈 2.判断stack是否为空,可以判断是否合法 class Solution { public: bool is ...