MySQL数据库的基础概念

目录

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

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

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系统中创建一个非目录普通文件。

对上面的内容做一下总结,走到这里我们就证明了3件事:

  1. 所谓的DB就是Linux系统下的一个目录文件。
  2. 所谓的表就是Linux系统下的一个普通文件。
  3. 所谓的use使用某个数据库DB本质就是在Linux系统中cd进入某个目录文件。

然后我们以后要知道,所谓的使用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语句。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库损坏后重装,数据库备份

重装 先卸载 sudo apt-get remove --purge mysql-server mysql-client mysql-common sudo apt-get autoremove sudo apt-get autoclean 然后重新安装MySQL: sudo apt-get install mysql-server mysql-client 首先要先使用无密码登录数据库一定要使用 sudo mysql -uroo…

数据结构(七):树介绍及面试常考算法

一、树介绍 1、定义 树形结构是一种层级式的数据结构&#xff0c;由顶点&#xff08;节点&#xff09;和连接它们的边组成。 树类似于图&#xff0c;但区分树和图的重要特征是树中不存在环路。树有以下特点&#xff1a; &#xff08;1&#xff09;每个节点有零个或多个子节点…

企业微信旧版-新版网络连接错误,无法登录的解决方案

一.企业微微信无法登录故障 二.解决方案 1.网上的解决方案 **检查网络连接&#xff1a;**确保你的计算机正常连接到互联网。尝试打开其他网页&#xff0c;以确保网络连接正常。 **防火墙和安全软件&#xff1a;**某些防火墙或安全软件可能会阻止企业微信的正常连接。请确保你…

computed 和 watch 的奇妙世界:让数据驱动你的 Vue 应用(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

idea2023解决右键没有Servlet的问题

复制Servlet Class.java中的文件。 回到文件&#xff0c;然后点击小加号 然后输入刚刚复制的东西&#xff1a; 3. 此时右键有servlet。 4. 然后他让你输入下面两个框&#xff1a; JAVAEE TYPE中输入Servlet Class Name 表示你要创建的Servlet类的名称是什么。自己起名字。然后…

寒冷冬天,再次撕下了新能源汽车的续航遮羞布,北方真不适合

随着懂车帝的冬测&#xff0c;新能源汽车的冬天续航成为关注焦点&#xff0c;电池性能在冬天里缩减众所周知&#xff0c;不过从来没有机构告诉消费者&#xff0c;到底冬天电池的续航会减少多少&#xff0c;如今这一切显然暴露在人们眼前了。 懂车帝的冬测显示除了特别优秀的新能…

Elasticsearch的 8.x常用api汇总

ES的查询语法比较复杂,对于初学者需要在不断练习中才会逐渐掌握,本文汇总了ES各种查询语法以及常用api,可以作为新手的实用笔记 首先,安装 Kibana! 下载Elasticsearch,官方下载页面;Elasticsearch 参考,官方文档;<

「构」向云端 - 我与 2023 亚马逊云科技 re:Invent 大会

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 2023年亚马逊AWS re:Invent大会宣布一项Amazon Q的创新项目&#x…

为什么 GAN 不好训练

为什么 GAN 不好训练&#xff1f;先看 GAN 的损失&#xff1a; 当生成器固定时&#xff0c;堆D(x)求导&#xff0c;推理得到&#xff08;加号右边先对log求导&#xff0c;再对负项求导&#xff09; 然后在面对最优Discriminator时&#xff0c;Generator的优化目标就变成了&…

基于BWA,Bowtie2,samtools、checkm等工具计算宏基因组学序列分析中Contigs与Genes在样品中的丰度,多种计算方式和脚本对比

计算contigs和genes相对丰度可以提供有关微生物群落结构和功能的信息。以下是计算这两个指标的意义&#xff1a; 1. Contigs的相对丰度&#xff1a;contigs是利用基因组测序技术获得的碎片序列&#xff0c;通过计算contigs的相对丰度可以了解微生物群落中不同菌种的相对丰度。…

ARM KEIL 安装

根据设备类型安装开发工具及环境 Arm,Cortex ----> MDK-Arm 8051 ----> C51 80251 ----> C251 C166,XC166,XC2000 MCU设备 ----> C155 填写信息提交后下载 点击MDK539.EXE下载 : MDK539.EXE 双击MDK539安装 点击Next 默认安装路径,点击Ne…

SaaS行业分析

文章目录 什么是SaaS ?SaaS的标准定义什么是软件即服务&#xff1f;SaaS与传统软件的区别 &#xff1f; SaaS行业分析你知道最赚钱的行业是什么&#xff1f;互联网带给企业的变化 SaaS与PaaS、IaaS的区别&#xff1f;IaaS&#xff08;Infrastructure as a Service&#xff09;…

C与C++编程语言的区别和联系

一、引言 C和C是两种广泛使用的编程语言&#xff0c;它们都在软件开发领域有着广泛的应用。虽然C是从C语言演化而来的&#xff0c;但两者之间存在一些重要的区别和联系。本文将详细介绍这两种编程语言的相同点和不同点&#xff0c;并通过实际例子进行说明。 二、C与C的相同点 …

微服务组件Sentinel的学习(3)

Sentinel 隔离和降级Feign整合Sentinel线程隔离熔断降级熔断策略 授权规则&#xff1a;自定义异常 隔离和降级 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范用避免雪崩&#xff0c;就要靠线程隔离(舱壁…

BearPi Std 板从入门到放弃 - 先天神魂篇(7)(RT-Thread 定时器-软件定时器)

简介 RT-Thread 软件定时器的简单使用步骤 创建项目 参考 BearPi RT-Thread项目创建 定时器管理接口 定时器时钟节拍 定时器管理相关函数 定时器类型 #define RT_TIMER_FLAG_ONE_SHOT 0x0 //一次性计时器 #define RT_TIMER_FLAG_PERIODIC 0x2 // 周期性定时器 #…

若依框架springboot——修改前端图片上传样式

简述 使用过若依框架的&#xff0c;一定知道若依前端框架上传图片的样式&#xff0c;是一个正方形加号图片&#xff0c;但是如果你要使用自定义样式呢。 比如将下面这个图进行修改呢 修改后的样式 你可以直接找到element-ui 修改上传图片的组件&#xff0c;也可以加入新的组…

计算机组成原理-选择语句和循环语句的汇编表示

文章目录 选择语句jmpjxx示例&#xff1a;选择语句的机器级表示扩展&#xff1a;cmp指令的底层原理 循环语句使用条件转移指令实现循环用loop指令实现循环 选择语句 不一定知道指令的位置&#xff0c;所以jmp直接跳转到指令的位置很难办 jmp 标号相当于位置&#xff0c;名字…

OSPF理论总结与实验

第1章 OSPF[1] 本章阐述了OSPF协议的特征、术语&#xff0c;OSPF的路由器类型、网络类型、区域类型、LSA类型&#xff0c;OSPF报文的具体内容及作用&#xff0c;描述了OSPF的邻居关系&#xff0c;通过实例让读者掌握OSPF在各种场景中的配置。 本章包含以下内容&#xff1a; …

【Java代码审计】文件上传篇

【Java代码审计】文件上传篇 1.Java常见文件上传方式2.文件上传漏洞修复 1.Java常见文件上传方式 1、通过文件流的方式上传 public static void uploadFile(String targetURL, String filePath) throws IOException {File file new File(filePath);FileInputStream fileInpu…

node.js 启一个前端代理服务

文章目录 前言一、分析技术二、操作步骤2.1、下载依赖2.2、创建一个 serve.js 文件2.3、js 文件中写入以下代码 三、运行&#xff1a; node serve四、结果展示五、总结六、感谢 前言 有时候我们需要做一些基础的页面时&#xff0c;在研发过程中需要代理调用接口避免浏览器跨域…