[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"article-mysql全栈开发学习笔记":22,"comments-mysql全栈开发学习笔记":42,"footer-socials":43},{"site_title":4,"site_subtitle":5,"home_intro":6,"avatar":7,"seo_keywords":8,"seo_description":9,"site_subtitle_highlight":10,"home_description":11,"about_name":12,"about_intro":13,"code_comment_2":14,"code_log":15,"code_skills":16,"code_goal":17,"code_comment_1":18,"meteor_density":19,"meteor_max_count":19,"meteor_enabled":20,"meteor_speed":21},"ShineGoldYao","架构代码，","全栈开发者 \u002F 开源爱好者 \u002F 技术探索者","https:\u002F\u002Fforuda.gitee.com\u002Favatar\u002F1762402862010015318\u002F16382196_yaoxingjin_1762402861.png!avatar200","ShiGoldYao,技术博客,全栈开发","专注于前沿技术分享与开源项目展示的个人技术博客","书写未来。","大家好，我是 ShiGoldYao。一名全栈学习与技术爱好者。在这里，我分享关于现代 Web 开发、技术框架学习记录以及极客生活的深度思考。","ShiGoldYao","我是一名全栈技术学习者，对构建高性能、可扩展的现代 Web 应用充满热情。过去一年里，我从初识互联网前后端开发，到逐步沉淀技术体系，始终保持着对前端、后端与工程化的持续探索。\n\n我坚信 “代码如诗”。除了日常学习与项目实践，我也会花大量时间关注开源社区，尝试摸索 WebAssembly、Rust 等前沿技术在浏览器端的更多可能，不断挑战性能与体验的边界。\n\n生活里的我并不只有代码：闲暇时会打打永劫无间，享受博弈与操作的快感；也喜欢打乒乓球，在运动中放松自己；当然，最幸福的时光，还是和女朋友一起慢慢生活、认真恋爱。","\u002F\u002F 🚀 开启学习之旅","","Vue , TypeScript , Nest , Mysql","成为优秀的前端全栈工程师","\u002F\u002F 欢迎来到我的技术世界","3","true","5",{"id":23,"title":24,"slug":25,"coverUrl":15,"summary":15,"content":26,"htmlContent":27,"categoryId":19,"viewCount":28,"likeCount":29,"isTop":29,"isPublish":30,"seoKeywords":15,"seoDescription":15,"publishTime":31,"createTime":32,"updateTime":33,"deleteTime":34,"category":35,"tags":41},"11","MySQL 全栈开发学习笔记","mysql全栈开发学习笔记","# MySQL 全栈开发学习笔记\n\n> 专为前端工程师转全栈设计的 MySQL 学习笔记\n\n---\n\n## 目录\n\n- [一、MySQL 基础概念](#一mysql-基础概念)\n- [二、SQL 语句基础](#二sql-语句基础)\n- [三、数据库和表的操作（DDL）](#三数据库和表的操作ddl)\n- [四、数据的增删改（DML）](#四数据的增删改dml)\n- [五、数据查询（DQL）](#五数据查询dql)\n- [六、约束与数据完整性](#六约束与数据完整性)\n- [七、多表操作](#七多表操作)\n- [八、视图](#八视图)\n- [九、前端开发实战示例](#九前端开发实战示例)\n\n---\n\n## 一、MySQL 基础概念\n\n### 1.1 为什么前端工程师需要学习 MySQL\n\n作为全栈开发者，你需要掌握数据库技能来：\n- 存储和管理用户数据\n- 实现后端 API 的数据持久化\n- 理解数据结构和关系设计\n- 优化查询性能\n\n### 1.2 核心概念\n\n**数据库（Database, DB）**\n- 存储数据的仓库，数据是有组织的进行存储\n- 类比：类似于前端的状态管理（如 Redux、Vuex），但数据持久化到磁盘\n\n**数据库管理系统（DBMS）**\n- 管理数据库的大型软件\n- MySQL 就是一种 DBMS\n\n**SQL（Structured Query Language）**\n- 结构化查询语言，操作关系型数据库的编程语言\n- 类比：类似于前端的 DOM 操作 API\n\n### 1.3 MySQL 数据模型\n\n关系型数据库由多张能互相连接的二维表组成：\n\n```\n数据库服务器\n    ├── 数据库1\n    │   ├── 表1（用户表）\n    │   │   ├── 列1（id）\n    │   │   ├── 列2（name）\n    │   │   └── 列3（email）\n    │   └── 表2（订单表）\n    └── 数据库2\n```\n\n**优点：**\n- 使用表结构，格式一致，易于维护\n- 使用通用的 SQL 语言操作\n- 数据存储在磁盘中，安全\n\n### 1.4 常见的关系型数据库\n\n| 数据库 | 特点 | 适用场景 |\n|--------|------|----------|\n| MySQL | 开源免费，中小型 | Web 应用、中小型项目 |\n| PostgreSQL | 开源免费，功能强大 | 复杂数据处理、地理信息 |\n| SQLite | 嵌入式微型数据库 | 移动应用、本地存储 |\n| Oracle | 收费大型数据库 | 企业级应用 |\n| SQL Server | Microsoft 收费中型 | .NET 生态 |\n\n---\n\n## 二、SQL 语句基础\n\n### 2.1 SQL 简介\n\nSQL（Structured Query Language）是操作关系型数据库的统一标准语言。\n\n**类比前端：**\n- SQL 就像是数据库的\"查询语言\"\n- 类似于前端的 CSS 选择器或 XPath\n\n### 2.2 SQL 通用语法\n\n```sql\n-- SQL 语句可以单行或多行书写，以分号结尾\nSELECT * FROM users;\n\n-- MySQL 不区分大小写，但关键字建议使用大写\nselect * from users;  -- 可以\nSELECT * FROM users;  -- 推荐\n\n-- 注释\n-- 单行注释（方式1）\n# 单行注释（方式2，MySQL 特有）\n\n\u002F* \n多行注释\n可以写多行\n*\u002F\n```\n\n### 2.3 SQL 分类\n\n| 分类 | 全称 | 作用 | 类比前端 |\n|------|------|------|----------|\n| DDL | Data Definition Language | 定义数据库对象：数据库、表、列等 | 创建\u002F删除 DOM 元 |\n | DML | Data Manipulation Language | 对表的数据进行增删改 | 修改 DOM 内容 |\n| DQL | Data Query Language | 查询表的记录 | 查询 DOM 元素 |\n| DCL | Data Control Language | 定义访问权限和安全级别 | 权限控制 |\n\n---\n\n## 三、数据库和表的操作（DDL）\n\n### 3.1 操作数据库\n\n```sql\n-- 查询所有数据库\nSHOW DATABASES;\n\n-- 创建数据库\nCREATE DATABASE myapp;\n\n-- 创建数据库（如果不存在则创建）\nCREATE DATABASE IF NOT EXISTS myapp;\n\n-- 删除数据库\nDROP DATABASE myapp;\n\n-- 删除数据库（如果存在则删除）\nDROP DATABASE IF EXISTS myapp;\n\n-- 使用数据库\nUSE myapp;\n\n-- 查看当前使用的数据库\nSELECT DATABASE();\n```\n\n### 3.2 数据类型\n\nMySQL 支持多种数据类型：\n\n**数值类型：**\n- `INT`：整数（类似 JavaScript 的 Number）\n- `DOUBLE(m,d)`：浮点数，m 总位数，d 小数位数\n- `DECIMAL(m,d)`：精确小数（金融计算推荐）\n\n**字符串类型：**\n- `VARCHAR(n)`：可变长度字符串，最大 n 个字符\n- `CHAR(n)`：固定长度字符串\n- `TEXT`：长文本\n\n**日期类型：**\n- `DATE`：日期（YYYY-MM-DD）\n- `DATETIME`：日期时间（YYYY-MM-DD HH:MM:SS）\n- `TIMESTAMP`：时间戳\n\n### 3.3 创建表\n\n```sql\n-- 基本语法\nCREATE TABLE 表名 (\n    字段名1 数据类型1,\n    字段名2 数据类型2,\n    ...\n    字段名n 数据类型n\n);\n\n-- 示例：创建用户表\nCREATE TABLE users (\n    id INT,\n    username VARCHAR(50),\n    email VARCHAR(100),\n    age INT,\n    create_time DATETIME\n);\n```\n\n**实战示例：设计一个电商用户表**\n\n```sql\nCREATE TABLE users (\n    id INT,                    -- 用户ID\n    username VARCHAR(20),      -- 用户名，最长20个字符\n    password VARCHAR(64),       -- 密码（加密后）\n    email VARCHAR(100),         -- 邮箱\n    phone VARCHAR(20),         -- 手机号\n    gender CHAR(1),            -- 性别：M\u002FF\n    birthday DATE,              -- 生日\n    Bbalance DECIMAL(10,2),    -- 余额，小数点后2位\n    status TINYINT,            -- 状态：0-禁用，1-正常\n    create_time DATETIME,      -- 创建时间\n    update_time DATETIME       -- 更新时间\n);\n```\n\n### 3.4 查询表\n\n```sql\n-- 查询当前数据库所有表\nSHOW TABLES;\n\n-- 查询表结构\nDESC users;\n\n-- 查看建表语句\nSHOW CREATE TABLE users;\n```\n\n### 3.5 修改表\n\n```sql\n-- 修改表名\nALTER TABLE users RENAME TO app_users;\n\n-- 添加列\nALTER TABLE users ADD COLUMN nickname VARCHAR(50);\n\n-- 修改数据类型\nALTER TABLE users MODIFY COLUMN username VARCHAR(30);\n\n-- 修改列名和数据类型\nALTER TABLE users CHANGE COLUMN nickname display_name VARCHAR(50);\n\n-- 删除列\nALTER TABLE users DROP COLUMN nickname;\n```\n\n### 3.6 删除表\n\n```sql\n-- 删除表\nDROP TABLE users;\n\n-- 删除表（如果存在）\nDROP TABLE IF EXISTS users;\n```\n\n---\n\n## 四、数据的增删改（DML）\n\n### 4.1 添加数据（INSERT）\n\n```sql\n-- 给指定列添加数据\nINSERT INTO users (id, username, email) VALUES (1, '张三', 'zhangsan@example.com');\n\n-- 给全部列添加数据（值的顺序要与表结构一致）\nINSERT INTO users VALUES (2, '李四', 'lisi@example.com', 25, NOW());\n\n-- 批量添加数据\nINSERT INTO users (id, username, email) VALUES\n    (3, '王五', 'wangwu@example.com'),\n    (4, '赵六', 'zhaoliu@example.com'),\n    (5, '孙七', 'sunqi@example.com');\n\n-- 批量添加数据（全部列）\nINSERT INTO users VALUES\n    (6, '周八', 'zhouba@example.com', 30, NOW()),\n    (7, '吴九', 'wujiu@example.com', 28, NOW());\n```\n\n### 4.2. 修改数据（UPDATE）\n\n```sql\n-- 修改数据（带条件）\nUPDATE users SET age = 26 WHERE id = 1;\n\n-- 修改多个字段\nUPDATE users \nSET age = 27, email = 'newemail@example.com' \nWHERE id = 2;\n\n-- 注意：如果不加 WHERE 条件，会修改所有数据！\nUPDATE users SET status = 0;  -- 危险！会把所有用户状态都改为0\n```\n\n### 4.3 删除数据（DELETE）\n\n```sql\n-- 删除数据（带条件）\nDELETE FROM users WHERE id = 1;\n\n-- 删除多条数据\nDELETE FROM users WHERE id IN (2, 3, 4);\n\n-- 注意：如果不加 WHERE 条件，会删除所有数据！\nDELETE FROM users;  -- 危险！会清空整个表\n```\n\n---\n\n## 五、数据查询（DQL）\n\n### 5.1 基础查询语法\n\n```sql\nSELECT \n    字段列表\nFROM \n    表名列表 \nWHERE \n    条件列表\nGROUP BY\n    分组字段\nHAVING\n    分组后条件\nORDER BY\n    排序字段\nLIMIT\n    分页限定\n```\n\n### 5.2 基础查询\n\n```sql\n-- 查询指定字段\nSELECT username, email FROM users;\n\n-- 查询所有字段\nSELECT * FROM users;\n\n-- 去除重复记录\nSELECT DISTINCT status FROM users;\n\n-- 起别名\nSELECT \n    username AS '用户名',\n    email AS '邮箱地址',\n    age AS '年龄'\nFROM users;\n\n-- AS 可以省略\nSELECT username '用户名', email '邮箱' FROM users;\n```\n\n### 5.3 条件查询（WHERE）\n\n**条件运算符：**\n- `>`、`\u003C`、`=`、`>=`、`\u003C=`、`!=`、`\u003C>`\n- `BETWEEN ... AND ...`：在某个范围内\n- `IN(...)`：在多个值集合中\n- `LIKE`：模糊查询\n- `IS NULL`、`IS NOT NULL`：判断空值\n- `AND`、`OR`：逻辑运算符\n\n```sql\n-- 查询年龄大于25的用户\nSELECT * FROM users WHERE age > 25;\n\n-- 查询年龄在20到30之间的用户\nSELECT * FROM users WHERE age >= 20 AND age \u003C= 30;\nSELECT * FROM users WHERE age BETWEEN 20 AND 30;\n\n-- 查询指定ID的用户\nSELECT * FROM users WHERE id IN (1, 3, 5);\n\n-- 模糊查询（% 表示任意多个字符，_ 表示一个字符）\nSELECT * FROM users WHERE username LIKE '张%';  -- 姓张的用户\nSELECT * FROM users WHERE email LIKE '%@gmail.com';  -- Gmail邮箱\n\n-- 查询邮箱为空的用户\nSELECT * FROM users WHERE email IS NULL;\n\n-- 组合条件\nSELECT * FROM users \nWHERE age > 25 AND status = 1;\n```\n\n### 5.4 排序查询（ORDER BY）\n\n```sql\n-- 升序排列（默认）\nSELECT * FROM users ORDER BY age;\n\n-- 降序排列\nSELECT * FROM users ORDER BY age DESC;\n\n-- 多字段排序\nSELECT * FROM users \nORDER BY age DESC, create_time ASC;\n\n-- 先按年龄降序，年龄相同则按创建时间升序\n```\n\n### 5.5 聚合函数\n\n| 函数 | 作用 |\n|------|------|\n| COUNT() | 统计数量 |\n| MAX() | 最大值 |\n| MIN() | 最小值 |\n| SUM() | 求和 |\n| AVG() | 平均值 |\n\n```sql\n-- 统计用户总数\nSELECT COUNT(*) FROM users;\n\n-- 统计年龄不为空的用户数\nSELECT COUNT(age) FROM users;\n\n-- 查询最大年龄\nSELECT MAX(age) FROM users;\n\n-- 查询最小年龄\nSELECT MIN(age) FROM users;\n\n-- 查询年龄总和\nSELECT SUM(age) FROM users;\n\n-- 查询平均年龄\nSELECT AVG(age) FROM users;\n\n-- 注意：NULL 值不参与聚合函数运算\n```\n\n### 5.6 分组查询（GROUP BY）\n\n```sql\n-- 按性别分组，统计查询每组人数\nSELECT gender, COUNT(*) \nFROM users \nGROUP BY gender;\n\n-- 按状态分组，统计每组平均年龄\nSELECT status, AVG(age) \nFROM users \nGROUP BY status;\n\n-- WHERE 和 HAVING 的区别\n-- WHERE：分组前过滤\n-- HAVING：分组后过滤\n\n-- 查询年龄大于20的用户，按性别分组，统计每组人数\nSELECT gender, COUNT(*) \nFROM users \nWHERE age > 20 \nGROUP BY gender;\n\n-- 按性别分组，统计每组人数，只显示人数大于2的组\nSELECT gender, COUNT(*) AS count \nFROM users \nGROUP BY gender \nHAVING count > 2;\n\n-- 执行顺序：WHERE > GROUP BY > 聚合函数 > HAVING\n```\n\n### 5.7 分页查询（LIMIT）\n\n```sql\n-- 语法：LIMIT 起始索引, 查询条目数\n-- 起始索引从0开始\n\n-- 查询前3条数据\nSELECT * FROM users LIMIT 0, 3;\n\n-- 查询第2页数据（每页3条）\n-- 起始索引 = (当前页码-1) * 每页显示条数\nSELECT * FROM users LIMIT 3, 3;\n\n-- 查询第3页数据（每页3条）\nSELECT * FROM users LIMIT 6, 3;\n\n-- 前端分页公式\n-- page: 当前页码\n-- pageSize: 每页条数\n-- LIMIT (page-1)*pageSize, pageSize\n```\n\n### 5.8 综合查询示例\n\n```sql\n-- 需求：查询状态为1的用户，按性别分组，统计每组人数和平均年龄，\n--      只显示人数大于2的组，按人数降序排列，取前2条\n\nSELECT \n    gender,\n    COUNT(*) AS user_count,\n    AVG(age) AS avg_age\nFROM users\nWHERE status = 1\nGROUP BY gender\nHAVING user_count > 2\nORDER BY user_count DESC\nLIMIT 0, 2;\n```\n\n---\n\n## 六、约束与数据完整性\n\n### 6.1 约束的概念\n\n约束是作用于表中列上的规则，用于限制加入表的数据，保证数据的正确性、有效性和完整性。\n\n**约束分类：**\n- 非空约束（NOT NULL）\n- 唯一约束（UNIQUE）\n- 主键约束（PRIMARY KEY）\n- 默认约束（DEFAULT）\n- 外键约束（FOREIGN KEY）\n\n### 6.2 非空约束（NOT NULL）\n\n保证列中所有数据不能有 NULL 值。\n\n```sql\n-- 创建表时添加\nCREATE TABLE users (\n    id INT,\n    username VARCHAR(50) NOT NULL,  -- 用户名不能为空\n    email VARCHAR(100)\n);\n\n-- 建表后添加\nALTER TABLE users MODIFY COLUMN username VARCHAR(50) NOT NULL;\n\n-- 删除非空约束\nALTER TABLE users MODIFY COLUMN username VARCHAR(50);\n```\n\n### 6.3 唯一约束（UNIQUE）\n\n保证列中所有数据各不相同。\n\n```sql\n-- 创建表时添加\nCREATE TABLE users (\n    id INT,\n    username VARCHAR(50) UNIQUE,  -- 用户名必须唯一\n    email VARCHAR(100)\n);\n\n);\n\n-- 建表后添加\nALTER TABLE users MODIFY COLUMN username VARCHAR(50) UNIQUE;\n\n-- 删除唯一约束\nALTER TABLE users DROP INDEX username;\n```\n\n### 6.4 主键约束（PRIMARY KEY）\n\n主键是一行数据的唯一标识，要求非空且唯一。一张表只能有一个主键。\n\n```sql\n-- 创建表时添加\nCREATE TABLE users (\n    id INT PRIMARY KEY,  -- id是主键\n    username VARCHAR(50)\n);\n\n-- 主键自增长\nCREATE TABLE users (\n    id INT PRIMARY KEY AUTO_INCREMENT,  -- 自动增长\n    username VARCHAR(50)\n);\n\n-- 建表后添加\nALTER TABLE users ADD PRIMARY KEY(id);\n\n-- 删除主键\nALTER TABLE users DROP PRIMARY KEY;\n```\n\n### 6.5 默认约束（DEFAULT）\n\n保存数据时，未指定值则采用默认值。\n\n```sql\n-- 创建表时添加\nCREATE TABLE users (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    username VARCHAR(50),\n    status TINYINT DEFAULT 1  -- 默认状态为1\n);\n\n-- 建表后添加\nALTER TABLE users ALTER COLUMN status SET DEFAULT 1;\n\n-- 删除默认约束\nALTER TABLE users ALTER COLUMN status DROP DEFAULT;\n```\n\n### 6.6 外键约束（FOREIGN KEY）\n\n让表与表之间产生关联关系，保证数据的一致性和完整性。\n\n```sql\n-- 创建部门表\nCREATE TABLE departments (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL\n);\n\n-- 创建员工表（添加外键）\nCREATE TABLE employees (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    dept_id INT,\n    FOREIGN KEY (dept_id) REFERENCES departments(id)\n);\n\n-- 建表后添加外键\nALTER TABLE employees \nADD CONSTRAINT fk_dept \nFOREIGN KEY (dept_id) REFERENCES departments(id);\n\n-- 删除外键\nALTER TABLE employees DROP FOREIGN KEY fk_dept;\n```\n\n### 6.7 级联操作\n\n```sql\n-- 级联删除和更新\nALTER TABLE employees \nADD CONSTRAINT fk_dept \nFOREIGN KEY (dept_id) REFERENCES departments(id)\nON DELETE CASCADE  -- 删除部门时，级联删除该部门的所有员工\nON UPDATE CASCADE;  -- 更新部门ID时，级联更新员工表中的部门ID\n```\n\n**级联操作类型：**\n- `CASCADE`：级联操作（慎用）\n- `SET NULL`：置空\n- `NO ACTION`：拒绝操作（默认）\n- `RESTRICT`：拒绝操作\n\n---\n\n## 七、多表操作\n\n### 7.1 表关系类型\n\n**一对一（1:1）**\n- 适用场景：用户和用户详情\n- 建表原则：在任意一个表建立外键\n\n**一对多（1:N）**\n- 适用场景：部门和员工、用户和订单\n- 建表原则：在多的一方建立外键\n\n**多对多（M:N）**\n- 适用场景：学生和课程、用户和角色\n- 建表原则：借助第三张中间表\n\n### 7.2 一对多关系示例\n\n```sql\n-- 部门表\nCREATE TABLE departments (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    location VARCHAR(100)\n);\n\n-- 员工表（多的一方，建立外键）\nCREATE TABLE employees (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    salary DECIMAL(10,2),\n    dept_id INT,\n    FOREIGN KEY (dept_id) REFERENCES departments(id)\n);\n\n-- 插入测试数据\nINSERT INTO departments (name, location) VALUES\n('技术部', '北京'),\n('市场部', '上海'),\n('财务部', '广州');\n\nINSERT INTO employees (name, salary, dept_id) VALUES\n('张三', 8000, 1),\n('李四', 9000, 1),\n('王五', 7000, 2),\n('赵六', 7500, 2),\n('孙七', 8500, 3);\n```\n\n### 7.3 多对多关系示例\n\n```sql\n-- 学生表\nCREATE TABLE students (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL\n);\n\n-- 课程表\nCREATE TABLE courses (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL\n);\n\n-- 中间表（学生选课表）\nCREATE TABLE student_courses (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    student_id INT,\n    course_id INT,\n    FOREIGN KEY (student_id) REFERENCES students(id),\n    FOREIGN KEY (course_id) REFERENCES courses(id)\n);\n\n-- 插入测试数据\nINSERT INTO students (name) VALUES ('张三'), ('李四'), ('王五');\nINSERT INTO courses (name) VALUES ('数学'), ('英语'), ('物理');\n\n-- 张三选了数学和英语\nINSERT INTO student_courses (student_id, course_id) VALUES (1, 1), (1, 2);\n-- 李四选了英语和物理\nINSERT INTO student_courses (student_id, course_id) VALUES (2, 2), (2, 3);\n```\n\n### 7.4 多表查询\n\n**笛卡尔积（不推荐）**\n```sql\n-- 笛卡尔积：A表每条数据与B表每条数据组合\nSELECT * FROM employees, departments;\n-- 结果：员工数 × 部门数\n```\n\n**内连接（INNER JOIN）**\n```sql\n-- 显式内连接\nSELECT e.name, e.salary, d.name AS dept_name\nFROM employees e\nINNER JOIN departments d ON e.dept_id = d.id;\n\n-- 隐式内连接\nSELECT e.name, e.salary, d.name AS dept_name\nFROM employees e, departments d\nWHERE e.dept_id = d.id;\n```\n\n**外连接（OUTER JOIN）**\n```sql\n-- 左外连接：查询左表所有数据，以及右表匹配的数据\nSELECT e.name, e.salary, d.name AS dept_name\nFROM employees e\nLEFT JOIN departments d ON e.dept_id = d.id;\n\n-- 右外连接：查询右表所有数据，以及左表匹配的数据\nSELECT e.name, e.salary, d.name AS dept_name\nFROM employees e\nRIGHT JOIN departments d ON e.dept_id = d.id;\n```\n\n### 7.5 子查询\n\n查询语句中嵌套查询语句。\n\n**单行单列（作为条件值）**\n```sql\n-- 查询工资高于张三的员工\nSELECT * FROM employees \nWHERE salary > (SELECT salary FROM employees WHERE name = '张三');\n```\n\n**多行单列（使用 IN）**\n```sql\n-- 查询技术部和市场部的所有员工\nSELECT * FROM employees\nWHERE dept_id IN (\n    SELECT id FROM departments \n    WHERE name IN ('技术部', '市场部')\n);\n```\n\n**多行多列（作为虚拟表）**\n```sql\n-- 查询工资大于8000的员工及其部门信息\nSELECT t1.name, t1.salary, t2.name AS dept_name\nFROM (SELECT * FROM employees WHERE salary > 8000) t1\nLEFT JOIN departments t2 ON t1.dept_id = t2.id;\n```\n\n### 7.6 自关联查询\n\n同一张表中的数据有关联性。\n\n```sql\n-- 员工表（包含领导ID）\nCREATE TABLE employees (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    manager_id INT,  -- 领导ID\n    FOREIGN KEY (manager_id) REFERENCES employees(id)\n);\n\n-- 插入测试数据\nINSERT INTO employees (id, name, manager_id) VALUES\n(1, 'CEO', NULL),\n(2, '技术总监', 1),\n(3, '市场总监', 1),\n(4, '前端主管', 2),\n(5, '后端主管', 2);\n\n-- 查询员工及其领导姓名\nSELECT \n    e1.name AS '员工',\n    e2.name AS '领导'\nFROM employees e1\nLEFT JOIN employees e2 ON e1.manager_id = e2.id;\n```\n\n---\n\n## 八、视图\n\n### 8.1 视图的概念\n\n视图是一种虚拟存在的数据表，不实际存储在数据库中。\n\n**作用：**\n- 将复杂查询语句的结果封装到虚拟表中\n- 简化后续查询\n- 提供数据安全性（限制访问权限）\n\n**类比前端：**\n- 类似于计算属性或 memoized 函数\n\n### 8.2 创建和查询视图\n\n```sql\n-- 创建视图（员工及其部门信息）\nCREATE VIEW employee_dept_view AS\nSELECT \n    e.id,\n    e.name AS employee_name,\n    e.salary,\n    d.name AS dept_name,\n    d.location\nFROM employees e\nLEFT JOIN departments d ON e.dept_id = d.id;\n\n-- 查询视图\nSELECT * FROM employee_dept_view;\n\n-- 带条件的查询\nSELECT * FROM employee_dept_view WHERE dept_name = '技术部';\n```\n\n### 8.3 修改和删除视图\n\n```sql\n-- 修改视图数据（会影响原表）\nUPDATE employee_dept_view SET salary = 10000 WHERE id = 1;\n\n-- 修改视图结构\nALTER VIEW employee_dept_view AS\nSELECT \n    e.id,\n    e.name AS employee_name,\n    e.salary,\n    d.name AS dept_name\nFROM employees e\nINNER JOIN departments d ON e.dept_id = d.id;\n\n-- 删除视图\nDROP VIEW IF EXISTS employee_dept_view;\n```\n\n---\n\n## 九、前端开发实战示例\n\n### 9.1 用户管理系统\n\n```sql\n-- 创建用户表\nCREATE TABLE users (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    username VARCHAR(50) NOT NULL UNIQUE,\n    password VARCHAR(255) NOT NULL,\n    email VARCHAR(100) NOT NULL UNIQUE,\n    phone VARCHAR(20),\n    avatar VARCHAR(255),\n    status TINYINT DEFAULT 1 COMMENT '0-禁用,1-正常',\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,\n    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    INDEX idx_username (username),\n    INDEX idx_email (email)\n);\n\n-- 用户注册\nINSERT INTO users (username, password, email, phone) \nVALUES ('zhangsan', 'hashed_password', 'zhangsan@example.com', '13800138000');\n\n-- 用户登录验证\nSELECT id, username, email, avatar, status \nFROM users \nWHERE username = 'zhangsan' AND password = 'hashed_password';\n\n-- 更新用户信息\nUPDATE users \nSET email = 'newemail@example.com', phone = '13900139000' \nWHERE id = 1;\n\n-- 分页查询用户列表（每页10条）\nSELECT id, username, email, status, create_time \nFROM users \nWHERE status = 1\nORDER BY create_time DESC\nLIMIT 0, 10;\n```\n\n### 9.2 博客系统\n\n```sql\n-- 用户表\nCREATE TABLE users (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    username VARCHAR(50) NOT NULL UNIQUE,\n    password VARCHAR(255) NOT NULL,\n    avatar VARCHAR(255),\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\n-- 文章表\nCREATE TABLE articles (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    title VARCHAR(200) NOT NULL,\n    content TEXT NOT NULL,\n    author_id INT NOT NULL,\n    category_id INT,\n    views INT DEFAULT 0,\n    likes INT DEFAULT 0,\n    status TINYINT DEFAULT 1 COMMENT '0-草稿,1-已发布',\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,\n    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    FOREIGN KEY (author_id) REFERENCES users(id),\n    INDEX idx_author (author_id),\n    INDEX idx_status (status)\n);\n\n-- 分类表\nCREATE TABLE categories (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(50) NOT NULL,\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\n-- 评论表\nCREATE TABLE comments (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    article_id INT NOT NULL,\n    user_id INT NOT NULL,\n    content TEXT NOT NULL,\n    parent_id INT COMMENT '父评论ID，用于回复',\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,\n    FOREIGN KEY (article_id) REFERENCES articles(id),\n    FOREIGN KEY (user_id) REFERENCES users(id),\n    FOREIGN KEY (parent_id) REFERENCES comments(id)\n);\n\n-- 发布文章\nINSERT INTO articles (title, content, author_id, category_id, status) \nVALUES ('MySQL学习笔记', '这是一篇关于MySQL的学习笔记...', 1, 1, 1);\n\n-- 查询文章列表（带作者和分类信息）\nSELECT \n    a.id,\n    a.title,\n    a.views,\n    a.likes,\n    a.create_time,\n    u.username AS author,\n    c.name AS category\nFROM articles a\nLEFT JOIN users u ON a.author_id = u.id\nLEFT JOIN categories c ON a.category_id = c.id\nWHERE a.status = 1\nORDER BY a.create_time DESC\nLIMIT 0, 10;\n\n-- 查询文章详情（带评论）\nSELECT \n    a.id,\n    a.title,\n    a.content,\n    a.views,\n    a.likes,\n    u.username AS author,\n    c.name AS category\nFROM articles a\nLEFT JOIN users u ON a.author_id = u.id\nLEFT JOIN categories c ON a.category_id = c.id\nWHERE a.id = 1;\n\n-- 查询文章的评论\nSELECT \n    c.id,\n    c.content,\n    c.create_time,\n    u.username,\n    u.avatar\nFROM comments c\nLEFT JOIN users u ON c.user_id = u.id\nWHERE c.article_id = 1 AND c.parent_id IS NULL\nORDER BY c.create_time DESC;\n\n-- 增加文章浏览量\nUPDATE articles SET views = views + 1 WHERE id = 1;\n\n-- 点赞文章\nUPDATE articles SET likes = likes + 1 WHERE id = 1;\n```\n\n### 9.3 电商订单系统\n\n```sql\n-- 用户表\nCREATE TABLE users (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    username VARCHAR(50) NOT NULL UNIQUE,\n    password VARCHAR(255) NOT NULL,\n    balance DECIMAL(10,2) DEFAULT 0,\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\n-- 商品表\nCREATE TABLE products (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    name VARCHAR(200) NOT NULL,\n    price DECIMAL(10,2) NOT NULL,\n    stock INT DEFAULT 0,\n    image VARCHAR(255),\n    status TINYINT DEFAULT 1 COMMENT '0-下架,1-上架',\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\n-- 订单表\nCREATE TABLE orders (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    order_no VARCHAR(50) NOT NULL UNIQUE,\n    user_id INT NOT NULL,\n    total_amount DECIMAL(10,2) NOT NULL,\n    status TINYINT DEFAULT 1 COMMENT '1-待付款,2-待发货,3-待收货,4-已完成',\n    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,\n    FOREIGN KEY (user_id) REFERENCES users(id),\n    INDEX idx_user (user_id),\n    INDEX idx_order_no (order_no)\n);\n\n-- 订单详情表\nCREATE TABLE order_items (\n    id INT PRIMARY KEY AUTO_INCREMENT,\n    order_id INT NOT NULL,\n    product_id INT NOT NULL,\n    quantity INT NOT NULL,\n    price DECIMAL(10,2) NOT NULL,\n    subtotal DECIMAL(10,2) NOT NULL,\n    FOREIGN KEY (order_id) REFERENCES orders(id),\n    FOREIGN KEY (product_id) REFERENCES products(id)\n);\n\n-- 创建订单（事务处理）\nSTART TRANSACTION;\n\n-- 1. 创建订单\nINSERT INTO orders (order_no, user_id, total_amount, status) \nVALUES ('ORD20240130001', 1, 299.00, 1);\n\n-- 2. 添加订单详情\nINSERT INTO order_items (order_id, product_id, quantity, price, subtotal) \nVALUES \n(LAST_INSERT_ID(), 1, 2, 99.00, 198.00),\n(LAST_INSERT_ID(), 2, 1, 101.00, 101.00);\n\n-- 3. 扣减库存\nUPDATE products SET stock = stock - 2 WHERE id = 1;\nUPDATE products SET stock = stock - 1 WHERE id = 2;\n\n-- 4. 扣减用户余额\nUPDATE users SET balance = balance - 299.00 WHERE id = 1;\n\nCOMMIT;\n\n-- 查询用户订单列表\nSELECT \n    o.id,\n    o.order_no,\n    o.total_amount,\n    o.status,\n    o.create_time\nFROM orders o\nWHERE o.user_id = 1\nORDER BY o.create_time DESC\nLIMIT 0, 10;\n\n-- 查询订单详情（包含商品信息）\nSELECT \n    oi.id,\n    p.name AS product_name,\n    p.image,\n    oi.quantity,\n    oi.price,\n    oi.subtotal\nFROM order_items oi\nLEFT JOIN products p ON oi.product_id = p.id\nWHERE oi.order_id = 1;\n```\n\n### 9.4 Node.js + MySQL 连接示例\n\n```javascript\n\u002F\u002F 安装 mysql2\n\u002F\u002F npm install mysql2\n\nconst mysql = require('mysql2');\n\n\u002F\u002F 创建连接池\nconst pool = mysql.createPool({\n    host: 'localhost',\n    user: 'root',\n    password: 'password',\n    database: 'myapp',\n    waitForConnections: true,\n    connectionLimit: 10,\n    queueLimit: 0\n});\n\n\u002F\u002F 查询用户\nasync function getUserById(id) {\n    const [rows] = await pool.promise().query(\n        'SELECT id, username, email, avatar FROM users WHERE id = ?',\n        [id]\n    );\n    return rows[0];\n}\n\n\u002F\u002F 用户注册\nasync function registerUser(username, password, email) {\n    const [result] = await pool.promise().query(\n        'INSERT INTO users (username, password, email) VALUES (?, ?, ?)',\n        [username, password, email]\n    );\n    return result.insertId;\n}\n\n\u002F\u002F 分页查询文章列表\nasync function getArticles(page = 1, pageSize = 10) {\n    const offset = (page - 1) * pageSize;\n    const [rows] = await pool.promise().query(`\n        SELECT \n            a.id,\n            a.title,\n            a.views,\n            a.likes,\n            a.create_time,\n            u.username AS author\n        FROM articles a\n        LEFT JOIN users u ON a.author_id = u.id\n        WHERE a.status = 1\n        ORDER BY a.create_time DESC\n        LIMIT ?, ?\n    `, [offset, pageSize]);\n    return rows;\n}\n\n\u002F\u002F 使用示例\n(async () => {\n    try {\n        const user = await getUserById(1);\n        console.log('用户信息:', user);\n\n        const articles = await getArticles(1, 10);\n        console.log('文章列表:', articles);\n    } catch (error) {\n        console.error('错误:', error);\n    }\n})();\n```\n\n---\n\n## 十、学习建议\n\n### 10.1 学习路径\n\n1. **基础概念**（1-2天）\n   - 理解数据库、表、字段的概念\n   - 掌握 MySQL 的安装和配置\n\n2. **SQL 基础**（3-5天）\n   - DDL：创建数据库和表\n   - DML：增删改数据\n   - DQL：基础查询\n\n3. **进阶查询**（3-5天）\n   - 条件查询、排序、分页\n   - 聚合函数、分组查询\n   - 多表查询、子查询\n\n4. **数据库设计**（3-5天）\n   - 约束的使用\n   - 表关系设计（一对一、一对多、多对多）\n   - 数据库设计范式\n\n5. **实战应用**（持续）\n   - 结合 Node.js\u002FExpress\u002FKoa\n   - 设计实际项目的数据库\n   - 优化查询性能\n\n### 10.2 常用工具\n\n- **Navicat**：图形化管理工具\n- **MySQL Workbench**：官方工具\n- **DBeaver**：开源免费\n- **命令行**：mysql 命令\n\n### 10.3 注意事项\n\n1. **SQL 注入防护**\n   - 使用参数化查询\n   - 避免字符串拼接 SQL\n\n2. **性能优化**\n   - 合理使用索引\n   - 避免 SELECT *\n   - 使用 LIMIT 限制结果集\n\n3. **事务处理**\n   - 重要操作使用事务\n   - 确保数据一致性\n\n4. **数据备份**\n   - 定期备份数据库\n   - 测试恢复流程\n\n---\n\n## 十一、快速参考\n\n### 11.1 常用 SQL 语句速查\n\n```sql\n-- 数据库操作\nSHOW DATABASES;\nCREATE DATABASE dbname;\nUSE dbname;\nDROP DATABASE dbname;\n\n-- 表操作\nSHOW TABLES;\nCREATE TABLE table_name (...);\nDESC table_name;\nDROP TABLE table_name;\n\n-- 数据操作\nINSERT INTO table_name (col1, col2) VALUES (val1, val2);\nUPDATE table_name SET col1 = val1 WHERE condition;\nDELETE FROM table_name WHERE condition;\n\n-- 查询操作\nSELECT * FROM table_name WHERE condition ORDER BY col LIMIT offset, count;\nSELECT COUNT(*) FROM table_name WHERE condition;\nSELECT col, COUNT(*) FROM table_name GROUP BY col HAVING count > 1;\n```\n\n### 11.2 数据类型速查\n\n| 类型 | 说明 | 示例 |\n|------|------|------|\n| INT | 整数 | age INT |\n| VARCHAR(n) | 可变字符串 | name VARCHAR(50) |\n| TEXT | 长文本 | content TEXT |\n| DECIMAL(m,d) | 精确小数 | price DECIMAL(10,2) |\n| DATE | 日期 | birthday DATE |\n| DATETIME | 日期时间 | create_time DATETIME |\n| TIMESTAMP | 时间戳 | update_time TIMESTAMP |\n\n---\n\n**祝学习愉快！成为优秀的全栈工程师！** 🚀\n",null,37,0,1,"2026-04-07T16:16:40.024Z","2026-04-07T16:16:40.027Z","2026-05-26T01:39:35.739Z","0",{"id":19,"categoryName":36,"slug":37,"description":38,"sort":29,"isEnable":30,"createTime":39,"updateTime":40,"deleteTime":29},"数据库开发","database-design","333","2026-04-03T02:37:05.639Z","2026-04-07T16:38:56.350Z",[],[],[]]