MySQL 作为全球最受欢迎的开源关系型数据库管理系统,凭借其高性能、可靠性、易用性,成为 Web 开发、企业应用、大数据处理等领域的基础设施。本文将系统全面地梳理 MySQL 的核心知识点,从基础概念到高级特性,帮助初学者建立完整的知识体系,也为有经验的 DBA 和开发者提供深入的技术参考。
一、MySQL 基础
1.1 数据库基本概念
数据库(Database):按照数据结构组织、存储和管理数据的仓库。
关系型数据库:基于关系模型,使用表(Table)来存储数据,通过 SQL 进行操作。
核心术语:
表(Table):数据的二维结构,由行和列组成
行(Row):也称为记录,代表一条完整的数据
列(Column):也称为字段,代表数据的某个属性
主键(Primary Key):唯一标识每条记录的字段
外键(Foreign Key):关联其他表主键的字段
索引(Index):提高查询效率的数据结构
1.2 MySQL 安装与配置
Windows 安装:
# 下载 MySQL Installer
# 选择 Developer Default 安装类型
# 设置 root 密码
# 配置环境变量
Linux 安装(Ubuntu):
# 更新包管理器
sudo apt update
# 安装 MySQL
sudo apt install mysql-server
# 安全配置
sudo mysql_secure_installation
# 启动服务
sudo systemctl start mysql
sudo systemctl enable mysql
# 登录
mysql -u root -p
macOS 安装:
# 使用 Homebrew
brew install mysql
# 启动服务
brew services start mysql
# 登录
mysql -u root
1.3 基本操作命令
-- 查看所有数据库
SHOW DATABASES;
-- 创建数据库
CREATE DATABASE mydb;
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用数据库
USE mydb;
-- 查看当前数据库
SELECT DATABASE();
-- 删除数据库
DROP DATABASE mydb;
DROP DATABASE IF EXISTS mydb;
-- 查看所有表
SHOW TABLES;
-- 查看表结构
DESC users;
DESCRIBE users;
SHOW COLUMNS FROM users;
-- 查看建表语句
SHOW CREATE TABLE users;
二、数据类型
2.1 数值类型
-- 使用示例
CREATE TABLE products (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
price DECIMAL(10, 2) NOT NULL, -- 10位总长度,2位小数
quantity INT DEFAULT 0,
status TINYINT DEFAULT 1 COMMENT '1:上架 0:下架'
);
2.2 字符串类型
CREATE TABLE articles (
title VARCHAR(200) NOT NULL,
content LONGTEXT,
status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
tags SET('tech', 'life', 'sports', 'music')
);
2.3 日期时间类型

CREATE TABLE logs (
id INT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
log_date DATE,
log_time TIME
);
-- 常用函数
SELECT NOW(); -- 当前日期时间
SELECT CURDATE(); -- 当前日期
SELECT CURTIME(); -- 当前时间
SELECT UNIX_TIMESTAMP(); -- Unix 时间戳
SELECT FROM_UNIXTIME(1234567890); -- 时间戳转日期
2.4 JSON 类型(MySQL 5.7+)
-- 创建 JSON 字段
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
profile JSON
);
-- 插入 JSON 数据
INSERT INTO users VALUES (1, '张三', '{"age": 25, "city": "北京", "hobbies": ["reading", "coding"]}');
-- JSON 函数
SELECT JSON_EXTRACT(profile, '$.age') FROM users;
SELECT profile->'$.age' FROM users; -- 简写
SELECT profile->>'$.city' FROM users; -- 去除引号
-- 修改 JSON
UPDATE users SET profile = JSON_SET(profile, '$.age', 26) WHERE id = 1;
UPDATE users SET profile = JSON_INSERT(profile, '$.email', 'zhang@example.com');
UPDATE users SET profile = JSON_REMOVE(profile, '$.hobbies[0]');
三、表操作
3.1 创建表
-- 基本创建
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
age TINYINT UNSIGNED,
gender ENUM('male', 'female', 'other') DEFAULT 'other',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_username (username),
INDEX idx_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 使用 SELECT 创建表(复制表结构)
CREATE TABLE users_backup LIKE users;
CREATE TABLE users_copy AS SELECT * FROM users WHERE 1=0; -- 只复制结构
-- 创建临时表
CREATE TEMPORARY TABLE temp_users SELECT * FROM users WHERE age > 18;
3.2 修改表
-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
ALTER TABLE users ADD COLUMN address TEXT;
-- 修改列
ALTER TABLE users MODIFY COLUMN phone VARCHAR(15);
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20);
ALTER TABLE users ALTER COLUMN age SET DEFAULT 18;
-- 删除列
ALTER TABLE users DROP COLUMN address;
-- 重命名表
RENAME TABLE users TO members;
ALTER TABLE members RENAME TO users;
-- 添加索引
ALTER TABLE users ADD INDEX idx_email (email);
ALTER TABLE users ADD UNIQUE INDEX idx_username (username);
ALTER TABLE users ADD FULLTEXT INDEX idx_content (content);
-- 删除索引
ALTER TABLE users DROP INDEX idx_email;
-- 修改存储引擎
ALTER TABLE users ENGINE=InnoDB;
3.3 删除表
-- 删除表
DROP TABLE IF EXISTS users_backup;
-- 清空表(重置 AUTO_INCREMENT)
TRUNCATE TABLE users_temp;
-- TRUNCATE vs DELETE
-- TRUNCATE: 快速清空,不记录日志,重置自增,不可回滚
-- DELETE: 逐行删除,记录日志,可回滚