跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
SQL联结表
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= SQL联结表 = '''SQL联结表'''(SQL JOIN)是关系型数据库中最重要的操作之一,它允许用户通过共同的字段将两个或多个表中的数据关联起来。理解联结操作是掌握SQL的关键,因为它能高效地组合来自不同表的相关数据。 == 联结的基本概念 == 在关系型数据库中,数据通常分散在多个表中以避免冗余。联结操作通过匹配表之间的'''外键'''和'''主键'''来重新组合这些数据。常见的联结类型包括: * '''内联结(INNER JOIN)''':只返回两表中匹配的行 * '''左外联结(LEFT JOIN)''':返回左表所有行,右表不匹配则为NULL * '''右外联结(RIGHT JOIN)''':返回右表所有行,左表不匹配则为NULL * '''全外联结(FULL JOIN)''':返回两表所有行,不匹配则为NULL * '''交叉联结(CROSS JOIN)''':返回两表的笛卡尔积 == 内联结(INNER JOIN) == 内联结是最常用的联结类型,语法结构为: <syntaxhighlight lang="sql"> SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列名 = 表2.列名 </syntaxhighlight> === 示例 === 假设我们有两个表:'''customers'''和'''orders''' '''customers表''' {| class="wikitable" |- ! customer_id !! customer_name !! contact_name |- | 1 || Alfreds || Maria Anders |- | 2 || Ana Trujillo || Ana Trujillo |- | 3 || Antonio Moreno || Antonio Moreno |} '''orders表''' {| class="wikitable" |- ! order_id !! customer_id !! order_date |- | 10308 || 2 || 2023-09-18 |- | 10309 || 1 || 2023-09-19 |- | 10310 || 3 || 2023-09-20 |} 执行内联结查询: <syntaxhighlight lang="sql"> SELECT customers.customer_name, orders.order_date FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id; </syntaxhighlight> '''输出结果''' {| class="wikitable" |- ! customer_name !! order_date |- | Alfreds || 2023-09-19 |- | Ana Trujillo || 2023-09-18 |- | Antonio Moreno || 2023-09-20 |} == 外联结(OUTER JOIN) == 外联结包括左外联结、右外联结和全外联结,用于保留不匹配的行。 === 左外联结(LEFT JOIN) === 返回左表所有行,右表不匹配则为NULL: <syntaxhighlight lang="sql"> SELECT customers.customer_name, orders.order_date FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id; </syntaxhighlight> == 多表联结 == 可以联结多个表,例如: <syntaxhighlight lang="sql"> SELECT customers.customer_name, orders.order_date, shippers.shipper_name FROM ((orders INNER JOIN customers ON orders.customer_id = customers.customer_id) INNER JOIN shippers ON orders.shipper_id = shippers.shipper_id); </syntaxhighlight> == 自联结(SELF JOIN) == 表与自身联结,常用于层级数据: <syntaxhighlight lang="sql"> SELECT A.customer_name AS Customer1, B.customer_name AS Customer2, A.city FROM customers A, customers B WHERE A.customer_id <> B.customer_id AND A.city = B.city; </syntaxhighlight> == 可视化联结类型 == <mermaid> erDiagram CUSTOMERS ||--o{ ORDERS : "1:N" CUSTOMERS { int customer_id PK string customer_name } ORDERS { int order_id PK int customer_id FK date order_date } </mermaid> == 性能考虑 == * 为联结列创建索引 * 避免不必要的列 * 注意联结顺序 * 使用EXPLAIN分析查询计划 == 实际应用案例 == '''电商系统'''中需要联结: * 用户表 * 订单表 * 产品表 * 支付表 获取完整订单信息: <syntaxhighlight lang="sql"> SELECT u.username, o.order_date, p.product_name, py.amount FROM users u JOIN orders o ON u.user_id = o.user_id JOIN order_items oi ON o.order_id = oi.order_id JOIN products p ON oi.product_id = p.product_id JOIN payments py ON o.order_id = py.order_id; </syntaxhighlight> == 常见错误 == 1. 忘记联结条件导致笛卡尔积 2. 使用WHERE代替ON造成混淆 3. 表别名使用不当 4. 忽略NULL值处理 == 进阶主题 == * 自然联结(NATURAL JOIN) * 使用USING简化语法 * 派生表联结 * 递归CTE实现复杂层级联结 == 数学基础 == 联结操作基于关系代数,内联结可表示为: <math> R \bowtie_{A=B} S = \sigma_{A=B}(R \times S) </math> 其中: * <math>\bowtie</math> 表示联结操作 * <math>\sigma</math> 是选择操作 * <math>\times</math> 是笛卡尔积 == 总结 == SQL联结是关系数据库的核心操作,掌握各种联结类型及其适用场景对高效查询至关重要。实践是掌握联结的最佳方式,建议在真实数据集上尝试不同类型的联结操作。 [[Category:计算机科学]] [[Category:数据库与信息系统]] [[Category:SQL基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)