MySQL 入门指南

前言

MySQL 是目前全球使用最广泛的开源关系型数据库管理系统之一。它以高性能、高可靠性和易用性著称,广泛应用于 Web 开发、企业应用、数据分析等场景。无论你是后端开发者、数据分析师,还是运维工程师,掌握 MySQL 都是一项必备技能。

本文将跳过安装环节,假设你已经拥有一个可用的 MySQL 服务实例,直接从连接数据库开始,带你系统性地掌握 MySQL 的核心操作。


一、连接数据库

安装完成后,第一步是连接到 MySQL 服务。打开终端或命令行工具,输入:

bash
mysql -u root -p

系统会提示你输入密码。连接成功后,你会看到类似如下的欢迎信息:

code
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 参数指定主机地址:

bash
mysql -h 192.168.1.100 -u root -p

连接成功后,所有 SQL 语句都以分号 ; 结尾。输入 exitquit 即可退出。


二、数据库的基本操作

2.1 查看所有数据库

sql
SHOW DATABASES;

你会看到 MySQL 自带的几个系统数据库(如 information_schemamysqlperformance_schemasys),这些是 MySQL 运行所必需的,不要随意修改或删除。

2.2 创建数据库

sql
CREATE DATABASE my_shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

说明:

  • utf8mb4 是推荐的字符集,它完整支持 Unicode,包括中文、日文以及各类特殊符号。
  • COLLATE 指定排序规则,utf8mb4_general_ci 是一种常用的不区分大小写的排序方式。

2.3 选择数据库

sql
USE my_shop;

后续所有表操作都将在这个数据库下进行。

2.4 删除数据库

sql
DROP DATABASE IF EXISTS my_shop;

注意:此操作不可逆,执行前务必确认。


三、表的基本操作

3.1 创建表

以电商场景为例,创建一张用户表和一张订单表:

sql
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;
sql
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 查看表结构

sql
SHOW TABLES;DESC users;SHOW CREATE TABLE orders;

3.3 修改表结构

sql
-- 添加字段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 删除表

sql
DROP TABLE IF EXISTS orders;

四、CRUD 操作

CRUD 即 Create(增)、Read(查)、Update(改)、Delete(删),是数据库最核心的四类操作。

4.1 插入数据(Create)

sql
-- 插入单条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)

查询是日常使用频率最高的操作。

sql
-- 查询所有用户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)

sql
-- 更新单条记录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)

sql
-- 删除指定记录DELETE FROM orders WHERE id = 3;-- 清空整张表(保留表结构,速度更快)TRUNCATE TABLE orders;

同样,DELETE 不带 WHERE 会删除全表数据。在生产环境中,建议先用 SELECT 验证 WHERE 条件是否正确,再执行 DELETE。


五、进阶查询技巧

5.1 排序与分页

sql
-- 按金额降序排列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 聚合函数

sql
-- 统计订单总数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 分组查询

sql
-- 每个用户的订单数量和总消费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 多表连接查询

sql
-- 内连接:查询有订单的用户及其订单信息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 子查询

sql
-- 查询消费金额高于平均水平的订单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 取值固定的场景,如状态、性别

七、索引简介

当表数据量增大后,查询速度会变慢。索引是提升查询性能的核心手段。

sql
-- 创建普通索引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 可以查看查询是否命中索引:

sql
EXPLAIN SELECT * FROM orders WHERE user_id = 1;

如果输出中 type 列显示为 refconst,说明索引起到了作用;如果是 ALL,则意味着全表扫描,需要优化。

索引使用原则:

  • 在 WHERE、JOIN、ORDER BY 频繁使用的列上建立索引。
  • 不要在数据量很小的表上建索引,收益不大。
  • 不要过度建索引,每个索引都会增加写入时的开销和存储成本。

八、事务基础

InnoDB 引擎支持事务,可以保证一组操作要么全部成功,要么全部回滚。

sql
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):事务一旦提交,其结果永久保存。

九、日常使用建议

  1. 永远不要在生产环境执行不带 WHERE 的 UPDATE 或 DELETE。 养成先 SELECT 确认、再执行修改的习惯。

  2. 使用参数化查询。 在应用程序中拼接 SQL 字符串极易引发 SQL 注入攻击,务必使用预编译语句(Prepared Statement)。

  3. 合理设计字段类型。 能用 INT 就不用 VARCHAR,能用 VARCHAR(50) 就不用 VARCHAR(255),精确的类型选择能节省存储并提升性能。

  4. 金额字段必须使用 DECIMAL。 FLOAT 和 DOUBLE 存在浮点精度问题,在金融计算中会导致误差。

  5. 定期备份。 使用 mysqldump 进行逻辑备份:

    bash
    mysqldump -u root -p my_shop > my_shop_backup_20260727.sql
  6. 善用 EXPLAIN 分析慢查询。 当查询响应变慢时,第一步不是加机器,而是看执行计划。


十、总结

本文从连接 MySQL 开始,依次介绍了数据库和表的创建与管理、CRUD 基本操作、条件查询与聚合统计、多表连接、索引优化以及事务控制。这些内容构成了 MySQL 使用的核心知识框架。

掌握这些基础之后,你可以进一步深入学习以下方向:

  • 锁机制与并发控制
  • 慢查询日志与性能调优
  • 主从复制与读写分离
  • 分库分表方案
  • MySQL 8.0 新特性(窗口函数、CTE、JSON 增强等)

数据库是一门实践性极强的技术,建议你在本地搭建一个练手项目,反复执行本文中的 SQL 语句,逐步建立手感。只有真正敲过、错过、调试过,这些知识才会变成你自己的能力。


本文基于 MySQL 8.0 编写,大部分语法同样适用于 5.7 版本。