SQL JOIN深度解析:从集合思维到实战避坑指南
1. 从一次线上故障说起为什么必须搞懂JOIN的区别那天下午系统监控突然报警一个核心报表的数据量比平时少了近三分之一。团队立刻进入排查状态查询日志发现问题出在一个看似简单的多表关联查询上。开发同学信誓旦旦地说“我用的是JOIN逻辑肯定没问题。”但当我们把SQL拿出来逐行分析时才发现他潜意识里想用的是LEFT JOIN但实际写成了INNER JOIN也就是JOIN导致大量本应出现的数据被“静默过滤”掉了。这次故障让我们损失了几个小时的业务数据可见性也让我深刻意识到对于LEFT JOIN、RIGHT JOIN和INNER JOINJOIN ON这些基础但核心的SQL操作绝不能停留在“大概知道”的层面。无论是数据分析师提取业务洞察还是后端工程师编写复杂业务逻辑甚至是运维人员排查数据一致性问题多表关联查询都是日常操作。JOIN用错了轻则查询结果不符合预期需要反复调试重则像我们一样导致线上数据展示错误影响决策。很多人觉得这些概念简单但一到复杂场景或性能关键路径上模糊的理解就会成为隐患。这篇文章我就结合自己踩过的坑和大量实践帮你彻底厘清这几种JOIN的本质区别、适用场景和那些手册上不会写的细节。我们会从最核心的集合思维和数据流向入手用大量的可视化比喻和实际SQL例子让你不仅记住语法更能理解其背后的逻辑从此写JOIN时心里有底调试时思路清晰。2. 核心思维转换把表看作集合理解JOIN的“初心”在深入语法之前我们必须先建立一个正确的思维模型。这是理解所有JOIN区别的基石。很多初学者容易迷失在具体的ON条件里而忽略了更上层的逻辑。2.1 关系型数据库的集合论基础关系型数据库的表本质上就是数据的集合。每一行是一个元素整个表就是这些元素的集合。当我们进行多表关联时实际上是在对这些集合进行数学上的“运算”目的是根据某种规则即ON后面的条件将来自不同集合的元素组合起来形成一个新的、更大的集合结果集。JOIN的过程可以想象成是拿着两个名单表去配对。ON条件就是配对规则比如“学号相同”或者“部门ID匹配”。不同的JOIN类型区别就在于当一份名单上的某个人在另一份名单上找不到匹配对象时该如何处理。这个根本性的处理策略差异导致了结果集的天壤之别。2.2 维恩图最直观的理解工具虽然实际的数据表并非简单的集合可能存在重复行但维恩图仍然是理解JOIN类型最直观的工具。我们假设有两个表表A员工表包含所有员工信息即使有些员工还未分配部门。表B部门表包含所有部门信息。它们通过部门ID关联。那么两个圆圈的重叠部分代表成功匹配上的记录即那些有部门的员工其部门信息也存在。表A独有的部分代表那些在员工表里但在部门表里找不到对应部门ID的员工可能是新员工、部门信息未录入或部门已撤销但员工记录未更新。表B独有的部分代表那些在部门表里但在员工表里找不到任何员工属于该部门可能是新成立的部门、或部门下暂无员工。理解了这个模型我们再来看具体的JOIN类型就豁然开朗了。3. 深入解剖三大JOIN语法、语义与本质区别现在我们进入核心部分。我会用同一个数据场景分别展示三种JOIN的结果并附上详细的执行逻辑分析。3.1 INNER JOIN或 JOIN ON只取“交集”的严格匹配这是最常用也最容易被误解的JOIN。它的关键字是INNER JOIN但JOIN本身默认就是INNER JOIN。本质只返回两个表中完全匹配ON条件的行。它对应的是维恩图中两个圆圈重叠的部分。如果某一行在另一个表中没有找到对应项那么这行数据将不会出现在最终结果中。语法示例SELECT A.员工姓名, B.部门名称 FROM 员工表 A INNER JOIN 部门表 B ON A.部门ID B.部门ID; -- 等价于 SELECT A.员工姓名, B.部门名称 FROM 员工表 A JOIN 部门表 B ON A.部门ID B.部门ID; -- JOIN 默认为 INNER JOIN执行逻辑拆解数据库首先定位员工表左表的第一行。拿着这行的部门ID值去部门表右表里寻找部门ID相等的行。如果找到了就将左表的这行和右表找到的行拼接成一行放入结果集。如果没找到则左表的这行数据被直接丢弃不会出现在结果中。重复步骤1-4遍历左表的每一行。关键特性与注意事项结果集行数小于或等于两个表中行数较少的那个表。因为它要求双方都必须存在。过滤性具有隐式的过滤效果。这是导致文章开头那个故障的根本原因。当你只想要“有对应关系”的数据时用它例如查询所有“已分配部门”的员工及其部门信息。性能影响在关联字段有索引的情况下INNER JOIN通常效率很高因为它可以快速定位匹配项并尽早过滤掉不匹配的行。实操心得在写JOIN时先问自己一个问题“我是否允许结果中出现‘单边’的数据”如果答案是否定的比如你确信关联关系一定存在如订单明细JOIN产品信息那么用INNER JOIN。如果答案不确定或为“是”请慎用考虑使用LEFT JOIN。3.2 LEFT JOIN以左表为基准的“包容性”匹配LEFT JOIN左连接是另一种极其常用的连接方式它的核心是“以左表为基准”。本质返回左表LEFT JOIN关键字前的表的全部行即使它们在右表中没有匹配的行。对于左表中那些在右表找不到匹配的行结果集中右表的部分会用NULL值填充。它对应的是维恩图中整个左圆圈包括重叠部分和左表独有部分。语法示例SELECT A.员工姓名, B.部门名称 FROM 员工表 A LEFT JOIN 部门表 B ON A.部门ID B.部门ID;执行逻辑拆解数据库首先定位员工表左表的第一行。拿着这行的部门ID值去部门表右表里寻找部门ID相等的行。如果找到了就将左表的这行和右表找到的行拼接成一行放入结果集。如果没找到仍然会将左表的这行数据放入结果集但右表的所有字段都用NULL来填充。重复步骤1-4遍历左表的每一行。左表的每一行都必然出现在结果中。关键特性与注意事项结果集行数等于左表的行数。这是LEFT JOIN的一个确定性特征。数据完整性用于确保左表的主查询范围不丢失。常见场景包括统计所有员工的业绩即使某些员工暂无业绩记录业绩为NULL或0查询所有订单即使有些订单可能缺少物流信息。与WHERE子句的陷阱这是LEFT JOIN最容易出错的地方-- 查询1这可能将LEFT JOIN转化为类似INNER JOIN的效果 SELECT A.员工姓名, B.部门名称 FROM 员工表 A LEFT JOIN 部门表 B ON A.部门ID B.部门ID WHERE B.部门名称 技术部; -- 这里WHERE条件对右表字段进行了非NULL过滤上面的查询1中WHERE B.部门名称 ‘技术部’这个条件会过滤掉那些右表为NULL的行因为NULL ! ‘技术部’导致最终结果中失去了“未分配部门”的员工违背了使用LEFT JOIN的初衷。-- 查询2正确的做法将右表过滤条件放在ON子句中 SELECT A.员工姓名, B.部门名称 FROM 员工表 A LEFT JOIN 部门表 B ON A.部门ID B.部门ID AND B.部门名称 技术部;查询2才是正确的。ON子句中的条件用于定义匹配规则即使右表不匹配部门不是技术部左表行依然会保留右表字段为NULL。而WHERE子句是对最终结果集的过滤。避坑指南记住一个原则——ON是连接过程的条件WHERE是连接后结果的过滤。如果你想在保留左表所有行的基础上对右表进行筛选条件应放在ON里如果你要对连接后的完整结果进行过滤条件才放在WHERE里。3.3 RIGHT JOIN以右表为基准的“镜像”操作RIGHT JOIN右连接在逻辑上是LEFT JOIN的完全镜像。本质返回右表RIGHT JOIN关键字后的表的全部行即使它们在左表中没有匹配的行。对于右表中那些在左表找不到匹配的行结果集中左表的部分会用NULL值填充。它对应的是维恩图中整个右圆圈。语法示例SELECT A.员工姓名, B.部门名称 FROM 员工表 A RIGHT JOIN 部门表 B ON A.部门ID B.部门ID;执行逻辑只需把LEFT JOIN描述中的“左表”和“右表”互换即可。它确保右表的数据不丢失。关键特性与注意事项结果集行数等于右表的行数。使用频率在实际开发中RIGHT JOIN的使用频率远低于LEFT JOIN。这并非因为它不好而是因为通过调整表的顺序任何RIGHT JOIN都可以用LEFT JOIN等价改写而人们更习惯从左到右的阅读和思考顺序。-- 下面两个查询完全等价 SELECT * FROM A RIGHT JOIN B ON A.id B.id; SELECT * FROM B LEFT JOIN A ON A.id B.id; -- 更常见的写法适用场景当你已经写好一个以某个表为主的复杂LEFT JOIN查询突然需要增加一个必须保留全部数据的新表时偶尔使用RIGHT JOIN可以避免重写整个FROM和JOIN的顺序让SQL更清晰。但多数情况下建议统一使用LEFT JOIN并通过调整表顺序来达到目的以保持代码风格一致。3.4 对比总结与速查表为了更清晰地对比我将三者的核心差异总结如下表特性INNER JOINLEFT JOINRIGHT JOIN核心逻辑只返回两个表都能匹配的行返回左表所有行匹配右表返回右表所有行匹配左表维恩图对应两圆交集部分左圆全部左圆右圆全部右圆结果集行数≤ min(左表行数 右表行数) 左表行数 右表行数未匹配行的处理丢弃保留左表行右表字段填NULL保留右表行左表字段填NULL常用场景获取存在明确关联关系的记录主表查询需包含所有主表记录同LEFT JOIN但习惯用LEFT代替性能关注点利用索引快速匹配与过滤需扫描左表全量右表查找匹配需扫描右表全量左表查找匹配4. 超越基础复杂场景下的JOIN实战与性能考量理解了基本区别我们来看看在更复杂的实际场景中如何应用和优化。4.1 多表链式JOIN的组合策略在实际业务中我们经常需要连接三个甚至更多的表。这时JOIN的顺序和类型组合就至关重要。场景查询所有订单的详细信息包括客户姓名、产品名称和分类名称。即使订单暂无产品分类信息也需要展示订单。SELECT o.order_id, c.customer_name, p.product_name, cat.category_name FROM orders o -- 订单表是事实表作为主表 LEFT JOIN customers c ON o.customer_id c.customer_id -- 关联客户订单必有客户 LEFT JOIN order_items oi ON o.order_id oi.order_id -- 关联订单项订单可能无明细 LEFT JOIN products p ON oi.product_id p.product_id -- 关联产品 LEFT JOIN categories cat ON p.category_id cat.category_id -- 关联分类 WHERE o.order_date 2023-01-01;策略分析确定主驱动表通常选择事实表或业务上的核心表作为FROM的起点这里orders订单是核心。选择JOIN类型从主表出发思考每一条关联关系是否是“必须的”。orders到customers一个订单是否可能没有对应的客户在规范系统中通常外键约束保证必须有但为保险或兼容历史脏数据用LEFT JOIN更安全。orders到order_items一个订单可能没有明细吗有可能比如仅保存了订单头。如果想包含所有订单必须用LEFT JOIN。order_items到products一个订单项可能对应一个已下架的产品产品信息可能被删除通常用LEFT JOIN。products到categories产品可能未分类用LEFT JOIN。层层递进后续的JOIN是基于前面JOIN的结果集进行的。如果第一个JOIN用了LEFT那么即使后续关联失败最初的主表记录依然可能被保留取决于中间JOIN的类型。经验之谈在复杂的多表JOIN中我倾向于从主表开始全部使用LEFT JOIN除非我百分之百确定某个关联关系绝对存在且不允许为NULL。这样写出来的SQL数据完整性最好也最容易理解逻辑——即“无论如何我要主表的所有数据其他的信息有的就带上没有就拉倒”。排查问题时也更容易定位是哪个环节的关联丢失了数据。4.2 FULL OUTER JOIN查全连接与数据核对除了上述三种还有一种FULL OUTER JOIN全外连接它返回左表和右表中的所有行。当某一行在另一个表中没有匹配时另一个表的字段用NULL填充。它对应维恩图中两个圆的全部面积。MySQL不直接支持FULL OUTER JOIN但可以通过LEFT JOIN和RIGHT JOIN的UNION来模拟-- 模拟 FULL OUTER JOIN找出所有员工和所有部门的对应情况包括未分配部门的员工和没有员工的部门 SELECT A.员工姓名, B.部门名称 FROM 员工表 A LEFT JOIN 部门表 B ON A.部门ID B.部门ID UNION SELECT A.员工姓名, B.部门名称 FROM 员工表 A RIGHT JOIN 部门表 B ON A.部门ID B.部门ID;核心应用场景数据核对与差异分析。比如对比两个不同来源的客户列表找出只在A列表的客户、只在B列表的客户以及两者共有的客户。4.3 JOIN性能优化的核心要点JOIN操作是数据库查询的性能瓶颈之一。理解以下几点能帮助你写出更高效的SQL索引是生命线ON条件中的字段如A.部门ID B.部门ID必须建立索引。通常是外键字段。没有索引JOIN就会退化成可怕的“嵌套循环全表扫描”数据量稍大就会超时。小表驱动大表在INNER JOIN中数据库优化器通常会自动选择数据量小的表作为驱动表先访问的表。但在复杂情况下可以通过调整JOIN顺序或使用STRAIGHT_JOIN谨慎使用来提示优化器。减少JOIN前的数据量在JOIN之前尽量通过WHERE条件过滤掉不需要的行。记住WHERE在JOIN执行前或同时进行过滤能显著减少参与JOIN运算的数据集大小。-- 优化前先JOIN两个大表再过滤 SELECT * FROM 大表A JOIN 大表B ON A.idB.id WHERE A.create_date ...; -- 优化后先过滤大表A再JOIN SELECT * FROM (SELECT * FROM 大表A WHERE create_date ...) A JOIN 大表B ON A.idB.id;**警惕SELECT ***只选择需要的列。特别是在多表JOIN时SELECT *会导致大量的数据在网络和内存间传输浪费资源。明确列出字段名也能让查询意图更清晰。5. 常见误区、疑难排查与经典案例复盘即使理解了原理在实际编码和调试中还是会遇到一些典型问题。5.1 误区一在LEFT JOIN后使用WHERE过滤右表字段这是最经典的错误前文已提及但值得再次强调。它会无意中将LEFT JOIN变成INNER JOIN的效果。务必分清ON匹配条件和WHERE结果过滤的界限。5.2 误区二混淆AND与OR在ON子句中的逻辑ON子句中的条件可以使用AND和OR进行组合但逻辑可能比想象中复杂。SELECT A.*, B.* FROM Table1 A LEFT JOIN Table2 B ON A.key B.key AND (B.status 1 OR B.status IS NULL);这个ON条件意味着连接时要么找到key相等且status1的B记录要么找到key相等且B记录为NULL即未找到。这常用于在连接时即对右表进行复杂的状态筛选同时仍保留左表记录。5.3 疑难排查结果行数不对怎么办当发现JOIN查询结果的行数不符合预期时可以按以下步骤排查单独检查每个表的数据分别运行FROM主表的查询和JOIN表的查询确认基础数据是否正确。检查关联字段确认ON条件两边的字段名是否正确数据类型是否一致如都是INT而不是INT和VARCHAR比较。隐式类型转换会导致索引失效和结果错误。逐层添加JOIN不要一次性写完所有JOIN。先写主表和第一个JOIN看结果。然后逐步添加第二个、第三个JOIN观察每一步结果集的变化定位是哪个JOIN引入了问题。使用COUNT(*)分组验证对于复杂的JOIN可以先用COUNT(*)分组查看关联情况。SELECT CASE WHEN B.id IS NULL THEN 仅存在于A ELSE A与B匹配 END AS match_type, COUNT(*) as record_count FROM TableA A LEFT JOIN TableB B ON A.id B.id GROUP BY CASE WHEN B.id IS NULL THEN 仅存在于A ELSE A与B匹配 END;这个查询能快速告诉你有多少行是匹配的多少行是LEFT JOIN后右表为NULL的。5.4 经典案例复盘统计部门人数包括无人部门需求统计每个部门的人数部门名称需展示即使人数为0。-- 错误做法使用INNER JOIN无人部门会直接消失 SELECT B.部门名称, COUNT(A.员工ID) AS 人数 FROM 员工表 A JOIN 部门表 B ON A.部门ID B.部门ID GROUP BY B.部门名称; -- 正确做法以部门表为主表LEFT JOIN员工表 SELECT B.部门名称, COUNT(A.员工ID) AS 人数 -- 注意COUNT(具体字段)会忽略NULL FROM 部门表 B LEFT JOIN 员工表 A ON B.部门ID A.部门ID GROUP BY B.部门名称;在这个正确做法中COUNT(A.员工ID)只会统计非NULL的员工ID。对于无人部门A.员工ID全部为NULLCOUNT结果为0正好符合“人数为0”的需求。如果错误地使用COUNT(*)则会统计行数导致每个部门至少为1。写JOIN的本质是对业务逻辑的精确翻译。每一次JOIN的选择都体现了你对数据之间关系的理解。从集合的角度思考明确你想要的是“交集”、“左集”还是“全集”再结合ON和WHERE的细微差别就能构建出准确无误的查询。多动手实验用不同的数据去验证你的SQL久而久之这种思维就会成为你的本能。

相关新闻

STM32F103C8T6最小系统板硬件设计、外设驱动与开发实战全解析

STM32F103C8T6最小系统板硬件设计、外设驱动与开发实战全解析

1. 项目概述:为什么STM32F103C8T6系统板是“国民级”开发利器?如果你在电子开发圈子里待过一阵子,几乎不可能没听说过STM32F103C8T6这块芯片,以及围绕它构建的各式各样的“最小系统板”或“核心板”。它就像一个电子世界的“瑞士军…

2026/10/9 14:06:50 阅读更多 →
程序员如何用工程思维学射箭:从技术栈选型到系统调试

程序员如何用工程思维学射箭:从技术栈选型到系统调试

1. 从代码到弓弦:一个程序员的跨界探索作为一名写了十几年代码的程序员,我的世界长期被键盘敲击声、逻辑判断和抽象概念所定义。直到几年前,一次偶然的机会,我接触到了传统弓箭,那种需要身体感知、精细控制和瞬间决策的…

2026/10/7 14:33:32 阅读更多 →
思科与华为模拟器中的 DHCP 配置(Packet Tracer / eNSP)

思科与华为模拟器中的 DHCP 配置(Packet Tracer / eNSP)

1. 引言 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是网络工程中最常用的地址分配技术之一。在真实网络设备上配置 DHCP 之前,很多学习者会先在模拟器中完成实验。目前最主流的两大模拟器分别是: Ci…

2026/9/30 1:16:16 阅读更多 →

最新新闻

试题库管理系统开发实战:数据库设计、自动组卷与权限模型解析

试题库管理系统开发实战:数据库设计、自动组卷与权限模型解析

简介:本资源为基于Qt与C开发的高校试题库管理系统课程设计完整资料包,面向计算机相关专业学生及需要完成数据库课程设计、管理信息系统开发实践的学习者。资源按照软件工程流程推进,覆盖需求分析、概念与逻辑结构设计、SQL建库建表、系统界面…

2026/10/9 14:07:13 阅读更多 →
de4dot-netcore 实战:.NET Core 程序集反混淆与避坑指南

de4dot-netcore 实战:.NET Core 程序集反混淆与避坑指南

简介:de4dot-netcore 版本是面向.NET Core 环境的脱壳工具,专为安全研究人员与逆向工程师打造,用于剥离 ConfuserEx、DNEmu、Themida、.NET Reactor 等常见保护壳,还原未经混淆的原始可执行文件,便于静态或动态分析。资…

2026/10/9 14:07:12 阅读更多 →
电子报纸订购系统数据库设计:课设中的真实业务数据建模

电子报纸订购系统数据库设计:课设中的真实业务数据建模

简介:本资源是一份面向高校数据库课程设计实践的完整说明书文档,适用于计算机相关专业本科生开展电子报纸订购系统开发项目。内容覆盖需求分析、数据流图绘制、概念与逻辑结构设计、关系模式构建、子系统实现(订购/统计/管理)及系…

2026/10/9 14:07:12 阅读更多 →
数据库习题解析:从SQL错题到生产级查询能力跃迁

数据库习题解析:从SQL错题到生产级查询能力跃迁

简介:本资源是《数据库原理和应用教程(第4版)》配套的习题参考答案与解析PDF,面向高校计算机、信息管理等专业本科生及数据库初学者,旨在系统巩固数据库核心理论与解题能力。内容覆盖数据库发展三阶段、DBMS组成与功能…

2026/10/9 14:07:11 阅读更多 →
Mendeley文献管理实战:从安装配置到Word引用与避坑指南

Mendeley文献管理实战:从安装配置到Word引用与避坑指南

1. 为什么我最终把文献管理交给了这款工具写论文这件事,最折磨人的环节往往不是实验做不出来,也不是数据分析跑不通,而是参考文献。我见过太多同行的桌面:几十个PDF文件散落在不同文件夹里,命名规则五花八门&#xff0…

2026/10/9 14:07:11 阅读更多 →
工资管理系统数据库设计:从课程作业到企业级HR建模

工资管理系统数据库设计:从课程作业到企业级HR建模

简介:本资源是一份面向高校信息管理与信息系统专业本科生的数据库课程设计报告,聚焦工资管理系统的全流程数据库设计与实现,帮助学习者掌握从需求分析到运行维护的完整工程实践能力。报告严格遵循数据库设计规范,系统覆盖引言、需…

2026/10/9 14:06:10 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →