目录

一、引言:为什么选择MySQL?

二、MySQL安装与登录配置

2.1 环境准备

2.2 登录指令详解

三、数据库核心操作

3.1 数据库生命周期管理

3.2 数据库存储引擎选择

四、数据表设计与操作

4.1 表结构创建(含数据类型详解)

4.2 表结构修改与管理

五、数据操作(CRUD核心)

5.1 插入数据(INSERT)

5.2 查询数据(SELECT)

5.3 更新与删除(UPDATE/DELETE)

六、数据完整性约束

6.1 六大约束类型全解析

6.2 外键级联操作(解决关联删除问题)

七、索引优化实战

7.1 索引类型与创建策略

7.2 执行计划分析(EXPLAIN)

八、事务与ACID特性

8.1 事务控制语句

8.2 ACID保障

九、常见问题与解决方案

9.1 死锁处理

9.2 数据备份与恢复

十、总结与进阶学习路径


一、引言:为什么选择MySQL?

MySQL作为开源关系型数据库管理系统(RDBMS),以其轻量、高效、稳定的特性占据全球数据库市场的重要地位。无论是中小型网站、企业级应用还是云服务,MySQL都能提供可靠的数据存储解决方案。本文将从基础操作到进阶特性,系统讲解MySQL的核心使用方法,帮助读者快速上手并深入理解数据库管理逻辑。

二、MySQL安装与登录配置

2.1 环境准备
  • Windows系统:通过MySQL Installer选择"Developer Default"安装完整开发环境,包含MySQL Server、Workbench图形工具及连接器。
  • Linux系统:使用包管理器一键安装(如yum install mysql-serverapt-get install mysql-server),安装后需执行mysql_secure_installation初始化安全配置(设置root密码、禁用远程root登录等)。
  • 验证安装:终端输入mysql --version,返回版本信息即表示安装成功。
2.2 登录指令详解

场景命令示例说明
本地默认登录mysql -u root -p-u指定用户,-p提示输入密码(密码不可见,输入后回车)
指定端口登录mysql -u root -p -P 3307当MySQL端口非默认3306时,用-P(大写)指定端口
远程服务器登录mysql -h 192.168.1.100 -u admin -p-h指定远程主机IP,需确保服务器开放3306端口且用户有远程访问权限
登录后切换数据库use test_db;切换至test_db数据库,后续操作默认在此库中执行

安全提示:生产环境中禁止使用root账户直接操作业务数据,应创建专用用户并分配最小权限(如GRANT SELECT,INSERT ON db.* TO 'user'@'localhost' IDENTIFIED BY 'password';)。

三、数据库核心操作

3.1 数据库生命周期管理
-- 1. 创建数据库(指定字符集为UTF-8mb4以支持emoji)
CREATE DATABASE IF NOT EXISTS company_db 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;-- 2. 查看所有数据库
SHOW DATABASES;-- 3. 查看当前数据库信息
SELECT DATABASE();-- 4. 修改数据库字符集
ALTER DATABASE company_db CHARACTER SET utf8mb4;-- 5. 删除数据库(谨慎操作!不可逆)
DROP DATABASE IF EXISTS old_db;
3.2 数据库存储引擎选择

MySQL支持多种存储引擎,常用的包括:

  • InnoDB(默认):支持事务、行级锁、外键,适合写密集型应用(如电商订单系统)。
  • MyISAM:不支持事务但查询速度快,适合读密集型场景(如日志分析)。
  • Memory:数据存储在内存中,适合临时计算(如会话缓存)。

查看与修改存储引擎:

-- 查看表使用的存储引擎
SHOW TABLE STATUS LIKE 'employees';-- 创建表时指定存储引擎
CREATE TABLE logs (
id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT
) ENGINE=MyISAM;

四、数据表设计与操作

4.1 表结构创建(含数据类型详解)
CREATE TABLE employees (
id INT UNSIGNED AUTO_INCREMENT COMMENT '员工ID(自增主键)',
name VARCHAR(50) NOT NULL COMMENT '姓名(非空)',
gender ENUM('male', 'female', 'other') DEFAULT 'other' COMMENT '性别(枚举类型)',
birth_date DATE COMMENT '出生日期',
salary DECIMAL(10,2) UNSIGNED COMMENT '薪资(精确到分)',
hire_date DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间(默认当前时间)',
department_id INT UNSIGNED COMMENT '部门ID(外键关联)',
is_active TINYINT(1) DEFAULT 1 COMMENT '是否在职(1:是,0:否)',
PRIMARY KEY (id),
KEY idx_department (department_id), -- 普通索引
CONSTRAINT fk_dept FOREIGN KEY (department_id) REFERENCES departments(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工信息表';

核心数据类型对比

类型用途示例空间效率注意事项
INT年龄、数量4字节UNSIGNED可扩大正数范围
VARCHAR(50)姓名、邮箱动态长度超过255字符建议用TEXT
DECIMAL(10,2)价格、薪资高精度定点数避免FLOAT/DOUBLE的浮点误差
DATETIME订单时间、日志时间8字节范围1000-9999年,不受时区影响
TIMESTAMP最后更新时间4字节范围1970-2038年,自动转换时区
4.2 表结构修改与管理
-- 添加列
ALTER TABLE employees ADD COLUMN phone VARCHAR(20) AFTER name;-- 修改列类型
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12,2);-- 删除列
ALTER TABLE employees DROP COLUMN phone;-- 重命名表
ALTER TABLE employees RENAME TO staff;-- 清空表数据(保留结构,自增ID重置)
TRUNCATE TABLE staff;

五、数据操作(CRUD核心)

5.1 插入数据(INSERT)
-- 完整插入
INSERT INTO employees (name, gender, birth_date, salary, department_id)
VALUES ('张三', 'male', '1990-01-15', 8000.00, 1);-- 批量插入(效率高于多次单条插入)
INSERT INTO employees (name, gender, salary) VALUES
('李四', 'female', 7500.00),
('王五', 'male', 9000.00);-- 插入查询结果
INSERT INTO employees_backup SELECT * FROM employees WHERE department_id=3;
5.2 查询数据(SELECT)

基础查询

-- 简单查询
SELECT name, salary FROM employees WHERE department_id=1;-- 带条件排序
SELECT * FROM employees 
WHERE salary > 6000 
ORDER BY hire_date DESC 
LIMIT 10 OFFSET 5; -- 分页:从第6条开始取10条

高级查询

-- 聚合查询(统计部门平均薪资)
SELECT department_id, AVG(salary) AS avg_salary, COUNT(*) AS emp_count
FROM employees 
GROUP BY department_id 
HAVING avg_salary > 7000; -- 对聚合结果过滤-- 多表联查(内连接)
SELECT e.name, d.dept_name 
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;-- 子查询(查找薪资高于部门平均的员工)
SELECT name, salary 
FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id=1);
5.3 更新与删除(UPDATE/DELETE)
-- 安全更新(添加LIMIT避免全表更新)
UPDATE employees 
SET salary = salary * 1.1, is_active=1 
WHERE department_id=2 AND hire_date < '2020-01-01'
LIMIT 100;-- 删除数据(谨慎!建议先查后删)
DELETE FROM employees 
WHERE is_active=0 AND hire_date < '2015-01-01';

安全操作原则:执行UPDATE/DELETE时必须加WHERE条件,生产环境建议开启sql_safe_updates=1(禁止无条件更新/删除)。

六、数据完整性约束

6.1 六大约束类型全解析

约束类型关键字作用示例违反约束的后果
主键约束PRIMARY KEY唯一标识记录(如员工ID)插入重复值报错
外键约束FOREIGN KEY关联两张表(如员工表关联部门表)插入不存在的关联值报错
唯一约束UNIQUE确保列值不重复(如邮箱)重复插入报错
非空约束NOT NULL列值不可为空(如姓名)插入NULL值报错
默认约束DEFAULT未指定值时使用默认值(如性别默认'other')未赋值时自动填充默认值
检查约束CHECK限制列值范围(如薪资>0)值不满足条件时报错

示例:创建带完整约束的用户表

CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) NOT NULL UNIQUE COMMENT '用户名',
email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
age INT CHECK (age >= 0 AND age <= 120) COMMENT '年龄范围0-120',
status ENUM('active', 'inactive') DEFAULT 'active' COMMENT '状态'
);
6.2 外键级联操作(解决关联删除问题)
-- 创建部门表(主表)
CREATE TABLE departments (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE
);-- 创建员工表(从表),外键级联删除
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(id)
ON DELETE CASCADE -- 当部门删除时,关联员工也删除
ON UPDATE CASCADE -- 当部门ID更新时,员工表关联ID同步更新
);

七、索引优化实战

7.1 索引类型与创建策略
-- 普通索引(加速查询)
CREATE INDEX idx_name ON employees(name);-- 联合索引(遵循最左前缀原则)
CREATE INDEX idx_dept_salary ON employees(department_id, salary);-- 唯一索引(兼具约束与加速)
CREATE UNIQUE INDEX idx_email ON users(email);

索引失效场景

  • 使用OR连接非索引列(如WHERE name='张三' OR age=30
  • 对索引列进行函数操作(如WHERE SUBSTR(name,1,2)='张'
  • 使用NOT IN!=IS NULL(部分情况)
  • LIKE以%开头(如WHERE name LIKE '%三'
7.2 执行计划分析(EXPLAIN)
EXPLAIN SELECT * FROM employees 
WHERE department_id=3 AND salary > 6000;

关注type列(ALL=全表扫描,ref=索引引用,range=范围扫描)和key列(实际使用的索引)。

八、事务与ACID特性

8.1 事务控制语句
START TRANSACTION; -- 开启事务
UPDATE account SET balance = balance - 100 WHERE id=1; -- A转账
UPDATE account SET balance = balance + 100 WHERE id=2; -- B收款
COMMIT; -- 提交事务(成功)
-- ROLLBACK; -- 若出错则回滚(恢复到初始状态)
8.2 ACID保障
  • 原子性(Atomicity):事务要么全执行,要么全回滚(如转账过程中断则恢复)。
  • 一致性(Consistency):事务前后数据符合业务规则(如总余额不变)。
  • 隔离性(Isolation):多事务并发时互不干扰(通过隔离级别控制)。
  • 持久性(Durability):事务提交后数据永久保存(写入redo log)。

九、常见问题与解决方案

9.1 死锁处理

现象:两个事务互相等待对方释放锁。
解决:

-- 查看当前锁等待
SHOW ENGINE INNODB STATUS;-- 避免死锁:保持一致的加锁顺序,控制事务大小
9.2 数据备份与恢复
# 备份数据库(命令行执行)
mysqldump -u root -p company_db > backup_20250812.sql# 恢复数据库
mysql -u root -p new_db < backup_20250812.sql

十、总结与进阶学习路径

本文系统讲解了MySQL的核心操作,从登录到事务,从表设计到索引优化。建议读者通过以下路径深化学习:

  1. 官方文档:MySQL Reference Manual
  2. 性能优化:学习慢查询日志、EXPLAIN分析、索引设计
  3. 高可用:主从复制、读写分离、分库分表
  4. 工具链:掌握Navicat、DBeaver等图形工具,以及Python/Java连接器

实践建议:搭建测试环境,复现本文示例,尝试设计一个完整的电商数据库模型(用户、商品、订单、支付表),并实现基础CRUD操作。

通过持续实践与问题解决,你将逐步掌握MySQL的精髓,为后端开发、数据分析等领域打下坚实基础。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring源码解析 - SpringApplication run流程-prepareContext源码分析

prepareContext源码分析 private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments, Bann…

HIS系统:医院信息化建设的核心,采用Angular+Java技术栈,集成MySQL、Redis等技术,实现医院全业务流程管理。

HIS系统在医院信息化建设中扮演着核心的角色。它是一个综合性的信息系统&#xff0c;旨在管理和运营医院的各种业务&#xff0c;包括门诊、住院、财务、物资、科研等。技术细节&#xff1a;前端&#xff1a;AngularNginx后台&#xff1a;JavaSpring&#xff0c;SpringBoot&…

深度学习-卷积神经网络-LeNet

卷积神经网络是一种专门用于处理具有网格结构数据&#xff08;如图像、音频等&#xff09;的深度学习模型。它通过卷积层自动提取数据中的特征&#xff0c;利用局部连接和参数共享的特性减少了模型的参数数量&#xff0c;降低了过拟合的风险&#xff0c;同时能够有效地捕捉数据…

【Java项目与数据库、Maven的关系详解】

Java项目与数据库、Maven的关系详解 一、Java项目是否都需要连接本地数据库&#xff1f; 不一定&#xff0c;这取决于项目类型和需求&#xff1a; 1. 需要数据库的项目类型项目类型数据库作用典型场景Web应用存储用户数据/业务数据电商系统、CMS服务端程序持久化数据金融交易系…

两个Maven工程,使用idea开发,工程A中依赖了工程B,改了工程B,工程A如何获取最新代码

两个Maven工程&#xff0c;使用idea开发&#xff0c;工程A中依赖了工程B&#xff0c;改了工程B&#xff0c;工程A如何获取最新代码 如果工程B的版本是快照&#xff0c;那么如下。 步骤一 工程B 执行 clean package install deploy 步骤二 工程A 刷新Maven

奥比中光与地平线、地瓜机器人达成战略合作,携手推动机器人智能化

摘要&#xff1a;机器人“慧眼”与“智脑”强强联合&#xff01;8月11日&#xff0c;奥比中光与地平线及其控股子公司地瓜机器人在北京签订合作协议&#xff0c;双方将在机器人智能化领域展开深度合作&#xff0c;充分发挥各自的技术与产品优势&#xff0c;携手推动机器人产业的…

【Linux】Tomcat

Tomcat简介Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和 并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat 具有处理HTML页面的功能&#xff0c;它还是一个Servlet和 JSP容器Tomcat的使用安装ja…

Putting it all together 将所有内容整合在一起

官方链接 https://www.youtube.com/watch?vAa_FAA3v22g&t1s Task1 Putting It All Together 将所有内容整合在一起 图片版 文字版 Putting It All Together 将所有内容整合在一起 From the previous modules, youll have learned that quite a lot of things go on b…

Python 闭包详解:从变量作用域到实战案例

一、变量作用域基础在 Python 中&#xff0c;变量根据作用范围可分为三类&#xff1a;全局变量&#xff1a;定义在函数外部的变量&#xff0c;作用范围是整个程序。如果在函数内部需要修改全局变量&#xff0c;必须使用global关键字声明。局部变量&#xff1a;定义在函数内部的…

Docker 跨主机容器之间的通信macvlan

默认一个物理网卡&#xff0c;只有一个物理mac地址&#xff0c;虚拟多个mac地址 缺点&#xff1a;每次需要手动配置ip地址&#xff0c;容易ip地址冲突。类似于保存到execl表格里面。 两台物理机&#xff1a; docker-01和docker-02 创建macvlan网络 [rootdocker-01 ~]# docker n…

android 换肤框架详解1-换肤逻辑基本

android 换肤框架详解1-换肤逻辑基本-CSDN博客 android 换肤框架详解2-LayoutInflater源码解析-CSDN博客 android 换肤框架详解3-自动换肤原理梳理-CSDN博客 换肤框架流程 1&#xff0c;通过AssetManager获取换肤的资源文件 2&#xff0c;通过原文件中的resId获取到res名称…

NEON性能优化总结

转自 NEON优化&#xff1a;性能优化经验总结-CSDN博客 NEON优化&#xff1a;性能优化经验总结 1. 什么是 NEON Arm Adv SIMD 历史 2. 寄存器 3. NEON 命名方式 4. 优化技巧 5. 优化 NEON 代码(Armv7-A内容&#xff0c;但区别不大) 5.1 优化 NEON 汇编代码 …

计算机网络摘星题库800题笔记 第2章 物理层

第2章 物理层2.1 物理层概述题组闯关1.采用以下哪种设备&#xff0c;可以使数字信号传输得更远 ( )。 A. 放大器 B. 中继器 C. 网桥 D. 路由器1.【参考答案】B 【解析】选项 A 放大器只是单纯地放大信号、抑制噪音和干扰。选项 B 中继器是把一根线缆中的电或者光信号传递给另一…

导入文件到iPhone实现

我们有时候开发需要加载一些自己的文件&#xff0c;这个时候就需要导入文件到iPhone等设备。在info里面open as source code&#xff0c;加入如下配置&#xff1a;<!-- 开启 iTunes / Finder 文件共享 --><key>UIFileSharingEnabled</key><true/>或者o…

Ubuntu Server系统安装磁盘分区方案

最近打算把家里的旧电脑利用起来&#xff0c;装上Ubuntu Server 24.04.3 LTS作为一个家用NAS服务器&#xff0c;但是给旧电脑安装系统时遇到了一些问题&#xff0c;遂记录下来 GPT分区与MBR分区 GPT 指的是 GUID Partition Table&#xff08;全局唯一标识分区表&#xff09;&am…

1小时 MySQL 数据库基础速通

目录 一、MySQL安装配置 1、下载mysql 2、下载mysql-shell 二、MySQL基本概念 1. 数据库&#xff08;Database&#xff09; 2. 表&#xff08;Table&#xff09; 3. 数据类型&#xff08;Data Type&#xff09; 4. 主键&#xff08;Primary Key&#xff09; 5. 索引&am…

HTTP应用层协议-长连接

HTTP应用层协议-长连接 关于 connection 报头 HTTP 中的 Connection 字段是 HTTP 报文头的一部分&#xff0c;它主要用于控制和管理客户端与服务器之间的连接状态 核心作用 • 管理持久连接&#xff1a;Connection 字段还用于管理持久连接&#xff08;也称为长连接&#xff09;…

2020/12 JLPT听力原文 问题一 4番

4番&#xff1a;ホテルの受付で女の人と男の人が話しています。女の人はどこでパソコンを使いますか。女&#xff1a;すみません、パソコンの貸出ってできますか。部屋で仕事をしたいんですけど。 男&#xff1a;申し訳ございません。貸出はしていないんですが、二階にビジネス…

《在 Spring Boot 中安全使用 Qwen API-KEY:环境变量替代明文配置的最佳实践》

《在 Spring Boot 中安全使用 Qwen API-KEY&#xff1a;环境变量替代明文配置的最佳实践》 想要的效果其实就是 把 Qwen API-KEY 放到系统环境变量中&#xff0c;然后在 application.yml 里通过占位符读取&#xff0c;而不写明文。 这样即便 application.yml 被提交到 Git&…

Nginx 反向代理与负载均衡架构

一、反向代理基础 实验目的&#xff1a;通过 Nginx 反向代理&#xff0c;将客户端请求按类型&#xff08;静态页面 / 动态 PHP 页面&#xff09;转发到不同的后端服务器&#xff08;RS1 处理静态资源&#xff0c;RS2 处理动态请求&#xff09;&#xff0c;实现 “客户端只与代…