一文读懂数据库语言
数据库系统提供数据定义语言(Data-Definition Language,DDL)来定义数据库模式,并提供数据操纵语言(Data-Manipulation Language,DML)来表达数据库的查询和更新。而实际上,数据定义和数据操纵语言并不是两种互相分离的语言,相反地,它们仅仅是构成了单一的数据库语言(例如SQL语言)的不同部分。几乎所有的关系数据库系统都使用SQL语言。
数据库模式是通过一系列定义来说明的,这些定义由一种称作数据定义语言的特定语言来表达。DDL也可用于定义数据的其他特征。
通过一系列特定的DDL语句来说明数据库系统所采用的存储结构和访问方式,这种特定的DDL称作数据存储和定义(datastorage and definition)语言。这些语句定义了数据库模式的实现细节,而这些细节对用户来说通常是不可见的。
存储在数据库中的数据值必须满足某些一致性约束。例如,假设大学要求一个系的账户余额必须不能为负值。DDL语言提供了指明这样的约束的工具。每当数据库被更新时,数据库系统都会检查这些约束。通常,约束可以是关于数据库的任意谓词。然而,如果要测试任意谓词,可能代价比较高。因此,数据库系统仅实现可以以最小代价测试的完整性约束。
域约束(domain constraint)。每个属性都必须对应于一个所有可能的取值构成的域(例如,整数型、字符型、日期/时间型)。声明一个属性属于某个具体的域就相当于约束它可以取的值。域约束是完整性约束的最基本形式。每当有新数据项插入数据库中,系统就能方便地进行域约束检测。
引用完整性(referential integrity)。常常有这样的情况,我们希望能确保一个关系中给定属性集上的取值也在另一关系的某一属性集的取值中出现(引用完整性)。例如,每门课程所列出的系必须是大学中实际存在的系。更准确地说,一个course记录中的dept_name值必须出现在department关系中的某个记录的dept_name属性中。数据库的修改有可能会导致引用完整性的破坏。当引用完整性约束被违反时,通常的处理是拒绝执行导致完整性被破坏的操作。
授权(authorization)。我们也许想对用户加以区别,对于不同的用户在数据库中的不同数据值上允许不同的访问类型。这些区别以授权来表达,最常见的是:读权限(read authorization),允许读取数据,但不能修改数据;插入权限(insertauthorization),允许插入新数据,但不允许修改已有数据;更新权限(update authorization),允许修改,但不能删除数据;删除权限(deleteauthorization),允许删除数据。我们可以赋予用户所有或者部分这些权限,也可以不赋予用户任何这些权限。
正如任何其他程序设计语言一样,对DDL语句的处理会产生一些输出。DDL的输出放在数据字典(data dictionary)中,数据字典包含元数据(metadata),元数据是关于数据的数据。可以把数据字典看作一种特殊的表,这种表只能由数据库系统本身(不是常规的用户)来访问和修改。在读取和修改实际的数据前,数据库系统先要参考数据字典。
SQL提供了丰富的DDL语言,通过它,我们可以定义具有数据类型和完整性约束的表。
例如,以下的SQL DDL语句定义了department表:
上面的DDL语句执行的结果就是创建了department表,该表有3个列:dept_name、building和budget,每个列有一个与之相关联的数据类型。在第3章中我们将更详细地讨论数据类型。
SQL DDL还支持若干种类型的完整性约束。例如,你可以指明dept_name属性是主码(primary key),以确保没有两个系会有相同的系名。另一个示例是,你可以指明在任何instructor记录中出现的dept_name属性值也必须在department表的某个记录中出现。(我们将在《数据库系统概念(原书第7版)》第3~4章中讨论SQL对完整性约束和授权的支持。)
数据操纵语言是这样一种语言,它使得用户可以访问或操纵那些按照某种适当的数据模型组织起来的数据。有以下访问类型:
对存储在数据库中的信息进行检索;
向数据库中插入新的信息;
从数据库中删除信息;
修改数据库中存储的信息。
基本上有两种类型的数据操纵语言:
过程化的DML(proceduralDML)要求用户指定需要什么数据以及如何获得这些数据。
声明式的DML(declarativeDML)(也称为非过程化的DML)只要求用户指定需要什么数据,而不必指明如何获得这些数据。
声明式的DML通常比过程化的DML易学易用。但是,由于用户不必指明如何获得数据,因此数据库系统必须找出一种访问数据的高效途径。
查询(query)是要求对信息进行检索的语句。DML中涉及信息检索的部分称作查询语言(query language)。实践中常把查询语言和数据操纵语言作为同义词使用,尽管从技术上来说这并不正确。
目前已有多个在使用的商业性的或者实验性的数据库查询语言。我们在《数据库系统概念(原书第7版)》第3~5章中将学习最广泛使用的查询语言SQL。
我们在1.3节中讨论的抽象层次不仅可以用于定义或构造数据,而且还可以用于操纵数据。在物理层,我们必须定义可高效访问数据的算法;在更高的抽象层,我们则强调易用性,目标是使人们能够更有效地和系统交互。数据库系统的查询处理器部件(我们将在第15和16章学习)将DML的查询语句翻译成数据库系统物理层的动作序列。在第22章中我们将研究在越来越普遍的并发和分布式环境中的查询处理过程。
SQL查询语言是非过程化的。一个查询以几个表作为输入(也可能只有一个表),总是仅返回一个表。下面是一个SQL查询的示例,它找出历史系的所有教师的名字:
这个查询指定了要从instructor表中取回dept_name为History的那些行,并且这些行的name属性要显示出来。本查询的执行结果是一个表,它包含单个列name,有若干行,每一行都是dept_name为History的一个教师的名字。如果这个查询运行在图1-1的表上,那么结果将包括两行,一行的名字是El Said,另一行的名字是Califieri。
查询可以涉及不止一个表的信息。例如,下面的查询将找出与经费预算超过95 000美元的系相关联的所有教师的ID和系名。
如果上述查询运行在图1-1的表上,那么系统将会发现,有两个系的经费预算超过95 000美元—计算机科学系和金融系;这些系里有5位教师。于是,结果将由一个表组成,这个表有两列(ID,dept_name)和五行(12121, Finance)、(45565, Computer Science)、(10101, Computer Science)、(83821, Computer Science)、(76543, Finance)。
像SQL这样的非过程化查询语言不像一个普适的图灵机那么强大:有一些计算可以用通用的程序设计语言来表达,但无法用SQL来表达。SQL也不支持诸如从用户那儿输入、输出到显示器或在网络上通信这样的动作。这样的计算和动作必须用一种宿主(host)语言来写,比如C/C++、Java或Python,在其中使用嵌入式的SQL查询来访问数据库中的数据。应用程序(applicationprogram)就是用来以这种方式与数据库进行交互的程序。在大学系统的示例中,就是那些使学生能够注册课程、产生课程花名册、计算学生的GPA、产生工资支票以及完成其他任务的程序。
为了访问数据库,需要将DML语句从宿主发送到执行这些语句的数据库。最通用的办法是使用应用程序接口(过程集合),它可以用来将DML和DDL的语句发送给数据库,再取回结果。开放数据库连接(ODBC)标准定义用于C语言和其他几种语言的应用程序接口。Java数据库连接(JDBC)标准为Java语言提供了相应的接口。
本文摘编自《数据库系统概念(原书第7版)》。
作者:[美] 亚伯拉罕·西尔伯沙茨
[美] 亨利·F. 科思、[印] S. 苏达尔尚
译者:杨冬青 李红燕 张金波 等
数据库领域的殿堂级作品,畅销经典全新升级
夯实数据库理论基础,修炼数据库技术内功的必备之选对深入理解数据库,深入研究数据库,深入操作数据库都具有极强的指导作用
本书是数据库系统方面的经典教材之一,其内容由浅入深,既包含了数据库系统基本概念,又反映了数据库技术的新进展。它被国际上许多著名大学所采用,包括斯坦福大学、耶鲁大学、得克萨斯大学、康奈尔大学、伊利诺伊大学等。我国也有多所大学采用本书作为本科生和研究生数据库课程的教材和主要教学参考书,收到了良好的效果。
第7版保持了前6版的总体风格,同时对内容进行了扩充,对结构进行了调整,以更好地符合数据库教学的需求,反映数据库设计、管理与使用方式的发展和变化。
扫码关注【华章计算机】视频号
每天来听华章哥讲书
书讯 | 9月书讯 | 秋天的第一本书,来了资讯 | DB-Engines 9月数据库排名:SnowFlake坐上了火箭书单 | 送你一份入门前端学习路线图干货 | 微服务设计:去中心化的技术治理与数据管理收藏 | 5G时代音视频开发利器WebRTC究竟长啥样?上新 | 【新书速递】你需要掌握的架构之道:系统设计+项目设计赠书 | 【第73期】全面拥抱 Go 语言!