一、MySQL 基础认知与环境搭建

1.1 什么是 MySQL

MySQL 是一款开源的关系型数据库管理系统(RDBMS),广泛应用于 Web 开发、数据分析等领域。它支持多线程、高并发,并且拥有完善的事务处理能力,是目前最流行的数据库之一。

1.2 环境搭建与连接

  • 安装:可通过官方下载包或 Docker 快速部署 MySQL 服务。
  • 连接方式
    • 命令行:mysql -u 用户名 -p,输入密码后进入交互模式。
    • 图形化工具:Navicat、DBeaver、MySQL Workbench 等。
    • 编程语言连接:Python(pymysql)、Java(JDBC)、PHP 等。

1.3 核心概念

  • 数据库(Database):存储数据的容器,包含多张表。
  • 表(Table):数据的二维结构,由行(记录)和列(字段)组成。
  • 字段(Column):表的列,定义数据类型和约束。
  • 记录(Row):表的行,代表一条完整数据。
  • 主键(Primary Key):唯一标识表中记录的字段,非空且唯一。

二、SQL 基础语法

2.1 数据库操作

-- 创建数据库
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 查看数据库
SHOW DATABASES;

-- 使用数据库
USE mydb;

-- 删除数据库
DROP DATABASE IF EXISTS mydb;

2.2 表操作

2.2.1 创建表
CREATE TABLE IF NOT EXISTS employee (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID',
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    gender ENUM('男','女') DEFAULT '男' COMMENT '性别',
    age TINYINT UNSIGNED COMMENT '年龄',
    dept_id INT COMMENT '部门ID',
    salary DECIMAL(10,2) DEFAULT 0.00 COMMENT '薪资',
    hire_date DATE COMMENT '入职日期'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';
2.2.2 修改表结构
-- 添加字段
ALTER TABLE employee ADD COLUMN phone VARCHAR(11) COMMENT '手机号';

-- 修改字段类型
ALTER TABLE employee MODIFY COLUMN age TINYINT UNSIGNED NOT NULL;

-- 删除字段
ALTER TABLE employee DROP COLUMN phone;

-- 重命名表
RENAME TABLE employee TO emp;
2.2.3 删除表
DROP TABLE IF EXISTS emp;

三、数据增删改查(CRUD)

3.1 插入数据(INSERT)

-- 单条插入
INSERT INTO emp (name, gender, age, dept_id, salary, hire_date)
VALUES ('张三', '男', 25, 1, 8000.00, '2021-01-15');

-- 批量插入
INSERT INTO emp (name, gender, age, dept_id, salary, hire_date)
VALUES 
('李四', '女', 28, 2, 9500.00, '2020-05-20'),
('王五', '男', 32, 1, 12000.00, '2019-03-10');

3.2 查询数据(SELECT)

3.2.1 基础查询
-- 查询所有字段
SELECT * FROM emp;

-- 查询指定字段
SELECT name, salary FROM emp;

-- 条件查询
SELECT name, age FROM emp WHERE age > 30;

-- 排序
SELECT name, salary FROM emp ORDER BY salary DESC;

-- 分页
SELECT * FROM emp LIMIT 0, 2;
3.2.2 聚合函数与分组
-- 统计员工数量
SELECT COUNT(*) FROM emp;

-- 平均薪资
SELECT AVG(salary) FROM emp;

-- 按部门分组统计
SELECT dept_id, COUNT(*), AVG(salary) 
FROM emp 
GROUP BY dept_id 
HAVING AVG(salary) > 8000;

3.3 更新数据(UPDATE)

-- 更新单条记录
UPDATE emp SET salary = 8500.00 WHERE id = 1;

-- 批量更新
UPDATE emp SET age = age + 1 WHERE dept_id = 1;

3.4 删除数据(DELETE)

-- 删除单条记录
DELETE FROM emp WHERE id = 3;

-- 清空表(谨慎使用)
TRUNCATE TABLE emp;

四、高级查询与多表操作

4.1 多表连接(JOIN)

4.1.1 内连接(INNER JOIN)
SELECT e.name, d.dept_name
FROM emp e
INNER JOIN dept d ON e.dept_id = d.id;
4.1.2 左连接(LEFT JOIN)
SELECT e.name, d.dept_name
FROM emp e
LEFT JOIN dept d ON e.dept_id = d.id;
4.1.3 右连接(RIGHT JOIN)
SELECT e.name, d.dept_name
FROM emp e
RIGHT JOIN dept d ON e.dept_id = d.id;

4.2 子查询

-- 标量子查询
SELECT name FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);

-- 列子查询
SELECT name FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE dept_name = '技术部');

4.3 联合查询(UNION)

SELECT name FROM emp WHERE gender = '男'
UNION
SELECT name FROM emp WHERE age > 30;

五、约束与索引

5.1 常用约束

  • 主键约束(PRIMARY KEY):唯一标识记录,非空且唯一。
  • 唯一约束(UNIQUE):字段值不可重复。
  • 非空约束(NOT NULL):字段值不能为空。
  • 默认约束(DEFAULT):字段未赋值时使用默认值。
  • 外键约束(FOREIGN KEY):建立表与表之间的关联。
CREATE TABLE dept (
    id INT PRIMARY KEY AUTO_INCREMENT,
    dept_name VARCHAR(50) UNIQUE NOT NULL,
    location VARCHAR(100) DEFAULT '北京'
);

5.2 索引优化

索引是提升查询效率的关键手段,常见类型:

  • 普通索引(INDEX):基础索引,加速查询。
  • 唯一索引(UNIQUE INDEX):字段值唯一,同时加速查询。
  • 主键索引(PRIMARY KEY):特殊的唯一索引,每张表只能有一个。
  • 复合索引:多个字段组合的索引,适用于多条件查询。
-- 创建普通索引
CREATE INDEX idx_emp_name ON emp(name);

-- 创建复合索引
CREATE INDEX idx_emp_dept_salary ON emp(dept_id, salary);

-- 删除索引
DROP INDEX idx_emp_name ON emp;

六、事务与存储引擎

6.1 事务(Transaction)

事务是一组原子性的 SQL 操作,要么全部执行成功,要么全部失败。

  • ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
  • 事务操作
-- 开启事务
START TRANSACTION;

-- 执行 SQL 操作
UPDATE emp SET salary = salary - 1000 WHERE id = 1;
UPDATE emp SET salary = salary + 1000 WHERE id = 2;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

6.2 存储引擎

MySQL 支持多种存储引擎,最常用的是 InnoDB 和 MyISAM

特性 InnoDB MyISAM
事务支持 支持 不支持
外键 支持 不支持
行级锁 支持 表级锁
并发性能
适用场景 高并发、事务型业务 读多写少、统计分析

七、视图、存储过程与函数

7.1 视图(View)

视图是虚拟表,基于查询结果创建,简化复杂查询并保障数据安全。

-- 创建视图
CREATE VIEW emp_dept_view AS
SELECT e.id, e.name, e.salary, d.dept_name
FROM emp e
JOIN dept d ON e.dept_id = d.id;

-- 查询视图
SELECT * FROM emp_dept_view;

7.2 存储过程(Procedure)

存储过程是一组预编译的 SQL 语句,可重复调用,提升执行效率。

DELIMITER //
CREATE PROCEDURE get_emp_by_dept(IN dept_id INT)
BEGIN
    SELECT * FROM emp WHERE dept_id = dept_id;
END //
DELIMITER ;

-- 调用存储过程
CALL get_emp_by_dept(1);

7.3 函数(Function)

函数与存储过程类似,但必须返回一个值。

DELIMITER //
CREATE FUNCTION get_avg_salary(dept_id INT) 
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    DECLARE avg_sal DECIMAL(10,2);
    SELECT AVG(salary) INTO avg_sal FROM emp WHERE dept_id = dept_id;
    RETURN avg_sal;
END //
DELIMITER ;

-- 调用函数
SELECT get_avg_salary(1);

八、用户权限与安全

8.1 创建用户

CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'password123';

8.2 授权与回收权限

-- 授予查询权限
GRANT SELECT ON mydb.* TO 'test_user'@'localhost';

-- 授予所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'admin_user'@'%';

-- 回收权限
REVOKE SELECT ON mydb.* FROM 'test_user'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

8.3 删除用户

DROP USER 'test_user'@'localhost';

九、备份与恢复

9.1 备份(mysqldump)

# 备份整个数据库
mysqldump -u root -p mydb > mydb_backup.sql

# 备份单张表
mysqldump -u root -p mydb emp > emp_backup.sql

9.2 恢复

# 恢复数据库
mysql -u root -p mydb < mydb_backup.sql

十、性能优化与常见问题

10.1 性能优化建议

  • 合理设计索引:避免过度索引,优先为高频查询字段创建索引。
  • 优化 SQL 语句:避免 SELECT *,减少子查询嵌套,使用 EXPLAIN 分析执行计划。
  • 分库分表:大数据量场景下,通过水平 / 垂直分表提升性能。
  • 配置优化:调整 my.cnf 中的缓冲池大小、连接数等参数。

10.2 常见问题排查

  • 连接超时:检查网络、防火墙、MySQL 最大连接数配置。
  • 慢查询:开启慢查询日志,定位低效 SQL。
  • 死锁:通过 SHOW ENGINE INNODB STATUS 查看死锁信息,优化事务逻辑。

十一、实战案例:员工管理系统

11.1 需求分析

实现一个简单的员工管理系统,包含部门表和员工表,支持增删改查、薪资统计等功能。

11.2 表结构设计

-- 部门表
CREATE TABLE dept (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '部门ID',
    dept_name VARCHAR(50) UNIQUE NOT NULL COMMENT '部门名称',
    location VARCHAR(100) DEFAULT '北京' COMMENT '部门位置'
) COMMENT='部门表';

-- 员工表
CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID',
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    gender ENUM('男','女') DEFAULT '男' COMMENT '性别',
    age TINYINT UNSIGNED COMMENT '年龄',
    dept_id INT COMMENT '部门ID',
    salary DECIMAL(10,2) DEFAULT 0.00 COMMENT '薪资',
    hire_date DATE COMMENT '入职日期',
    FOREIGN KEY (dept_id) REFERENCES dept(id) ON DELETE SET NULL
) COMMENT='员工表';

11.3 核心功能实现

  • 查询各部门平均薪资
SELECT d.dept_name, AVG(e.salary) AS avg_salary
FROM dept d
LEFT JOIN emp e ON d.id = e.dept_id
GROUP BY d.id;
  • 统计入职时间超过 3 年的员工
SELECT name, hire_date, DATEDIFF(CURDATE(), hire_date)/365 AS work_years
FROM emp
WHERE DATEDIFF(CURDATE(), hire_date) > 3*365;

总结

本文从 MySQL 基础环境搭建、SQL 语法、高级查询,到事务、索引、存储过程等高级特性,再到性能优化与实战案例,全面覆盖了 MySQL 开发的核心知识点。掌握这些内容,能够帮助开发者高效构建稳定、高性能的数据库应用。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐