数据库和 SQL 是什么关系

本文介绍数据库的结构和基本理论,以及数据库的实际应用。同时还介绍关系数据库专用的 SQL 语句的书写方法和规则。

一、数据库是什么

本节重点

  • 数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合。

  • 用来管理数据库的计算机系统称为数据库管理系统(DBMS)。

  • 通过使用 DBMS,多个用户便可安全、简单地操作大量数据。

  • 数据库有很多种类,本文将介绍如何使用专门的 SQL 语言来操作关系数据库。

  • 关系数据库通过关系数据库管理系统(RDBMS)进行管理。

1.1 我们身边的数据库

大家都有过下面这样的经历吧?

  • 收到曾经为自己诊治过的牙医寄来的明信片,上面写着“距上次检查已有半年,请您再来做个牙齿健康检查”。

  • 在生日的前一个月,收到曾入住过的旅店或宾馆发来的“生日当月入住优惠”的邮件或者明信片。

  • 在网上商城购物之后,收到内附“推荐商品列表”的邮件。

这可能是因为牙医、旅店或商城的经营者掌握了顾客上一次的就诊日期、生日和购买历史等信息,并且拥有能够从大量汇总信息中快速获取所需信息(比如你的住址或爱好)的设备(计算机系统)。

如果利用人工完成同样的工作,真不知道要多长时间呢。

另外,现在所有地区的图书馆都配备了计算机,实现了图书的自动查询。

使用该系统,可以通过检索书名或出版年份快速查找出希望借阅的图书的所在位置,以及是否已经借出等信息。

正是因为拥有了可以保存图书名称、出版年份以及保管位置和外借情况等信息,并且可以按需查询的设备,才使这一切成为可能。

像这样将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库(Database,DB)。

将姓名、住址、电话号码、邮箱地址、爱好和家庭构成等数据保存到数据库中,就可以随时迅速获取想要的信息了。

用来管理数据库的计算机系统称为数据库管理系统(Database Management System,DBMS1

系统的使用者通常无法直接接触到数据库。因此,在使用系统的时候往往意识不到数据库的存在。

其实大到银行账户的管理,小到手机的电话簿,可以说社会的所有系统中都有数据库的身影(图 1)。

数据库无处不在

图 1 数据库无处不在

1.2 为什么 DBMS 那么重要

那么,为什么要使用专用系统(DBMS)来管理数据呢?我们通过计算机管理数据的时候,通常使用文本文件 2 或者 Excel 那样的电子制表软件就可以完成了,非常简单。

确实,通过文本文件或者电子制表软件来管理数据的方法非常简便,但也有不足。下面就举几个有代表性的例子。

  • 无法多人共享数据

    保存在已连接网络的计算机中的文件,可以通过共享设定实现多个用户在线阅读或编辑。但是,当某个用户打开该文件的时候,其他用户就无法进行编辑了。

    如果是网上商城的话,当某个用户购买商品的时候,其他用户就无法购买了。

  • 无法提供操作大量数据所需的格式

    要想瞬间从几十万或者上百万的数据中获取想要的数据,必须把数据保存为适当的格式,但是文本文件和 Excel 工作表等无法提供相应的格式。

  • 实现读写自动化需要编程能力

    通过编写计算机程序(以下简称程序)可以实现数据读取和编辑自动化,但这必须以了解数据结构为前提,还需具备一定的计算机编程技术。

  • 无法应对突发事故

    当文件被误删、硬盘出现故障等导致无法读取的时候,可能会造成重要数据丢失,同时数据还可能被他人轻易读取或窃用。

DBMS 可以克服这些不足,实现多个用户同时安全简单地操作大量数据(图 2)。这也是我们一定要使用 DBMS 的原因。

DBMS 能够实现多个用户同时安全简单地操作大量数据

图 2 DBMS 能够实现多个用户同时安全简单地操作大量数据

1.3 DBMS 的种类

DBMS 主要通过数据的保存格式(数据库的种类)来进行分类,现阶段主要有以下 5 种类型。

  • 层次数据库(Hierarchical Database,HDB

    最古老的数据库之一,它把数据通过层次结构(树形结构)的方式表现出来。层次数据库曾经是数据库的主流,但随着关系数据库的出现和普及,现在已经很少使用了。

  • 关系数据库(Relational Database,RDB

    关系数据库是现在应用最广泛的数据库。关系数据库在 1969 年诞生,可谓历史悠久。和 Excel 工作表一样,它也采用由行和列组成的二维表来管理数据,所以简单易懂(表 1)。

    同时,它还使用专门的 SQL(Structured Query Language,结构化查询语言)对数据进行操作。

    表 1  关系数据库中的数据

    商品编号商品名称商品种类销售单价进货单价登记日期
    0001T 恤衫衣服10005002009-09-20
    0002打孔器办公用品5003202009-09-11
    0003运动 T 恤衣服40002800
    0004菜刀厨房用具300028002009-09-20
    0005高压锅厨房用具680050002009-01-15
    0006叉子厨房用具5002009-09-20
    0007擦菜板厨房用具8807902008-04-28
    0008圆珠笔办公用品1002009-11-11

    这种类型的 DBMS 称为关系数据库管理系统(Relational Database Management System,RDBMS)。比较具有代表性的 RDBMS 有如下 5 种。

    • Oracle Database :甲骨文公司的 RDBMS

    • SQL Server :微软公司的 RDBMS

    • DB2 :IBM 公司的 RDBMS

    • PostgreSQL :开源的 RDBMS

    • MySQL :开源的 RDBMS

    另外,Oracle Database 通常简称为 Oracle。

  • 面向对象数据库(Object Oriented Database,OODB

    编程语言当中有一种被称为面向对象语言的语言 3。把数据以及对数据的操作集合起来以对象为单位进行管理,因此得名。面向对象数据库就是用来保存这些对象的数据库。

  • XML 数据库(XML Database,XMLDB

    最近几年,XML 4 作为在网络上进行交互的数据的形式逐渐普及起来。XML 数据库可以对 XML 形式的大量数据进行高速处理。

  • 键值存储系统(Key-Value Store,KVS

    这是一种单纯用来保存查询所使用的主键(Key)和值(Value)的组合的数据库。具有编程语言知识的读者可以把它想象成关联数组或者散列(hash)。

    近年来,随着键值存储系统被应用到 Google 等需要对大量数据进行超高速查询的 Web 服务当中,它正逐渐为人们所关注。

本文向大家介绍使用 SQL 语言的数据库管理系统,也就是关系数据库管理系统(RDBMS)的操作方法

接下来还会深入讲解 RDBMS。如无特殊说明,本文所提到的数据库以及 DBMS 都是指 RDBMS。

另外,有的 RDBMS 也可以像 XML 数据库那样操作 XML 形式的数据,或者具有面向对象数据库的功能。

本文并不会介绍用于这些扩展功能的 SQL,如果要了解这些内容,请参考 RDBMS 附带的 SQL 手册或者针对不同的 RDBMS 介绍 SQL 的图书。

二、数据库的结构

本节重点

  • RDBMS 通常使用客户端/服务器这样的系统结构。

  • 通过从客户端向服务器端发送 SQL 语句来实现数据库的读写操作。

  • 关系数据库采用被称为数据库表的二维表来管理数据。

  • 数据库表由表示数据项目的列(字段)和表示一条数据的行(记录)所组成,以记录为单位进行数据读写。

  • 本文将行和列交汇的方格称为单元格,每个单元格只能输入一个数据。

2.1 RDBMS 的常见系统结构

使用 RDBMS 时,最常见的系统结构就是 客户端/服务器类型(C/S 类型) 这种结构(图 3)。

使用 RDBMS 时的系统结构

图 3 使用 RDBMS 时的系统结构

服务器指的是用来接收其他程序发出的请求,并对该请求进行相应处理的程序(软件),或者是安装了此类程序的设备(计算机)。在计算机上持续执行处理,并等待接收下一条请求。

RDBMS 也是一种服务器,它能够从保存在硬盘上的数据库中读取数据并返回,还可以把数据变更为指定内容。

与之相对,向服务器发出请求的程序(软件),或者是安装了该程序的设备(计算机)称为客户端。访问由 RDBMS 管理的数据库,进行数据读写的程序称为 RDBMS 客户端。

RDBMS 客户端将想要获取什么样的数据,或者想对哪些数据进行何种变更等信息通过 SQL 语句发送给 RDBMS 服务器。

RDBMS 根据该语句的内容返回所请求的数据,或者对存储在数据库中的数据进行更新。

客户端就如同委托方,而服务器就像是受托方。由于两者关系类似受托方执行委托方发出的指令,故而得名。

这样就可以使用 SQL 语句来实现关系数据库的读写操作了。

本文为了给大家讲解 SQL,使用了可以显示如何将 SQL 语句发送到 RDBMS,以及接收返回信息(数据)的客户端。具体内容请参考 如何在 Windows 10 中安装 PostgreSQL 和连接设置

另外,RDBMS 既可以和其客户端安装在同一台计算机上,也可以分别安装在不同的计算机上。这样一来,不仅可以通过网络使二者相互关联,还可以实现多个客户端访问同一个 RDBMS(图 4)。

通过网络可以实现多个客户端访问同一个数据库

图 4 通过网络可以实现多个客户端访问同一个数据库

客户端没有必要使用同样的程序,只要能将 SQL 发送给 RDBMS,就可以操作数据库了。并且,多个客户端还可以同时对同一个数据库进行读写操作。

另外,RDBMS 除了需要同时接收多个客户端的请求之外,还需要操作存有大量数据的数据库,因此通常都会安装在比客户端性能更优越的计算机上。

操作数据量特别巨大的数据库时,还可以将多台计算机组合使用。

虽然 RDBMS 的系统结构多种多样,但是从客户端发来的 SQL 语句基本上都是一样的。

2.2 表的结构

让我们再具体了解一下 RDBMS 的结构。上一节我们讲到了关系数据库通过类似 Excel 工作表那样的、由行和列组成的二维表来管理数据。用来管理数据的二维表在关系数据库中简称为

表存储在由 RDBMS 管理的数据库中,如图 5 所示。一个数据库中可以存储多个表。

数据库和表的关系

图 5 数据库和表的关系

根据 SQL 语句的内容返回的数据同样必须是二维表的形式,这也是关系数据库的特征之一。返回结果如果不是二维表的 SQL 语句则无法执行。

另外,图 5 中只有一个数据库,我们还可以创建多个数据库分别用于不同用途。

图 6 所示为之后的学习中实际用到的商品表的内容。

表的示例(商品表)

图 6 表的示例(商品表)

表的(垂直方向)称为字段,它代表了保存在表中的数据项目。在表 2 的商品表中,从商品编号到登记日期一共有 6 列。

对于列的约束比 Excel 更加严格,定义为数字的列只能输入数字,定义为日期的列只能输入日期(在 SQL 如何对表进行创建、更新和删除操作 详细介绍)。

与之相对,表的(水平方向)称为记录,它相当于一条数据。商品表中总共有 8 行数据。关系数据库必须以行为单位进行数据读写,请大家牢记。

法则 1

关系数据库以行为单位读写数据。

本文将图 6 所示的行和列交汇的方格称为单元格。一个单元格中只能输入一个数据。像图 7 那样,在一个单元格中输入 2 个或 2 个以上的数据是不允许的,请大家牢记。

一个单元格中只能输入一个数据

图 7 一个单元格中只能输入一个数据

法则 2

一个单元格中只能输入一个数据。

专栏

RDBMS 的用户管理

为了防止重要数据被窃读或篡改,RDBMS 只允许注册用户接触数据库。

这里的用户并不是指 Windows 等操作系统的注册用户,而是只能用于 RDBMS 的用户。RDBMS 允许注册多个用户。

注册用户的时候除了设定用户名(账号),还需要设定密码。虽然密码并不是必需的,但为了防止重要信息的泄露,还是希望大家能够设定密码。

三、SQL 简介

本节要点

  • SQL 是为操作数据库而开发的语言。

  • 虽然 SQL 也有标准,但实际上根据 RDBMS 的不同 SQL 也不尽相同。

  • SQL 通过一条语句来描述想要进行的操作,发送给 RDBMS。

  • 原则上 SQL 语句都会使用分号结尾。

  • SQL 根据操作目的可以分为 DDL、DML 和 DCL。

3.1 标准 SQL

如前所述,本文所要学习的 SQL 是用来操作关系数据库的语言。

它原本是为了提高数据库查询效率而开发的语言,但是现在不仅可以进行数据查询,就连数据的插入和删除等操作也基本上都可以通过 SQL 来完成了。

国际标准化组织(ISO)为 SQL 制定了相应的标准,以此为基准的 SQL 称为标准 SQL(相关信息请参考专栏——标准 SQL 和特定的 SQL)。

以前,完全基于标准 SQL 的 RDBMS 很少,通常需要根据不同的 RDBMS 来编写特定的 SQL 语句。

这样一来,就会造成能够在 Oracle 中使用的 SQL 语句却无法在 SQL Server 中使用,反之亦然。

近来,对标准 SQL 的支持取得了一些进展,因此希望准备学习 SQL 的读者们能够从现在开始就牢记标准 SQL 的书写方式。

原则上,本文介绍的都是标准 SQL 5 的书写方式,但是根据 RDBMS 的不同也会存在一些特殊的 SQL 语句。如果遇到这种情况,将会通过其他途径对其进行说明。

法则 3

学会标准 SQL 就可以在各种 RDBMS 中书写 SQL 语句了。

3.2 SQL 语句及其种类

SQL 用关键字、表名、列名等组合而成的一条语句(SQL 语句)来描述操作的内容。

关键字是指那些含义或使用方法已事先定义好的英语单词,存在包含“对表进行查询”或者“参考这个表”等各种意义的关键字。

根据对 RDBMS 赋予的指令种类的不同,SQL 语句可以分为以下三类。

  • DDL

    DDL(Data Definition Language,数据定义语言) 用来创建或者删除存储数据用的数据库以及数据库中的表等对象。DDL 包含以下几种指令。

    • CREATE:创建数据库和表等对象

    • DROP:删除数据库和表等对象

    • ALTER:修改数据库和表等对象的结构

  • DML

    DML(Data Manipulation Language,数据操纵语言) 用来查询或者变更表中的记录。DML 包含以下几种指令。

    • SELECT:查询表中的数据

    • INSERT:向表中插入新数据

    • UPDATE:更新表中的数据

    • DELETE:删除表中的数据

  • DCL

    DCL(Data Control Language,数据控制语言) 用来确认或者取消对数据库中的数据进行的变更。

    除此之外,还可以对 RDBMS 的用户是否有权限操作数据库中的对象(数据库表等)进行设定。DCL 包含以下几种指令。

    • COMMIT:确认对数据库中的数据进行的变更

    • ROLLBACK:取消对数据库中的数据进行的变更

    • GRANT:赋予用户操作权限

    • REVOKE:取消用户的操作权限

实际使用的 SQL 语句当中有 90% 属于 DML,本文同样会以 DML 为中心进行讲解。

法则 4

SQL 根据功能不同可以分为三类,其中使用最多的是 DML。

3.3 SQL 的基本书写规则

书写 SQL 语句时必须要遵守一些规则。这些规则都非常简单,接下来就让我们逐一认识一下吧。

  • SQL 语句要以分号(;)结尾

    一条 SQL 语句可以描述一个数据库操作。在 RDBMS 当中,SQL 语句也是逐条执行的。

    众所周知,我们在句子的句尾加注标点表示结束,中文句子以句号(。)结尾,英文以点号(.)结尾,而 SQL 语句则使用 分号(; 结尾。

    法则 5

    SQL 语句以分号(;)结尾。

  • SQL 语句不区分大小写

    SQL 不区分关键字的大小写。例如,不管写成 SELECT 还是 select,解释都是一样的。表名和列名也是如此。

    虽然可以根据个人喜好选择大写还是小写(或大小写混杂),但为了理解起来更加容易,本文使用以下规则来书写 SQL 语句。

    • 关键字大写

    • 表名的首字母大写

    • 其余(列名等)小写

    法则 6

    关键字不区分大小写。