关于sqlcrossjoin的信息
本篇文章给大家谈谈sqlcrossjoin,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、SQL中的innerjoin、outerjoin和crossjoin有什么区别
- 2、SQL实战新手入门:交叉联接(CROSS JOIN)
- 3、关于SQL数据库中cross join 和inner join用法上的区别?
SQL中的innerjoin、outerjoin和crossjoin有什么区别
对于SQL中innerjoin、outerjoin和crossjoin的区别,如果辩岁逗你使用join连表,缺陷的情况下是innerjoin,另外,开发中使用的leftjoin和rightjoin属于outerjoin,另外outerjoin还包括fulljoin.下面我通过图标让大家认识它们的区别。
现有两张表,TableA是左边的表。TableB是右边的表。其各有四条记录,其中有两条记录name是相同的:
1.INNERJOIN产生的结果是雀高AB的交集
SELECT*FROMTableAINNERJOINTableBONTableA.name=TableB.name
2.LEFT[OUTER]JOIN产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
SELECT*FROMTableALEFTOUTERJOINTableBONTableA.name=TableB.name
3.RIGHT[OUTER]JOIN产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
SELECT*FROMTableARIGHTOUTERJOINTableBONTableA.name=TableB.name
图标如leftjoin类似。
4.FULL[OUTER]JOIN产生A和B的并集。对于没有匹配的记录,则会以null做为值携卖。
SELECT*FROMTableAFULLOUTERJOINTableBONTableA.name=TableB.name
你可以通过isNULL将没有匹配的值找出来:
SELECT*FROMTableAFULLOUTERJOINTableBONTableA.name=TableB.name
WHERETableA.idISnullORTableB.idISnull
[img]SQL实战新手入门:交叉联接(CROSS JOIN)
交叉联接(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
lishixinzhi/Article/program/SQL/201311/16467
关于SQL数据库中cross join 和inner join用法上的区别?
SQL数据库中cross join 和inner join区别为:连接不同、条件筛选不同、语法不同。
一、连接不核喊同
1、cross join :cross join将A表盯此的所有行分别与B表的所有行进行连接,返回的记录数为两个表的记录数乘积。
2、inner join:inner join组合两个表中的记录,只有公共字段之中有相符的值才进行连接。
二、条件筛选不同
1、cross join :cross join不能在连接时进行条件筛选。
2、inner join:inner join可以通过on关键字,在连接时进行条件筛选。
三、语法不同
1、cross join :cross join 的语法不加on关键字,为SELECT * FROM table1 CROSS JOIN table2。
2、inner join:inner join的凯氏迅语法可以加on关键字,为SELECT * FROM table1 INNER JOIN table2 ON table1.field1 = table2.field2。
关于sqlcrossjoin和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。