MySQL 入门笔记

MySQL 入门笔记

数据库基础操作与实践


文档结构导航

文章目录

  • [MySQL 入门笔记](#MySQL 入门笔记)
    • 文档结构导航
    • [1. 数据库核心操作](#1. 数据库核心操作)
      • [1.1 库操作模板](#1.1 库操作模板)
      • [1.2 表操作规范](#1.2 表操作规范)
      • [1.3 表结构维护](#1.3 表结构维护)
    • [2. 数据操作语言 (DML)](#2. 数据操作语言 (DML))
      • [2.1 插入操作模板](#2.1 插入操作模板)
      • [2.2 更新删除规范](#2.2 更新删除规范)
    • [3. 数据查询语言 (DQL)](#3. 数据查询语言 (DQL))
      • [3.1 查询模板示例](#3.1 查询模板示例)
      • [3.2 分页方案对比](#3.2 分页方案对比)
    • [4. 常用函数速查](#4. 常用函数速查)
      • [4.1 日期处理示例](#4.1 日期处理示例)
      • [4.2 JSON处理函数](#4.2 JSON处理函数)
    • [5. 高级查询模式](#5. 高级查询模式)
      • [5.1 CTE递归查询](#5.1 CTE递归查询)
      • [5.2 窗口函数应用](#5.2 窗口函数应用)
    • [6. 事务控制与优化](#6. 事务控制与优化)
      • [6.1 事务保存点机制](#6.1 事务保存点机制)
      • [6.2 锁机制对比](#6.2 锁机制对比)
    • [7. 知识体系扩展](#7. 知识体系扩展)
      • [7.1 版本差异注意](#7.1 版本差异注意)
      • [7.2 性能优化技巧](#7.2 性能优化技巧)
    • [8. 实战演练建议](#8. 实战演练建议)

1. 数据库核心操作

1.1 库操作模板

sql 复制代码
-- 安全创建数据库
CREATE DATABASE IF NOT EXISTS school_db
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

-- 删除数据库(危险操作!)
DROP DATABASE IF EXISTS temp_db;

1.2 表操作规范

sql 复制代码
-- 标准建表语句
CREATE TABLE courses (
    course_id INT UNSIGNED AUTO_INCREMENT COMMENT '课程ID',
    course_name VARCHAR(30) NOT NULL DEFAULT '未命名课程' COMMENT '课程名称',
    credit DECIMAL(3,1) UNSIGNED NOT NULL COMMENT '学分',
    duration TINYINT UNSIGNED NOT NULL COMMENT '学时',
    PRIMARY KEY (course_id),
    UNIQUE INDEX idx_course_name (course_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程信息表';

最佳实践

  • 始终指定存储引擎和字符集
  • 使用COMMENT添加字段描述
  • 主键推荐使用无符号整型

1.3 表结构维护

sql 复制代码
-- 增加字段示例
ALTER TABLE students
ADD COLUMN wechat VARCHAR(30) COMMENT '微信账号' AFTER email;

-- 修改字段示例
ALTER TABLE teachers
MODIFY COLUMN phone VARCHAR(15) NOT NULL COMMENT '联系电话';

2. 数据操作语言 (DML)

2.1 插入操作模板

方式 语法示例 适用场景
全字段插入 INSERT INTO table VALUES (...) 需要插入所有字段时
定向插入 INSERT INTO table (col1, col2) VALUES (...) 字段可选时推荐方式
批量插入 INSERT INTO table VALUES (...), (...) 多数据插入效率优化

2.2 更新删除规范

sql 复制代码
-- 严格WHERE条件更新
UPDATE course_schedule 
SET status = '已取消' 
WHERE course_id = 1024 
  AND start_time > NOW();

-- 安全删除操作
DELETE FROM temp_logs 
WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);

危险操作警示

sql 复制代码
-- 禁用无条件的删除/更新
UPDATE users SET status = 0;  -- ❌ 错误示范
DELETE FROM logs;             -- ❌ 错误示范

3. 数据查询语言 (DQL)

3.1 查询模板示例

sql 复制代码
-- 多条件复合查询
SELECT 
    stu.name AS '姓名',
    cls.class_name AS '班级',
    cou.course_name AS '课程'
FROM students stu
JOIN classes cls ON stu.class_id = cls.id
JOIN course_selection cou ON stu.id = cou.stu_id
WHERE cls.grade = '2023级'
  AND cou.score >= 60
ORDER BY cou.score DESC;

3.2 分页方案对比

分页方式 语法 优劣分析
LIMIT传统分页 LIMIT 0, 10 简单易用,大数据量性能差
Keyset分页 WHERE id > 100 LIMIT 10 高效性能,不支持跳页
窗口函数分页 ROW_NUMBER() OVER() SQL2018+ 支持,功能最强大

4. 常用函数速查

4.1 日期处理示例

sql 复制代码
-- 计算学生年龄
SELECT 
    name,
    birth_date,
    TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age
FROM students;

-- 下学期开始日期计算
SELECT DATE_ADD(CURDATE(), INTERVAL 3 MONTH);

4.2 JSON处理函数

sql 复制代码
-- 解析学生扩展信息
SELECT 
    stu_id,
    JSON_EXTRACT(ext_info, '$.emergency_contact') AS emergency
FROM student_info
WHERE JSON_CONTAINS(ext_info, '{"blood_type": "A"}');

5. 高级查询模式

5.1 CTE递归查询

sql 复制代码
WITH RECURSIVE org_tree AS (
    SELECT id, name, parent_id
    FROM departments
    WHERE id = 1  -- 顶级部门
    UNION ALL
    SELECT d.id, d.name, d.parent_id
    FROM departments d
    INNER JOIN org_tree ot ON d.parent_id = ot.id
)
SELECT * FROM org_tree;

5.2 窗口函数应用

sql 复制代码
SELECT 
    department,
    name,
    salary,
    RANK() OVER(PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;

6. 事务控制与优化

6.1 事务保存点机制

sql 复制代码
START TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT transfer_start;

UPDATE accounts SET balance = balance + 100 WHERE id = 2;
IF @@ERROR_COUNT <> 0 THEN
    ROLLBACK TO transfer_start;
END IF;

COMMIT;

6.2 锁机制对比

锁类型 粒度 冲突概率 性能影响
行级锁 内存占用高
表级锁 影响吞吐量

7. 知识体系扩展

7.1 版本差异注意

sql 复制代码
-- MySQL 8.0+ 新特性示例
CREATE TABLE temporal_table (
    id INT PRIMARY KEY,
    sys_period_start DATETIME(6) GENERATED ALWAYS AS ROW START,
    sys_period_end DATETIME(6) GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME(sys_period_start, sys_period_end)
) WITH SYSTEM VERSIONING;

7.2 性能优化技巧

sql 复制代码
-- 查询缓存查看
SHOW VARIABLES LIKE 'query_cache%';

-- 执行计划分析
EXPLAIN ANALYZE SELECT * FROM large_table WHERE status = 'active';

8. 实战演练建议

  1. 在线沙盒练习

    推荐使用 DB Fiddle 进行SQL实验

  2. 可视化工具推荐

    • MySQL Workbench (官方工具)
    • DBeaver (开源多平台)
  3. 学习路线推荐

    基础SQL语法 数据库设计 查询优化 事务管理 高可用架构

/www.db-fiddle.com/) 进行SQL实验

  1. 可视化工具推荐

    • MySQL Workbench (官方工具)
    • DBeaver (开源多平台)
  2. 学习路线推荐

    基础SQL语法 数据库设计 查询优化 事务管理 高可用架构

相关推荐
补三补四7 分钟前
Yashan DB 实例管理
数据库·oracle
yqcoder31 分钟前
Express + MongoDB + multer 解决文件上传 originalname 中文乱码
数据库·mongodb·express
瑶光守护者1 小时前
并行计算编程模型的发展方向与RISC-V的机遇
人工智能·笔记·学习·架构·risc-v
l_tian_tian_1 小时前
JavaWeb——Mybatis、JDBC、数据库连接池、lombok
java·数据库·mybatis
半夏知半秋1 小时前
linux下的网络抓包(tcpdump)介绍
linux·运维·服务器·网络·笔记·学习·tcpdump
m0_748247801 小时前
Python连接SQL SEVER数据库全流程
数据库·python·sql
盖盖衍上1 小时前
2-002:MySQL 索引的最左前缀匹配原则是什么?
android·数据库·mysql
m0_555762902 小时前
通过接口或抽象类进一步解耦
数据库·系统架构
dengjiayue3 小时前
golang 高性能的 MySQL 数据导出
开发语言·mysql·golang
SelectDB3 小时前
SelectDB 实时分析性能突出,宝舵成本锐减与性能显著提升的双赢之旅
大数据·数据库·数据分析