MySQL 入门详细指南
一、MySQL 简介
1.1 什么是 MySQL?
- 关系型数据库管理系统(RDBMS)
- 开源免费(社区版)
- 使用 SQL(Structured Query Language) 进行数据管理
- 支持多种操作系统(Windows、Linux、macOS)
1.2 主要特性
- 数据以表格形式存储
- 支持事务处理(ACID 特性)
- 提供数据完整性约束
- 支持多种存储引擎(InnoDB、MyISAM 等)
- 良好的安全性和权限管理
二、安装 MySQL
2.1 Windows 安装
- 下载 MySQL Installer
- 选择安装类型:
- Developer Default:开发者默认
- Server only:仅安装服务器
- Client only:仅安装客户端
- 配置 root 用户密码
- 设置 Windows 服务
2.2 Linux 安装(Ubuntu为例) - # 更新包列表
- sudo apt update
- # 安装 MySQL 服务器
- sudo apt install mysql-server
- # 启动 MySQL 服务
- sudo systemctl start mysql
- # 设置开机启动
- sudo systemctl enable mysql
- # 运行安全脚本
- sudo mysql_secure_installation
复制代码
2.3 macOS 安装 - # 使用 Homebrew 安装
- brew install mysql
- # 启动 MySQL 服务
- brew services start mysql
- # 设置 root 密码
- mysql_secure_installation
复制代码
三、MySQL 基本操作
3.1 连接 MySQL - -- 命令行连接
- mysql -u root -p
- -- 指定主机和端口连接
- mysql -h localhost -P 3306 -u root -p
复制代码
3.2 数据库操作 - -- 查看所有数据库
- SHOW DATABASES;
- -- 创建数据库
- CREATE DATABASE mydatabase;
- CREATE DATABASE IF NOT EXISTS mydatabase;
- -- 选择数据库
- USE mydatabase;
- -- 删除数据库
- DROP DATABASE mydatabase;
- DROP DATABASE IF EXISTS mydatabase;
- -- 查看当前使用的数据库
- SELECT DATABASE();
复制代码
3.3 数据表操作
创建表 - CREATE TABLE users (
- id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自动增长
- username VARCHAR(50) NOT NULL UNIQUE, -- 用户名,非空且唯一
- password VARCHAR(100) NOT NULL, -- 密码
- email VARCHAR(100) NOT NULL UNIQUE, -- 邮箱,唯一
- age INT CHECK (age >= 0 AND age <= 150), -- 年龄,范围检查
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
- );
- -- 创建带索引的表
- CREATE TABLE products (
- id INT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(100) NOT NULL,
- category_id INT,
- price DECIMAL(10, 2),
- stock INT DEFAULT 0,
- INDEX idx_category (category_id), -- 普通索引
- INDEX idx_name (name(20)), -- 前缀索引
- FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL -- 外键
- );
复制代码
修改表结构 - -- 添加列
- ALTER TABLE users ADD COLUMN phone VARCHAR(15);
- -- 修改列
- ALTER TABLE users MODIFY COLUMN phone VARCHAR(20);
- -- 重命名列
- ALTER TABLE users CHANGE COLUMN phone telephone VARCHAR(20);
- -- 删除列
- ALTER TABLE users DROP COLUMN telephone;
- -- 添加主键
- ALTER TABLE users ADD PRIMARY KEY (id);
- -- 添加外键
- ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
- -- 添加索引
- ALTER TABLE users ADD INDEX idx_email (email);
- CREATE INDEX idx_username ON users(username);
- -- 删除索引
- ALTER TABLE users DROP INDEX idx_email;
- DROP INDEX idx_username ON users;
复制代码
查看表信息 - -- 查看所有表
- SHOW TABLES;
- -- 查看表结构
- DESCRIBE users;
- DESC users;
- SHOW COLUMNS FROM users;
- -- 查看建表语句
- SHOW CREATE TABLE users;
- -- 查看表状态
- SHOW TABLE STATUS LIKE 'users';
复制代码
删除表 - -- 删除表
- DROP TABLE users;
- -- 安全删除(如果存在)
- DROP TABLE IF EXISTS users;
- -- 清空表数据(保留结构)
- TRUNCATE TABLE users;
复制代码
四、数据类型
4.1 数值类型 - -- 整数类型
- TINYINT -- 1字节,-128~127
- SMALLINT -- 2字节
- MEDIUMINT -- 3字节
- INT/INTEGER -- 4字节
- BIGINT -- 8字节
- -- 浮点数类型
- FLOAT(m,d) -- 单精度浮点数
- DOUBLE(m,d) -- 双精度浮点数
- DECIMAL(m,d) -- 精确小数,m总位数,d小数位数
复制代码
4.2 字符串类型 - CHAR(n) -- 定长字符串,0-255字符
- VARCHAR(n) -- 变长字符串,0-65535字符
- TEXT -- 长文本数据
- LONGTEXT -- 超长文本数据
- BLOB -- 二进制数据
- LONGBLOB -- 超长二进制数据
- ENUM -- 枚举类型
- SET -- 集合类型
复制代码
4.3 日期时间类型 - DATE -- 日期,YYYY-MM-DD
- TIME -- 时间,HH:MM:SS
- DATETIME -- 日期时间,YYYY-MM-DD HH:MM:SS
- TIMESTAMP -- 时间戳,自动更新
- YEAR -- 年份
复制代码
五、数据操作(CRUD)
5.1 插入数据(INSERT) - -- 插入单行数据
- INSERT INTO users (username, password, email, age)
- VALUES ('john_doe', 'password123', 'john@example.com', 25);
- -- 插入多行数据
- INSERT INTO users (username, password, email, age)
- VALUES
- ('jane_doe', 'pass123', 'jane@example.com', 28),
- ('bob_smith', 'bobpass', 'bob@example.com', 32);
- -- 插入查询结果
- INSERT INTO user_backup (username, email)
- SELECT username, email FROM users WHERE age > 20;
- -- 使用 SET 语法
- INSERT INTO users
- SET username = 'alice', password = 'alicepass', email = 'alice@example.com';
复制代码
5.2 查询数据(SELECT) - -- 查询所有列
- SELECT * FROM users;
- -- 查询指定列
- SELECT id, username, email FROM users;
- -- 去重查询
- SELECT DISTINCT age FROM users;
- -- 条件查询
- SELECT * FROM users WHERE age > 25;
- SELECT * FROM users WHERE age BETWEEN 20 AND 30;
- SELECT * FROM users WHERE email LIKE '%@gmail.com';
- SELECT * FROM users WHERE username IN ('john', 'jane', 'bob');
- SELECT * FROM users WHERE age > 25 AND email LIKE '%@example.com';
- -- 空值检查
- SELECT * FROM users WHERE phone IS NULL;
- SELECT * FROM users WHERE phone IS NOT NULL;
- -- 排序
- SELECT * FROM users ORDER BY age DESC;
- SELECT * FROM users ORDER BY created_at ASC, username DESC;
- -- 限制结果
- SELECT * FROM users LIMIT 10;
- SELECT * FROM users LIMIT 5 OFFSET 10; -- 跳过10条,取5条
- SELECT * FROM users LIMIT 10, 5; -- 同上
- -- 分组统计
- SELECT age, COUNT(*) as count FROM users GROUP BY age;
- SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) > 1;
- -- 别名
- SELECT username AS 用户名, email AS 邮箱 FROM users;
复制代码
5.3 更新数据(UPDATE) - -- 更新单行
- UPDATE users SET age = 26 WHERE id = 1;
- -- 更新多行
- UPDATE users SET status = 'active' WHERE age >= 18;
- -- 更新多列
- UPDATE users SET age = age + 1, updated_at = NOW() WHERE id = 1;
- -- 使用子查询更新
- UPDATE orders
- SET total_price = (SELECT SUM(price * quantity) FROM order_items WHERE order_id = orders.id)
- WHERE id = 100;
复制代码
5.4 删除数据(DELETE) - -- 删除特定行
- DELETE FROM users WHERE id = 1;
- -- 删除所有行
- DELETE FROM users;
- -- 使用子查询删除
- DELETE FROM users
- WHERE id IN (SELECT user_id FROM inactive_users WHERE last_login < '2023-01-01');
复制代码
六、高级查询
6.1 连接查询(JOIN) - -- 内连接
- SELECT u.username, o.order_date, o.total_amount
- FROM users u
- INNER JOIN orders o ON u.id = o.user_id;
- -- 左连接
- SELECT u.username, o.order_date
- FROM users u
- LEFT JOIN orders o ON u.id = o.user_id;
- -- 右连接
- SELECT u.username, o.order_date
- FROM users u
- RIGHT JOIN orders o ON u.id = o.user_id;
- -- 全外连接(MySQL 不支持,使用 UNION 模拟)
- SELECT u.username, o.order_date
- FROM users u LEFT JOIN orders o ON u.id = o.user_id
- UNION
- SELECT u.username, o.order_date
- FROM users u RIGHT JOIN orders o ON u.id = o.user_id;
- -- 自连接
- SELECT e1.name AS employee, e2.name AS manager
- FROM employees e1
- LEFT JOIN employees e2 ON e1.manager_id = e2.id;
- -- 多表连接
- SELECT u.username, o.order_date, p.product_name
- FROM users u
- JOIN orders o ON u.id = o.user_id
- JOIN order_items oi ON o.id = oi.order_id
- JOIN products p ON oi.product_id = p.id;
复制代码
6.2 子查询 - -- 标量子查询(返回单个值)
- SELECT username FROM users
- WHERE age = (SELECT MAX(age) FROM users);
- -- 列子查询(返回一列)
- SELECT * FROM users
- WHERE id IN (SELECT user_id FROM orders WHERE total_amount > 1000);
- -- 行子查询(返回一行)
- SELECT * FROM users
- WHERE (age, salary) = (SELECT MAX(age), AVG(salary) FROM users);
- -- 表子查询
- SELECT u.username, o.order_count
- FROM users u
- JOIN (SELECT user_id, COUNT(*) as order_count FROM orders GROUP BY user_id) o
- ON u.id = o.user_id;
- -- EXISTS 子查询
- SELECT * FROM users u
- WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
复制代码
6.3 聚合函数 - -- 常用聚合函数
- SELECT
- COUNT(*) as total_users, -- 计数
- COUNT(DISTINCT age) as unique_ages, -- 去重计数
- AVG(age) as average_age, -- 平均值
- SUM(age) as total_age, -- 求和
- MAX(age) as max_age, -- 最大值
- MIN(age) as min_age, -- 最小值
- GROUP_CONCAT(username) as user_list -- 连接字符串
- FROM users;
复制代码
6.4 窗口函数(MySQL 8.0+) - -- 排名函数
- SELECT
- username,
- age,
- ROW_NUMBER() OVER (ORDER BY age DESC) as row_num,
- RANK() OVER (ORDER BY age DESC) as rank_num,
- DENSE_RANK() OVER (ORDER BY age DESC) as dense_rank_num,
- NTILE(4) OVER (ORDER BY age DESC) as quartile
- FROM users;
- -- 聚合窗口函数
- SELECT
- username,
- age,
- AVG(age) OVER () as avg_all,
- AVG(age) OVER (PARTITION BY department) as avg_dept,
- SUM(age) OVER (ORDER BY created_at) as running_total
- FROM users;
- -- 前后行访问
- SELECT
- username,
- age,
- LAG(age) OVER (ORDER BY created_at) as prev_age,
- LEAD(age) OVER (ORDER BY created_at) as next_age
- FROM users;
复制代码
七、索引优化
7.1 创建索引 - -- 创建普通索引
- CREATE INDEX idx_email ON users(email);
- CREATE INDEX idx_name_age ON users(username, age);
- -- 创建唯一索引
- CREATE UNIQUE INDEX uniq_email ON users(email);
- -- 创建全文索引
- CREATE FULLTEXT INDEX ft_content ON articles(content);
- -- 创建空间索引
- CREATE SPATIAL INDEX sp_location ON locations(coordinates);
- -- 创建前缀索引
- CREATE INDEX idx_name_prefix ON users(username(10));
复制代码
7.2 查看索引 - -- 查看表的所有索引
- SHOW INDEX FROM users;
- -- 查看索引使用情况
- EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
复制代码
八、事务管理
8.1 事务基本操作 - -- 开始事务
- START TRANSACTION;
- BEGIN;
- -- 提交事务
- COMMIT;
- -- 回滚事务
- ROLLBACK;
- -- 设置保存点
- SAVEPOINT point1;
- -- 回滚到保存点
- ROLLBACK TO SAVEPOINT point1;
- -- 释放保存点
- RELEASE SAVEPOINT point1;
复制代码
8.2 事务示例 - -- 转账示例
- START TRANSACTION;
- UPDATE accounts SET balance = balance - 500 WHERE id = 1;
- UPDATE accounts SET balance = balance + 500 WHERE id = 2;
- -- 检查余额是否充足
- SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
- COMMIT; -- 或 ROLLBACK 如果出现错误
复制代码
8.3 事务隔离级别 - -- 查看当前隔离级别
- SELECT @@transaction_isolation;
- -- 设置隔离级别
- SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 读未提交
- SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 读已提交
- SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 可重复读(MySQL默认)
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 串行化
- -- 设置会话级别隔离
- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
复制代码
九、存储过程和函数
9.1 存储过程 - -- 创建存储过程
- DELIMITER //
- CREATE PROCEDURE GetUserCount(IN minAge INT, OUT userCount INT)
- BEGIN
- SELECT COUNT(*) INTO userCount FROM users WHERE age >= minAge;
- END //
- DELIMITER ;
- -- 调用存储过程
- CALL GetUserCount(18, @count);
- SELECT @count;
- -- 删除存储过程
- DROP PROCEDURE IF EXISTS GetUserCount;
复制代码
9.2 函数 - -- 创建函数
- DELIMITER //
- CREATE FUNCTION CalculateDiscount(price DECIMAL(10,2), discount_rate DECIMAL(3,2))
- RETURNS DECIMAL(10,2) DETERMINISTIC
- BEGIN
- DECLARE final_price DECIMAL(10,2);
- SET final_price = price * (1 - discount_rate);
- RETURN final_price;
- END //
- DELIMITER ;
- -- 使用函数
- SELECT product_name, price, CalculateDiscount(price, 0.1) as discounted_price
- FROM products;
- -- 删除函数
- DROP FUNCTION IF EXISTS CalculateDiscount;
复制代码
十、触发器和事件
10.1 触发器 - -- 创建 BEFORE INSERT 触发器
- DELIMITER //
- CREATE TRIGGER before_user_insert
- BEFORE INSERT ON users
- FOR EACH ROW
- BEGIN
- SET NEW.created_at = NOW();
- SET NEW.updated_at = NOW();
- END //
- DELIMITER ;
- -- 创建 AFTER UPDATE 触发器
- DELIMITER //
- CREATE TRIGGER after_user_update
- AFTER UPDATE ON users
- FOR EACH ROW
- BEGIN
- INSERT INTO user_logs (user_id, action, action_time)
- VALUES (OLD.id, 'UPDATE', NOW());
- END //
- DELIMITER ;
- -- 删除触发器
- DROP TRIGGER IF EXISTS before_user_insert;
复制代码
10.2 事件调度器 - -- 启用事件调度器
- SET GLOBAL event_scheduler = ON;
- -- 创建定时事件
- DELIMITER //
- CREATE EVENT clean_old_logs
- ON SCHEDULE EVERY 1 DAY STARTS '2024-01-01 02:00:00'
- DO
- BEGIN
- DELETE FROM user_logs WHERE action_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
- END //
- DELIMITER ;
- -- 查看事件
- SHOW EVENTS;
- -- 删除事件
- DROP EVENT IF EXISTS clean_old_logs;
复制代码
十一、备份与恢复
11.1 备份数据库 - # 备份单个数据库
- mysqldump -u root -p mydatabase > backup.sql
- # 备份所有数据库
- mysqldump -u root -p --all-databases > all_backup.sql
- # 备份特定表
- mysqldump -u root -p mydatabase users products > tables_backup.sql
- # 压缩备份
- mysqldump -u root -p mydatabase | gzip > backup.sql.gz
复制代码
11.2 恢复数据库 - # 恢复数据库
- mysql -u root -p mydatabase < backup.sql
- # 恢复压缩的备份
- gunzip < backup.sql.gz | mysql -u root -p mydatabase
- # 在 MySQL 命令行中恢复
- mysql> USE mydatabase;
- mysql> SOURCE backup.sql;
复制代码
十二、性能优化
12.1 查询优化 - -- 使用 EXPLAIN 分析查询
- EXPLAIN SELECT * FROM users WHERE age > 25;
- -- 避免 SELECT *
- SELECT id, username, email FROM users; -- 优于 SELECT *
- -- 使用 LIMIT 限制结果
- SELECT * FROM users LIMIT 100;
- -- 合理使用索引
- SELECT * FROM users USE INDEX (idx_age) WHERE age > 25;
- -- 避免在 WHERE 子句中对字段进行运算
- SELECT * FROM users WHERE YEAR(created_at) = 2023; -- 不好
- SELECT * FROM users WHERE created_at >= '2023-01-01' AND created_at < '2024-01-01'; -- 好
复制代码
12.2 配置优化 - # my.cnf 配置文件示例
- [mysqld]
- # 内存设置
- innodb_buffer_pool_size = 1G
- key_buffer_size = 256M
- # 连接设置
- max_connections = 1000
- thread_cache_size = 100
- # 查询缓存(MySQL 8.0 已移除)
- query_cache_type = 0
- # 日志设置
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 2
复制代码
十三、安全最佳实践
13.1 用户权限管理 - -- 创建用户
- CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
- -- 授予权限
- GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'app_user'@'localhost';
- -- 更细粒度的权限控制
- GRANT SELECT (id, username, email) ON mydatabase.users TO 'app_user'@'localhost';
- -- 撤销权限
- REVOKE DELETE ON mydatabase.* FROM 'app_user'@'localhost';
- -- 查看用户权限
- SHOW GRANTS FOR 'app_user'@'localhost';
- -- 删除用户
- DROP USER 'app_user'@'localhost';
复制代码
13.2 防止 SQL 注入 - -- 不安全的方式(不要这样用!)
- SET @sql = CONCAT('SELECT * FROM users WHERE username = "', @input, '"');
- PREPARE stmt FROM @sql;
- EXECUTE stmt;
- -- 安全的方式:使用参数化查询
- PREPARE stmt FROM 'SELECT * FROM users WHERE username = ?';
- SET @username = 'john_doe';
- EXECUTE stmt USING @username;
- -- 在编程语言中使用预处理语句
- # Python 示例
- cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
复制代码
十四、常用命令速查 - -- 查看版本
- SELECT VERSION();
- -- 查看当前用户
- SELECT USER();
- SELECT CURRENT_USER();
- -- 查看系统变量
- SHOW VARIABLES LIKE '%timeout%';
- SELECT @@global.max_connections;
- -- 查看进程
- SHOW PROCESSLIST;
- -- 终止查询
- KILL [CONNECTION | QUERY] process_id;
- -- 查看状态
- SHOW STATUS LIKE 'Threads_connected';
- -- 刷新权限
- FLUSH PRIVILEGES;
- -- 清除查询缓存
- RESET QUERY CACHE;
- -- 优化表
- OPTIMIZE TABLE users;
复制代码
十五、学习路径建议
初级阶段(1-2周)
- 安装和配置 MySQL
- 学习基本 SQL 语句(SELECT, INSERT, UPDATE, DELETE)
- 理解数据类型和表结构设计
- 练习简单的查询操作
中级阶段(2-4周)
- 掌握高级查询(JOIN, 子查询,聚合函数)
- 学习索引优化
- 理解事务管理
- 学习基本的存储过程和函数
高级阶段(1-2个月)
- 数据库设计与规范化
- 性能调优和监控
- 备份恢复策略
- 高可用和复制配置
- 安全最佳实践
十六、学习资源推荐
官方文档
在线教程
- W3Schools MySQL
- 菜鸟教程 MySQL
- MySQLTutorial.org
书籍推荐
- 《MySQL 必知必会》
- 《高性能 MySQL》
- 《MySQL 技术内幕》
练习平台
- LeetCode 数据库题库
- HackerRank SQL 练习
- SQLZoo
这个指南涵盖了 MySQL 从入门到进阶的主要内容。建议按照顺序学习,并通过实际项目练习来巩固知识。MySQL 的学习需要理论与实践相结合,多动手操作才能真正掌握。 |