前言
MySQL 是目前全球使用最广泛的开源关系型数据库管理系统之一。它以高性能、高可靠性和易用性著称,广泛应用于 Web 开发、企业应用、数据分析等场景。无论你是后端开发者、数据分析师,还是运维工程师,掌握 MySQL 都是一项必备技能。
本文将跳过安装环节,假设你已经拥有一个可用的 MySQL 服务实例,直接从连接数据库开始,带你系统性地掌握 MySQL 的核心操作。
一、连接数据库
安装完成后,第一步是连接到 MySQL 服务。打开终端或命令行工具,输入:
mysql -u root -p
系统会提示你输入密码。连接成功后,你会看到类似如下的欢迎信息:
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 8Server version: 8.0.36 MySQL Community Server - GPLType 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
如果你连接的是远程服务器,可以加上 -h 参数指定主机地址:
mysql -h 192.168.1.100 -u root -p
连接成功后,所有 SQL 语句都以分号 ; 结尾。输入 exit 或 quit 即可退出。
二、数据库的基本操作
2.1 查看所有数据库
SHOW DATABASES;
你会看到 MySQL 自带的几个系统数据库(如 information_schema、mysql、performance_schema、sys),这些是 MySQL 运行所必需的,不要随意修改或删除。
2.2 创建数据库
CREATE DATABASE my_shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
说明:
utf8mb4是推荐的字符集,它完整支持 Unicode,包括中文、日文以及各类特殊符号。COLLATE指定排序规则,utf8mb4_general_ci是一种常用的不区分大小写的排序方式。
2.3 选择数据库
USE my_shop;
后续所有表操作都将在这个数据库下进行。
2.4 删除数据库
DROP DATABASE IF EXISTS my_shop;
注意:此操作不可逆,执行前务必确认。
三、表的基本操作
3.1 创建表
以电商场景为例,创建一张用户表和一张订单表:
CREATE TABLE users ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, password_hash VARCHAR(255) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE orders ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id INT UNSIGNED NOT NULL, product_name VARCHAR(200) NOT NULL, amount DECIMAL(10, 2) NOT NULL, status ENUM('pending', 'paid', 'shipped', 'completed', 'cancelled') DEFAULT 'pending', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
几个关键点:
AUTO_INCREMENT:自增主键,每插入一条记录自动加 1。NOT NULL:该字段不允许为空。UNIQUE:该字段的值必须唯一。DECIMAL(10, 2):精确数值类型,适合存储金额,总共 10 位数字,其中 2 位是小数。ENUM:枚举类型,限定字段只能取预设的几个值。FOREIGN KEY:外键约束,保证orders.user_id必须对应users.id中已存在的值。ENGINE=InnoDB:InnoDB 引擎支持事务和外键,是 MySQL 8.0 的默认引擎。
3.2 查看表结构
SHOW TABLES;DESC users;SHOW CREATE TABLE orders;
3.3 修改表结构
-- 添加字段ALTER TABLE users ADD COLUMN phone VARCHAR(20) DEFAULT NULL AFTER email;-- 修改字段类型ALTER TABLE users MODIFY COLUMN phone VARCHAR(30);-- 删除字段ALTER TABLE users DROP COLUMN phone;-- 重命名表ALTER TABLE users RENAME TO customers;
3.4 删除表
DROP TABLE IF EXISTS orders;
四、CRUD 操作
CRUD 即 Create(增)、Read(查)、Update(改)、Delete(删),是数据库最核心的四类操作。
4.1 插入数据(Create)
-- 插入单条INSERT INTO users (username, email, password_hash)VALUES ('zhangsan', 'zhangsan@example.com', 'hashed_pw_001');-- 插入多条INSERT INTO users (username, email, password_hash) VALUES('lisi', 'lisi@example.com', 'hashed_pw_002'),('wangwu', 'wangwu@example.com', 'hashed_pw_003');-- 插入订单INSERT INTO orders (user_id, product_name, amount, status) VALUES(1, 'MySQL实战45讲', 129.00, 'paid'),(1, '机械键盘', 399.00, 'pending'),(2, '显示器支架', 89.50, 'completed');
4.2 查询数据(Read)
查询是日常使用频率最高的操作。
-- 查询所有用户SELECT * FROM users;-- 查询指定字段SELECT username, email FROM users;-- 条件查询SELECT * FROM users WHERE id = 1;-- 多条件查询SELECT * FROM orders WHERE user_id = 1 AND status = 'paid';-- 模糊查询SELECT * FROM users WHERE username LIKE 'zhang%';-- 范围查询SELECT * FROM orders WHERE amount BETWEEN 100 AND 500;-- IN 查询SELECT * FROM orders WHERE status IN ('paid', 'shipped');
4.3 更新数据(Update)
-- 更新单条记录UPDATE users SET email = 'new_zhangsan@example.com' WHERE id = 1;-- 批量更新UPDATE orders SET status = 'cancelled' WHERE user_id = 2 AND status = 'pending';
重要提醒:UPDATE 语句一定要带 WHERE 条件。如果省略 WHERE,将会更新表中所有记录,这往往是灾难性的。
4.4 删除数据(Delete)
-- 删除指定记录DELETE FROM orders WHERE id = 3;-- 清空整张表(保留表结构,速度更快)TRUNCATE TABLE orders;
同样,DELETE 不带 WHERE 会删除全表数据。在生产环境中,建议先用 SELECT 验证 WHERE 条件是否正确,再执行 DELETE。
五、进阶查询技巧
5.1 排序与分页
-- 按金额降序排列SELECT * FROM orders ORDER BY amount DESC;-- 多字段排序SELECT * FROM orders ORDER BY status ASC, amount DESC;-- 分页查询(第2页,每页10条)SELECT * FROM orders ORDER BY id LIMIT 10 OFFSET 10;
5.2 聚合函数
-- 统计订单总数SELECT COUNT(*) AS total_orders FROM orders;-- 计算总金额SELECT SUM(amount) AS total_amount FROM orders;-- 平均金额SELECT AVG(amount) AS avg_amount FROM orders;-- 最大/最小金额SELECT MAX(amount), MIN(amount) FROM orders;
5.3 分组查询
-- 每个用户的订单数量和总消费SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total_spentFROM ordersGROUP BY user_id;-- 筛选总消费超过 200 的用户SELECT user_id, SUM(amount) AS total_spentFROM ordersGROUP BY user_idHAVING total_spent > 200;
注意:WHERE 在分组前过滤行,HAVING 在分组后过滤组。
5.4 多表连接查询
-- 内连接:查询有订单的用户及其订单信息SELECT u.username, o.product_name, o.amount, o.statusFROM users uINNER JOIN orders o ON u.id = o.user_id;-- 左连接:查询所有用户,包括没有订单的用户SELECT u.username, o.product_name, o.amountFROM users uLEFT JOIN orders o ON u.id = o.user_id;
5.5 子查询
-- 查询消费金额高于平均水平的订单SELECT * FROM ordersWHERE amount > (SELECT AVG(amount) FROM orders);
六、常用数据类型速查
| 类别 | 类型 | 说明 |
|---|---|---|
| 整数 | TINYINT / SMALLINT / INT / BIGINT | 根据数值范围选择,主键常用 INT 或 BIGINT |
| 浮点 | FLOAT / DOUBLE | 有精度损失,不建议用于金额 |
| 精确数值 | DECIMAL(M, D) | 金额、汇率等必须用 DECIMAL |
| 字符串 | CHAR(N) / VARCHAR(N) | CHAR 定长,VARCHAR 变长,最常用 VARCHAR |
| 长文本 | TEXT / MEDIUMTEXT / LONGTEXT | 存储文章、日志等大段文本 |
| 日期时间 | DATE / TIME / DATETIME / TIMESTAMP | DATETIME 范围更大,TIMESTAMP 受时区影响 |
| 布尔 | BOOLEAN | 实际是 TINYINT(1),0 为假,1 为真 |
| 枚举 | ENUM | 取值固定的场景,如状态、性别 |
七、索引简介
当表数据量增大后,查询速度会变慢。索引是提升查询性能的核心手段。
-- 创建普通索引CREATE INDEX idx_orders_user_id ON orders(user_id);-- 创建唯一索引CREATE UNIQUE INDEX idx_users_email ON users(email);-- 查看表的索引SHOW INDEX FROM orders;-- 删除索引DROP INDEX idx_orders_user_id ON orders;
使用 EXPLAIN 可以查看查询是否命中索引:
EXPLAIN SELECT * FROM orders WHERE user_id = 1;
如果输出中 type 列显示为 ref 或 const,说明索引起到了作用;如果是 ALL,则意味着全表扫描,需要优化。
索引使用原则:
- 在 WHERE、JOIN、ORDER BY 频繁使用的列上建立索引。
- 不要在数据量很小的表上建索引,收益不大。
- 不要过度建索引,每个索引都会增加写入时的开销和存储成本。
八、事务基础
InnoDB 引擎支持事务,可以保证一组操作要么全部成功,要么全部回滚。
START TRANSACTION;UPDATE users SET email = 'updated@example.com' WHERE id = 1;UPDATE orders SET status = 'completed' WHERE id = 1;-- 确认无误后提交COMMIT;-- 如果发现问题,可以回滚-- ROLLBACK;
事务的四大特性(ACID):
- 原子性(Atomicity):事务中的操作不可分割,要么全做,要么全不做。
- 一致性(Consistency):事务前后,数据必须满足所有约束。
- 隔离性(Isolation):并发事务之间互不干扰。
- 持久性(Durability):事务一旦提交,其结果永久保存。
九、日常使用建议
-
永远不要在生产环境执行不带 WHERE 的 UPDATE 或 DELETE。 养成先 SELECT 确认、再执行修改的习惯。
-
使用参数化查询。 在应用程序中拼接 SQL 字符串极易引发 SQL 注入攻击,务必使用预编译语句(Prepared Statement)。
-
合理设计字段类型。 能用 INT 就不用 VARCHAR,能用 VARCHAR(50) 就不用 VARCHAR(255),精确的类型选择能节省存储并提升性能。
-
金额字段必须使用 DECIMAL。 FLOAT 和 DOUBLE 存在浮点精度问题,在金融计算中会导致误差。
-
定期备份。 使用
mysqldump进行逻辑备份:mysqldump -u root -p my_shop > my_shop_backup_20260727.sql -
善用 EXPLAIN 分析慢查询。 当查询响应变慢时,第一步不是加机器,而是看执行计划。
十、总结
本文从连接 MySQL 开始,依次介绍了数据库和表的创建与管理、CRUD 基本操作、条件查询与聚合统计、多表连接、索引优化以及事务控制。这些内容构成了 MySQL 使用的核心知识框架。
掌握这些基础之后,你可以进一步深入学习以下方向:
- 锁机制与并发控制
- 慢查询日志与性能调优
- 主从复制与读写分离
- 分库分表方案
- MySQL 8.0 新特性(窗口函数、CTE、JSON 增强等)
数据库是一门实践性极强的技术,建议你在本地搭建一个练手项目,反复执行本文中的 SQL 语句,逐步建立手感。只有真正敲过、错过、调试过,这些知识才会变成你自己的能力。
本文基于 MySQL 8.0 编写,大部分语法同样适用于 5.7 版本。