上一篇
场景引入:
小张正在开发电商后台系统,突然接到需求:"统计每个用户的订单总金额,并显示所属地区",他盯着用户表
、订单表
和地区表
发愁——这三个表的数据怎么一次性查出来?别急,三表联查就是你的瑞士军刀!
核心思想:通过共享字段把多个表的数据像拼图一样组合起来。
SELECT 表A.字段, 表B.字段, 表C.字段 FROM 表A JOIN 表B ON 表A.关联字段 = 表B.关联字段 JOIN 表C ON 表B.关联字段 = 表C.关联字段
👉 关键点:
JOIN
是连接的核心操作符 ON
后面跟着关联条件(就像告诉MySQL怎么拼图) a
,b
,c
) 适用场景:只显示三表都有匹配的数据
SELECT u.username, o.order_no, r.region_name FROM users u INNER JOIN orders o ON u.id = o.user_id INNER JOIN regions r ON u.region_id = r.id
适用场景:即使右表没有数据,也要保留左表记录
SELECT u.username, o.order_no, r.region_name FROM users u LEFT JOIN orders o ON u.id = o.user_id LEFT JOIN regions r ON u.region_id = r.id
案例:查询所有用户,及有订单的对应地区
SELECT u.username, o.order_no, r.region_name FROM users u LEFT JOIN orders o ON u.id = o.user_id -- 保留无订单用户 INNER JOIN regions r ON u.region_id = r.id -- 只显示有地区的
解决小张的需求:
SELECT u.username, r.region_name, COUNT(o.id) AS order_count, SUM(o.amount) AS total_amount FROM users u LEFT JOIN orders o ON u.id = o.user_id LEFT JOIN regions r ON u.region_id = r.id GROUP BY u.id, r.region_name
场景:查询员工及其经理所在部门
SELECT e.name AS employee, m.name AS manager, d.department_name FROM employees e LEFT JOIN employees m ON e.manager_id = m.id -- 自连接查经理 INNER JOIN departments d ON e.dept_id = d.id
ALTER TABLE orders ADD INDEX idx_user_id (user_id);
SELECT *
,只查必要字段 EXPLAIN SELECT...你的三表查询...
-- 错误示范 SELECT id, name... -- 哪个表的id? -- 正确写法 SELECT u.id, o.name...
(答案提示:需要组合使用JOIN、GROUP BY和子查询)
:三表联查就像搭积木,掌握好JOIN的四种类型(INNER/LEFT/RIGHT/FULL)和关联逻辑,就能轻松应对90%的多表查询需求,记得先用小数据量测试,再上生产环境哦!✨
📅 技术要点更新至2025年8月,适用于MySQL 8.0+版本
本文由 邱清雅 于2025-08-02发表在【云服务器提供商】,文中图片由(邱清雅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/510766.html
发表评论