上一篇
场景引入:
小张最近接手了一个电商系统的数据分析任务,需要统计每个用户的订单总金额,但问题来了——用户信息存在users
表里,订单数据却在orders
表里,他盯着两个孤零零的表格发愁:"怎么才能把它们拼在一起查?" 别急,这就是数据库链接查询大显身手的时候了!
想象你有一堆乐高积木:零件分散在不同盒子里(就像分散的数据表),而链接查询就是那本教你"如何拼出完整模型"的说明书,通过关联查询,我们可以:
适用场景:只查两表有对应关系的数据
SELECT users.name, orders.amount FROM users INNER JOIN orders ON users.id = orders.user_id;
效果:像相亲配对,只展示成功牵手的组合(用户有订单才会显示)
适用场景:保留左表全部数据,右表没匹配就显示NULL
SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id;
效果:像家长会点名——所有学生(左表)必须到场,家长(右表)没来的记缺席
适用场景:保留右表全部数据(实际使用较少,通常用左连接替代)
SELECT users.name, orders.amount FROM users RIGHT JOIN orders ON users.id = orders.user_id;
适用场景:显示两表所有数据(MySQL不支持,可用UNION替代)
SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id UNION SELECT users.name, orders.amount FROM users RIGHT JOIN orders ON users.id = orders.user_id;
SELECT u.name, o.order_date, p.product_name FROM users u INNER JOIN orders o ON u.id = o.user_id INNER JOIN products p ON o.product_id = p.id;
-- 查询2025年消费超过500元的用户 SELECT u.name, SUM(o.amount) as total FROM users u INNER JOIN orders o ON u.id = o.user_id WHERE o.order_date BETWEEN '2025-01-01' AND '2025-12-31' GROUP BY u.name HAVING total > 500;
user_id
、order_id
等 SELECT *
,只查需要的列 ❌ 陷阱1:关联条件漏写导致笛卡尔积(结果集爆炸)
-- 错误示范(忘记写ON条件) SELECT * FROM users JOIN orders; -- 会组合所有可能性!
❌ 陷阱2:混淆WHERE和HAVING
❌ 陷阱3:多对多关系未使用中间表
比如用户和商品的关系,需要通过user_products
中间表关联
:
链接查询就像数据库的"社交网络"——通过主外键关系让数据表们建立联系,掌握这些方法后,你会发现原来需要手动拼接的Excel报表,现在一句SQL就能搞定,下次遇到分散的数据时,记得大喊一声:"JOIN来!"
(注:本文示例基于标准SQL语法,具体实现可能因MySQL/PostgreSQL等数据库略有差异)
本文由 独运锋 于2025-08-03发表在【云服务器提供商】,文中图片由(独运锋)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/523457.html
发表评论