目录
顾名思义,数据库是用于存储数据的,那这些数据被存储在哪呢?
文件也能存储数据,那在这个基础上,为什么还要搞出一个数据库来存储数据呢?
MySQL的客户端登录/退出指令、服务端的启动/关闭指令
数据库的客户端和服务端以及表之间的关系
存储在表中的数据的逻辑存储结构和物理存储结构
SQL指令(又称SQL语句)的分类
顾名思义,数据库是用于存储数据的,那这些数据被存储在哪呢?
在<<如何在Centos 7环境下安装MySQL并登录>>一文中我们说过,下载好MySQL后,我们的Linux服务器中会有3个文件,分别是mysql、mysqld、my.cnf,其中mysql是客户端可执行文件,mysqld是服务端可执行文件(d表示守护进程),my.cnf是mysql和mysqld的配置文件,所以实际上MySQL就是一个网络服务器,和我们以前自己编写TCP服务端和客户端是一样的,都是基于客户端和服务端的模式。
通过指令sudo vim /etc/my.cnf打开客户端mysql和服务端mysqld共同的配置文件my.cnf后,如下图1红框处所示,datadir配置项后面的路径就是数据库中所有数据的存储路径了,如下图2所示,通过ls命令可以看到该datadir路径上有一堆文件,而数据库中的所有数据就存储在这些文件中。
然后要知道的是,如下图3所示,MySQL数据库中的数据是存储在MySQL服务器端(即mysqld进程)上的,而不是存储在MySQL客户端(即mysql进程)上,客户端主要用于连接服务器、发送查询请求、接收查询结果等操作,实际的数据库文件和数据都是存储在服务器端上的,当客户端执行查询时,请求会发送到服务器,服务器负责在其数据存储中进行相应的操作,并将处理结果返回给客户端。总体而言,数据库系统的基本架构是客户端/服务器模型,其中数据存储在服务器端,而客户端负责与服务器进行通信和交互。
说一下,就算mysqld服务端被删除了,该datadir路径中的所有文件以及文件中的数据都是不会被删除的,这就像就算银行倒闭了,其中的员工也都跑路了,但广大人民存在里面的钱是一定不会被卷走的,否则就坑爹了。
- 图1如下。
- 图2如下。
- 图3如下。
文件也能存储数据,那在这个基础上,为什么还要搞出一个数据库来存储数据呢?
通过上文我们知道了数据库中的所有数据本质也是被存储在datadir路径上的一个个文件中的,即我们把想要存储的数据存进数据库中时,本质上数据库这个软件层帮我们做的事就是完成文件的创建,并把用户输入的数据存进该文件中,那么问题来了,我们自己也可以创建文件,并将数据写入到该文件中啊?为什么非要搞出一个数据库来呢?原因如下:
- 举个例子,假如我们曾经往某个文件中写入了1w个IP地址,如果此时有一个要求是需要我们在该文件中找出所有开头是120的IP地址,并将开头从120改成119,然后统计最后改了多少个,如果靠用户自己去写代码,比如调用fread、fwrite等接口编写一个程序去达成这个要求,则对用户的成本就太高了,用户不一定能成功地把这个程序给完美地实现出来,而如果有数据库的存在,则只需要调用几条指令即可达成这个要求,就大大降低了用户的成本,这就简单地回答了为什么要有数据库这个软件层的存在。
通过上面的简单介绍,我们还能举一反三为什么要有数据库的存在,如下:
- 如果靠用户自主管理文件中的数据,则数据误操作后无法进行回滚,比如在上面的例子中改IP地址时,如果不小心把整个文件的数据清空了,则靠用户自己是很难还原的,而如果有数据库的存在,则很容易做到回滚。
- 如果靠用户自主管理文件中的数据,因为文件中的数据没有以某种数据结构被组织起来,所以用户自主在文件中查找目标数据时只能一行行遍历,效率低下;而数据库则不同,数据库在管理文件中的数据时就会将其以某种数据结构组织起来以提供查询效率。
- 如果靠用户自主管理文件中的数据,则相比于靠数据库来管理文件中的数据,明显前者是很不方便的。
- 如果靠用户自主管理文件中的数据,则文件中的数据量越大,用户自主管理操控数据的成本就越高。
所以综上可以发现,数据库的本质就是提供了一套高效的用于【对文件中的数据做各种控制和管理以及操作】的方案,这样一来程序员就不用自己手动编写代码去操作文件中的数据了。
然后说一下,虽然数据库和OS一样都负责管理并操作文件,但他俩管理并操作的侧重点是不同的,比如OS主要是负责管理并操作一个文件的属性,管理这个文件的名字,提供操作该文件的访问操作函数(比如键盘文件的IO接口就是驱动层提供给OS,然后OS提供给键盘文件的struct file的),控制这个文件被放在哪个路径;而数据库则主要是负责对文件中的数据,即对文件的内容做操作、做管理。
MySQL的客户端登录/退出指令、服务端的启动/关闭指令
登录mysql客户端以连接服务端mysqld的方式如下:
解释说明:
- -h: 表示你要连接的MySQL服务端进程mysqld所在的主机,127.0.0.1表示本地主机。
- -P: 表示你要连接的MySQL服务端进程mysqld绑定的端口号,一般默认是3306。
- -u: 表示用哪一个用户连接MySQL服务器,root表示超级用户。
- -p: 表示该用户对应的密码,密码可以直接跟在-p后面,比如【 -p ‘123456’ 】,但一般为了不回显密码,一般是不会直接把密码写在-p后面的,而是输入完-p后就直接按回车以执行这条指令,然后在Enter password后面输入密码。
- 注意,以上所有选项后面都是可以不带空格而直接传值的,比如mysql -h127.0.0.1 -P3306 -uroot -p。
说一下,我们在上文中说过一个结论【实际上MySQL就是一个网络服务器,和我们以前自己编写TCP服务端和客户端是一样的,都是基于客户端和服务端的模式】,现在从登录mysql客户端以连接服务端mysqld的这条指令中也能更好地佐证这一点,比如-h后面带了目的ip地址,-P后面带了目的端口号,如下图所示,这和我们以前编写的TCP客户端的使用方式【 ./TcpClient 127.0.0.1 8080】是一样的。
此外,如下图红框处所示,如果MySQL客户端进程mysql要连接的MySQL服务端进程mysqld在本地上,那么登录mysql客户端以连接服务端mysqld时只需要指明用户名和用户密码即可。同时因为在上文中说过-h、-P、-u等选项后面都是可以不带空格而直接传值的,所以这也是为什么在<<如何在Centos 7环境下安装MySQL并登录>>一文中用于登录客户端的指令是mysql -uroot -p。
退出mysql客户端以断开和服务端mysqld的连接的方式如下:
连接到MySQL服务器后,就可以输入各种SQL语句让服务器执行了,如下图红框处所示,当要退出mysql时直接输入quit或exit或\q即可。
上面的操作都是针对于MySQL的客户端进程mysql,接下来咱们介绍一下启动和关闭MySQL的服务端进程mysqld的指令。
其实在<<如何在Centos 7环境下安装MySQL并登录>>一文中我们已经说明过启动和关闭MySQL的服务端进程mysqld的指令了,咱们再回顾一遍,如下:
- 通过
systemctl stop mysqld
命令或service mysqld stop
命令可以关闭MySQL服务端进程mysqld。 - 通过
systemctl start mysqld
命令或service mysqld start
命令可以启动MySQL服务端进程mysqld。 - 通过
systemctl restart mysqld
命令或service mysqld restart
命令可以重启MySQL服务端进程mysqld。
数据库的客户端和服务端以及表之间的关系
数据库的客户端和服务端以及表之间的关系如上图所示,图中的Client对应的就是MySQL客户端进程mysql,我们以后就是在客户端进程mysql中输入命令;MySQL对应的就是MySQL服务端进程mysqld。那么什么是DB和表呢?
每个DB(database)表示的是mysqld管理的数据库,每个表表示的是数据库DB管理的数据。说一下,在上文中说过MySQL中的所有数据都会被存储在datadir路径(也就是/var/lib/mysql)上的文件中,如下图所示就是datadir路径上的所有文件,这里笔者要说的是,实际上该路径中的每个目录文件就是一个DB,每个普通文件就是一个表。换言之,DB就是Linux系统下的一个目录文件,表就是Linux系统下的一个普通文件。如何证明这一点呢?请往下看。
如下图1所示,连接MySQL服务器后,通过create database语句创建一个名为helloworld的数据库后,这时/var/lib/mysql目录下就会多出一个名为helloworld的目录。如下图2所示,当我们通过drop database语句将这个helloworld数据库删除后,在/var/lib/mysql目录中这个helloworld目录也就不存在了。这也就证明了DB就是Linux系统下的一个目录文件,所以以后我们就要知道,所谓的使用create database语句创建一个数据库,本质就是在Linux系统中创建一个目录文件。
- 图1如下。
- 图2如下。
走到这里我们就证明了所谓的数据库DB本质就是Linux系统下的一个目录文件,现在笔者要说的是,所谓的use使用某个数据库DB本质就是在Linux系统中cd进入某个目录文件。这点如何证明呢?如下图左半部分所示,通过create database语句创建helloworld数据库后,再使用use语句使用helloworld数据库后,再在该helloworld数据库中通过create table语句创建一个student表后,如下图右边部分所示,此时helloworld目录文件中就有了两个student文件,这就证明了所谓的表就是Linux系统下的一个普通文件,并且也证明了所谓的use使用某个数据库DB本质就是在Linux系统中cd进入某个目录文件。所以以后我们就要知道所谓的使用create table语句创建一个表,本质就是在Linux系统中创建一个非目录普通文件。
既然说所谓的use使用某个数据库DB本质就是在Linux系统中cd进入某个目录文件,现在的问题是:在Linux中如果我忘记了我当前在哪个目录文件中可以通过pwd查询,那么在MySQL中如果我忘记了我当前在use使用哪个DB,我该如何知道这个信息呢?
答案:通过下图红框处的use指令使用helloworld数据库后,通过下图蓝框处的select database();指令即可知道你当前在use使用哪个数DB,下图粉框中的查询结果helloworld即可证明这一点。所以实际上select database();语句就对应Linux系统下的pwd命令。
对上面的内容做一下总结,走到这里我们就证明了4件事:
- 所谓的DB就是Linux系统下的一个目录文件。
- 所谓的表就是Linux系统下的一个普通文件。
- 所谓的use使用某个数据库DB本质就是在Linux系统中cd进入某个目录文件。
- SQL语句select database();就是Linux系统下的pwd命令。
然后我们以后要知道,所谓的使用create database语句创建一个数据库,本质就是在Linux系统中创建一个目录文件;所谓的使用create table语句创建一个表,本质就是在Linux系统中创建一个非目录普通文件。
存储在表中的数据的逻辑存储结构和物理存储结构
存储在表中的数据的逻辑存储结构:
- 如下图所示,表中的数据是以二维表格的形式进行呈现的,包括行和列,其中每一行我们称之为是一条记录,而每一列都代表一个属性(属性列)。
存储在表中的数据的物理存储结构:
- 在上文中证明过所谓的表就是Linux系统下的一个普通文件,所以表中的数据和普通文件中的数据没有什么不同,其物理结构就是一个字节一个字节紧挨着的连续存储在磁盘上的。
SQL指令(又称SQL语句)的分类
SQL(Structured Query Language,结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL语句可分为如下三类:
- DDL(Data Definition Language)数据定义语言,用来控制操作存储数据的结构。比如create语句、drop语句、alter语句等。
- DML(Data Manipulation Language)数据操作语言,用来控制操作结构中的数据。比如insert语句、delete语句、update语句等。说一下,在DML中又单独分了一个DQL(Data Query Language)数据查询语言,比如select语句、from语句、where语句等。
- DCL(Data Control Language)数据控制语言,主要负责权限管理和事务,用于阻拦恶意攻击。比如grant语句、revoke语句、commit语句。