本节要点

从EXCEL举例说起
数据库的定义及分类
SQL的发展历史

从EXCEL说起

如果你用过电脑,处理过一些简单的文档,那么OFFICE系列的软件你肯定有接触过。记得我大学快毕业的时候,学校要求完成一个毕业设计,最后要用Word编辑并打印成论文提交上去。其他的大学,应该也有类似的要求。

所以相信大家对Word肯定是比较熟悉的。而Excel作为Office三剑客中的一个,在处理表格上跟使用Word处理文本一样,简单易学。

比如说,现在有一所学校,深圳市第一初级中学,学校里有20个老师,219个学生,并且初一开了5个班,初二开了6个班,初三开了4个班。

那么校长找你来,说想把学校里的老师、学生、班级的数据保存下来,方便以后查看和打印。

那么,你会怎么来做呢?

大部分人的做法,可能都是打开Excel软件,然后创建一个《深圳市第一初级中学.xlsx》的文件。

在这个Excel文件里,新建三个Sheet页:老师、班级和学生。

在“老师”的Sheet页里,第一行是表头,说明这个Sheet页里包含3列数据,分别是老师编号、老师姓名、性别,然后下面把学校里的20个老师信息全部列出来,一个老师一行。

在“班级”的Sheet页里,第一行也是表头,说明了这个表格里有2列数据,分别是班级编号、班级名称,然后下面列出了学校开设的初一、初二和初三的班级信息。一个班级一行。

在“学生”的Sheet页里,第一行同样也是表头,说明“学生”这个表格里包含了学生编号、学生姓名、性别、年龄、班级编号这5列数据,下面的219行,是学校的所有学生信息。一个学生一行。

这样做有什么好处呢?

第一点,刚才我们已经说了,Excel作为Office三剑客中的一员,是跟Word一样简单易学的。只要会打字,你就能使用。

第二点,就是表格看起来比较直观。拿出一张表格出来,基本上小学生都能看得懂。

第三点,是Excel最大的优点,就是Excel作为一个软件,虽然学起来很简单,但提供的功能可是很强大的。简单的,像更新一个单元格的数据;复杂的,像做一些简单的筛选、统计,操作起来都很容易。

比如说,我想筛选出年龄为12岁的学生有哪些?直接选中第一行表头,然后点数据->筛选,再在“年龄”列勾选“12”就可以了。在界面的左下角,Excel也很聪明的告诉了你,这个表格总共有219行,其中按年龄勾选后,找到了44个。说明学校里有44个年龄为12岁的学生。

是不是很容易。

但如果我们更进一步,想像一下下面这几个情况该怎么操作?

比如,我想筛选出年龄为12岁或性别为男的所有学生?注意,这里是“或”,而不是“且“。

再比如,我想统计出初一的三个班,每班有多少个男生,多少个女生?而且是要显示的是班级的名称。像这样的结果,该怎么来操作?

如果对Excel的操作比较熟悉的朋友,相信也能做出这些表格来。但其中使用到的操作,就比较复杂了。这里面至少涉及到数据透视表以及函数公式的使用,不是一般人能够快速掌握的。

另外,做过大数据量处理的朋友应该有经验,Excel在处理1万行以上的表格时,响应会越来越慢,特别是在表格里包含一些函数公式的时候,经常要等上30秒甚至一二分钟,而且容易卡死。

所以说,Excel在做一些复杂的数据处理时,操作上和响应上,效率都显得有点低。并且非专业人士,掌握起来还是需要一定的时间的。

那有没有用起来像Excel一样直观,但是功能强大,高速响应,操作起来比较简单的呢?

了解数据库

这就是我们接下来要介绍的数据库。

首先,我们来说下,什么是数据库。

从字面上来理解,就是保存数据的仓库。事实上也的确是这样。比较正式一点的定义,它其实是按照一定的结构来组织、存储和管理数据的仓库。一般来说,在计算机里,它是由一个或一组文件组成的。

从这个定义上来看,有几个关键字:结构,组织、存储、管理,数据。

先说怎么理解“结构”这个关键字。

“结构”指的是数据库的建模方式。一般分为关系型和非关系型两种。

下面这张图列出了一些LOGO图标,他们都是使用比较广泛的关系型数据库。比如说MySQL、Oracle等。关于关系型数据库,我们后面再详细讲。

而非关系型数据库,又被称为NoSQL,是Not Only SQL的简写,意思是说不仅仅是SQL。
下边列出了非关系型数据库的四大分类,分别是键值对存储型、文档存储型、基于列的数据库、图形数据库。以及每种类型的代表性数据库产品。

键值对存储:Redis
文档存储:MongoDB
基于列的数据库:Cassandra、HBase
图形数据库:Neo4j

其中,最近这几年,图形数据库比较火,而且根据现在的发展势头,以后图数据库的应用可能会越来越深入。

图数据库适用于哪些场景呢?举个例子,不知道大家有没有觉得QQ或者之前的校内网很强大。为什么说它强大呢?因为我是通过QQ找到了我失散多年的小学同学,是手机QQ推荐给我的。那QQ是怎么找到的呢?如果说把我们每个人在纸上都缩小为一个小圆点,而每两个人之间的关系就用一根线连接起来,那就形成了一个图,准确的说,是一张网。这里面有同学关系、朋友关系、同事关系、师生关系、亲戚关系、甚至明星与粉丝的关系等等。一般来说,同学的同学也是同学,是吧?

比如下面这张图,A和B是同学关系,K和B也是同学关系,那么是不是有理由相信A和K也是同学关系?当然了,这种推论可能并不一定准确,但如果同时也知道了A和C是同学关系,K和C也是同学关系呢?这种推论的准确性是不是就很高了。

如何处理这种图形似的关系,使用关系数据库就比较复杂,而图数据库就比较适用于这种场景。这有点类似于计算机程序设计时的数据结构。不同的数据结构,适用于不同的场景,而不同结构的数据库,同样也是适用于不同的使用场景。

Db-engines的网站上有一个数据库的排名。我截图放在这里了,有兴趣的朋友可以查看最新的数据(来源:https://db-engines.com/en/ranking)。

很明显的,Oracle、MySQL、Microsoft SQL Server占据着前三名,而且得分遥遥领先,这三个都是关系型数据库。

我们看Database Model这一列,就是数据库的建模方式。一眼看过来,排名前20的数据库里,大部分也都是Relational DBMS,也就是关系型数据库。非关系型数据库占比很小。

但我们再来看一个图。

这个图是排名靠前的数据库,在2014年到2022年的得分走势。

排名前三的Oracle、MySQL、Microsoft SQL Server的得分显示超出其他数据库一大截,但走势一直比较平稳,甚至还略有下降。说明这些数据库的增长空间已经不是很大了。

再看一些非关系型数据库,像文档存储型数据库Couchbase和MongoDB、图数据库Neo4j,从走势上来看,都是增长比较快的。相信以后会有更大的发展空间。

而Snowflake最近2年增长迅猛!

对于数据库的定义,还有3个比较关键的词:组织、存储、管理。

这三个词,高度概括了数据库所提供的功能。它们分别解决了在数据库里数据是如何被格式化、如何持久化以及如何使用的问题。

对于关系型数据库来说,数据是按照库、表、行/列的方式分层组织的。而对于图数据库来说,数据是按照节点和关系组织起来的。

前面我们说过,数据库通常是由一个或一组文件组成的。所以数据一般都是保存在磁盘的文件里,这样即使数据库服务器关机重启,数据仍然能保留下来。这一类数据库,一般也被称作磁盘数据库(DRDB:Disk-Resident Database)。

还有另外一种很特别的数据库,基本上是把整个数据库都放到内存里去的,这一类数据库,一般被称作内存数据库(MMDB:Main Memory Database)。最典型的,比如说SQLite数据库。

而管理,也是数据库提供的一个基本功能。对于使用的人来说,并不是说把数据保存下来,放进数据库,然后放在那里就可以了。事实上,保存数据只是第一步。保存下来,是为了后面更好的去使用。所以数据库也提供了一些基本的管理功能,最常见的比如说增删改查的操作。

最后一个关键词,是数据。

这就不用多说了,数据库本身就是用来存放数据的。

那么,什么是数据呢?

举个例子,我们天天都在用微信,那微信的登录用户是数据,微信的聊天记录是数据,甚至微信里好友的头像也是数据。

其实,几乎我们生活中接触到的所有的人、事、物,都可以称做数据,都可以以数据的方式来保存。基本上可以说,数据无处不在。我们本身就处在一个数据的世界里,只是大多数人可能根本就没有察觉。

刚才对非关系型数据库,讲的多一些。下面来聊聊关系型数据库。

关系型数据库,指的是建立在关系模型基础上,由多张能互相联接的二维行列表格组成的数据库。比如这里罗列的DBA、SQL Server、MySQL、Oracle都是使用比较广泛的关系型数据库。

二维行列表格都比较好理解,因为我们平时生活中看到的表格,大多数都是按行和列组织的二维表。

而关系模型,是关系型数据库的基础。现实世界中的各种实体和实体之间的关系,都可以用关系模型来表示。关系模型主要由实体及实体之间的关系组成。

比如书籍和出版社是有关系的,书籍和作者也是有关系的。

再比如,学校里最常见的,是老师与所教授的班级之间的关系,以及班级与学生之间的关系。

其中,一个老师可以教多个班级,一个班级也可以由多个老师来教,所以老师与班级之间是多对多的关系。

一个班级可以包含多个学生,但一个学生只能归属一个班级,所以班级与学生之间是一对多的关系。

一对多的关系,其实是可以反过来说的,比如班级与学生的一对多的关系,反过来说,学生与班级,就是多对一的关系。至于是一对多,还是多对一,是看哪个主体放在前面来说的。

还有一种比较常见的关系,一对一关系。比如,一个学生只能有一个身份证,而一个身份证也只能归属于一个学生。这种就是一对一的关系。

这里的身份证、学生、老师、班级,被称作实体。

在关系型数据库中,实体一般使用表来表示。

表是以行、列的方式组织的二维表格。其实跟EXCEL里的表格是类似的。

表格的行和列在数据库表里也一样,也可以叫行和列。不过在数据库表里,行也叫记录,列称作字段或属性。

在表里,一般都会定义一个主键。主键由一列或多列组成,用来唯一标识一行记录。所以说,主键是不能重复的。

比如说,老师表里,老师编号一般作为主键,因为所有老师的编号,是不会重复的。但老师姓名是不能作主键的,因为有可能有两个老师叫同一个名字。

一般来说,每张表最好都定义一个主键。

讲到这里,大家有没有发现,关系型数据库其实和EXCEL表格是很像的。

数据库与EXCEL文件相对应,而一张表就对应于EXCEL里的一个SHEET页,表里的行和列与SHEET页的行和列基本可以理解为是一致的。只是数据库里的行和列,也可以有一些其他的专用叫法。

前面我们讲过,数据库一般是由一个或多个文件组成的。但数据放在文件里,使用起来其实不是太方便。总不能每次想查询数据的时候,都直接把数据文件打开来看。一方面确实查起来不方便,另一方面,当文件比较大时,查询效率会非常低。

所以,需要一个系统,能够支持我们去方便的管理数据,这类系统,被称为数据库管理系统,简称DBMS。

从狭义的角度上来说,数据库指的就是保存数据的一个或多个文件。而从广义的角度上来说,数据库还包括这个数据库管理系统。

基本上所有的关系型数据库管理系统,都支持使用SQL语言来管理数据库。

了解SQL

SQL的全称叫Structured Query Language,中文名叫结构化查询语言。它是一种特殊目的的编程语言,用来支持数据库查询、更新和管理。

SQL其实就是一种标准。

SQL标准最初是由美国国家标准局规范通过。后来国际标准化组织ISO颁布了正式的国际标准。经过1989年和1992年两次改版,目前最新的版本是SQL92版本。

除了支持基本的SQL标准外,不同的数据库管理系统,对SQL都有一些或多或少的扩展。所以不同的数据库管理系统支持的SQL,都有些许的区别。

本课程使用的是MySQL来配合讲解,我会尽量只讲解标准SQL的相关内容,但也会有一些MySQL数据库特有的写法。虽然是MySQL特有的,但移植到其他数据库,其实也非常简单。

picture loss