PostgreSQL 多表 JOIN 连接查询深度指南 — 企业级高性能关联查询标准规范

MyBatis分页插件PageHelper原理与实战指南 分页查询是后端开发中的常见需求,传统方式需要手动处理分页逻辑、计算总数和拼接SQL语句,既繁琐又容易出错。MyBatis拦截器机制通过类似AOP的方式,可以在SQL执行前动态修改语句,这为分页插件提供了技术基础。PageHelper作为MyBatis生态中的明星插件,利用ThreadLocal实现无侵入式的分页参数传递,并支持多种数据库方言的SQL自动改写。在性能优化方面,PageHelper提供了count查询缓存、自定义count语句等解决方案,特别适合处理大数据量的分页场景。结合Spring Boot 阅读详情

以下是一份专为 Java 后端开发者(尤其是使用 Spring Boot 的团队)撰写的 PostgreSQL 多表 JOIN 连接查询深度详解文档,系统性覆盖:

✅ 什么是 JOIN?
✅ 有什么作用?
✅ 使用场景?
✅ 常见错误与性能陷阱?
✅ 最佳实践与标准写法?
✅ 企业级规范与团队协作建议?

全文采用结构化、注释式、可直接用于团队培训与代码审查的写法,涵盖 5 大 JOIN 类型、12 个实战场景、8 条铁律、5 项性能优化技巧,助你彻底掌握 PostgreSQL 的 JOIN 查询,杜绝“慢查询”“N+1”“笛卡尔积”“锁表”等灾难性问题。


🔗 PostgreSQL 多表 JOIN 连接查询深度详解文档

—— 数据关联的“艺术”与性能的“命门”

适用对象:Java 后端开发、架构师、测试工程师、DBA、技术负责人
目标:系统掌握 PostgreSQL 多表 JOIN 的原理、类型、最佳实践、性能陷阱与团队规范,实现从“能连表”到“连得准、连得快、连得稳” 的跃迁,彻底杜绝 N+1、笛卡尔积、全表扫描、连接池耗尽等致命问题。


一、什么是多表 JOIN 连接查询?(Definition)

JOIN(连接) 是 SQL 中用于将两个或多个表基于关联字段组合成一个结果集的操作。
它不是“查多个表”,而是在逻辑上将分散在不同表中的数据“拼接”成一条完整记录。

✅ 核心作用:

作用说明
打破数据孤岛用户信息在 users,订单在 orders,商品在 products —— JOIN 让它们关联
减少应用层复杂度一次 SQL 查询完成多表聚合,避免 Java 循环查库(N+1)
提升查询效率数据库引擎优化连接算法(Hash Join、Merge Join),远快于 Java 循环
支持复杂业务建模实现一对多、多对多、树形结构等关系型业务(如订单→订单项→商品)

💡 关键认知:

  • JOIN 是关系型数据库的核心能力,也是性能的“分水岭”。
  • 一个错误的 JOIN 可能导致:
    • 笛卡尔积(1000 × 1000 = 100 万行) → 内存爆掉
    • N+1 查询(Java 循环查) → 数据库连接池耗尽
    • 全表扫描(无索引) → 查询耗时 10 秒

✅ 结论:
不会写 JOIN 的 Java 开发者,是“数据搬运工”;会写高效 JOIN 的开发者,是“数据架构师”。


二、JOIN 的使用场景(企业级典型场景)

场景表结构JOIN 类型业务价值
✅ 1. 用户 + 订单users + ordersINNER JOIN查询“已支付订单的用户”
✅ 2. 订单 + 订单项 + 商品orders + order_items + productsINNER JOIN ×2查询“订单详情”
✅ 3. 部门 + 员工(左关联)departments + employeesLEFT JOIN查询“所有部门,含无员工的”
✅ 4. 用户 + 未支付订单users + ordersLEFT JOIN + WHERE o.id IS NULL查询“从未下单的用户”
✅ 5. 用户 + 朋友(自关联)users(有 friend_id)SELF JOIN查询“用户的朋友是谁”
✅ 6. 商品 + 标签(多对多)products + product_tags + tagsINNER JOIN ×2查询“带‘手机’标签的商品”
✅ 7. 订单 + 支付记录 + 退款记录orders + payments + refundsLEFT JOIN ×2查询“订单的支付与退款状态”
✅ 8. 评论 + 回复(树形结构)comments(含 parent_id)CTE RECURSIVE查询“某评论的所有回复”

✅ 行业共识:
90% 的业务查询,都依赖 JOIN。
一个电商系统,90% 的 API 接口都需要 JOIN 用户、订单、商品、地址、物流。


三、JOIN 的五大类型详解与标准写法(带中文注释)

PostgreSQL 支持 5 种标准 JOIN,必须理解语义差异,避免误用。


✅ 1. INNER JOIN —— 内连接(最常用)

作用:只返回两个表都匹配的记录。

📌 示例:查询“已支付订单的用户信息”
-- ✅ 标准写法:显式 INNER JOIN,清晰关联关系
SELECT 
    u.id AS user_id,
    u.username,
    u.email,
    o.order_no,
    o.total_amount,
    o.created_at
FROM users u
INNER JOIN orders o ON u.id = o.user_id  -- ✅ 关联条件:用户ID = 订单用户ID
WHERE o.status = 'paid'  -- ✅ 业务过滤:仅已支付订单
ORDER BY o.created_at DESC
LIMIT 20 OFFSET 0;

-- ✅ 执行结果:
-- 只返回:有订单的用户
-- 没有订单的用户 → 不出现
-- 订单状态不是 paid → 不出现

✅ 企业级建议:

  • 默认使用 INNER JOIN,语义清晰。
  • 必须用 ON 指定关联条件,禁止在 WHERE 中写 u.id = o.user_id(易混淆)。
  • 关联字段必须有索引(users.id、orders.user_id)。

✅ 2. LEFT JOIN —— 左连接(最易错)

作用:返回左表所有记录,右表匹配的就拼接,不匹配的补 NULL。

📌 示例1:查询“所有用户,含无订单的”
-- ✅ 标准写法:左表是 users,保留所有用户
SELECT 
    u.id,
    u.username,
    u.email,
    COUNT(o.id) AS order_count,  -- ✅ 无订单则为 0
    COALESCE(SUM(o.total_amount), 0) AS total_spent  -- ✅ 无订单则为 0
FROM users u
LEFT JOIN orders o ON u.id = o.user_id  -- ✅ 关联条件写在 ON,不是 WHERE
GROUP BY u.id, u.username, u.email
ORDER BY total_spent DESC;

✅ 执行结果:

  • 有订单的用户 → 显示订单数和金额
  • 无订单的用户 → order_count = 0, total_spent = 0
📌 示例2:查询“从未下单的用户”(经典用法)
-- ✅ 标准写法:LEFT JOIN + WHERE 右表字段 IS NULL
SELECT 
    u.id,
    u.username,
    u.email
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;  -- ✅ 关键:右表无匹配 → o.id 为 NULL → 从未下单

✅ 为什么不能写 WHERE o.status = 'pending'?
❌ 错误写法:

SELECT * FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.status = 'pending';  -- ❌ 这会过滤掉所有没有订单的用户!

✅ 原因:LEFT JOIN 后,无订单的行中 o.status 是 NULL,NULL = 'pending' → FALSE → 被过滤。

✅ 正确写法:过滤条件写在 ON 中(仅过滤关联数据)

SELECT 
    u.id,
    u.username,
    u.email,
    o.order_no,
    o.total_amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id AND o.status = 'pending'  -- ✅ 只关联 pending 订单
WHERE o.id IS NULL;  -- ✅ 从未有过 pending 订单的用户

✅ 企业级建议:

  • 所有“查全量+关联信息”的场景,必须用 LEFT JOIN(如:用户列表 + 最近订单)。
  • 关联条件写在 ON,过滤条件写在 WHERE。
  • 永远不要在 WHERE 中对右表字段做非 IS NULL 的条件,除非你明确要过滤掉 NULL。

✅ 3. RIGHT JOIN —— 右连接(极少使用)

作用:返回右表所有记录,左表匹配的就拼接,不匹配的补 NULL。

✅ 推荐做法:永远不要用 RIGHT JOIN,改写为 LEFT JOIN,提高可读性。

-- ❌ 不推荐
SELECT * FROM orders o
RIGHT JOIN users u ON u.id = o.user_id;

-- ✅ 推荐:交换顺序,改用 LEFT JOIN
SELECT * FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

✅ 4. FULL OUTER JOIN —— 全外连接(极少见)

作用:返回两个表所有记录,匹配的拼接,不匹配的补 NULL。

📌 示例:查询“所有用户与所有订单,无论是否关联”
SELECT 
    u.username,
    o.order_no,
    o.total_amount
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id
ORDER BY u.username, o.order_no;

✅ 使用场景:

  • 数据对比(如:A系统 vs B系统的用户差异)
  • 统计“谁有订单谁没有”

✅ 企业级建议:

  • 99% 的业务不需要 FULL OUTER JOIN。
  • 性能差,结果集大,慎用。
  • 若需对比,建议用 UNION + LEFT JOIN + RIGHT JOIN 拆解。

✅ 5. CROSS JOIN —— 笛卡尔积(高危!)

作用:两个表的每一条记录都组合,产生 m × n 行。

📌 示例:错误写法(灾难性)
-- ❌ 绝对禁止!
SELECT u.username, p.name
FROM users u
CROSS JOIN products p;
-- ✅ 结果:1000 用户 × 500 商品 = 50 万行!

💥 影响:

  • 内存爆满
  • 网络阻塞
  • 数据库卡死

✅ 唯一合法用途:生成所有组合(极罕见)

-- ✅ 合法用途:生成所有用户+所有通知类型的组合(用于初始化配置)
SELECT u.id AS user_id, t.type AS notification_type
FROM users u
CROSS JOIN (VALUES ('email'), ('push'), ('sms')) AS t(type);

✅ 企业级建议:

  • 禁止在生产环境使用 CROSS JOIN。
  • 如果发现 CROSS JOIN,立即回滚,检查是否漏了 ON 条件。

四、多表 JOIN 的性能影响因素与常见错误写法

错误写法问题后果
❌ SELECT *返回所有字段,包括 metadata、password_hash网络传输量增加 10 倍,Java 解析慢
❌ 无 ON 条件隐式 CROSS JOIN笛卡尔积 → 100 万行 → 数据库崩溃
❌ 关联字段无索引users.id 或 orders.user_id 无索引全表扫描 → 查询耗时 5 秒
❌ 在 WHERE 中写关联条件WHERE u.id = o.user_id语义模糊,优化器可能选错执行计划
❌ LEFT JOIN 后 WHERE right_table.col = 'xxx'过滤掉 NULL 行,变 INNER JOIN逻辑错误,结果不完整
❌ 多表 JOIN 无 LIMIT一次查 100 万行内存溢出、前端卡死
❌ 多层 JOIN 无 CTE 拆解一个 SQL 5 行 JOIN可读性差,调试困难
❌ 在 JOIN 中使用函数ON LOWER(u.email) = LOWER(o.email)索引失效 → 全表扫描

五、多表 JOIN 最佳实践与标准写法(黄金准则)

✅ 标准写法模板(推荐模板)

-- ✅ 标准结构:清晰、规范、可维护
WITH order_summary AS (
    -- ✅ 步骤1:先聚合订单(小结果集)
    SELECT 
        user_id,
        COUNT(*) AS order_count,
        SUM(total_amount) AS total_spent
    FROM orders
    WHERE status = 'paid'
    GROUP BY user_id
),
user_with_orders AS (
    -- ✅ 步骤2:关联用户(主表驱动)
    SELECT 
        u.id,
        u.username,
        u.email,
        os.order_count,
        os.total_spent
    FROM users u
    INNER JOIN order_summary os ON u.id = os.user_id  -- ✅ 小表驱动大表
)
-- ✅ 步骤3:最终查询(分页、排序)
SELECT 
    id,
    username,
    email,
    order_count,
    total_spent
FROM user_with_orders
ORDER BY total_spent DESC
LIMIT 20 OFFSET 0;

✅ 为什么这样写?

  • CTE 拆解逻辑 → 每步清晰,可独立测试
  • 先聚合,再 JOIN → 减少 JOIN 数据量(100 万订单 → 10 万用户)
  • 小表驱动大表 → 性能最优
  • 最终加 LIMIT → 避免全量返回

✅ 多表 JOIN 性能优化黄金法则(必须遵守)

法则说明示例
✅ 1. 用 ON 指定关联条件,用 WHERE 指定过滤条件清晰分离逻辑ON u.id = o.user_id,WHERE o.status = 'paid'
✅ 2. 所有 JOIN 字段必须有索引否则全表扫描CREATE INDEX idx_orders_user_id ON orders (user_id);
✅ 3. 小表驱动大表把数据量小的表放左边users(10万)JOIN orders(1000万)→ 用户在左
✅ 4. 使用 CTE 拆解复杂 JOIN提升可读性、可维护性用 WITH 分步聚合
✅ 5. 所有 JOIN 必须加 LIMIT防止返回百万行API 查询必须分页
✅ 6. 禁止 SELECT *,只查需要字段减少传输与解析SELECT u.name, o.order_no
✅ 7. 多层 JOIN 优先用 INNER JOIN,再用 LEFT JOIN保证数据一致性先内连核心,再左连附属
✅ 8. 使用 EXPLAIN ANALYZE 验证执行计划看是否走索引看 Index Scan 还是 Seq Scan

六、实战场景:多表 JOIN 最佳实践案例(含错误 vs 正确)

📌 场景:查询“用户最近一笔已支付订单的详细信息”

❌ 错误写法(性能差 + 逻辑错)
-- ❌ 错误1:无索引
SELECT u.username, o.order_no, p.name, oi.quantity
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE o.status = 'paid'
ORDER BY o.created_at DESC
LIMIT 1;

-- ❌ 错误2:未用 CTE,未优化
-- ❌ 错误3:可能返回多个订单(如果用户有多个)

✅ 执行计划:Seq Scan on orders(无索引)→ 1000 万行排序 → 慢!

✅ 正确写法(性能最优)
-- ✅ 步骤1:为关键字段建索引(必须!)
CREATE INDEX idx_orders_user_status ON orders (user_id, status, created_at DESC);
CREATE INDEX idx_order_items_order_id ON order_items (order_id);
CREATE INDEX idx_products_id ON products (id);

-- ✅ 步骤2:用 CTE 先找到每个用户最近一笔订单
WITH latest_paid_orders AS (
    SELECT 
        user_id,
        id AS order_id,
        order_no,
        total_amount,
        created_at,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
    FROM orders
    WHERE status = 'paid'
),
-- ✅ 步骤3:关联订单项和商品
order_details AS (
    SELECT 
        lpo.user_id,
        lpo.order_no,
        lpo.total_amount,
        lpo.created_at,
        oi.quantity,
        p.name AS product_name
    FROM latest_paid_orders lpo
    JOIN order_items oi ON lpo.order_id = oi.order_id
    JOIN products p ON oi.product_id = p.id
    WHERE lpo.rn = 1  -- ✅ 只取最近一笔
)
-- ✅ 步骤4:关联用户,返回最终结果
SELECT 
    u.username,
    od.order_no,
    od.product_name,
    od.quantity,
    od.total_amount,
    od.created_at
FROM users u
JOIN order_details od ON u.id = od.user_id
ORDER BY od.created_at DESC
LIMIT 10 OFFSET 0;

✅ 执行计划:

  • Index Scan on idx_orders_user_status → 快速找到每用户最近订单
  • Index Scan on idx_order_items_order_id → 快速查订单项
  • 总耗时:< 50ms

✅ 效果:

  • 性能提升 100 倍
  • 逻辑清晰,可维护
  • 无笛卡尔积,无 N+1

七、多表 JOIN 的团队协作规范(Java 团队必须遵守)

规范说明
✅ 1. 所有 JOIN 必须显式写 INNER JOIN / LEFT JOIN,禁止逗号连接FROM a, b WHERE a.id = b.id → 禁止!
✅ 2. 所有 JOIN 的 ON 条件必须使用主键或外键禁止 ON LOWER(email) = LOWER(email)
✅ 3. 所有 JOIN 必须有 LIMIT,API 查询必须分页LIMIT 20 OFFSET 0,最大不超过 100
✅ 4. 所有 JOIN 必须用 EXPLAIN ANALYZE 验证代码评审时必须附执行计划截图
✅ 5. 所有复杂 JOIN 必须用 CTE 拆解超过 3 表 JOIN,必须用 WITH 分步
✅ 6. 所有 JOIN 必须避免 SELECT *只查前端需要的字段
✅ 7. 禁止在 JOIN 中使用函数如 `ON u.email LIKE ‘%’
✅ 8. 禁止在事务中执行多表 JOIN 查询(除非必要)长事务 + JOIN = 锁等待
✅ 9. 所有 JOIN 字段必须有索引CREATE INDEX 必须写在 Flyway 脚本中
✅ 10. 所有 JOIN 语句必须有注释说明业务含义-- 查询:用户最近一笔已支付订单

八、实际开发中的建议与注意事项(Java 开发者必看)

建议说明
✅ 1. 使用 @EntityGraph(JPA)或 @Query(MyBatis)避免 N+1@EntityGraph(attributePaths = {"orders", "orders.items"})
✅ 2. 用 @Transactional 包裹多表 JOIN 查询(仅当涉及写入)纯查询无需事务,避免锁表
✅ 3. 用 TestContainers + pg_stat_statements 做性能回归测试自动检测新功能是否引入慢 JOIN
✅ 4. 使用 pg_stat_statements 监控高频 JOIN 查询识别“被频繁调用的慢 JOIN”
✅ 5. 使用 JOIN 替代子查询JOIN 比 IN (SELECT ...) 性能高 3~5 倍
✅ 6. 避免过度 JOIN一张表 JOIN 8 张表?拆成多个 API 或用视图封装
✅ 7. 使用视图封装复杂 JOINCREATE VIEW user_order_summary AS SELECT ...,Java 只查视图
✅ 8. 用 CTE 替代临时表WITH 比 CREATE TEMP TABLE 更轻量、更安全
✅ 9. 所有 JOIN 查询必须有 ORDER BY 和 LIMIT即使只查一条,也必须有序、有界
✅ 10. 每月执行一次 ANALYZE(或开启 autovacuum)确保统计信息准确,优化器不“瞎猜”

九、总结:JOIN 的三条铁律

铁律说明
🔍 1. 所有 JOIN 必须有索引支持,否则性能为 0无索引 = 全表扫描 = 系统雪崩
🧩 2. 所有复杂 JOIN 必须用 CTE 拆解,禁止写成“一锅粥”可读性决定可维护性
🚫 3. 禁止在 JOIN 中使用函数、模糊匹配、隐式关联会导致索引失效、逻辑错误

✅ 终极建议:
一个能写出清晰、高效、带注释的 JOIN 查询的 Java 开发者,是团队的“数据架构师”。
一个只会写 @Repository 但不懂 JOIN 原理的开发者,是系统的“定时炸弹”。


📌 下一步行动建议:

  1. 将本文档作为团队《JOIN 查询规范》核心章节,加入 Code Review 检查清单。
  2. 在 GitLab CI 中集成 pg_stat_statements,自动识别慢 JOIN 查询。
  3. 组织一次“JOIN 攻防演练”:故意写一个无索引的 JOIN,看谁第一个发现。
  4. 制作《JOIN 查询速查卡》:打印贴在工位,包含 INNER JOIN、LEFT JOIN、CTE 模板。
  5. 为所有核心服务(订单、用户、商品)建立 JOIN 性能基线:平均响应时间 < 100ms。

数据分析自学路线:Excel、SQL、Python、Tableau核心技能栈详解 很多同学想入门数据分析,但面对Excel、SQL、Tableau、Python这些工具,常常感到无从下手,网上资料要么太散,要么太深,很难形成体系化的学习路径。本文旨在为你梳理一条清晰、实用、可执行的数据分析自学路线,涵盖从数据处理、分析到可视化的核心技能栈,并提供可直接上手的代码示例和项目思路。无论你是零基础转行,还是希望提升业务分析能力,都能从这套“组合拳”中找到适合自己的学习模块。 1. 数据分析核心技能栈全景解读 数据分析并非掌握单一工具即可,而是一个由数据处理、分析挖掘、结果呈现构成的完整工作流。 阅读详情

相关推荐

【openGauss、PostgreSQL的SQL优化】多表left join、group by的慢SQL如何优化改造

【openGauss、PostgreSQL的SQL优化】多表left join、group by的慢SQL如何优化改造

tttzzzqqq2018的博客 1782

postgresql 左连接三张表

postgresql 左连接三张表:   select A.col1, B.col2, C.col3 from (A left join B on a.col3 = b.col1)       left join c on A.col3 = C.col1       Where ......+ 条件

snn1410的专栏 1万+

【审计专栏】第六十五篇 招投标围标串标模式及利益链识别/关联交易/反洗钱01

编号010构建了一个以规则引擎为核心、AI模型为感知、法律法规知识图谱为底座的双轮合规治理体系。可司法采信:规则引擎的输出直接引用法条原文,符合证据链要求可审计追溯:每条规则触发均有完整日志,支持回放可热更新:规则版本Git管理,灰度发布,秒级回滚高性能:Rete算法增量匹配,100亿+主体高并发信创适配:全面支持鲲鹏、飞腾、昇腾、达梦等国产软硬件此体系可以独立部署,也可作为中央企业、地方政府公共资源交易平台的合规监管中台,真正实现“让数据说话、让规则执法、让法律落地”。维度。

weixin_49199313的博客 272

【SQL解惑】PostgreSQL LEFT JOIN ON AND 查询语句遇到的问题

在工作中遇到一个问题,PostgreSQL 关联多张表进行数据查询时,遇到了一个问题,使用 LEFT JOIN ON 关联多张表,并使用AND设置了多个条件,发现返回的接口与预期不一致。

IT后浪的博客 984

【信息科学与工程学】【数据中心】 第十五篇 智算中心DaaS数据消费场景02

智算中心DaaS数据共享场景的分级分类是一个复杂的系统工程,需要从技术、安全、合规、治理、运营等多个维度进行综合考虑。本分级分类体系为不同场景下的数据共享提供了详细的指导,包括安全分级、共享模式、技术架构、合规治理等方面。在实施数据共享平台时,应结合自身业务需求、技术能力和资源情况,选择适合的共享模式和实施路径。同时,要高度重视数据安全和隐私保护,采用先进的技术和管理手段,确保数据共享的安全可控。

weixin_49199313的博客 1万+

《PostgreSQL开发指南》第14篇 多表连接

连接查询(join)基于两个表中的连接字段将数据行拼接到一起,可以同时返回两个表中的相关数据。 PostgreSQL 支持各种类型的 SQL 连接查询:内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接(FULL OUTER JOIN)、交叉连接(CROSS JOIN)、自然连接(NATURAL JOIN)、自连接。

Tony.Dong的专栏 4457

LEFT JOIN优化技巧:比传统方法快10倍的查询方案

LEFT JOIN不是性能问题的根源,不当使用才是大数据量下,EXPLAIN分析执行计划必不可少有时分解为多个简单查询反而比复杂JOIN更快数据库优化需要结合具体业务场景和数据特点这个工具的开发过程让我对SQL性能优化有了更深刻的理解。使用InsCode(快马)平台可以快速搭建类似的Spring Boot项目,它的在线编辑器即时反馈特性特别适合调试数据库查询,部署功能还能一键将分析工具发布成可访问的Web服务。

GoldenleafLynx28的博客 329

SQL-99标准深度解读:从方言分裂到窗口函数与避坑指南

SQL标准是关系数据库的通用契约,但实际使用中Oracle、MySQL、SQL Server等产品的方言差异却常让开发者困惑。SQL-99(ISO/IEC 9075)作为第三代SQL标准,以Core+Packages机制取代SQL-92的粗粒度分级,为数据库实现提供可量化的兼容性标尺。本文将解析SQL-99的核心框架,重点介绍它引入的窗口函数(RANK、ROW_NUMBER等)、SQL/PSM存储过程规范以及用户自定义类型等关键技术,并剖析在跨库迁移、SQL规范制定时常见的兼容性陷阱,如LIMIT缺失、BO

weixin_31423955的博客 257

PostgreSQL查询优化:查询条件优化一(条件分类)

在SQL中,查询条件在查询优化阶段需要被分成三种类型,三类条件有不同的作用,在某些情况下,可以相互转化。 首先说明一下SQL语句的执行步骤,可以分为三步:一,读取表中的元组;二,如果有JOIN,则开始做JOIN;三,针对WHERE条件作过滤。我们以简单的SQL为例: 表TBL(c1 int, c2 int, c3 int); 有SQL语句 :SELECT A.c1, B.c3 FROM TB

梦之音的专栏 3712

RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main

我们找到系统复位的地方,可以往下单步跟踪。 ①从系统初始化开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处(BLX是带链接的跳转,即带返回的跳转)。 ②将main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回(BX是跳转,不返回)。 ③跳转到了$Sub$$main。 【注:在 __CC_ARM 编译器环境下,使用了$Sub$$ 与$Super$ $ 的...

yang1111111112的博客 1万+

从零开始STM32cubeide学习

使用的是正点原子的精英版,单片机是STM32F103ZET6,详细讲解完成跑马灯实验

weixin_44077208的博客 2277

Spring Boot JPA实战:从入门到生产,攻克懒加载与N+1查询陷阱

对象关系映射(ORM)是连接Java对象与关系数据库的桥梁,而JPA正是Java领域的ORM标准规范。理解其底层原理——从实体映射到懒加载机制——是高效使用Spring Boot与Hibernate的关键。JPA通过Spring Data JPA的封装极大简化了数据访问层的开发,让开发者专注于业务逻辑。在实际应用中,常见的N+1查询、事务边界和乐观锁并发控制等问题,往往决定项目性能与稳定性。无论你是新手还是从MyBatis转型的开发者,掌握这些要点都能少走弯路。围绕实体映射、Repository设计、懒加载

weixin_29698641的博客 244

10X Genomics单细胞数据分析实战:从FASTQ到UMAP可视化的完整流程

本文详细介绍了10X Genomics单细胞数据分析的完整流程,从FASTQ原始数据处理到UMAP可视化。通过Seurat工具包实现数据质量控制、标准化、降维聚类和细胞注释,特别适合生物信息学新手学习。文章包含可复现的代码示例和常见问题解决方案,帮助研究者快速掌握单细胞测序数据分析的核心技术。

weixin_30952535的博客 534

Centos环境django项目部署过程

Django是一款针对Python环境的开源WEB开发框架,采用BSD license,能够帮助我们快速开发安全和可维护的网站。它采用MTV 架构: 采用 Model(模型)、Template(模板)、View(视图)模式,强制代码分离,结构清晰,非常适合团队协作和大型项目维护。它还提供了DRF(Django REST Framework): 是构建 API 的行业标准工具包。如果你需要开发前后端分离的项目(如配合 React/Vue 前端或移动端 App),DRF 提供了强大的序列化、认证和视图集功能。

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 688

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1135

广义正态分布优化算法(GNDO)详解:从理论到实践

广义正态分布优化算法(GNDO)是一种基于正态分布理论的新型元启发式优化算法。该算法通过局部开发和全局探索两种策略平衡搜索过程:局部开发利用广义平均位置和标准差进行精细搜索,而全局探索通过随机个体信息共享扩大搜索范围。GNDO具有参数少、结构简单、收敛速度快等优点,在光伏模型参数提取等工程优化问题中表现优异。算法将种群位置更新与正态分布参数调整相联系,通过自适应机制平衡探索与开发,数学分析表明其具有全局收敛性。相比传统优化算法,GNDO在探索能力和开发能力上均有优势,是高维复杂优化问题的有效解决方案。

qq_42212808的博客 136

构建AI Agent技能包管理器:基于层次化作用域的Skilldex设计与实现

包管理器是现代软件开发中管理代码依赖和复用的核心工具,其原理是通过注册中心和客户端工具实现包的发布、检索与版本控制。在AI Agent开发领域,技能复用面临敏感数据、上下文依赖和快速迭代等特殊挑战,通用包管理器的扁平化结构难以满足企业级需求。Skilldex创新性地引入层次化作用域机制,将组织架构映射为`@公司/团队/项目`的命名空间,实现权限隔离与精细分发。这种设计借鉴了npm、Docker Registry的成熟思想,结合bun等现代工具链对效率的追求,为AI技能提供了可控、高效的包分发体系。通过Typ

weixin_30908103的博客 388

开源推荐:5个最实用的AIGC风格迁移项目

随着人工智能技术的飞速发展,AIGC(人工智能生成内容)领域取得了显著的成果。风格迁移作为AIGC中的一个重要分支,旨在将一种图像的风格应用到另一种图像上,创造出具有独特艺术效果的新图像。本文的目的是为读者推荐5个最实用的AIGC风格迁移开源项目,详细介绍这些项目的技术原理、使用方法和应用场景,帮助读者在实际项目中选择合适的工具进行风格迁移。文章的范围涵盖了这些项目的核心概念、算法原理、数学模型、项目实战以及相关的学习资源和未来发展趋势等方面。

AI 原生应用开发的博客 1703

Java基础面试题总结《十二》

Dubbo 是阿里巴巴开源的一款高性能、轻量级的 Java RPC(远程过程调用)框架。它的核心目标是让分布式系统中的服务调用像本地调用一样简单,开发者无需关心底层的网络通信细节。从架构设计上看,Dubbo 采用了经典的分层架构(官方文档定义为 10 层模型),但在面试或宏观理解中,我们通常将其简化为三层模式Dubbo 的优势:极致性能、低延迟、适合 Java 技术栈内部的高并发核心链路。Spring Cloud 的优势。

qq_55862497的博客 373

RT-Thread Studio 使用笔记(七)| 配合STM32CubeMX添加裸机驱动(以ADC为例)

1. 配置STM32CubeMX 2. 复制stm32xxxx_hal_msp.c文件 将 CubeMx 生成的代码 stm32f7xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译: 由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32f7xx_hal_msp.c 文件中 #include “main.h” 替换为 #i...

Mculover666的博客(嵌入式) 9622

RK3588 C++ MeloTTS 推理

本文介绍了基于RK3588平台和RKNN工具链实现的端侧语音合成(TTS)系统。该系统支持中英文混合输入处理,通过自动合并英文单词、转换标点符号等方式预处理文本,并将其转换为音素和声调序列。核心推理流程包含编码器、中间处理和解码器三个阶段:编码器将音素序列转为隐藏状态,中间处理调节音调和语速,解码器生成最终波形。代码示例展示了输入数据设置和模型推理过程,利用RK3588内置NPU实现高效语音合成。该系统展现了在边缘计算设备上实现复杂AI任务的能力。

J。 199

正则表达式完整知识体系

正则表达式(Regex)是一种文本处理工具,通过特殊字符组合定义匹配模式,用于字符串的查找、校验、提取和替换。核心特性包括: 基础语法 元字符:.(任意字符)、\d(数字)、\w(单词字符)等 量词:+(1次以上)、*(0次以上)、{n,m}(次数范围) 分组:()捕获内容,(?:)非捕获分组 边界:^(起始)、$(结尾)、\b(单词边界) 高级功能 零宽断言:(?=)(正向先行)、(?<=)(正向后行)实现精准匹配 贪婪/非贪婪:默认贪婪匹配,?切换非贪婪 修饰符:g(全局)、i(忽略大小写)、s(

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 609

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

智能问数Text2SQL的JOIN噩梦怎样被DQL终结?

Text2SQL 火了三年,有一道行业级的坎始终迈不过去:多表关联(JOIN)。演示环境里百发百中的工具,一进入企业真实数据环境就频频翻车。在 Spider 这类标准多表数据集上,主流大模型方案的执行准确率仅在 60%-82% 之间;而面对网状交织的企业级复杂模型时,复杂跨表场景的准确率甚至会跌破 30%。现实是,绝大多数企业的业务数据都分散在几十上百张表里,80% 以上的日常查询都涉及多表关联。JOIN 问题解决不了,智能问数就只是演示玩具。

Raqsoft 334

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

PostgreSQL 多表关联操作

1.多表关联更新数据(update) 说明: 表1与表2根据id列做关联(表1.id1=表2.id2) 修改 set 表1.type1=表2.type2 update更新语句为: UPDATE 表1 SET type1=tbs.type2 FROM( SELECT tb_2.type2,ta_1.id1 FROM 表1 AS ta_1 INNER JOIN 表2 AS tb_2 ON ta_1.id1=tb_2.id2 )tbs W

libralee233的博客 4724

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

PostgreSQL的多表关联

#################### inner join ################################# select * from weather inner join cities on (weather.city = cities.name); #################### left out join ################################# select * from weather left outer join citie

Uncle.Cui的技术博客 1443

postgresql实现多表关联删除性能分析

转载自: https://mp.weixin.qq.com/s?src=11&timestamp=1628513358&ver=3242&signature=s26j91cKXj5oZohocJhY7DRGiRgSnzIvowxS9OymsLiHXjUfK7JZihyGpLlHVUYmdQk9pJfAwx4WZ0ThI8zewPLF8ItKTCO7V4wbLSNhgEzlDjqssW2JooLFLkHxKR&new=1 导读:最近在进行sql编写时,发现delete +usi

clapAlong的博客 2772
上一篇: PostgreSQL 查询性能优化深度详解文档
下一篇: PostgreSQL 多表 JOIN 为何推荐“小表驱动大表”?
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值