-- 创建数据库CREATE DATABASE IF NOTEXISTS `shop` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE shop;
-- 创建表CREATE TABLE `user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`username` VARCHAR(50) NOT NULLUNIQUE COMMENT '用户名',
`password` CHAR(32) NOT NULL COMMENT '密码 (MD5)',
`email` VARCHAR(100) COMMENT '邮箱',
`status` TINYINT DEFAULT1 COMMENT '状态:0 禁用,1 启用',
`created_at` DATETIME DEFAULTCURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
INDEX idx_username (`username`) -- 普通索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 修改表结构ALTER TABLE `user` ADDCOLUMN `phone` VARCHAR(20) AFTER `email`;
ALTER TABLE `user` MODIFY `status` TINYINT DEFAULT0;
ALTER TABLE `user` DROPCOLUMN `phone`;
2.3 DML:数据的增删改
插入数据时要注意批量操作的效率。更新和删除务必带上 WHERE 条件,否则可能导致全表更新或删除,后果严重。
-- 插入INSERT INTO `user` (`username`, `password`, `email`) VALUES ('zhangsan', MD5('123456'), '[email protected]');
-- 批量插入INSERT INTO `user` (`username`, `password`) VALUES ('lisi', MD5('123')), ('wangwu', MD5('456'));
-- 更新 (务必带 WHERE 条件)UPDATE `user` SET `status` =0WHERE `username` ='zhangsan';
-- 删除 (逻辑删除推荐使用状态字段,物理删除慎用)DELETEFROM `user` WHERE `id` =10;
2.4 DQL:核心查询(SELECT)
查询是开发中最频繁的操作。注意分页查询中的 LIMIT 用法以及聚合函数的使用。
-- 基础查询SELECT id, username, email FROMuserWHERE status =1;
-- 条件查询与排序SELECT*FROMuserWHERE created_at >='2023-01-01'AND status IN (1,2) ORDERBY created_at DESC, id ASC LIMIT 10OFFSET0;
-- 聚合查询SELECTCOUNT(*) AS total_count, MAX(id) AS max_id, AVG(id) AS avg_id FROMuser;
第三部分:进阶篇 —— 高性能 SQL 与复杂场景应用
3.1 MySQL 逻辑架构与存储引擎
MySQL 的逻辑架构大致分为四层:连接层、服务层、引擎层、存储层。其中引擎层是可插拔的,决定了数据的存储方式。
-- 假设创建了联合索引 (name, age, city)-- ✅ 有效:命中 name 和 ageSELECT*FROMuserWHERE name ='A'AND age =20;
-- ✅ 有效:命中 nameSELECT*FROMuserWHERE name ='A';
-- ❌ 失效:未使用最左列SELECT*FROMuserWHERE age =20;
-- ❌ 失效:跳过中间列,只能用到 nameSELECT*FROMuserWHERE name ='A'AND city ='BJ';
-- INNER JOIN: 返回匹配的行SELECT u.name, o.order_no FROMuser u INNERJOIN orders o ON u.id = o.user_id;
-- LEFT JOIN: 返回左表所有行,右表无匹配则为 NULLSELECT u.name, o.order_no FROMuser u LEFTJOIN orders o ON u.id = o.user_id;
-- 自连接:查询员工及其上级SELECT e.name, m.name AS manager FROM employee e LEFTJOIN employee m ON e.manager_id = m.id;
子查询与派生表:
-- 标量子查询SELECT name, (SELECTMAX(salary) FROM employee) FROM employee;
-- IN 子查询SELECT*FROMuserWHERE id IN (SELECT user_id FROM orders WHERE amount >100);
-- EXISTS 子查询 (通常用于判断存在性)SELECT*FROMuser u WHEREEXISTS (SELECT1FROM orders o WHERE o.user_id = u.id);
窗口函数(MySQL 8.0+):
-- 排名:ROW_NUMBER, RANK, DENSE_RANKSELECT name, salary, ROW_NUMBER() OVER (ORDERBY salary DESC) AS row_num,
RANK() OVER (ORDERBY salary DESC) AS rank_num,
DENSE_RANK() OVER (ORDERBY salary DESC) AS dense_rank_num
FROM employee;
-- 分组排名:按部门内排名SELECT name, dept_id, salary, RANK() OVER (PARTITIONBY dept_id ORDERBY salary DESC) AS dept_rank
FROM employee;
-- 聚合窗口函数:计算累计和SELECTdate, amount, SUM(amount) OVER (ORDERBYdate) AS cumulative_amount FROM sales;