MySQL从入门到放弃?不妨看看这个~
一、MySQL 基础概念
1.1 什么是 MySQL
关系型数据库管理系统(RDBMS),基于 SQL(结构化查询语言) 进行数据操作
开源、轻量、高效,广泛应用于 Web 开发(如 LAMP/LEMP 架构)
1.2 核心术语
术语 | 说明 |
---|---|
数据库(DB) | 存储数据的容器,如 employees 、ecommerce |
表(Table) | 数据库中的二维表格,由行(记录)和列(字段)组成 |
字段(Field) | 表中的列,定义数据类型(如 INT 、VARCHAR 、DATE ) |
记录(Row) | 表中的一行,包含多个字段的具体值 |
主键(PK) | 唯一标识一条记录的字段,不允许重复和为空(如 user_id ) |
外键(FK) | 用于建立表间关联的字段,指向另一张表的主键(如 dept_id 关联部门表) |
二、安装与配置(以 Windows 为例)
2.1 下载安装
官网下载 MySQL Installer()
选择 Custom 自定义安装,勾选:
MySQL Server(数据库服务)
MySQL Workbench(图形化管理工具)
按向导完成安装,设置 root 用户密码(需牢记)
2.2 配置环境变量
将 MySQL 安装目录下的 bin
路径(如 C:\Program Files\MySQL\MySQL Server 8.0\bin
)添加到系统环境变量 PATH
中
2.3 启动服务
命令行执行:net start mysql
(停止服务:net stop mysql
)
或通过 服务管理器(services.msc
)设置为自动启动
三、SQL 核心语法
3.1 数据定义语言(DDL)
3.1.1 数据库操作
\-- 创建数据库(若不存在则创建,字符集设为 UTF8)
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4;
\-- 使用数据库
USE mydb;
\-- 删除数据库
DROP DATABASE IF EXISTS mydb;
3.1.2 表操作
\-- 创建用户表
CREATE TABLE IF NOT EXISTS users (
; user\_id INT PRIMARY KEY AUTO\_INCREMENT, -- 自增主键
; username VARCHAR(50) NOT NULL UNIQUE, -- 用户名(非空、唯一)
; email VARCHAR(100) NOT NULL,
; age TINYINT,
; create\_time DATETIME DEFAULT CURRENT\_TIMESTAMP -- 默认值为当前时间
);
\-- 修改表结构
ALTER TABLE users;
ADD COLUMN phone VARCHAR(20), -- 添加字段
MODIFY COLUMN age SMALLINT, -- 修改字段类型
DROP COLUMN phone, -- 删除字段
RENAME COLUMN email TO user\_email; -- 重命名字段
\-- 删除表
DROP TABLE IF EXISTS users;
3.2 数据操作语言(DML)
3.2.1 插入数据
\-- 全字段插入
INSERT INTO users (username, email, age);
VALUES ('john\_doe', 'john@example.com', 28);
\-- 自动填充默认值(如 create\_time)
INSERT INTO users (username, email);
VALUES ('alice\_smith', 'alice@example.com');
3.2.2 更新数据
\-- 更新单个字段
UPDATE users;
SET age = 30;
WHERE username = 'john\_doe';
\-- 批量更新
UPDATE users;
SET age = age + 1;
WHERE age < 30;
3.2.3 删除数据
\-- 删除单条记录
DELETE FROM users;
WHERE username = 'alice\_smith';
\-- 清空表(不可恢复,速度更快)
TRUNCATE TABLE users;
3.3 数据查询语言(DQL)
3.3.1 基础查询
\-- 查询所有字段
SELECT \* FROM users;
\-- 查询指定字段(去重)
SELECT DISTINCT age FROM users;
\-- 别名用法
SELECT username AS "用户名", age AS "年龄" FROM users;
3.3.2 条件过滤(WHERE)
\-- 查询年龄大于 25 且邮箱包含 @example.com 的用户
SELECT \* FROM users;
WHERE age > 25 AND email LIKE '%@example.com';
\-- 模糊查询(% 匹配任意字符,\_ 匹配单个字符)
SELECT \* FROM users;
WHERE username LIKE 'j%'; -- 以 j 开头的用户名
3.3.3 排序与分页
\-- 按年龄降序排列,年龄相同则按用户名升序
SELECT \* FROM users;
ORDER BY age DESC, username ASC;
\-- 分页查询(LIMIT 偏移量, 每页数量;MySQL 从 0 开始计数)
SELECT \* FROM users;
LIMIT 0, 10; -- 第 1 页(10 条记录)
3.3.4 聚合函数与分组
\-- 统计用户总数
SELECT COUNT(\*) AS total\_users FROM users;
\-- 按年龄分组,统计各组人数及平均邮箱长度
SELECT age,;
; COUNT(\*) AS count,;
; AVG(LENGTH(email)) AS avg\_email\_length;
FROM users;
GROUP BY age;
HAVING count > 1; -- 对分组结果过滤(不能用 WHERE)
四、表关系与多表查询
4.1 表关系类型
一对一(1:1):如用户与个人详情表(用主键关联)
一对多(1:N):如部门与员工表(部门表主键为员工表外键)
多对多(M:N):如学生与课程表(需中间表存储关联关系)
4.2 多表查询示例
\-- 假设存在三张表:
\-- employees(员工表,emp\_id, emp\_name, dept\_id)
\-- departments(部门表,dept\_id, dept\_name)
\-- emp\_courses(员工课程表,emp\_id, course\_id)
\-- courses(课程表,course\_id, course\_name)
\-- 1. 内连接(查询员工及其所属部门)
SELECT e.emp\_name, d.dept\_name
FROM employees e
INNER JOIN departments d ON e.dept\_id = d.dept\_id;
\-- 2. 左连接(查询所有员工,包括无部门的)
SELECT e.emp\_name, d.dept\_name
FROM employees e
LEFT JOIN departments d ON e.dept\_id = d.dept\_id;
\-- 3. 多表连接(查询员工选修的课程)
SELECT e.emp\_name, c.course\_name
FROM employees e
JOIN emp\_courses ec ON e.emp\_id = ec.emp\_id
JOIN courses c ON ec.course\_id = c.course\_id;
五、索引与优化
5.1 索引作用
加快数据查询速度,类似书籍目录
代价:占用存储空间,影响写入性能(INSERT/UPDATE/DELETE)
5.2 创建索引
\-- 在 username 字段创建普通索引
CREATE INDEX idx\_username ON users (username);
\-- 在 email 字段创建唯一索引
CREATE UNIQUE INDEX idx\_email ON users (email);
\-- 在多字段组合上创建索引
CREATE INDEX idx\_name\_age ON users (username, age);
5.3 查看执行计划
\-- 分析查询语句的执行效率
EXPLAIN SELECT \* FROM users WHERE username = 'john\_doe';
六、常用工具
6.1 MySQL Workbench
图形化界面,支持 SQL 编辑、可视化建表、数据库迁移等功能
6.2 命令行客户端
\-- 登录 MySQL(替换为实际密码)
mysql -u root -p
6.3 其他工具
Navicat:功能强大的数据库管理工具(需付费)
phpMyAdmin:基于 Web 的 MySQL 管理工具(适合 PHP 环境)
七、常见错误与解决
错误信息 | 可能原因 | 解决方法 |
---|---|---|
Access denied for user 'root'@'localhost' |
密码错误 | 重置 root 密码(参考官方文档) |
Table 'mydb.users' doesn't exist |
表不存在 | 确认数据库和表名是否正确,使用 CREATE TABLE |
Duplicate entry 'xxx' for key 'unique_key' |
唯一索引冲突 | 检查插入数据是否重复 |
Out of memory |
内存不足 | 调整 MySQL 配置文件(my.cnf/my.ini)中的内存参数 |