你一直在使用数据库:查邮箱地址簿、用百度查询东西、登录工作网络、ATM 机验证 PIN 和查余额,这些行为都离不开数据库。
但多数人并不清楚数据库的准确定义,再加上术语使用的混乱,理解数据库的第一步,就是梳理并明确核心术语的含义。
下文是数据库基础概念的简介,适合新手入门,也可供有经验者复习。要掌握 SQL,理解数据库是关键,必要时可查阅专业的数据库基础书籍。
数据库的定义有多种表述,从 SQL 视角来看,数据库是有组织的数据集合,可理解为存储数据的容器(通常是一个或一组文件)。
最简单的类比是文件柜 —— 它只是存放数据的物理载体,与数据内容和组织形式无关。如下图:

这里需澄清一个常见误区:人们常将数据库软件称作“数据库”,这是混淆的根源。实际上,这类软件的正式名称是数据库管理系统(DBMS)。数据库由 DBMS 创建和操作,它可以是硬盘上的文件,也可以是其他形式。对使用者而言,无需直接访问数据库,只需通过 DBMS 即可完成数据交互。
就像整理文件柜时,不会随意丢放资料,而是分类建档收纳一样,在数据库里,这种“文件”被称为表。如下图:

表是存储特定类型数据的结构化清单,比如顾客名录、产品目录等。核心原则是一类数据对应一张表,切勿将顾客和订单这类不同清单混存,否则会严重影响后续检索。
每张表都有唯一名称,这个唯一性通常由数据库名、表名甚至所有者信息组合决定,因此同一数据库内不能重名,不同数据库则不受限。
定义表的数据存储规则(如数据类型、结构、命名规范等)的信息集合,被称为模式,它既描述单张表的布局,也定义整个数据库及表间关系。
表由列(字段)构成,一列对应一类特定信息。可以把表想象成网格:比如顾客表中,顾客编号、姓名、地址、城市、州、邮政编码,会分别存在不同列里。如下图:

上图是用户信息表,包含 7 列,分别是编号、姓名、性别、年龄、籍贯、QQ 和邮箱。
数据分解至关重要。像城市、省份、邮政编码这类信息,必须分列存储 —— 这样才能按单一维度筛选、分类数据(比如筛选某省份的顾客),若混存在同一列,这类操作会变得困难。
每列都有数据类型,它限定列的存储内容(如数值型存数字、日期型存时间),既能防止错误数据录入(如数值列填文字),还能优化数据分类和磁盘占用,建表时需重点关注。
注意:数据类型兼容问题是 SQL 跨数据库不兼容的主因之一,基础类型支持较统一,但高级数据类型兼容就太糟糕了。
表数据按行存储,每条记录对应一行。例如,顾客表中,一行就是一位顾客的信息,行的编号即记录编号。如下图:

如果把表看作网格,列是垂直维度,行是水平维度。
日常表述中,行(row)和记录(record)常混用,但从技术规范来讲,行是更准确的表述。
表中每行需有一列或多列作为唯一标识。例如,顾客表可用顾客编号,订单表用订单 ID,雇员表用雇员 ID 或社保号。这类能唯一标识表中每行的列(或多列),称为主键(多列称为复合主键)。
主键用于精准定位特定行,没有主键的话,更新或删除指定行极易出错,无法确保只操作目标数据。尽管不是强制要求,但数据库设计中通常会为每个表定义主键,方便后续数据操纵与管理。
主键需满足以下条件:
任意两行的主键值不重复;
每行必须有主键值(主键列不允许NULL);
主键值不可修改或更新;
主键值不可重用(删除行的主键不能赋给新行)。
注意,主键可由单列或多列组合而成,多列组合主键需满足组合值唯一(单个列的值可重复)。此外,还有一类重要的键 —— 外键,将在后续介绍。