详解SQL四种语言:DDL DML DCL TCL
看到很多人讨论sql还分为四种类型,在这里知识普及一下,并总结下他们的区别吧。
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中处理数据库中的数据
其主要命令有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 = '*' 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 = '*' 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哈。)
希望本文对大家学习sql有所帮助。