热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLSERVER中对于内外联接(join,leftjoin,rightjoin.....)等的实现过程是怎么样的啊,高人请指点一下!!!

SQLSERVER中对于内外联接(join,leftjoin,rightjoin..)等的实现过程是怎么样的啊,高人请指点一下!!!是不是想有些人说的先笛卡儿积后再按条件选出行来
SQL SERVER 中对于内外联接(join,left join,right join.....)等的实现过程是怎么样的啊,高人请指点一下!!!

是不是想有些人说的先笛卡儿积后再按条件选出行来?

28 个解决方案

#1


--测试数据
DECLARE @a TABLE(id int)
INSERT @a SELECT 1
UNION ALL SELECT 2

DECLARE @b TABLE(id int)
INSERT @b SELECT 2
UNION ALL SELECT 3

--内联接
SELECT * FROM @a a JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=b.id
/*--结果(只返回两个表中id相同的记录)
id           id
---------------- ----------- 
2           2
--*/

--左向外联接
SELECT * FROM @a a LEFT JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id*=b.id --会产生不明确查询,不建议再使用这种方式
/*--结果(返回@a(左边表)所有的记录,及@b(右边表)的id与@a表id匹配的记录),不匹配的用NULL表示
id           id 
----------------- ----------- 
1           NULL
2           2
--*/

--右向外联接
SELECT * FROM @a a RIGHT JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=*b.id –会产生不明确查询,不建议再使用这种方式
/*--结果(返回@b(右边表)所有的记录,及@a(左边表)的id与@b表id匹配的记录),不匹配的用NULL表示
id           id 
----------------- ----------- 
2           2
NULL       3
--*/

--完整外部联接
SELECT * FROM @a a FULL JOIN @b b ON a.id=b.id
/*--结果(返回@a与@b表所有的记录,id不匹配的用NULL表示
id           id 
----------------- ----------- 
2           2
NULL       3
1           NULL
--*/

--交叉联接
SELECT * FROM @a a CROSS JOIN @b b
SELECT * FROM @a a,@b b
/*--结果:
id           id 
----------------- ----------- 
1           2
2           2
1           3
2           3
--*/

#2


楼上的都说的够明白了,没什么好说的了

#3


噢,联机文档上有的。

#4


第一个 JOIN有时也写成 INNER JOIN两是一样的
JOIN只是省了INNER。

#5


msdn!                       .

#6


引用楼主 eping2002 的帖子:
SQL SERVER 中对于内外联接(join,left join,right join.....)等的实现过程是怎么样的啊,高人请指点一下!!! 

是不是想有些人说的先笛卡儿积后再按条件选出行来?


SQL SERVER对于连接的实现,只有NESTED-LOOP JOIN,MERGE JOIN和HASH JOIN三种方式

一楼大约是所答非所问的



#7


引用 6 楼 kelph 的回复:
引用楼主 eping2002 的帖子:
SQL SERVER 中对于内外联接(join,left join,right join.....)等的实现过程是怎么样的啊,高人请指点一下!!! 

是不是想有些人说的先笛卡儿积后再按条件选出行来? 
 

SQL SERVER对于连接的实现,只有NESTED-LOOP JOIN,MERGE JOIN和HASH JOIN三种方式 

一楼大约是所答非所问的 



是滴,物理实现就LOOP JOIN ,MERGE JOIN , HASH JOIN 三种。

#8


看看联机帮助中对于 join的3种说明

#9


mark

#10


楼主想了解它的原理?

#11


楼主是在学习数据库原理,看来他是想自己开发一套汉字的SQL哦,将来,我们写SQL语句是这样的,
选取字段一,字段二 从 表一联接到表二 条件是 七七八八 按九九十十排序
全世界为汗字疯狂!!!

#12


看聯機幫助和說明和例子

選擇—索引—輸入"from 子句"—選擇"關於from子句"

#13


如果只是关注条件在何时先过滤:
join  先过滤两边表再连接(按条件匹配),
---(过滤指对某个表单独的条件如 table1.col1>100 and table2.col2='abc')
left join 先过滤右边表再连接(如 table2.col2='abc')
right join 先过滤左边表再连接(如 table1.col1>100 )
full join 先连接(按条件匹配)后过滤
cross join 先过滤两边表再连接

#14


呵呵 邹建 新书 里面 讲了 一下,偶看了又忘记了。你可以去看看啊!

#15


引用 11 楼 Leedsema 的回复:
楼主是在学习数据库原理,看来他是想自己开发一套汉字的SQL哦,将来,我们写SQL语句是这样的, 
选取字段一,字段二 从 表一联接到表二 条件是 七七八八 按九九十十排序 
全世界为汗字疯狂!!!


呵呵,我只是在面试时,当谈到联接时,对方大谈性能方面的影响,说内联在ON条件以前,数据会以笛卡儿积提取出来,然后再按ON的条件把最终结果取出来,由于我没有看过这方面的资料,但感觉又不可能是这样,我只能说,我不太了解实现原理,但我对你的观点我持保留态度。
所以,回来我就查资料,顺便发个贴子让高人指点一下!!!

这几天网不好,谢谢大家的指点,我去看看这方面的资料 希望大家多谈自已的观点,

#16


on条件中非连接(我指的是对单一表的条件)条件并非都在联接之后过滤条件,尤其是内联是首先过滤对单一表的条件经(如对A表的条件与对B的条件或两条件的组合),这在查询分析器中的执行计划里可以查到。

#17


引用 15 楼 eping2002 的回复:
 

呵呵,我只是在面试时,当谈到联接时,对方大谈性能方面的影响,说内联在ON条件以前,数据会以笛卡儿积提取出来,然后再按ON的条件把最终结果取出来,由于我没有看过这方面的资料,但感觉又不…


去他的 !

LOOP JOIN 、MERGE JOIN 、HASH JOIN之间没有谁好谁坏的区别!
看是在什么场合,小数据量就是loop join 和merge join ,但merge join 要求输入的数据要有排序,
loop join 不消耗内存。
超大数据连接时,采用的就是hash join ,消耗内存严重,有可能会使用temp db。

#18


引用 1 楼 liangCK 的回复:
SQL code--测试数据
DECLARE @a TABLE(id int)
INSERT @a SELECT 1
UNION ALL SELECT 2

DECLARE @b TABLE(id int)
INSERT @b SELECT 2
UNION ALL SELECT 3

--内联接
SELECT * FROM @a a JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=b.id
/*--结果(只返回两个表中id相同的记录)
id           id
---------------- ----------- 
2           2
--*/

--左向外联接
SELECT * FROM @a a LEFT J…

//小梁mm就是厉害啊,学习...

#19


可以查看一下执行计划。

join 的物理实现,如 7 楼所述,分为三种

nested loops join , merge join 和 hash join。

具体原理,楼主可以参考相关资料。

#20


你们知道不知道。
SELECT * FROM  TabA A INNER JOIN TabB B ON A.ID_=B.ID_

SELECT * FROM  TabA A ,TabB B WHERE A.ID_=B.ID_
的区别?先搞清楚这个再来说联接的事吧

#21


引用 1 楼 liangCK 的回复:
SQL code--测试数据
DECLARE @a TABLE(id int)
INSERT @a SELECT 1
UNION ALL SELECT 2

DECLARE @b TABLE(id int)
INSERT @b SELECT 2
UNION ALL SELECT 3

--内联接
SELECT * FROM @a a JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=b.id
/*--结果(只返回两个表中id相同的记录)
id           id
---------------- ----------- 
2           2
--*/

学习一下

--左向外联接
SELECT * FROM @a a LEFT J…

#22


楼主说的很正确...................

#23


这几天查了一下资料,首先查了一下SQL SERVER 联接时用的常用三种方法Hash Join (哈希联结),Nested Loop Join (嵌套循环联结),Merge Join (排序合并联结,SQL SERVER内外联系会自动根据情况选择一种最优化的法师来执行,
,HASH一般用在两表都未排序,较大,两边都有重复值时,SQL SERVER优化器最后选择的一种方法,NESTED LOOP一般用在一大一小的表,且其中有一个表的JOIN字段有唯一值,内表最好有索引的情况下,效果会很好,Merge一般用在表的大小都差不多,而且两表的JOIN字段都排序完成的情况下最好,

总体来说,这几种方法在最坏的情况时,有可能执要花费笛卡尔积的性能,蛤也不是我面试时说的那种情况,

至于leedsema说的20楼的情况,

我了解的可以认为后者是联接的前身形式吧,至于执行的原理应该也是类似的步骤吧,这只是我的认为,呵呵,

还请Leedsema详细说一下区别,那位高手能熟细的来说说啊,

#24


既然是联接的内部机制,我们又没法控制,它再差也比in强吧,能不用join?

#25


引用 24 楼 wgzaaa 的回复:
既然是联接的内部机制,我们又没法控制,它再差也比in强吧,能不用join?


不是在JOIN前加相关的前缀就能让按指定的方法来实现吗!!!不知我理解的对不

#26


引用 25 楼 eping2002 的回复:
引用 24 楼 wgzaaa 的回复:
既然是联接的内部机制,我们又没法控制,它再差也比in强吧,能不用join? 
 

不是在JOIN前加相关的前缀就能让按指定的方法来实现吗!!!不知我理解的对不

好像是这样的,sql会根据表的情况选择最优的方法实现join。

还有,20楼的说法我,我也太明白,能不能给大家讲解一下!

#27


我有过一次经历,我生成了一个600W条记录的数据库,然后测试几个分页存储过程,环境是XP下我用的虚拟机,装了个2003,上边安装的SQL SERVER2005 ,数据库建成后,在建产索引时,死活建不了,可以是虚拟机的硬件没有设够,建索引时,老报错,后来,我在这种条件下测试一个分页存储过程,其中用了几条多表(#表)子语句的查询,结果查这数据库,硬是在我睡前到天亮醒来都没有完成,最后我查了一下,是硬盘空间被用光了,我估计是不是Merge Join 实现,他在给出表建索引,但索引又建不了,所以,造成空等待

#28


引用 20 楼 Leedsema 的回复:
你们知道不知道。 
SELECT * FROM  TabA A INNER JOIN TabB B ON A.ID_=B.ID_ 
与 
SELECT * FROM  TabA A ,TabB B WHERE A.ID_=B.ID_ 
的区别?先搞清楚这个再来说联接的事吧


这位来给出个答案啊,指教一下啊

推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
author-avatar
KristenW_ong_湘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有