-- 创建数据库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.2 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.3 DQL:核心查询(SELECT)
查询是日常开发中最频繁的操作,掌握分页和聚合是基本功。
-- 基础查询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;
-- 假设创建了联合索引 (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;
6.2 子查询与派生表
子查询虽然灵活,但要注意性能,有时候 EXISTS 比 IN 更高效。
-- 标量子查询SELECT name, (SELECTMAX(salary) FROM employee) FROM employee;
-- IN 子查询 (注意优化,可能转换为 EXISTS)SELECT*FROMuserWHERE id IN (SELECT user_id FROM orders WHERE amount >100);
-- EXISTS 子查询 (通常用于判断存在性,性能通常优于 IN 当子查询结果集大时)SELECT*FROMuser u WHEREEXISTS (SELECT1FROM orders o WHERE o.user_id = u.id);
6.3 窗口函数(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;