MySQL 基础知识
一、MySQL 概述
1.1 什么是 MySQL
MySQL 是一个开源的关系型数据库管理系统(RDBMS),使用 SQL(结构化查询语言)进行数据库管理。
核心特点:
- 开源免费
- 性能优秀
- 易于使用
- 跨平台支持
- 丰富的功能
1.2 适用场景
| 场景 | 说明 |
|---|---|
| Web 应用 | 网站后台数据存储 |
| 内容管理 | CMS、博客系统 |
| 电商系统 | 商品、订单管理 |
| 数据分析 | 数据仓库、报表 |
| 企业应用 | ERP、CRM 系统 |
二、数据类型
2.1 数值类型
| 类型 | 说明 | 范围 |
|---|---|---|
| TINYINT | 1 字节整数 | -128 到 127 |
| SMALLINT | 2 字节整数 | -32768 到 32767 |
| INT | 4 字节整数 | -2147483648 到 2147483647 |
| BIGINT | 8 字节整数 | 极大整数 |
| FLOAT | 单精度浮点数 | 约 7 位小数 |
| DOUBLE | 双精度浮点数 | 约 15 位小数 |
| DECIMAL(M,D) | 精确小数 | M 总位数,D 小数位 |
2.2 字符串类型
| 类型 | 说明 | 长度 |
|---|---|---|
| CHAR(n) | 固定长度字符串 | 0-255 字符 |
| VARCHAR(n) | 可变长度字符串 | 0-65535 字符 |
| TEXT | 长文本 | 最大 65535 字符 |
| MEDIUMTEXT | 中等文本 | 最大 16MB |
| LONGTEXT | 超长文本 | 最大 4GB |
2.3 日期时间类型
| 类型 | 说明 | 格式 |
|---|---|---|
| DATE | 日期 | YYYY-MM-DD |
| TIME | 时间 | HH:MM:SS |
| DATETIME | 日期时间 | YYYY-MM-DD HH:MM:SS |
| TIMESTAMP | 时间戳 | 自动更新 |
| YEAR | 年份 | YYYY |
2.4 其他类型
- BOOLEAN:布尔值(实际是 TINYINT(1))
- ENUM:枚举类型
- SET:集合类型
- JSON:JSON 数据(MySQL 5.7+)
- BLOB:二进制大对象
三、数据库操作
3.1 创建数据库
-- 创建数据库
CREATE DATABASE mydb;
-- 创建数据库(指定字符集)
CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 查看所有数据库
SHOW DATABASES;
-- 使用数据库
USE mydb;
-- 删除数据库
DROP DATABASE mydb;
3.2 创建表
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 查看表结构
DESCRIBE users;
DESC users;
-- 查看所有表
SHOW TABLES;
-- 删除表
DROP TABLE users;
3.3 修改表结构
-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 修改列
ALTER TABLE users MODIFY COLUMN email VARCHAR(150);
-- 删除列
ALTER TABLE users DROP COLUMN phone;
-- 重命名列
ALTER TABLE users CHANGE COLUMN username name VARCHAR(50);
-- 添加索引
ALTER TABLE users ADD INDEX idx_email (email);
-- 删除索引
ALTER TABLE users DROP INDEX idx_email;
四、约束
4.1 主键约束
-- 单列主键
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 自增主键
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
-- 复合主键
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
4.2 外键约束
-- 创建外键
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
total DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 外键约束选项
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE -- 级联删除
ON UPDATE CASCADE -- 级联更新
);
4.3 其他约束
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL, -- 非空约束
email VARCHAR(100) UNIQUE, -- 唯一约束
age INT CHECK (age >= 0 AND age <= 150), -- 检查约束(MySQL 8.0+)
status ENUM('active', 'inactive') DEFAULT 'active' -- 默认值
);
五、数据操作(CRUD)
5.1 插入数据(INSERT)
-- 插入单条记录
INSERT INTO users (username, email, password)
VALUES ('zhangsan', 'zhangsan@example.com', 'password123');
-- 插入多条记录
INSERT INTO users (username, email, password)
VALUES
('lisi', 'lisi@example.com', 'password123'),
('wangwu', 'wangwu@example.com', 'password123');
-- 插入查询结果
INSERT INTO users_backup (username, email)
SELECT username, email FROM users WHERE age > 18;
5.2 查询数据(SELECT)
-- 查询所有列
SELECT * FROM users;
-- 查询指定列
SELECT id, username, email FROM users;
-- 条件查询
SELECT * FROM users WHERE age > 18;
-- 多条件查询
SELECT * FROM users
WHERE age > 18 AND status = 'active';
-- 模糊查询
SELECT * FROM users WHERE username LIKE 'zhang%';
-- 排序
SELECT * FROM users ORDER BY created_at DESC;
-- 限制结果数量
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 10 OFFSET 20; -- 分页
-- 去重
SELECT DISTINCT status FROM users;
5.3 更新数据(UPDATE)
-- 更新单条记录
UPDATE users
SET email = 'newemail@example.com'
WHERE id = 1;
-- 更新多条记录
UPDATE users
SET status = 'inactive'
WHERE age < 18;
-- 更新多个字段
UPDATE users
SET email = 'newemail@example.com', age = 25
WHERE id = 1;
5.4 删除数据(DELETE)
-- 删除指定记录
DELETE FROM users WHERE id = 1;
-- 删除多条记录
DELETE FROM users WHERE status = 'inactive';
-- 清空表(保留表结构)
TRUNCATE TABLE users;
-- 删除所有记录
DELETE FROM users;
六、查询进阶
6.1 聚合函数
-- COUNT:计数
SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT status) FROM users;
-- SUM:求和
SELECT SUM(price) FROM products;
-- AVG:平均值
SELECT AVG(age) FROM users;
-- MAX/MIN:最大值/最小值
SELECT MAX(price) FROM products;
SELECT MIN(age) FROM users;
-- GROUP BY:分组
SELECT status, COUNT(*)
FROM users
GROUP BY status;
-- HAVING:分组后过滤
SELECT status, COUNT(*) as count
FROM users
GROUP BY status
HAVING count > 10;
6.2 连接查询
-- 内连接(INNER JOIN)
SELECT u.username, o.order_id, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接(LEFT JOIN)
SELECT u.username, o.order_id, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 右连接(RIGHT JOIN)
SELECT u.username, o.order_id, o.total
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
-- 全连接(FULL OUTER JOIN)- MySQL 不支持,用 UNION 实现
SELECT u.username, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.username, o.order_id
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;
6.3 子查询
-- 标量子查询
SELECT * FROM users
WHERE age > (SELECT AVG(age) FROM users);
-- 列子查询(IN)
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders);
-- 行子查询
SELECT * FROM users
WHERE (age, status) = (SELECT MAX(age), 'active' FROM users);
-- EXISTS 子查询
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.user_id = u.id
);
-- 相关子查询
SELECT u.*,
(SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) as order_count
FROM users u;
6.4 联合查询
-- UNION:合并结果(去重)
SELECT username FROM users
UNION
SELECT name FROM admins;
-- UNION ALL:合并结果(不去重)
SELECT username FROM users
UNION ALL
SELECT name FROM admins;
七、索引
7.1 创建索引
-- 普通索引
CREATE INDEX idx_email ON users(email);
-- 唯一索引
CREATE UNIQUE INDEX idx_username ON users(username);
-- 复合索引
CREATE INDEX idx_name_age ON users(name, age);
-- 全文索引(MyISAM 或 InnoDB 5.6+)
CREATE FULLTEXT INDEX idx_content ON articles(content);
-- 查看索引
SHOW INDEX FROM users;
7.2 索引优化
索引使用原则:
- 经常用于 WHERE 条件的列
- 经常用于 JOIN 的列
- 经常用于 ORDER BY 的列
- 避免在小表上建索引
- 避免在频繁更新的列上建索引
索引失效场景:
-- 使用函数
SELECT * FROM users WHERE YEAR(created_at) = 2024; -- 索引失效
-- 使用 LIKE '%xxx'
SELECT * FROM users WHERE username LIKE '%zhang'; -- 索引失效
-- 类型转换
SELECT * FROM users WHERE id = '1'; -- 可能失效
-- OR 条件(部分列无索引)
SELECT * FROM users WHERE id = 1 OR email = 'xxx'; -- 可能失效
八、事务
8.1 事务特性(ACID)
- 原子性(Atomicity):事务要么全部成功,要么全部失败
- 一致性(Consistency):事务前后数据保持一致
- 隔离性(Isolation):并发事务互不干扰
- 持久性(Durability):事务提交后数据永久保存
8.2 事务操作
-- 开始事务
START TRANSACTION;
-- 或
BEGIN;
-- 执行操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 设置保存点
SAVEPOINT sp1;
-- 回滚到保存点
ROLLBACK TO sp1;
8.3 隔离级别
-- 查看隔离级别
SELECT @@transaction_isolation;
-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✅ | ✅ | ✅ |
| READ COMMITTED | ❌ | ✅ | ✅ |
| REPEATABLE READ | ❌ | ❌ | ✅ |
| SERIALIZABLE | ❌ | ❌ | ❌ |
九、视图
9.1 创建视图
-- 创建视图
CREATE VIEW user_orders AS
SELECT
u.username,
u.email,
o.order_id,
o.total,
o.created_at
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 使用视图
SELECT * FROM user_orders WHERE username = 'zhangsan';
-- 查看视图
SHOW CREATE VIEW user_orders;
-- 删除视图
DROP VIEW user_orders;
9.2 更新视图
-- 可更新视图(满足条件)
CREATE VIEW active_users AS
SELECT id, username, email FROM users WHERE status = 'active';
-- 通过视图更新数据
UPDATE active_users SET email = 'new@example.com' WHERE id = 1;
十、存储过程与函数
10.1 存储过程
-- 创建存储过程
DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
SELECT * FROM users WHERE id = user_id;
END //
DELIMITER ;
-- 调用存储过程
CALL GetUserById(1);
-- 带输出参数的存储过程
DELIMITER //
CREATE PROCEDURE GetUserCount(OUT total INT)
BEGIN
SELECT COUNT(*) INTO total FROM users;
END //
DELIMITER ;
CALL GetUserCount(@count);
SELECT @count;
10.2 函数
-- 创建函数
DELIMITER //
CREATE FUNCTION GetUserName(user_id INT)
RETURNS VARCHAR(50)
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE user_name VARCHAR(50);
SELECT username INTO user_name FROM users WHERE id = user_id;
RETURN user_name;
END //
DELIMITER ;
-- 使用函数
SELECT GetUserName(1);
十一、触发器
-- 创建触发器
DELIMITER //
CREATE TRIGGER update_user_timestamp
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
SET NEW.updated_at = CURRENT_TIMESTAMP;
END //
DELIMITER ;
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER update_user_timestamp;
十二、Node.js 连接 MySQL
12.1 使用 mysql2
const mysql = require('mysql2/promise');
// 创建连接
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydb'
});
// 查询
const [rows] = await connection.execute('SELECT * FROM users WHERE id = ?', [1]);
// 插入
const [result] = await connection.execute(
'INSERT INTO users (username, email) VALUES (?, ?)',
['zhangsan', 'zhangsan@example.com']
);
// 关闭连接
await connection.end();
12.2 使用连接池
const mysql = require('mysql2/promise');
// 创建连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydb',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
// 使用连接池
async function queryUsers() {
const [rows] = await pool.execute('SELECT * FROM users');
return rows;
}
// 关闭连接池
await pool.end();
12.3 使用 ORM(Sequelize)
const { Sequelize, DataTypes } = require('sequelize');
// 创建 Sequelize 实例
const sequelize = new Sequelize('mydb', 'root', 'password', {
host: 'localhost',
dialect: 'mysql'
});
// 定义模型
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: {
type: DataTypes.STRING(50),
allowNull: false,
unique: true
},
email: {
type: DataTypes.STRING(100),
allowNull: false
}
});
// 使用模型
const users = await User.findAll();
const user = await User.findByPk(1);
await User.create({ username: 'zhangsan', email: 'zhangsan@example.com' });
十三、性能优化
13.1 查询优化
-- 使用 EXPLAIN 分析查询
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
-- 避免 SELECT *
SELECT id, username FROM users; -- 而不是 SELECT *
-- 使用 LIMIT
SELECT * FROM users LIMIT 10;
-- 合理使用索引
CREATE INDEX idx_email ON users(email);
13.2 表优化
-- 分析表
ANALYZE TABLE users;
-- 优化表
OPTIMIZE TABLE users;
-- 检查表
CHECK TABLE users;
-- 修复表
REPAIR TABLE users;
13.3 配置优化
# my.cnf 配置示例
[mysqld]
# 连接数
max_connections = 200
# 缓冲区大小
innodb_buffer_pool_size = 1G
# 查询缓存(MySQL 8.0 已移除)
# query_cache_size = 64M
# 慢查询日志
slow_query_log = 1
long_query_time = 2
十四、备份与恢复
14.1 备份
# 备份单个数据库
mysqldump -u root -p mydb > backup.sql
# 备份所有数据库
mysqldump -u root -p --all-databases > all_backup.sql
# 备份表结构
mysqldump -u root -p --no-data mydb > schema.sql
# 备份数据
mysqldump -u root -p --no-create-info mydb > data.sql
14.2 恢复
# 恢复数据库
mysql -u root -p mydb < backup.sql
# 从压缩文件恢复
gunzip < backup.sql.gz | mysql -u root -p mydb
十五、安全建议
- 使用强密码:设置复杂的数据库密码
- 限制权限:为应用创建专用用户,只授予必要权限
- 防止 SQL 注入:使用参数化查询
- 定期备份:建立备份机制
- 更新版本:及时更新 MySQL 版本
- 网络安全:限制数据库访问 IP
十六、常用命令速查
-- 数据库操作
SHOW DATABASES;
USE database_name;
CREATE DATABASE db_name;
DROP DATABASE db_name;
-- 表操作
SHOW TABLES;
DESC table_name;
CREATE TABLE table_name (...);
DROP TABLE table_name;
ALTER TABLE table_name ...;
-- 数据操作
SELECT ... FROM table_name WHERE ...;
INSERT INTO table_name VALUES (...);
UPDATE table_name SET ... WHERE ...;
DELETE FROM table_name WHERE ...;
-- 索引操作
CREATE INDEX idx_name ON table_name(column);
DROP INDEX idx_name ON table_name;
SHOW INDEX FROM table_name;
-- 用户权限
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost';
FLUSH PRIVILEGES;
十七、推荐资源
官方文档:
- MySQL 官方文档:dev.mysql.com/doc/
- MySQL 中文文档:www.mysqlzh.com/
学习资源:
- 《MySQL 必知必会》
- 《高性能 MySQL》
- MySQL 教程:www.runoob.com/mysql/mysql…
十八、总结
MySQL 核心要点:
关系型数据库 + SQL 语言 + 事务支持 + 高性能 = 可靠的数据存储
核心心法:
掌握 SQL 是数据库开发的基础。 合理设计表结构和索引是性能优化的关键。
📝 文档信息
- 作者: 阿鑫
- 更新日期: 2026.2