目录
顾名思义,数据库是用于存储数据的,那这些数据被存储在哪呢?
文件也能存储数据,那在这个基础上,为什么还要搞出一个数据库来存储数据呢?
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路径中的所有文件以及文件中的数据都是不会被删除的,这就像就算银行倒闭了,其中的员工也都跑路了,但广大人民存在里面的钱是一定不会被卷走的,否则就坑爹了。
通过上文我们知道了数据库中的所有数据本质也是被存储在datadir路径上的一个个文件中的,即我们把想要存储的数据存进数据库中时,本质上数据库这个软件层帮我们做的事就是完成文件的创建,并把用户输入的数据存进该文件中,那么问题来了,我们自己也可以创建文件,并将数据写入到该文件中啊?为什么非要搞出一个数据库来呢?原因如下:
通过上面的简单介绍,我们还能举一反三为什么要有数据库的存在,如下:
所以综上可以发现,数据库的本质就是提供了一套高效的用于【对文件中的数据做各种控制和管理以及操作】的方案,这样一来程序员就不用自己手动编写代码去操作文件中的数据了。
然后说一下,虽然数据库和OS一样都负责管理并操作文件,但他俩管理并操作的侧重点是不同的,比如OS主要是负责管理并操作一个文件的属性,管理这个文件的名字,提供操作该文件的访问操作函数(比如键盘文件的IO接口就是驱动层提供给OS,然后OS提供给键盘文件的struct file的),控制这个文件被放在哪个路径;而数据库则主要是负责对文件中的数据,即对文件的内容做操作、做管理。
登录mysql客户端以连接服务端mysqld的方式如下:
解释说明:
说一下,我们在上文中说过一个结论【实际上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系统中创建一个目录文件。
走到这里我们就证明了所谓的数据库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件事:
然后我们以后要知道,所谓的使用create database语句创建一个数据库,本质就是在Linux系统中创建一个目录文件;所谓的使用create table语句创建一个表,本质就是在Linux系统中创建一个非目录普通文件。
存储在表中的数据的逻辑存储结构:
存储在表中的数据的物理存储结构:
SQL(Structured Query Language,结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL语句可分为如下三类: