概念辨析:SQL、DQL、DML、DDL、DCL

  • SQL(Structure Query Language, 结构化查询语言)语言是数据库的核心语言。

  • SQL的发展是从1974年开始的,其发展过程如下:

  • 1974年 由Boyce和Chamberlin提出,当时称SEQUEL
  • 1976年 IBM公司的Sanjase研究所在研制RDBMS SYSTEM R时改为SQL
  • 1979年 ORACLE公司发表第一个基于SQL的商业化RDBMS产品。
  • 1982年 IBM公司出版第一个RDBMS语言SQL/DS
  • 1985年 IBM公司出版第一个RDBMS语言DB2
  • 1986年 美国国家标准化组织ANSI宣布SQL作为数据库工业标准
  • SQL是一个标准的数据库语言,是面向集合的描述性非过程化语言。

它功能强,效率高,简单易学易维护。

  • 然而SQL语言由于以上优点,同时也出现了这样一个问题

它是非过程性语言,即大多数语句都是独立执行的,与上下文无关,而绝大部分应用都是一个完整的过程,显然用SQL完全实现这些功能是很困难的。

SQL语言的分类

  • SQL语言共分为四大类:
  • 数据定义语言DDL
  • 数据控制语言DCL
  • 数据操纵语言DML
  • 数据查询语言DQL

数据定义语言DDL

  • 数据定义语言(Data Definition Language,DDL),用于定义和管理 SQL 数据库中的所有对象的语言,用来创建数据库中的各种对象:表、视图、索引、同义词、聚簇等

如:CREATE TABLE / VIEW / INDEX / SYN / CLUSTER| 表 视图 索引 同义词 簇。

DDL操作是隐性提交的!不能rollback

CREATE - to create objects in the database 创建

ALTER - alters the structure of the database 修改

DROP - delete objects from the database 删除

TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed TRUNCATE TABLE [Table Name]。
下面是对Truncate语句在MSSQLServer2000中用法和原理的说明:
Truncate table 表名 速度快,而且效率高
因为: TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。
但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。
如果要删除表定义及其数据,请使用 DROP TABLE 语句。
对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。   
TRUNCATE TABLE 不能用于参与了索引视图的表。 COMMENT - add comments to the data dictionary 注释 GRANT - gives user’s access privileges to database 授权 REVOKE - withdraw access privileges given with the GRANT command 收回已经授予的权限

领域特定语言DSL

DSL的定义?

  • DSLDomain Specific Language)是针对某一领域具有受限表达性的一种计算机程序设计语言

常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单。

说到DSL,大家也会自然的想到通用语言(如JavaC等)。

为什么没有一种语言同时 兼具『简洁』和『业务表达』能力呢?

  • 信息论本质上来讨论这个问题,每个语言的程序都可以抽象为一个字符串每个字符串由有限数量的合法字符组成

它在运行时会实现某个功能,因而可以看作是一种需求的信源编码

每种需求可以映射到一个或多个正确的程序,但一个程序肯定只对应到一种需求,因而程序包含的信息熵不低于需求的信息熵

程序中不仅仅需要描述需求的信息,还需要包含: 可读性、辩识度;如果是静态语言还需要静态检查等额外信息

  • 这里也可以看出来,为什么DSL是特定领域的语言了。

DSL分类

  • 最常见的分类方法是按照DSL的实现途径来分类。
  • 马丁·福勒曾将DSL分为内部外部两大类,他的分类法得到了绝大多数业界人士的认可和沿袭。

内部与外部之分取决于DSL是否将一种现存语言作为宿主语言,在其上构建自身的实现。

内部DSL := 内嵌式DSL

  • 内部DSL,也称内嵌式DSL。因为它们的实现嵌入到宿主语言中,与之合为一体。
  • 内部DSL将一种现有编程语言作为宿主语言,基于其设施建立专门面向特定领域的各种语义。

例如:Kotlin DSL、Groovy DSL等;

外部DSL := 独立 DSL

  • 外部DSL,也称独立DSL

因为它们是从零开始建立起来的独立语言,而不基于任何现有宿主语言的设施建立。

外部DSL是从零开发的DSL,在词法分析、解析技术、解释、编译、代码生成等方面拥有独立的设施。

  • 开发外部DSL近似于从零开始实现一种拥有独特语法和语义的全新语言。

构建工具make 、语法分析器生成工具YACC、词法分析工具LEX等都是常见的外部DSL。

例如:正则表达式、XML、SQL、JSON、 Markdown等;

DSL示例

内部DSL

  • HTML: 通过自然语言编写

Groovy中,通过DSL可以用易读的写法生成XML

import groovy.xml.MarkupBuilder

def s = new StringWriter()
def xml = new MarkupBuilder(s)
xml.html{
head{
title("Hello")
script(ahref:'https://xxxx.com/vue.js')
}
body{
p("Excited")
}
}
println s.toString()

最后将生成

Excited

这里相对于Java这样的动态语言,最为不同的就是xml.html这个并不存在的方法居然可以通过编译运行

它内部重写了invokeMethod方法,并进行闭包遍历,少写了许多POJO对象,效率更高。

外部DSL

  • plantUML为例,外部DSL不受限于宿主语言的语法,对用户很友好,尤其是对于不懂宿主语言语法的用户。

  • 但外部DSL的自定义语法需要有配套的语法分析器。

  • 常见的语法分析器有:YACC、ANTLR等。

DSL(领域特定语言) & DDD(领域驱动)

  • DDDDSL的融合有三点:
  • 面向领域;
  • 模型的组装方式;
  • 分层架构演进;
  • DSL 可以看作是在领域模型之上的一层外壳,可以显著增强领域模型的能力。

  • 它的价值主要有2个:
  • 提升了开发人员的生产力
  • 增进了开发人员与领域专家的沟通

外部 DSL 就是对领域模型的一种组装方式。

DSL不是银弹

  • 前开篇也提到了,在信息量不变的情况下,代码行数越短,它的“潜规则”信息量就越多,那么如何排查?如何定位?如何扩展?成为一个好的DSL需要考量的点。

  • 设计良好的DSL难点在于:

  • DSL只是一种声明式的编程语言,无法承载大量业务。
  • DSL语句与编译生成的“字节码”的过程是黑盒的,不但对内部工作不明朗,如果报错的话,不但堆栈行数无法与源码对应上,而且无法“断点”或者“日志”。
  • DSL对设计者要求高,需要会一个领域有通透的理解,设计时要克制『增加各种特性』,DSL还要文档齐全,支撑充分,甚至要开源以帮助使用者定位。

有哪些DSL工具

  • 上节中提到,DSL分为内部和外部。

由于外部DSL需要自己编写分析器,所以笔者使用内部DSL实现。

  • 从之前收集的大量资料中,调研到有两种比如轻量实现DSL的方式。
  • 第一种:使用Groovy脚本语言的元编程特性,天然支持DSL的下定义,而且兼容Java调用,生成的class更容易被JVM优化,执行性能上不会有太多损失。
  • 第二种:使用Jetbrains MPS,开发基于java base的内部DSL。支持快速修复、智能提示、语法检查等。

https://www.jetbrains.com/zh-cn/mps/

  • 第三种: ANTLR

案例:Groovy实战DSL

参见: 一杆到底:DSL 领域特定语言 - Aliyun

案例:ANTLR 【TODO】

参见: ANTLR - 博客园/千千寰宇

数据控制语言DCL

  • 数据控制语言(Data Control Language statements, DCL),用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
    1. GRANT:授权。
    1. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。回滚---ROLLBACK回滚命令使数据库状态回到上次最后提交的状态。其格式为:SQL>ROLLBACK;
    1. COMMIT [WORK]:提交。在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。
  • (1) 显式提交

    COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT

  • (2) 隐式提交

    用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

  • (3) 自动提交

    若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。

其格式为:SQL> SET AUTOCOMMIT ON;

COMMIT - save work done 提交

SAVEPOINT - identify a point in a transaction to which you can later roll back 保存点

ROLLBACK - restore database to original since the last COMMIT 回滚

SET TRANSACTION - Change transaction options like what rollback segment to use 设置当前事务的特性,它对后面的事务没有影响.

数据操纵语言DML

  • 数据操纵语言(Data Manipulation Language, DML),SQL中处理数据等操作统称为数据操纵语言

  • 主要有三种形式:

  1. 插入:INSERT
  2. 更新:UPDATE
  3. 删除:DELETE
SELECT - retrieve data from the a database 查询

INSERT - insert data into a table 添加

UPDATE - updates existing data within a table 更新

DELETE - deletes all records from a table, the space for the records remain 删除

CALL - call a PL/SQL or Java subprogram

EXPLAIN PLAN - explain access path to data Oracle RDBMS执行每一条SQL语句,都必须经过Oracle优化器的评估。
所以,了解优化器是如何选择(搜索)路径以及索引是如何被使用的,对优化SQL语句有很大的帮助。
Explain可以用来迅速方便地查出对于给定SQL语句中的查询数据是如何得到的即搜索路径(我们通常称为Access Path)。
从而使我们选择最优的查询方式达到最大的优化效果。 LOCK TABLE - control concurrency 锁,用于控制并发

数据查询语言DQL

  • 数据查询语言DQL(Data Query Language)
  • 基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:

    SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>

X 参考文献

[数据库/SQL] 浅谈DDL、DSL、DCL、DML、DQL的更多相关文章

  1. 数据库:浅谈DML、DDL、DCL的区别

    简介 SQL是一个标准的数据库语言,是面向集合的描述性非过程化语言.它功能强,效率高,简单易学易维护(迄今为止,我还没见过比它还好学的语言).然而SQL语言由于以上优点,同时也出现了这样一个问题:它是 ...

  2. Oracle数据库基本操作(一) —— Oracle数据库体系结构介绍、DDL、DCL、DML

    一.Oracle数据库介绍 1.基本介绍 Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/ ...

  3. SQL Server - SQL语言组成 (DML、DDL、DCL、DQL的区别)

    转载自:https://www.cnblogs.com/dato/p/7049343.html 作者:Dato.zeng --------------------------------------- ...

  4. SQl浅谈 索引

    1.索引的工作原理 我给大家推荐一个别人的总结. http://blog.csdn.net/NightManHAHA/article/details/5648579 2.索引的设计原则 对于一张表来说 ...

  5. 数据库SQL语言类型(DQL.DML.DDL.DCL)

    1.SQL语言 SQL(Structure Query Language)语言是数据库的核心语言. SQL是一个标准的数据库语言, 是面向集合的描述性非过程化语言. 它功能强,效率高,简单易学易维护. ...

  6. MySQL的sql语言分类DML、DQL、DDL、DCL、

    MySQL的sql语言分类DML.DQL.DDL.DCL. SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data ...

  7. SQL语言分类之DDL、DML、DCL、DQL

    SQL 语言共分为四大类: 数据控制语言 DCL 数据定义语言 DDL 数据操纵语言 DML 数据查询语言 DQL 一.数据控制语言 DCL 1.1 作用 用来设置或更改数据库用户或角色权限的语句,并 ...

  8. 数据库操作语句类型(DQL、DML、DDL、DCL)

    数据库操作语句类型(DQL.DML.DDL.DCL)简介 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语 ...

  9. SQL中有关DQL、DML、DDL、DCL的概念与区别?

    SQL(Structure Query Language)结构化查询语言是数据库的核心语言,是高级的非过程化编程语言.它功能强大,效率高,简单易学易维护.SQL语言基本上独立于数据库本身.使用的机器. ...

  10. 数据库DQL、DML、DDL及DCL详解

    目录 1. 数据查询语言(DQL,Data Query Language) 2. 数据操纵语言(DML,Data Manipulation Language) 3. 数据定义语言(DDL,Data D ...

随机推荐

  1. Linux介绍及使用(1)

    一.linux介绍 1.Linux是一个免费.开源的操作系统,能多用户.多任务.支持多线程和多CPU的操作系统,相对windows更加稳定,在unix系统的基础上开发的系统: 注解:(1)免费:不要钱 ...

  2. OSAL架构

    OSAL操作系统最多可以支持16个任务,由任务功耗管理PwrMgr_task_state变量可知,而OSAL每个任务最多只能支持16个事件处理,理论上最大可以执行256个事件处理. 对于一些运算能力不 ...

  3. Android Service后台服务进程意外被kill掉之后如何重启

    Service组件在android开发中经常用到,经常作为后台服务,需要一直保持运行,负责处理一些不必展示的任务.而一些安全软件,会有结束进程的功能,如果不做Service的保持,就会被其杀掉. 那么 ...

  4. Studio 3T 试用期破解(含破解补丁) - 解决办法

    使用数据可视化工具Studio 3T查看MongoDB数据集数据,但是Studio 3T试用过期了,没了权限打不开软件怎么办? 这里通过建立批处理文件,重置试用时间,即可临时破解权限. 每次开机重启脚 ...

  5. 【vulhub】redis CVE-2022-0543(redis沙盒逃逸)

    渗透环境 攻击机:   IP: 192.168.66.130(Kali) 漏洞收录于:vulhub/redis/CVE-2022-0543 涉及知识点:redis沙盒逃逸 漏洞详情 受影响的系统: 仅 ...

  6. 在鹅厂做java开发是什么体验

    离职已有好几个月,准备写一篇关于之前在腾讯做Java开发的经历,现在来谈谈在Java领域里,在腾讯做Java开发的体验.随便写写别较真. 首先,介绍一下腾讯里与Java相关的部门.主要有CDG(云与智 ...

  7. 别再混淆了!JVM内存模型和Java内存模型的本质区别

    JVM 内存模型(JVM Memory Model)和 Java 内存模型(Java Memory Model, JMM)是 Java 开发中两个非常重要的概念,但这两个概念很容易被搞混,所以本文就来 ...

  8. linux下配置ip为动态获取

    点击查看代码 在Linux系统中配置网络接口以动态获取IP地址,通常需要使用DHCP(Dynamic Host Configuration Protocol).大多数现代Linux发行版都默认支持这个 ...

  9. Selenium 报错 提示“unable to find an ant file to run”

    解决:我采用方法2解决成功 翻译:不能找到执行文件 出现问题原因:这个文件是我从电脑A拷贝到电脑B,缺少相应文件导致

  10. vuex 踩坑记之unknown local mutation type

    使用模块化定义vuex时,出现了这么个错误unknown local mutation type,检查好久发现单词并没有写错,代码如下: // 引入请求数据的方法 import { reqUsers ...