# MySQL 常考语句分类整理 ## 一、数据查询(SELECT) | 类型 | 示例 | | -------- | ---------------------------------------------------------- | | 基础查询 | `SELECT * FROM users;` | | 指定列 | `SELECT id, name FROM users;` | | 条件查询 | `SELECT * FROM users WHERE age > 25;` | | 排序 | `SELECT * FROM users ORDER BY age DESC;` | | 去重 | `SELECT DISTINCT city FROM users;` | | 分页 | `SELECT * FROM users LIMIT 10 OFFSET 20;` | | 别名 | `SELECT name AS username FROM users;` | | 模糊匹配 | `SELECT * FROM users WHERE name LIKE 'A%';` | | 范围查询 | `SELECT * FROM users WHERE age BETWEEN 20 AND 30;` | | 多条件 | `SELECT * FROM users WHERE age > 20 AND city = 'Beijing';` | ------ ## 二、多表操作(连接与子查询) | 类型 | 示例 | | ----------------- | ------------------------------------------------------------ | | 内连接 | `SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.user_id;` | | 左连接 | `SELECT u.name, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id;` | | 右连接 | `SELECT u.name, o.amount FROM users u RIGHT JOIN orders o ON u.id = o.user_id;` | | 子查询(WHERE中) | `SELECT name FROM users WHERE id IN (SELECT user_id FROM orders);` | | 子查询(FROM中) | `SELECT t.user_id, COUNT(*) FROM (SELECT * FROM orders WHERE amount > 100) t GROUP BY t.user_id;` | ------ ## 三、聚合与分组 | 类型 | 示例 | | ----------- | ------------------------------------------------------------ | | 总数 | `SELECT COUNT(*) FROM users;` | | 求和 | `SELECT SUM(amount) FROM orders;` | | 平均值 | `SELECT AVG(age) FROM users;` | | 最大/最小值 | `SELECT MAX(age), MIN(age) FROM users;` | | 分组统计 | `SELECT city, COUNT(*) FROM users GROUP BY city;` | | 分组条件 | `SELECT city, COUNT(*) FROM users GROUP BY city HAVING COUNT(*) > 10;` | ------ ## 四、数据更新与写入 | 类型 | 示例 | | ---------- | ------------------------------------------------------------ | | 插入 | `INSERT INTO users(name, age) VALUES('Alice', 30);` | | 批量插入 | `INSERT INTO users(name, age) VALUES ('Bob', 25), ('Cathy', 22);` | | 插入或更新 | `INSERT INTO users(id, name) VALUES (1, 'Tom') ON DUPLICATE KEY UPDATE name='Tom';` | | 更新数据 | `UPDATE users SET age = 28 WHERE id = 1;` | | 删除数据 | `DELETE FROM users WHERE age < 18;` | ------ ## 五、索引与性能优化相关 | 类型 | 示例 | | -------------- | ----------------------------------------------------------- | | 查看索引 | `SHOW INDEX FROM users;` | | 创建索引 | `CREATE INDEX idx_age ON users(age);` | | 删除索引 | `DROP INDEX idx_age ON users;` | | 使用执行计划 | `EXPLAIN SELECT * FROM users WHERE age > 30;` | | 查看慢查询日志 | `SHOW VARIABLES LIKE 'slow_query_log%';` | | 强制使用索引 | `SELECT * FROM users FORCE INDEX (idx_age) WHERE age > 25;` | ------ ## 六、事务与锁操作 | 类型 | 示例 | | ---------------- | ------------------------------------------------------------ | | 开启事务 | `START TRANSACTION;` 或 `BEGIN;` | | 提交事务 | `COMMIT;` | | 回滚事务 | `ROLLBACK;` | | 设置隔离级别 | `SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;` | | 查看当前隔离级别 | `SELECT @@tx_isolation;` | | 悲观锁 | `SELECT * FROM users WHERE id = 1 FOR UPDATE;` | | 乐观锁 | `UPDATE users SET age = 26, version = version + 1 WHERE id = 1 AND version = 2;` | ------ ## Bonus:面试高频场景题 | 问题 | 示例 | | -------------------------- | ------------------------------------------------------------ | | 查询每个用户的最后一笔订单 | 使用 `GROUP BY` + `MAX(order_time)` 或 `子查询 + JOIN` | | 查询重复数据 | `SELECT name, COUNT(*) FROM users GROUP BY name HAVING COUNT(*) > 1;` | | 查询某字段为空 | `SELECT * FROM users WHERE phone IS NULL;` | | 查询某天注册的用户 | `SELECT * FROM users WHERE DATE(register_time) = '2024-01-01';` | | 分页优化 | `SELECT * FROM users WHERE id > ? LIMIT 10;` 替代 OFFSET |