Java-Web学习-数据库-SQL四种语言类型总览

SQL

SQL作为一种标准化的计算机语言,给予了我们访问数据库的能力。其定义了一系列数据库上的操作。

同时,即使SQL是一种标准,但是不同数据库都可能对其进行了独特的拓展(但是至少都保留了原标准)。

SQL在诞生时,所有的数据库程序还是传统的关系型数据库程序(RDBMS),而近几年来,随着数据量不断增大、高并发需求逐渐普遍,Redis、MongoDB等NoSQL(Not only SQL)数据库渐渐兴起。但是这并不影响SQL在NoSQL数据库系统中的使用。

事实上,我们必须认识到,SQL不会拘束于具体的数据库系统,其只定义某个操作及其效果,而我们必须用依赖于具体数据库系统的语言体系去实现这个操作及其效果。

SQL语言分类

SQL语言从功能上分为四大类,分别是:

  1. DDL(Data Definition Language):数据库定义语言,其定义数据库的三级结构,包括三种模式(外模式、概念模式、内模式)及其相互间的映像。DDL语句无需commit。

    数据库管理系统中模式的概念:data schema,即数据的抽象表示。

    概念模式:对应于概念级,是数据库设计者从统一的角度面向所有数据的总体描述。

    外模式:对应于用户级,是特定用户(组)所得到的数据视图,其属于概念模式的子集,是设计中允许用户所看到的那部分数据的集合。

    内模式:对应存储级,描述了数据在存储介质上的存储方式。

    映像:内模式和概念模式、概念模式和外模式间各存在映射关系。映像是映射的结果,其描述了不同模式间的抽象联系。

    对于一个数据库系统,其只有唯一的数据库,其内模式和概念模式也是唯一的,但是对于不同的用户所展示的外模式不是唯一的,这取决于设计者的想法。

    SQL中定义的DDL包括:

    CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME

  2. DML(Data Manipulation Language):数据操纵语言,其由数据库管理系统(DBMS)提供给使用者,实现数据层面的操作。其按照玉檀的类型分为两种,分别为交互型嵌入型,按照语言的级别又可分为过程性DML非过程性DML。DML语句是需要commit才能真正影响到数据库的。

    交互式和嵌入式:交互式指直接使用交互式语句操作数据库系统,而嵌入式则融入了高级语言过程控制的思想,类似于脚本语言,更容易描述复杂的操作逻辑。

    过程性和非过程性:过程性主要指明哪里获取数据和如何操作数据,而非过程性下只需要指明如何操作数据即可。通常过程性DML通常对应层次、网状数据库,而非过程性DML对应关系型数据库

    SQL中定义的DML包括:

    SELECT、INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAIN PLAN、LOCK TABLE

  3. DCL(Data Control Language):数据控制语言,其用于对数据的访问权限进行控制,管理不同用户对于数据库对象的控制权。DCL语句无需commit。

    SQL中定义的DCL包括:

    GRANT、REVOKE

  4. TCL(Transaction Control Language):事务控制语言,其用于管理数据库的事务流。TCL支撑了数据库事务控制,支持对commit的历史进行回退等管理操作。

    事务:一组SQL语句(通常均为DML语句)组成一个对于数据库对象的操作过程,这些语句要么不执行,要么一起执行。事务是数据库系统并发控制的单位,有点类似操作系统中的原语。

    事务隔离级别:即使拥有原语,操作系统也不能避免并发性的问题。同样,即使对事务进行了不可分割的设计,也不能避免并发下的信息丢失。但是不同于操作系统需要严格保证并发进程间的数据安全,SQL采用4个事务隔离级别来描述不同的干扰行为。每个事务都对应一个事务隔离级别,每个级别对应了一种安全级别:

    • Read Uncommitted:该事务会读取到其他并发事务中没有commit的数据。这种情况被称为脏读(Dirty Reads)。这是安全性最低的。
    • Read Committed:该事务只能读取到其他并发事务中已经commit的数据。但是无法保证自己连续读两次的结果一致(因为在这之间另一个事务commit了一个相关改变),这种情况称为不可重复读(Non-Repeatable Reads
    • Repeated Read:保证该事务中对同一对象先后多次的查询将返回统一的结果。其通过加锁(lock)避免了丢失更新(Lost Update),即并发事务同时修改同一个数据对象导致其中一个更新丢失。但是这个级别只对同一对象加锁,而忽略了数据间的相关性,可能导致幻读(Phantom Reads),即互相关联的A和B对象,事务1先后两次查询A之间,事务2修改了B对象,理论上A应该发生相应的变化,但是事务1前后两次查询之间结果却是一致的。
    • Serializable:该事务绝对安全。其将强制事务串行(即序列化)执行,性能最低。

    SQL中的TCL语句包括:

    COMMIT、SAVEPOINT、ROLLBACK、SET TRANSACTION

如何看SQL语句的使用描述?

在支持SQL的数据库管理系统中,输入?+指令名称即可查询到相关的指令描述:

image

  • [A]:可以选择性加入,用于描述某种附加行为,不加的话会有默认

  • {A|B}:必需的内容,从A或B中选一个

  • (A):用于和其他元素分开,以表达逻辑层次

  • A……:当前元素不定长,可能由参数列表组成

SQL对指令的定义和相应的描述非常全面,你可以访问MySQL 8.0 Reference Manual来查询MySQL下所有指令的具体使用规范,其中对标准SQL的支持较为规范。

后续更新的博客将会在讲解指令的使用过程中穿插数据库中的概念,基本将作为我学习的笔记,质量较低。当基本完结后将进行总结,并把这些低质量的笔记删除。

posted @ 2021-05-27 10:39  neumy  阅读(406)  评论(0编辑  收藏  举报