知识大全 交叉联接(CROSS JOIN)

Posted 笛卡尔

篇首语:讨厌自己明明不甘平凡,却又不好好努力。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 交叉联接(CROSS JOIN)相关的知识,希望对你有一定的参考价值。

SQL实战新手入门:交叉联接(CROSS JOIN)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   交叉联接(CROSS JOIN)

  最后 将介绍另外一种不同类型的联接 实际上 它的语法不允许定义行匹配的条件

  SELECT

  loc_bookcase

   loc_shelf

   loc_position_left

   bk_title

  FROM location CROSS JOIN books

  ( row(s) affected)

  这怎么可能呢?查询结果产生了 行记录?在每一个表中仅有 条记录啊!这是什么类型的联接呢?它就是交叉联接 又称为笛卡尔积 请回顾一下笛卡尔坐标系统 它由两根互为直角的轴构成 两轴交叉点的坐标为 并从 开始沿轴逐渐增加数值 笛卡尔坐标系统的一个常见的例子就是国际象棋的棋盘 它沿着轴用字母取代了数字 除此之外 两者是类似的

  如果对棋盘上的每一个方格进行命名 可以使用棋盘上的坐标 A A E E 等 换句话说 即将一个轴上的每一个值都与另外一个轴上的每一个值进行匹配 这就是笛卡尔积(这非常类似于将轴上的值 相乘 :A× A× 等)

  CROSS JOIN对于两个表执行类似的操作 它将一个表中的每一行与另外一个表中的每一行进行配对 可以想象 CROSS JOIN的结果集通常都相当大 在上面的例子中 仅仅交叉联接两个表(每个表只有 行数据)就返回了 行结果 如果在查询中加入更多的表 那么结果集将变得更加庞大

  如何建立CROSS JOIN呢?实际上无需太多的语法 使用旧式SQL语法来创建CROSS JOIN非常简单 只需要在FROM子句中列出要选取的表 无需任何JOIN条件

  SELECT

  loc_bookcase

   loc_shelf

   loc_position_left

   bk_title

  FROM location books

  也就是说 无须使用任何JOIN关键字 只需要在FROM子句中列出要交叉联接的表即可 但是这会产生一个困境 忽略WHERE子句将创建一个笛卡尔积的查询 并且编写这样的SQL查询非常简单 然而 结果集可能会超出希望查询的数据范围 表 显示了将LIBRARY数据库中的表逐步增加到CROSS JOIN查询中时结果集数量的增长过程

  表 LIBRARY数据库中的笛卡尔积

  LIBRARY数据库非常小 只包含 个表 其中没有一个表超过 条记录 但使用CROSSJOIN时却产生了极大的结果集 设想一下 如果对于一个包含了几十个甚至上百个表的产品级的数据库(其中可能包含了上百万的记录)使用CROSS JOIN将会产生什么样的后果?毫无疑问 这会将数据库折磨到挂掉 并让DBA恼火不已

  可以在CROSS JOIN中使用一个WHERE子句来减少返回记录的数量 例如 使用下面的查询产生一个笛卡尔积

  SELECT loc_bookcase loc_shelf loc_position_left bk_title

  FROM location CROSS JOIN books

  WHERE bk_id =

  该查询仅返回 条记录 而不是前面例子中的 条记录

  幸运的是 新的SQL语法要求首先显式地声明联接的类型 这可以避免查询意外地产生不必要的笛卡尔积 新SQL语法要求必须使用CROSS JOIN关键字或者应用联接条件 对于DBA请注意以下的警告 使用旧的联接语法对数据库是有害的 很多RDBMS在它们各自的数据库中已经停止了对旧语法的支持 除非需要处理遗留的代码 否则在查询中最好不要再使用旧式语法

  读者可能会感到疑惑 如果CROSS JOIN是不良的 应该避免使用的联接 那为什么还要自寻烦恼地提供CROSS JOIN关键字呢?实际上 CROSS JOIN也有合理的用途 例如 它提供了一个快速又简单的办法来产生巨量的数据集 可用于测试用途 另外一种应用场景是通过CROSS JOIN产生的数据集来选取行 这些行既无法通过INNER JOIN也无法通过OUTER JOIN来产生 例如 选取对于指定产品的销售总量为 的客户(或者在LIBRARY数据库的情形下查询在一年内没有借阅一本特定图书的客户)

  CROSS JOIN是一个极为强大的工具 因此也必须谨慎地加以使用 处理巨大的数据集将消耗系统资源 在SQL中 最佳实践之一就是在查询中尽可能地对记录进行筛选 并最小化须访问的数据的数量

  一个SQL查询对于可以包含多少个JOIN操作是否存在限制呢?对于预备执行计划的复杂性都存在实际的限制 更不用说执行这些复杂的计划可能会使服务器崩溃 实际的数量取决于RDBMS以及运行RDBMS的硬件环境 如果你发现联接太多的表 那么应该重新考虑你的查询方案

       返回目录 SQL实战新手入门

       编辑推荐

       Oracle索引技术

       高性能MySQL

cha138/Article/program/SQL/201311/16467

相关参考

知识大全 内联接(INNER JOIN)(1)

SQL实战新手入门:内联接(INNERJOIN)(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 内联接(INNER JOIN)(2)

SQL实战新手入门:内联接(INNERJOIN)(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 左联接(LEFT OUTER JOIN)

SQL实战新手入门:左联接(LEFTOUTERJOIN)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 右联接(RIGHT OUTER JOIN)

SQL实战新手入门:右联接(RIGHTOUTERJOIN)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

交错层理(或者交错层;斜层理)Cross-Bedding(或Cross-Strata;InctinedBedding)

在一个较厚的岩层中出现的倾斜的层。交错层是与水平层成某一角度沉积下来的,在典型的情况下,它在粒状沉积物(特别是砂岩)中出现。它们是三角洲中和砂丘中沉积的沉积物以及冰川溶水沉积的沉积物的标志,对恢复古气

知识大全 再探JOIN

SQL实战新手入门:再探JOIN  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第章组合数据集 

知识大全 join方法的使用

Java多线程初学者指南(5):join方法的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 关于C#中Thread.Join()的一点理解

关于C#中Thread.Join()的一点理解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今

知识大全 N路INNER JOIN

SQL实战新手入门:N路INNERJOIN  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  N路I

知识大全 asp中join函数实现字符串连接

  (list[delimiter])  参数描述  listRequiredAonedimensionalarraythatcontainsthesubstringstobejoined  必选项包