-- 插入或更新用户信息(基于id唯一键) INSERT INTO users (id, name, email) VALUES (1, '张三', 'zhangsan_new@example.com'), -- 存在则更新 (4, '赵六', 'zhaoliu@example.com') -- 不存在则插入 ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email);
6. 使用FIND_IN_SET处理集合查询
场景:当字段存储逗号分隔的集合(如多分类ID)时,快速查询包含指定元素的记录。
1 2 3 4
-- 查询包含分类ID=1的商品 SELECT * FROM products WHERE FIND_IN_SET('1', category_ids);
-- 结果:商品A(1,2,3)、商品C(1,4)、商品E(1,5,6)
7. 使用GROUP_CONCAT合并多行数据
场景:将分组后的多行数据合并为单个字符串(如部门员工列表、标签集合),简化应用层拼接逻辑。
1 2 3 4 5 6 7 8 9
-- 按部门合并员工姓名(以逗号分隔) SELECT department, GROUP_CONCAT(name ORDER BY name SEPARATOR ', ') AS employees FROM employees GROUP BY department;
-- 结果示例: -- 技术部 | 李四, 王五, 张三
8. 使用EXISTS优化子查询性能
场景:替代低效的IN子查询,判断子查询是否存在结果。尤其在大数据量时,EXISTS性能更优。
1 2 3 4 5 6
-- 查询包含高价商品(价格>100)的订单 SELECT * FROM orders o WHERE EXISTS ( SELECT 1 FROM order_items oi WHERE oi.order_id = o.id AND oi.price > 100 );
9. 使用ROW_NUMBER()实现高效分页
场景:MySQL 8.0+支持的窗口函数,通过行编号实现分页,逻辑清晰且性能稳定。
1 2 3 4 5 6
-- 查询第1-10条最新文章(按创建时间倒序) SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY created_at DESC) AS row_num FROM articles ) t WHERE row_num BETWEEN 1 AND 10;
10. 使用WITH子句简化复杂查询
场景:将复杂查询拆解为多个CTE(公共表表达式),提升可读性和可维护性,类似“查询中的变量定义”。
1 2 3 4 5 6 7 8 9
-- 统计用户订单数和总金额,再关联用户表 WITH user_stats AS ( SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY user_id ) SELECT u.name, us.order_count, us.total_amount FROM users u JOIN user_stats us ON u.id = us.user_id;