1. 什么是数据库以及为什么需要数据库?
通常所说的数据库有两种含义,一是指实际存储数据的仓库,二是指抽象层面上容纳一组表的那个database,我们这里所讲的数据库属于后一种,最常用的数据库是关系型数据库。
我们与计算机的交互本质上是对数据的增删改查,数据库就提供了这些功能。它可以实现对数据的定义、插入、更新、删除、查询等操作,提供了工程师与数据交互的窗口。
主流的关系数据库主要分为以下几类:
- 商用数据库,例如:Oracle,SQL Server,DB2等;
- 开源数据库,例如:MySQL,PostgreSQL等;
- 桌面数据库,以微软Access为代表,适合桌面应用程序使用;
- 嵌入式数据库,以Sqlite为代表,适合手机应用和桌面程序。
2. 什么是SQL以及为什么学习SQL?
SQL是结构化查询语言(Structured Query Language)的缩写,用来访问和操作数据库系统的标准语言。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。
不同的数据库,虽然多多少少都对SQL进行了扩展,但是标准的SQL核心功能是通用的,这样我们通过学习SQL这一种语言,就可以操作各种不同的数据库。
SQL语言定义了几种操作数据库的能力:
- DDL:Data Definition Language
DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。 - DML:Data Manipulation Language
DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。 - DQL:Data Query Language
DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。
3. 基本概念
3.1 表
关系型数据库建立在关系模型上,关系模型的本质是若干个存储数据的二维表,我们可以将其视为EXCEL表格。
表是数据存储的直接载体,数据库基本上都是通过表来组织数据的。所以是我们查询并获取数据最直接的对象。
表的几个特征:
- 表的每一行称为一个记录(record),记录一个逻辑意义上的数据。
- 表的每一列称为一个字段(Column),同一个表每一行都有相同的若干字段。
- 每一个记录,包含若干个字段,同一个表所有记录有相同的字段。
- 行列交叉唯一确定一个单元格。
- 表中列名不能重复,即列名需唯一。
- 表中每一列只能存储同一类型数据。
3.2 数据类型
不同数据库管理系统支持类型有些许差异,以MySQL为例,常用数据类型如下:
- 数值类型
数值类型中,BIGINT能基本满足整数存储需求,最常用。 - 日期类型
- 字符串类型
VARCHAR(N)能满足字符串存储的需求,最为常用。
3.3 主键
对于关系表,有个很重要的约束:任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
主键最关键要求:
- 一旦插入表中,主键最好不要修改,用于唯一定位记录。
- 与业务无关,可以选择自增类型或者全局唯一GUID类型。
- 主键不允许为NULL。
主键可以是一列(如下图1)也可以是多列(如下图2),目的就是为了唯一区分定位记录。多列主键称为联合主键。联合主键允许一列重复,只要所有主键列不重复即可。
![](https://i-blog.csdnimg.cn/blog_migrate/9e25d4509c3c1b8ac77eb5f4ab0233f6.png)
图1 单列主键
![](https://i-blog.csdnimg.cn/blog_migrate/0d1e18bd1af5f3f61af8c2c818dc4ea5.png)
图2 联合主键
3.4 表关系和外键
表和表之间的关系通常有三种,一对一、一对多、多对多:
- 一对一:指表A和表B通过某字段关联后,表A中的一条记录最多对应表B中的一条记录,表B中的一条记录也最多对应表A中的一条记录。
- 一对多:指表A和表B通过某字段关联后,表A中的一条记录可能对应表B中的多条记录,而表B中的一条记录最多对应表A中的一条记录。
- 多对多:指表A和表B通过某字段关联后,表A中的一条记录可能对应表B中的多条记录,而表B中的一条记录可能对应表A中的多条记录。
一对一和一对多关系,通常使用外键引用对应表的主键就可以表达。而多对多关系,通常需要使用中间表来表达,中间表中记录了两张表的主键的对应关系。
因此,外键通常用来建立两张表之间的关联关系。如下图两个表
students表:
classes表:
想要找到学生与班级的对应关系,相当于classes对students是一对多,使用外键class_id关联两个表:
注意:
- 外键不是通过列名实现的,而是通过定义外键约束。
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
- 删除外键约束。
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
- 外键约束一般会有性能问题,所以一般不会设置外键约束,而是将class_id作为普通列,起到外键作用。
3.5 索引
对于数据库中的表来说,索引就相当于是表的目录,是关系数据库中对某一列或多个列的值进行预排序的数据结构,其存在的主要目的就是为了加快查询速度。
索引的效率取决于索引列的值是否散列,该列值越不同效率越高。对于主键,关系数据库会自动对其创建主键索引,因为主键会保证绝对唯一,所以使用主键索引的效率是最高的。
- 创建索引
ALTER TABLE students
ADD INDEX idx_score (score);
- 创建唯一索引
唯一索引可以约束列中元素不能相同,保证唯一性。
ALTER TABLE students
ADD INDEX idx_name_score (name, score);
- 使用唯一约束
添加唯一约束,也可以保证唯一性。
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
3.6 视图
视图就是一张虚拟的表,但是注意,视图存储的是SQL语句,而不是SQL执行后的结果。
视图主要解决经常用到的SQL日常查询,可以保存为视图,方便下次直接读取使用。
3.7 集合
集合表示数据库中记录的集合,表、视图和查询的执行结果都是记录的集合。可以做交集,并集,差集。
查询的执行结果也是集合,那么就可以把查询的结果再当做一个表,继续基于这个表做分析。这个便是子查询的理论基础。