MySQL 详细教程
MySQL 是最流行的开源关系型数据库管理系统之一,广泛应用于Web应用开发。以下是MySQL的全面教程:
1. MySQL 简介
主要特点
- 关系型数据库:基于表结构存储数据
- 开源免费:社区版可免费使用
- 跨平台:支持多种操作系统
- 高性能:优化的查询引擎
- 可扩展:支持大型数据库
- 安全性:完善的用户权限系统
- 事务支持:ACID兼容
核心概念
- 数据库(Database):数据容器
- 表(Table):数据以行列形式存储
- 列(Column/Field):表的字段
- 行(Row/Record):表中的记录
- 主键(Primary Key):唯一标识记录的字段
- 外键(Foreign Key):关联其他表的字段
2. MySQL 安装
Linux 安装(Ubuntu/Debian)
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation # 安全配置
Linux 安装(CentOS/RHEL)
sudo yum install mysql-server
sudo systemctl start mysqld
sudo systemctl enable mysqld
sudo mysql_secure_installation
Mac 安装
brew install mysql
brew services start mysql
mysql_secure_installation
Windows 安装
- 从官网下载MySQL Installer
- 运行安装向导
- 选择"Developer Default"安装类型
- 完成安装并配置root密码
Docker 运行
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
3. MySQL 命令行客户端
连接MySQL
mysql -u username -p # 本地连接
mysql -h hostname -u username -p # 远程连接
常用命令
SHOW DATABASES; -- 显示所有数据库
USE database_name; -- 选择数据库
SHOW TABLES; -- 显示当前数据库的所有表
DESCRIBE table_name; -- 显示表结构
SOURCE file.sql; -- 执行SQL文件
EXIT; -- 退出客户端
4. 数据库操作
创建数据库
CREATE DATABASE dbname;
CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
删除数据库
DROP DATABASE dbname;
选择数据库
USE dbname;
5. 表操作
创建表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
常见数据类型
- 整数:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
- 小数:FLOAT, DOUBLE, DECIMAL
- 字符串:CHAR, VARCHAR, TEXT, BLOB
- 日期时间:DATE, TIME, DATETIME, TIMESTAMP, YEAR
- 布尔:BOOLEAN(TINYINT(1)的别名)
修改表结构
ALTER TABLE users ADD COLUMN phone VARCHAR(20); -- 添加列
ALTER TABLE users MODIFY COLUMN phone VARCHAR(30); -- 修改列
ALTER TABLE users DROP COLUMN phone; -- 删除列
ALTER TABLE users RENAME TO customers; -- 重命名表
删除表
DROP TABLE users;
清空表
TRUNCATE TABLE users; -- 快速清空(不记录日志)
6. CRUD 操作
1. 插入数据(INSERT)
-- 插入单行
INSERT INTO users (username, password, email, age)
VALUES ('john_doe', 'secure123', 'john@example.com', 30);
-- 插入多行
INSERT INTO users (username, password, email, age) VALUES
('jane_doe', 'pass123', 'jane@example.com', 28),
('bob_smith', 'bobpass', 'bob@example.com', 35);
2. 查询数据(SELECT)
-- 查询所有列
SELECT * FROM users;
-- 查询特定列
SELECT username, email FROM users;
-- 条件查询
SELECT * FROM users WHERE age > 25;
-- 模糊查询
SELECT * FROM users WHERE username LIKE 'j%';
-- 排序
SELECT * FROM users ORDER BY age DESC;
-- 分页
SELECT * FROM users LIMIT 10 OFFSET 20; -- 等价于 LIMIT 20, 10
-- 分组
SELECT age, COUNT(*) FROM users GROUP BY age;
-- 连接查询
SELECT u.username, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id;
3. 更新数据(UPDATE)
-- 更新单行
UPDATE users SET email = 'new@example.com' WHERE id = 1;
-- 更新多行
UPDATE users SET age = age + 1 WHERE age < 30;
4. 删除数据(DELETE)
-- 删除特定行
DELETE FROM users WHERE id = 1;
-- 删除所有行(慎用)
DELETE FROM users;
7. 索引
创建索引
-- 单列索引
CREATE INDEX idx_username ON users(username);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 复合索引
CREATE INDEX idx_name_age ON users(username, age);
-- 主键索引(创建表时自动创建)
查看索引
SHOW INDEX FROM users;
删除索引
DROP INDEX idx_username ON users;
8. 约束
常用约束
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
sku VARCHAR(50) UNIQUE,
price DECIMAL(10,2) CHECK (price > 0),
category_id INT,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
约束类型
PRIMARY KEY
- 主键约束UNIQUE
- 唯一约束NOT NULL
- 非空约束CHECK
- 检查约束(MySQL 8.0+)DEFAULT
- 默认值约束FOREIGN KEY
- 外键约束
9. 事务处理
基本事务
START TRANSACTION;
INSERT INTO orders (user_id, amount) VALUES (1, 100.00);
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
COMMIT; -- 或 ROLLBACK;
事务隔离级别
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
10. 存储过程和函数
创建存储过程
DELIMITER //
CREATE PROCEDURE GetUserCount(OUT user_count INT)
BEGIN
SELECT COUNT(*) INTO user_count FROM users;
END //
DELIMITER ;
-- 调用存储过程
CALL GetUserCount(@count);
SELECT @count;
创建函数
DELIMITER //
CREATE FUNCTION CalculateDiscount(price DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE discount DECIMAL(10,2);
IF price > 100 THEN
SET discount = price * 0.9;
ELSE
SET discount = price;
END IF;
RETURN discount;
END //
DELIMITER ;
-- 使用函数
SELECT name, price, CalculateDiscount(price) AS discounted_price FROM products;
11. 视图
创建视图
CREATE VIEW active_users AS
SELECT id, username, email
FROM users
WHERE last_login > DATE_SUB(NOW(), INTERVAL 30 DAY);
使用视图
SELECT * FROM active_users;
修改视图
ALTER VIEW active_users AS
SELECT id, username, email, last_login
FROM users
WHERE last_login > DATE_SUB(NOW(), INTERVAL 60 DAY);
删除视图
DROP VIEW active_users;
12. 触发器
创建触发器
DELIMITER //
CREATE TRIGGER before_user_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
SET NEW.updated_at = NOW();
END //
DELIMITER ;
触发器类型
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
13. 用户和权限管理
创建用户
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
授予权限
-- 授予所有权限
GRANT ALL PRIVILEGES ON dbname.* TO 'username'@'localhost';
-- 授予特定权限
GRANT SELECT, INSERT ON dbname.* TO 'username'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
撤销权限
REVOKE ALL PRIVILEGES ON dbname.* FROM 'username'@'localhost';
删除用户
DROP USER 'username'@'localhost';
14. 备份与恢复
使用mysqldump备份
# 备份整个数据库
mysqldump -u username -p dbname > dbname_backup.sql
# 备份特定表
mysqldump -u username -p dbname table1 table2 > tables_backup.sql
# 备份所有数据库
mysqldump -u username -p --all-databases > all_db_backup.sql
恢复数据库
mysql -u username -p dbname < dbname_backup.sql
15. 性能优化
1. EXPLAIN分析查询
EXPLAIN SELECT * FROM users WHERE age > 25;
2. 优化索引
- 为常用查询条件创建索引
- 避免过多索引(影响写入性能)
- 使用复合索引优化多条件查询
3. 查询优化技巧
- 只查询需要的列
- 避免使用SELECT *
- 合理使用LIMIT分页
- 避免使用OR条件(考虑使用UNION)
- 避免在WHERE子句中使用函数
4. 配置优化
-- 查看配置变量
SHOW VARIABLES LIKE '%buffer%';
-- 临时设置变量
SET GLOBAL key_buffer_size = 1024*1024*64;
-- 永久配置(修改my.cnf/my.ini)
[mysqld]
key_buffer_size = 64M
innodb_buffer_pool_size = 1G
16. 常用客户端工具
- MySQL Workbench - 官方GUI工具
- phpMyAdmin - Web界面管理工具
- HeidiSQL - Windows轻量级客户端
- DBeaver - 跨平台数据库工具
- Sequel Pro - Mac平台MySQL客户端
17. 编程语言连接示例
Python (PyMySQL)
import pymysql
connection = pymysql.connect(
host='localhost',
user='username',
password='password',
database='dbname'
)
try:
with connection.cursor() as cursor:
sql = "SELECT * FROM users WHERE age > %s"
cursor.execute(sql, (25,))
results = cursor.fetchall()
for row in results:
print(row)
finally:
connection.close()
Node.js (mysql2)
const mysql = require('mysql2/promise');
async function queryDatabase() {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'username',
password: 'password',
database: 'dbname'
});
const [rows] = await connection.execute('SELECT * FROM users WHERE age > ?', [25]);
console.log(rows);
await connection.end();
}
queryDatabase();
Java (JDBC)
import java.sql.*;
public class MySQLExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/dbname";
String username = "username";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
String sql = "SELECT * FROM users WHERE age > ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, 25);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("username") + " " + rs.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
18. 常见应用场景实现
1. 分页查询
-- 传统分页(性能随offset增大而降低)
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 20;
-- 优化分页(使用WHERE子句)
SELECT * FROM products WHERE id > 20 ORDER BY id LIMIT 10;
2. 树形结构存储(邻接表)
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
-- 查询子节点
SELECT * FROM categories WHERE parent_id = 1;
-- 递归查询(MySQL 8.0+)
WITH RECURSIVE category_tree AS (
SELECT * FROM categories WHERE id = 1
UNION ALL
SELECT c.* FROM categories c
JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree;
3. 全文搜索
-- 创建全文索引
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT(title, content)
) ENGINE=InnoDB;
-- 全文搜索
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('数据库教程' IN NATURAL LANGUAGE MODE);
4. 数据统计报表
-- 每日订单统计
SELECT
DATE(order_date) AS day,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY DATE(order_date)
ORDER BY day DESC;
-- 月度销售趋势
SELECT
YEAR(order_date) AS year,
MONTH(order_date) AS month,
SUM(amount) AS monthly_sales
FROM orders
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY year, month;
MySQL 是一个功能强大且灵活的关系型数据库,适用于各种规模的应用程序。通过本教程,您应该能够掌握MySQL的核心概念和基本操作,并能够在实际项目中应用这些知识。