MySql速成笔记6(DQL多表)

想汇总结果的时候可以用垂直合并

注意:主键名 inner join 外键名 还是 外键名 inner join 主键名 效果一样

注意外连接是必须要加 主外键相等的(on)

  • 连续 LEFT JOIN 中,每次的逻辑主表是上一次 JOIN 的中间结果集(保证主表记录不丢失)。
  • 但中间结果集包含了所有已关联原始表的字段,因此原始表的别名在后续所有 JOIN 中仍可引用(全局有效)也就是说用原始表的别名访问的是中间结果集的数据。
sql 复制代码
SELECT *
FROM users AS u
LEFT JOIN orders AS o ON u.user_id = o.user_id
LEFT JOIN order_details AS od ON u.user_id = od.user_id;  -- 直接用 u.user_id 关联(假设详情表也有 user_id)
  1. SELECT 子句与 ON 子句的关系

    • ON 子句用于定义表之间的关联条件,决定多表如何合并(哪些记录会被匹配关联)。
    • SELECT 子句用于从合并后的完整结果集中筛选需要返回的字段 ,它不影响表的关联逻辑,只影响最终输出的列。因此,SELECT 后指定的字段与 ON 中的关联条件确实没有直接关系(前者是 "选列",后者是 "关联规则")。
  2. MySQL 处理多表连接时的数据可见性 :执行多表连接时,MySQL 会先根据所有 JOINON 条件构建一个包含所有关联表字段的中间结果集 (可以理解为 "临时合并表"),这个结果集包含了符合关联条件的所有记录及相关字段(即使某些字段在 SELECT 中没被选中,它们在中间过程中也是存在的)。最终,SELECT 子句从这个中间结果集中 "挑选" 需要的字段返回给用户,相当于对中间结果集做了一次 "列过滤"。

    SELECT u.user_id -- 只返回用户ID
    FROM users AS u
    LEFT JOIN orders AS o ON u.user_id = o.user_id -- 关联用户和订单
    LEFT JOIN order_details AS od ON u.user_id = od.user_id; -- 关联用户和订单详情

  • 中间结果集会包含 usersordersorder_details 三表的所有字段(如 u.user_ido.order_idod.detail_id 等)。
  • SELECT u.user_id 仅决定最终结果只显示 u.user_id 这一列,但不影响三表的关联逻辑(ON 条件依然会正常执行,确保关联正确)。
相关推荐
报错小能手2 小时前
C++笔记(面向对象)详解单例模式
c++·笔记·单例模式
晓py2 小时前
SQL调优专题笔记:打造你的数据库性能优化思维体系
数据库·笔记·sql
三无少女指南2 小时前
在 Ubuntu 上使用 Docker 部署思源笔记:一份详尽的实践教程以及常见错误汇总
笔记·ubuntu·docker
路弥行至3 小时前
C语言入门教程 | 第七讲:函数和程序结构完全指南
c语言·经验分享·笔记·其他·算法·课程设计·入门教程
凌然先生4 小时前
12.如何利用ArcGIS进行基本的空间数据格式转换
经验分享·笔记·arcgis·电脑
Autism1144 小时前
javase-day22-stream
java·开发语言·windows·笔记
koo3645 小时前
李宏毅机器学习笔记34
人工智能·笔记·机器学习
lumi.5 小时前
前端本地存储技术笔记:localStorage 与 sessionStorage 详解
前端·javascript·笔记
せいしゅん青春之我6 小时前
【JavaEE初阶】网络原理——TCP处理先发后至问题
java·网络·笔记·网络协议·tcp/ip·java-ee
colus_SEU6 小时前
【计算机网络笔记】第二章 应用层 (Application Layer)
笔记·计算机网络·1024程序员节