【MySQL】数据库基础

【MySQL】数据库基础

本博客讲解的前置条件 :已经在CentOS7上安装了适配版本的MySQL,设置了免密登录,并在 my.cnf 中配置了 port=3306、character-set-server=utf8、default-storage-engine=innodb

本文还需区分两种命令窗口:

  • Linux Shel l:提示符常类似 root@主机名 \~# 或 用户@主机名 \~$。这里运行 ls、ps、ss、systemctl 等 Linux 命令。
  • MySQL 客户端 :提示符通常是 mysql>。这里运行 SELECT、SHOW、CREATE、INSERT 等 SQL

提示 :不要把 SQL 直接敲进普通 Shell ,也不要把 ls、ps 等 Linux 命令直接敲进 mysql> 。如果不确定自己在哪个环境,先看提示符

安全规则 :实验尽量使用普通实验数据库 ;不要随意删除 /var/lib/mysql 下的文件,不要执行来历不明的 rm -rf,不要为了远程连接把 3306 端口开放给整个公网

文章目录

  • 【MySQL】数据库基础
    • [一、 MySQL是啥](#一、 MySQL是啥)
    • [二、 MySQL在Linux上怎么运行](#二、 MySQL在Linux上怎么运行)
      • [1、 MySQL 服务管理](#1、 MySQL 服务管理)
      • [2、 连接本机的MySQL](#2、 连接本机的MySQL)
      • [3、 远程连接mysql](#3、 远程连接mysql)
      • [4、 数据库、表和Linux文件系统的关系](#4、 数据库、表和Linux文件系统的关系)
    • [三、 创建学生信息数据库](#三、 创建学生信息数据库)
      • [1、 创建数据库](#1、 创建数据库)
      • [2、 在 helloworld 中建 student 表](#2、 在 helloworld 中建 student 表)
      • [3、 插入、查询和统计学生数据](#3、 插入、查询和统计学生数据)
    • [四、 存储引擎:MySQL 如何决定表的数据怎样保存?](#四、 存储引擎:MySQL 如何决定表的数据怎样保存?)
    • [五、 SQL 分类:看到命令就知道它大概负责什么](#五、 SQL 分类:看到命令就知道它大概负责什么)
    • [六、 小练习](#六、 小练习)

一、 MySQL是啥

1、为什么需要数据库?

我们熟知的普通文件 已经能存数据了,为什么我们还需要额外搞个数据库 呢?

想象你正在做一个学生管理系统。你可以把学生信息放在一个文本文件中:

学号,姓名,年龄,性别

1,张三,20,男

2,李四,21,女

3,王五,19,男

这样当然可以保存数据。小规模、结构简单、几乎没人同时修改的场景,普通文件可能完全够用 。真正的难点出现在数据越来越多、查询越来越复杂、多人同时使用、程序突然崩溃的时候

例如 ,老师想查出所有年龄大于 20 岁的学生;管理员想统计人数;两个工作人员同时修改同一位学生的资料;程序写到一半突然断电。若只用普通文本文件,程序就必须自行负责读取、解析、查找、修改、避免覆盖、权限控制、备份和异常恢复等工作

数据库 提供的不是"另一种文件后缀",而是一整套数据管理方案:它定义数据结构,提供查询语言,协调并发操作,管理权限,并借助日志、事务、索引等机制提高可靠性与查询效率

不是"文件不好、数据库一定更好",而是:当数据需要被持续、可靠、多人协作地管理时,数据库通常更合适。

2、数据库、管理系统和表

一些名词解释

术语 通俗解释 更准确的说法
数据(Data) 具体的信息,例如张三、20、男 被记录和处理的事实
数据库(Database,DB) 按一定结构组织的数据集合 逻辑上的数据组织与容器
数据库管理系统(DBMS) 负责管理数据的专门软件 提供定义、查询、更新、权限、事务等能力的软件
MySQL 我们使用的一种数据库管理系统 一种关系型数据库管理系统(RDBMS)
表(Table) 像电子表格一样按行列组织数据 由列定义结构、由行保存记录的数据对象
存储引擎(Storage Engine) 决定表的数据怎样存、怎样查、怎样维护 MySQL 用来实现表级存储与访问机制的组件

数据库是逻辑组织, 不等于一个固定的 Linux 文件;但在常见的本地部署中,数据库最终会通过数据文件、索引文件、日志等落到磁盘上

3、mysql是客户端,mysqld是服务器

C/S 是 Client/Server 的缩写 ,中文叫"客户端/服务器"模式。它是一种常见的软件组织方式 :客户端提出请求,服务器接收并处理请求,再把结果返回给客户端

客户端像点餐的顾客,服务器像厨房。顾客说"来一份炒饭",厨房负责真正制作,再把结果交给顾客。顾客手里的菜单并不等于厨房,顾客也不需要自己跑进厨房翻找食材。

在 MySQL 里,mysql 通常指命令行客户端程序 ;mysqld 通常指数据库服务器进程 。客户端负责连接、发送 SQL 和展示结果 ;服务器负责验证连接与权限、处理 SQL,并通过存储引擎访问数据

4、MySQL本质上是一种网络服务

其实客户端与服务器不必在同一台电脑上 。客户端可以连接本机的 MySQL,也可以通过网络连接另一台主机上的 MySQL。为了做到这一点,服务器需要在某个网络地址和端口上等待连接

网络服务可以理解为 :一个持续运行、等待请求、按约定规则提供功能的程序。MySQL 服务器通常通过 TCP 连接接收客户端请求,再使用 MySQL 自己的通信协议交换请求和结果

概念 通俗解释 放在 MySQL 场景里
主机(Host) 运行程序的计算机或虚拟机 CentOS 7 云服务器
IP 地址 网络中用于定位主机网络接口的地址 例如 127.0.0.1 或服务器的某个 IP
端口(Port) 一台主机上区分不同网络服务的编号 MySQL 常用 TCP 3306
TCP 提供可靠、有序的字节传输 客户端与服务器建立连接后交换数据
协议(Protocol) 通信双方约定的数据格式和规则 MySQL 客户端与服务器理解彼此请求的规则

可以把 IP 地址理解为大楼地址,把端口理解为大楼里的窗口编号。只有地址通常还不够,要想找到正确的服务,还需要端口

特别注意 :127.0.0.1 是回环地址 ,意思是"当前这台机器自己" 。如果你是在云服务器的终端里执行命令,127.0.0.1指向云服务器自己,不是你的 Windows 电脑

二、 MySQL在Linux上怎么运行

1、 MySQL 服务管理

我们目前统一使用root账号进行操作

ps 用于查看进程 。进程可以先理解为"正在运行中的程序实例"

如果能看到 mysqld 相关行,说明系统中存在匹配的服务器进程 ;如果没有 ,不要立即重装,继续检查服务状态和实际服务名

which 用来查找命令对应的可执行文件路径 。mysql 与 mysqld 可能位于不同路径,路径也会因安装方式而不同

类似的指令还有

bash 复制代码
# 查看mysql服务状态(systemd)
systemctl status mysqld

# 停止mysql
systemctl stop mysqld

# 重启mysql
systemctl restart mysqld

# 登录mysql
mysql -uroot -p

2、 连接本机的MySQL

  • h 127.0.0.1:连接当前机器的回环地址
  • P 3306:连接 3306 端口。注意这里是大写 P
  • u root:使用 root 这个 MySQL 用户名

由于我设置了免密登录,这条命令可能直接进入 mysql>。否则就要输入密码才能进入mysql

更简洁的进入mysql方式(省略 - h、-P,默认连本机 3306)

接下来的两条指令都要在mysql内部运行哦

查询当前 MySQL 数据库的版本号

查看 MySQL 服务监听的端口号

3、 远程连接mysql

bash 复制代码
mysql -h <服务器IP> -P 3306 -u <用户名> -p

尖括号里的文字是占位符,需要替换成真实值 。-p 通常会提示你输入密码。远程连接成功至少需要检查:

  1. mysqld 正在运行
  2. 服务器监听了客户端能到达的地址和端口
  3. 网络路由可达,防火墙或云安全组允许必要的流量
  4. MySQL 账号允许从对应来源主机连接,并且认证成功
  5. 客户端和服务器的版本、协议与配置能够正常协作

因此,"MySQL 是网络服务"并不意味着"只要知道 IP 就一定能连上"。网络连通只是条件之一,账号权限和服务配置同样重要

4、 数据库、表和Linux文件系统的关系

现在让我们把视角从网络连接转向数据存储 。MySQL 服务器收到 SQL 后 ,并不是让程序员自己去编辑某个数据文件,而是由服务器调用存储引擎,按照数据库规则管理数据

bash 复制代码
逻辑上:
MySQL 服务器
├── 数据库 helloworld
│   └── 表 student
└── 数据库 school
    ├── 表 teacher
    └── 表 course

物理上:
Linux 文件系统
└── MySQL 数据目录
    ├── 系统数据、元数据或日志
    ├── helloworld 相关数据文件
    └── school 相关数据文件

我们可以这么理解 :建立数据库其实就是Linux下的一个目录,而在数据库内建表,本质上就是Linux下创建对应文件

三、 创建学生信息数据库

接下来的内容主要以展示为主,在之后的文章会有更详细地讲解

1、 创建数据库

在 Linux Shell 运行 mysql ,进入客户端后,确认提示符变成 mysql> ,再执行下边的指令

注意:MySQL 靠分号 "; "判断一条语句结束,所以一定要在语句末尾加分号";"

SHOW DATABASES; 该指令可查看 MySQL 中所有数据库

查到的 4 个,都是 MySQL5.7 自带的系统库,不是我们自己建的库,不能随意删除哦

  • information_schema:存放数据库元数据(表、字段、权限这些信息)
  • mysql:核心系统库,存账号、密码、权限
  • performance_schema:性能监控、统计
  • sys:简化性能查询,方便 DBA 看性能

CREATE DATABASE helloworld; 创建一个名叫 helloworld 的数据库

USE helloworld; 切换、选中 helloworld 这个数据库,作为当前操作库

MySQL 里操作表之前,必须先用 USE 选中目标数据库;选中之后,后面建表、查数据都是在这个库里面操作

SHOW VARIABLES LIKE 'datadir'; 查看 MySQL 数据文件存放的物理路径

建好 helloworld 数据库,Linux 里面就会在这个路径下生成一个名叫 helloworld 的文件夹,表的数据文件都存在里面

EXIT; 用于退出 MySQL 交互终端;也可以用 QUIT;,效果完全一样

2、 在 helloworld 中建 student 表

学生表可以看成一张电子表格:每一列代表一种属性,每一行代表一名学生

列需要有数据类型,才能约束和解释数据

SQL 类型/约束 通俗解释 本实验用途
INT 整数 年龄或编号
VARCHAR(32) 长度上限为 32 个字符的可变长度文本 姓名
PRIMARY KEY 主键,唯一标识每条记录 防止两条记录使用相同的 id
AUTO_INCREMENT 自动递增编号 插入新学生时自动生成 id
ENGINE=InnoDB 指定表使用 InnoDB 存储引擎 学习事务和常见存储方式

创建表

先切换到helloworld数据库

CREATE TABLE student创建一张名叫 student(学生表)的表

  1. id INT AUTO_INCREMENT PRIMARY KEY
    INT :整数类型
    AUTO_INCREMENT :自增,不用你手动填 id,新增一行自动 + 1
    PRIMARY KEY:主键,唯一、非空,用来唯一区分每一条学生记录
  2. name VARCHAR(32)
    VARCHAR(32):变长字符串,最多存 32 个字符,用来存姓名
  3. age INT:年龄,整数
  4. gender VARCHAR(2):性别
  5. 括号外面两个参数 :
    ENGINE=InnoDB :存储引擎。InnoDB 支持事务、外键,现在最常用
    DEFAULT CHARSET=utf8:默认字符集 utf8,支持存中文

注意关键字、单词之间至少要有一个空格;同一个单词内部不能插空格 ,比如:

CREATE TABLE:CREATE 和 TABLE 之间必须空格,它们是两个独立关键字

student(:student 和 ( 之间,空格可有可无,写不写都行

检查表是否创建成功

SHOW TABLES 查看表名

student 表已经成功建在 helloworld 数据库里面了!

DESCRIBE; 查看列和类型

DESCRIBE 可以简写为 DESC ,两个效果完全一样:DESC student;

3、 插入、查询和统计学生数据

插入几条记录,每执行一条 INSERT,服务器都会处理这条 SQL,并让存储引擎完成相应的数据变更

由于 id 设置了 AUTO_INCREMENT,所以插入语句中没有手动提供 id

查询所有记录

SELECT 表示查询 , * 表示所有列,FROM student 表示从 student 表读取数据。输出的表格是客户端展示的查询结果

带条件查询与统计

WHERE 用于筛选 ,只写 name、age 就只返回指定列;COUNT(*) 统计记录数

敲入 SQL 的地方是客户端 ;真正解析和执行 SQL 的是 mysqld ;数据由存储引擎管理 ;结果再通过连接返回给客户端

四、 存储引擎:MySQL 如何决定表的数据怎样保存?

1、MySQL使用的存储引擎

同样是 MySQL 表,底层可以使用不同的存储引擎

存储引擎负责实现数据如何组织、读取、更新、索引,以及在一定程度上如何支持事务和锁等机制

可以把 MySQL 想象成一家图书馆的管理机构,而存储引擎像不同的资料管理方案:有的更强调事务与可靠性,有的适合特殊用途。选择哪一种,取决于数据和应用的需求

SHOW ENGINES; 用来查看 MySQL 支持的存储引擎,InnoDB 是默认引擎

Support 表示该引擎的支持状态

查看当前默认引擎

2、 常见引擎的入门比较

引擎 入门理解 需要知道的特点
InnoDB 通用场景常用的默认选择 支持事务、行级锁、外键等常见能力;使用日志机制支持恢复
MyISAM 较早版本中常见的非事务型引擎 不支持事务;锁粒度和可靠性特征与 InnoDB 不同
MEMORY 主要把表数据放在内存中 重启后表数据通常不保留;适用场景有限
ARCHIVE 面向归档类场景的引擎 特性和可执行操作有局限,适合特定用途
CSV 以 CSV 格式组织数据的引擎 适用范围有限,不应简单等同于完整的关系型数据库能力

为什么选择 InnoDB?,因为有以下优势:

  • 事务(Transaction):把一组相关操作当作一个整体提交或回滚。
  • 并发控制:多个用户同时操作时,尽量协调读写并减少相互干扰。
  • 崩溃恢复:借助日志等机制,在异常退出后恢复到符合规则的状态。
  • 索引:帮助更快定位数据,但会占用额外空间,也需要在数据更新时维护。

五、 SQL 分类:看到命令就知道它大概负责什么

SQL 是 Structured Query Language(结构化查询语言)。它是我们向数据库表达需求的语言

分类 英文全称 用途 常见命令
DDL Data Definition Language 定义或调整数据库对象结构 CREATE、ALTER、DROP
DML Data Manipulation Language 插入、修改、删除数据 INSERT、UPDATE、DELETE
DQL Data Query Language 查询数据(常单独列出) SELECT
DCL Data Control Language 权限控制 GRANT、REVOKE
事务控制 Transaction Control 控制事务提交与回滚 COMMIT、ROLLBACK

DROP、DELETE、UPDATE 都可能造成不可逆的数据变化。学习时先确认当前数据库和 WHERE 条件;没有备份时不要在真实业务数据上练习

六、 小练习

请把这些问题用自己的话解释清楚

为什么普通文件可以存数据,但数据库更适合复杂查询、多用户访问和可靠的数据管理?

  1. 普通文件可以存数据,但数据库更擅长管理数据

  2. 比如,你要管理一个学校的学生信息。用普通文件(例如 TXT 文件)也可以记录学生的姓名、学号和成绩。但是,如果你想找出所有成绩超过 80 分的学生、统计每个班级的人数,或者让多个老师同时修改学生信息,就需要自己编写很多额外的程序

  3. 数据库则专门提供了这些功能:

    复杂查询 : 可以通过 SQL 快速筛选、统计和排序数据

    多用户访问 : 可以协调多个用户同时读取或修改数据

    数据可靠性: 可以通过约束、事务、日志和恢复机制等减少数据错误,并在故障后恢复数据

  4. 但这并不意味着普通文件绝对做不到这些事情,而是数据库已经提供了专门的管理机制,不需要程序员从头实现所有功能

数据库(DB)、数据库管理系统(DBMS)、MySQL、表和存储引擎分别是什么?

  1. DB:数据库(Database)

    有组织的数据集合。例如,学校的学生信息、课程信息和成绩信息

  2. DBMS:数据库管理系统

    负责创建、管理和操作数据库的软件。它负责处理查询、修改数据、权限和并发访问等问题

  3. MySQL

    一种关系型数据库管理系统。我们可以使用 SQL 语句通过它创建表、插入数据和查询数据

  4. 表(Table)

    用行和列组织数据。例如,学生表的一行代表一个学生,一列代表一个字段,比如姓名或学号

  5. 存储引擎(Storage Engine)

    是数据库内部负责具体存储和处理表数据的组件。不同存储引擎具有不同的特性,例如 InnoDB 支持事务

C/S 是什么?为什么 mysql 是客户端,而 mysqld 是服务器端?

  1. C/S 是 Client/Server 的缩写,意思是客户端/服务器模式
    它描述的是一种工作方式:客户端提出请求,服务器接收请求、处理请求,再把结果返回给客户端
  2. mysql:客户端程序,负责连接数据库服务、发送 SQL 并接收结果
  3. mysqld:服务器程序,负责处理请求、访问和管理数据库中的数据
    两者的区别在于功能角色,而不是是否位于不同的电脑上

IP 地址、端口、TCP 和 MySQL 协议分别解决什么问题?

  1. IP 地址告诉我们要找哪台电脑

  2. 端口告诉我们要找这台电脑上的哪个服务

  3. TCP 负责可靠地传输数据

  4. MySQL 协议规定双方如何理解和处理这些数据

为什么 127.0.0.1 在云服务器上指向云服务器自己?

  1. 127.0.0.1 是一个特殊的 IPv4 回环地址,它的特点是:无论在哪台电脑上使用,它指向的都是当前这台电脑自身
  2. 在云服务器上访问 127.0.0.1:3306,通常是在连接云服务器自己的 MySQL 服务
  3. 在笔记本电脑上访问 127.0.0.1:3306,是在尝试连接笔记本电脑自己的服务,并不会自动连接到云服务器

CREATE DATABASE、CREATE TABLE、INSERT、SELECT 分别做什么?

  1. CREATE DATABASE:创建数据库

  2. CREATE TABLE:定义数据表的结构

  3. INSERT:向表中添加数据

  4. SELECT:查询表中的数据

为什么端口在监听,不代表远程连接一定成功?

端口处于监听状态,只能说明服务正在相应的网络地址和端口上等待连接,并不代表远程客户端一定能够访问。远程连接还受到监听地址、防火墙、安全组、网络连通性以及 MySQL 账号和权限等因素的影响。因此,端口监听是连接成功的一个条件,而不是充分条件

相关推荐
香蕉大香蕉(06敬畏市场)1 小时前
MySQL 单点详解(03)
java·数据库·mysql·面试·八股·大厂实习
赤生云电竞2 小时前
云游戏边缘节点部署:机房选址与网络拓扑优化实践——接入延迟、VXLAN与GPU虚拟化选型
数据库·游戏
Y003 小时前
PostgreSQL 权限管理踩坑记:从 42501 到默认权限和 RLS
数据库·postgresql
呆萌很3 小时前
达梦(DM8)数据库常用SQL
数据库·sql
跟太阳说早安3 小时前
极简数据库SQL
数据库·sql
前端 贾公子3 小时前
第 5 章:Codex 从可运行程序到可交付工具
java·前端·数据库
杨云龙UP3 小时前
MySQL 主从复制管理:暂停、恢复、清理主从关系及命令执行位置
运维·数据库·mysql·主从配置·主从命令·reset replica·清除复制
yzs873 小时前
openGauss branch diff能力解析
数据库·oracle
霂鳯4 小时前
新手勇闯网络安全 | MySQL复习
mysql·安全·web安全