1. 数据库基础概念与MySQL简介
MySQL作为最流行的开源关系型数据库管理系统之一,在Web应用开发中占据着核心地位。今天我们就从最基础的数据库创建开始,逐步掌握各类SQL语句的编写与执行技巧。
关系型数据库采用表格形式存储数据,每个表由行和列组成。MySQL使用SQL(结构化查询语言)作为操作接口,这种语言包含数据定义(DDL)、数据操作(DML)、数据控制(DCL)等多个子集。最新版本的MySQL在性能优化、JSON支持和窗口函数等方面都有显著提升。
提示:虽然MySQL Workbench等图形工具很方便,但建议初学者先掌握命令行操作,这有助于深入理解数据库工作原理。
2. 数据库创建与管理
2.1 创建数据库基础语法
创建数据库的基本命令非常简单:
sql复制CREATE DATABASE 数据库名;
但实际工作中我们需要考虑更多参数:
sql复制CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
这里有几个关键点需要注意:
- utf8mb4字符集支持完整的Unicode字符(包括emoji)
- 排序规则(collation)决定了字符串比较和排序的规则
- 数据库名称最好使用小写字母和下划线的组合
2.2 数据库配置细节
创建数据库时可以指定更多参数:
sql复制CREATE DATABASE inventory
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci
COMMENT '产品库存数据库';
重要参数说明:
- DEFAULT关键字确保后续创建的表默认使用这些设置
- utf8mb4_0900_ai_ci是MySQL 8.0推荐的排序规则
- COMMENT可以为数据库添加描述信息
2.3 查看与修改数据库
查看已有数据库:
sql复制SHOW DATABASES;
查看特定数据库的创建语句:
sql复制SHOW CREATE DATABASE mydb;
修改数据库字符集:
sql复制ALTER DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
3. 表操作与数据定义语言(DDL)
3.1 创建表的基本语法
创建表是数据库设计的核心环节。基本语法如下:
sql复制CREATE TABLE 表名 (
列名1 数据类型 [约束条件],
列名2 数据类型 [约束条件],
...
[表级约束条件]
);
一个完整的创建表示例:
sql复制CREATE TABLE employees (
emp_id INT AUTO_INCREMENT PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
gender CHAR(1) CHECK (gender IN ('M','F')),
birth_date DATE,
hire_date DATE NOT NULL,
department VARCHAR(30) DEFAULT '未分配',
salary DECIMAL(10,2),
INDEX idx_department (department)
) ENGINE=InnoDB;
3.2 数据类型选择
MySQL支持多种数据类型,正确选择类型对性能至关重要:
| 类型分类 | 常用类型 | 说明 |
|---|---|---|
| 整数 | INT, SMALLINT, BIGINT | 根据数据范围选择 |
| 小数 | DECIMAL, FLOAT, DOUBLE | 金融数据用DECIMAL |
| 字符串 | VARCHAR, CHAR, TEXT | VARCHAR可变长度更省空间 |
| 日期时间 | DATE, DATETIME, TIMESTAMP | TIMESTAMP自动时区转换 |
| 二进制 | BLOB, LONGBLOB | 存储文件等二进制数据 |
3.3 约束条件详解
约束条件保证数据完整性:
- PRIMARY KEY:主键,唯一标识每行记录
- FOREIGN KEY:外键,保持表间关系
- UNIQUE:确保列值唯一
- NOT NULL:禁止NULL值
- DEFAULT:指定默认值
- CHECK:自定义验证条件(MySQL 8.0+支持)
4. 数据操作语言(DML)实战
4.1 插入数据
基本插入语法:
sql复制INSERT INTO 表名 (列1,列2,...)
VALUES (值1,值2,...);
多行插入更高效:
sql复制INSERT INTO employees (emp_name, hire_date, salary)
VALUES
('张三', '2020-01-15', 8500.00),
('李四', '2019-05-22', 9200.00),
('王五', '2021-03-10', 7800.00);
从其他表导入数据:
sql复制INSERT INTO new_employees
SELECT * FROM employees
WHERE hire_date > '2020-01-01';
4.2 更新数据
基本更新语法:
sql复制UPDATE 表名
SET 列1=值1, 列2=值2,...
[WHERE 条件];
带子查询的更新:
sql复制UPDATE employees e
SET salary = salary * 1.1
WHERE department IN (
SELECT department_id
FROM departments
WHERE location = '北京'
);
注意:UPDATE语句一定要加WHERE条件,否则会更新全表!
4.3 删除数据
删除特定行:
sql复制DELETE FROM employees
WHERE emp_id = 1001;
清空表数据(不可回滚):
sql复制TRUNCATE TABLE temp_data;
5. 查询数据(SELECT)高级技巧
5.1 基础查询
基本查询语法:
sql复制SELECT 列1,列2,...
FROM 表名
[WHERE 条件]
[GROUP BY 分组列]
[HAVING 分组条件]
[ORDER BY 排序列]
[LIMIT 行数];
实际示例:
sql复制SELECT
emp_name AS '姓名',
department AS '部门',
salary AS '月薪'
FROM employees
WHERE hire_date >= '2020-01-01'
ORDER BY salary DESC
LIMIT 10;
5.2 多表连接查询
内连接(只返回匹配行):
sql复制SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
左外连接(返回左表所有行):
sql复制SELECT e.emp_name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
5.3 聚合函数与分组
常用聚合函数:
sql复制SELECT
department,
COUNT(*) AS emp_count,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
6. 视图与存储过程
6.1 创建和使用视图
视图是基于查询的虚拟表:
sql复制CREATE VIEW emp_dept_view AS
SELECT e.emp_id, e.emp_name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
使用视图:
sql复制SELECT * FROM emp_dept_view
WHERE dept_name = '研发部';
6.2 存储过程基础
创建简单存储过程:
sql复制DELIMITER //
CREATE PROCEDURE raise_salary(IN dept_id INT, IN rate DECIMAL(3,2))
BEGIN
UPDATE employees
SET salary = salary * (1 + rate)
WHERE dept_id = dept_id;
END //
DELIMITER ;
调用存储过程:
sql复制CALL raise_salary(3, 0.1);
7. 事务管理与锁机制
7.1 事务基本操作
事务的ACID特性:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
事务示例:
sql复制START TRANSACTION;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT;
7.2 事务隔离级别
MySQL支持四种隔离级别:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ(默认)
- SERIALIZABLE
设置隔离级别:
sql复制SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
8. 索引优化与查询性能
8.1 索引创建策略
创建普通索引:
sql复制CREATE INDEX idx_emp_name ON employees(emp_name);
创建复合索引:
sql复制CREATE INDEX idx_dept_salary ON employees(department, salary);
提示:索引不是越多越好,写操作频繁的表要谨慎添加索引
8.2 EXPLAIN分析查询
使用EXPLAIN分析查询:
sql复制EXPLAIN SELECT * FROM employees
WHERE department = '销售部'
ORDER BY hire_date;
关键指标解读:
- type:访问类型(const, ref, range, index, ALL)
- possible_keys:可能使用的索引
- key:实际使用的索引
- rows:预估检查的行数
- Extra:额外信息(Using filesort, Using temporary等)
9. 数据库备份与恢复
9.1 使用mysqldump备份
备份单个数据库:
bash复制mysqldump -u root -p mydb > mydb_backup.sql
备份所有数据库:
bash复制mysqldump -u root -p --all-databases > all_backup.sql
9.2 恢复数据库
从备份文件恢复:
bash复制mysql -u root -p mydb < mydb_backup.sql
10. 安全与权限管理
10.1 用户账户管理
创建用户:
sql复制CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'secure_password';
修改密码:
sql复制ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'new_password';
10.2 权限控制
授予权限:
sql复制GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'localhost';
查看权限:
sql复制SHOW GRANTS FOR 'app_user'@'localhost';
在实际项目中,我发现合理规划数据库结构比后期优化更重要。初期花时间设计好表关系和索引策略,能避免很多性能问题。对于复杂的查询,使用EXPLAIN分析执行计划是优化的第一步。