sql

有关SQL语句的一些思考

日常关于SQL语句的一些想法,一点自己的见解,今天分享出来记录并提供更正和补全。主要是关于SQL语句的分类和原理的拙见。

SQL语句分类

一般来说,SQL语句根据用途分为

  1. 数据操作语言(DML:Data Manipulation Language)

    由数据库管理系统(DBMS) 提供,用于让用户或程序员使用,实现对数据库中数据的操作。 主要包含 SELECT、 INSERT、 UPDATE、 DELETE、 MERGE、 CALL、 EXPLAIN PLAN、 LOCK TABLE等语句。

  2. 数据定义语言(DDL:Data Definition Language)

    用于定义SQL模式、基本表、视图和索引的创建和撤消操作。 主要包含 CREATE、 ALTER、 DROP、 TRUNCATE、 COMMENT、 REPLACE(RENAME)等语句,一般不需要commit等事务操作。

  3. 数据控制语言(DCL:Data Control Language)

    用于数据库授权、角色控制等管理工作。 主要包含 GRANT、 REVOKE等语句。

  4. 事务控制语言(TCL:Transaction Control Language)

    用于数据库的事务管理。 主要包含 SAVEPOINT、 ROLLBACK、 COMMIT、 SET TRANSACTION等语句。

这种分类方式是oracle给出的,网上可以查询到的也大多认可了此分类方式。不过今天谈的不是这种分类,以上仅作为参考。

另一种分类

也算不上是分类吧,我个人的一点看法。因为我工作的性质,我更关注数据库协议相关的内容。按照数据库查询语句的生命周期和用途,也大致可以分为四种类型。

第一种是最简洁常用的操作/查询语句,其实与DML的定义差不多,在MySQL中就是query,ASE中叫language等等。这种语句的生命周期就是一次查询,一次完整请求对应一次完整响应,基本上不需要进行维护操作。

第二种是在基础查询语句上提供参数化的功能,可能叫参数化/模版/动态查询等等。这种语句也可以看作一种函数,将查询语句中的一些参数作为变量,有的支持变量命名,有的数据库只支持匿名参数。改语句的生命周期有一次查询语句的,此时多数由客户端进行维护,复用模版时自行进行参数化查询,然后附加参数的值。也有的生命周期存在于创建和释放模版之间,可以认为是在服务器注册了一个临时的函数。针对一次查询可以认为将参数替换后,也是一次交互,一次请求对一次响应。

第三种就是RPC。可以认为是函数,执行了一系列的查询操作。服务器一般都内置了很多的RPC,生命周期可以视为永久,不过针对结果来讲,还是一次请求对一次完整响应。自定义的RPC生命周期维护在创建和释放之间。

第四种就是游标。游标是针对查询结果的,生命周期一般是伴随着创建游标产生,附加在一条查询语句上,随着删除游标请求而释放。之所以需要游标,是很多查询是长期且返回很大的结果集的,我们不太可能一次性获取所有结果,游标可以让我们随着需要去取自己想要的数据。大部分游标不仅绑定在查询语句上,而且是与连接相关的,一旦连接断开,服务器会自动释放游标。不过也有些游标是由服务器维护,直到客户端请求释放才会结束游标的。

综上,第一种类型可以认为客户端不需要维护任何的生命周期,可以迅速的拿到请求与响应。第二种主要需要维护一条查询语句和一个参数列表。第三种一般需要维护一个RPC名称/查询语句和可能的参数列表。而第四种需要维护的就比较多了,要维护游标id,查询语句,参数,以及需要用到的结果集。

其实好像这篇比较水,主要是想到一些就记下来了。