MySQL数据库的基础概念

news2024/9/20 18:00:41

目录

顾名思义,数据库是用于存储数据的,那这些数据被存储在哪呢?

文件也能存储数据,那在这个基础上,为什么还要搞出一个数据库来存储数据呢? 

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件事:

  1. 所谓的DB就是Linux系统下的一个目录文件。
  2. 所谓的表就是Linux系统下的一个普通文件。
  3. 所谓的use使用某个数据库DB本质就是在Linux系统中cd进入某个目录文件。
  4. 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语句。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1316860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle怎么导入dmp文件??????

目录 oracle怎么导入dmp文件&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 先看&#xff1a; 方法一&#xff1a;【推荐】 winR输入 输入&#xff1a; 检验&#xff1a; 导入成功&#xff01; 方法二&#xff1a; 直接在 PLSQL Developer…

技术探秘:在RISC Zero中验证FHE——由隐藏到证明:FHE验证的ZK路径(1)

1. 引言 开源代码实现见&#xff1a; https://github.com/hashcloak/fhe_risc0_zkvm&#xff08;Rust&#xff09;https://github.com/weikengchen/vfhe-profiled&#xff08;Rust&#xff09;https://github.com/l2iterative/vfhe0&#xff08;Rust&#xff09; L2IV Resea…

一问掌握SpringBoot常见注解,后无压力。

文章目录 一、&#x1f50e; SpringBoot常用注解大全&#x1f341;&#x1f341; 01. RequestMapping 注解&#x1f341; 1.1. RequestMapping 是什么&#xff1f;&#x1f341; 1.2. RequestMapping 特点有哪些&#xff1f;&#x1f341; 1.3. RequestMapping 作用是什么&…

SpringBoot中处理处理国际化

SpringBoot中处理处理国际化 1. 创建SpringBoot项目2. resource下创建i18n目录3. 右键i18n新建资源包4. 弹框中添加需要支持的国际化语言5. messages.properties中添加需要国际化的键6. application.yaml添加配置7. 国际化工具8. 使用功能9 场景问题 1. 创建SpringBoot项目 2.…

智能配电房在线监测系统

智能配电房在线监测系统是一个综合性的系统&#xff0c;依托电力智慧运维工具-电易云&#xff0c;主要用于监控和调整配电房的环境、安防和电气设备状态。以下是该系统的一些主要功能和特点&#xff1a; 环境监控&#xff1a;实时监测配电房内的温度、湿度、SF6气体浓度、臭氧浓…

论文阅读笔记(12月15)--DialogXL

论文阅读笔记(12月15)–DialogXL 基本情况介绍&#xff1a; 作者&#xff1a;Weizhou Shen等 单位&#xff1a;中山大学 时间&期刊&#xff1a;AAAI 2021 主题&#xff1a;对话情绪识别(ERC)–文本模态 论文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article…

如何在Go中并发运行多个函数

引言 Go语言的一个流行特性是它对并发的一流支持,即一个程序可以同时做多件事。随着计算机从更快地运行单个代码流转向同时运行更多代码流,能够并发地运行代码正在成为编程的重要组成部分。为了让程序运行得更快,程序员需要把程序设计成并发运行,这样程序中并发的每一部分…

HQL优化之数据倾斜

group by导致倾斜 前文提到过&#xff0c;Hive中未经优化的分组聚合&#xff0c;是通过一个MapReduce Job实现的。Map端负责读取数据&#xff0c;并按照分组字段分区&#xff0c;通过Shuffle&#xff0c;将数据发往Reduce端&#xff0c;各组数据在Reduce端完成最终的聚合运算。…

SpringCloud-高级篇(八)

&#xff08;1&#xff09;TCC模式 前面学了XA和AT模式&#xff0c;这两种模式最终都能实现一致性&#xff0c;和隔离性&#xff0c;XA是强一致&#xff0c;AT是最终一致&#xff0c;隔离性呢XA是在第一阶段不提交&#xff0c;基于事务本身的特性来完成隔离&#xff0c;AT则是…

MongoDB表的主键可以重复?!MongoDB的坑

MongoDB表的主键可以重复&#xff1f;&#xff01; 眼见为实&#xff1f; 碰到一个奇怪的现象&#xff0c; MongoDB的一个表居然有两个一样的_id值&#xff01; 再次提交时&#xff0c;是会报主键冲突的。那上图&#xff0c;为什么会有两个一样的_id呢&#xff1f; 将它们的…

【halcon深度学习】目标检测的数据准备过程中的一个库函数determine_dl_model_detection_param

determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数&#xff0c;强烈建议使用这一过程来优化训练和推断性能。 过程签名 determine_dl_model_detection…

10 新字符设备驱动文件

一、新字符设备驱动原理 因为 register_chrdev 和 unregister_chrdev 两个函数是老版本驱动文件&#xff0c;现在可以用新字符设备驱动 API 函数。 1. 分配和和释放设备号 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可&#xff0c;但是这样会带来两…

【面试】广告优化

a1&#xff1a;点击率公式是什么&#xff1f;点击率低的原因是什么&#xff1f; 点击率点击/曝光&#xff0c;点击率低的原因主要有两点&#xff1a;一是创意不吸引人&#xff1b;二是目标受众不准确/定向过宽不精确&#xff0c;广告曝光给了对产品不感兴趣用户 a2&#xff1a;…

数据库——关系数据的规范化:范式判断【知识点罗列+例题讲解】

知识点罗列&#xff1a; 各种范式之间的关系 1.第一范式1NF&#xff1a; 如果关系模式R中所有的属性都具有原子性&#xff0c;均是不可再分的&#xff08;一个属性不能再被分解成更小的数据单元&#xff09;&#xff0c;则称R属于第一范式&#xff0c;简称1NF&#xff0c;记作R…

linux常见错误

1.E45: ‘readonly‘ option is set (add ! to override) 首先使用以下命令从Vim编辑器中出来&#xff1a;:qa!(强制退出) 接下来&#xff0c;使用sudo vim filename和更高版本&#xff1a;:wq 2.Bash script – "/bin/bash^M: bad interpreter: No such file or direc…

yolov5单目测距+速度测量+目标跟踪

要在YOLOv5中添加测距和测速功能&#xff0c;您需要了解以下两个部分的原理&#xff1a; 单目测距算法 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法&#xff08;如立体匹配&#xff09;和基于深度学习的方法&#xff08;如神经网…

安捷伦N9020A 是德keysight/N9020A

N9020A信号分析仪自动化和通讯接口&#xff1a; 符合 LXI、SCPI 和 IVI-COM USB 3.0、1000Base-T LAN、GPIB 编程与 PSA、8566/68 和 856x 的远程语言兼容性 通用 X 系列用户界面 / 开放式 Windows 7 操作系统&#xff08;标准&#xff09; 将现有的 MXA 从 Windows XP 迁移到…

CAN 五: CAN编程实践

1、CAN基本驱动步骤 (1)CAN参数初始化 工作模式、波特率等函数&#xff1a;HAL_CAN_Init (2)使能CAN时钟和初始化相关引脚 GPIO模式设为复用功能模式函数&#xff1a;HAL_CAN_MspInit(CAN的初始化回调函数) (3)设置过滤器 过滤器的配置函数&#xff1a;HAL_CAN_ConfigFil…

【linux】(ubuntu)下 QT 出现的问题

错误一&#xff1a;Make 运行QT程序以后出现这样的错误。 【解决方法】 我的ubuntu版本是18.04.4&#xff0c; 原因1&#xff1a;没有更换软件源 原因2&#xff1a;没安装相关 软件包 注意&#xff1a;这一步很有可能卡死这一步&#xff0c;所以如果一直卡在这并且进度…

黑马点评01

基础篇-07.Redis命令-数据结构介绍_哔哩哔哩_bilibili 1.NoSQL 非结构化数据库&#xff0c;和sql的区别在于没有数据库表之间的关系&#xff08;主键外键&#xff09;&#xff0c;一般的存储形式是JSON。每个json里面都存储了该记录的所有数据&#xff0c;所以有一定重复性。 …