热门标签 | 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_ 
的区别?先搞清楚这个再来说联接的事吧


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

推荐阅读
  • SQL Server 存储过程实践任务(第二部分)
    本文档详细介绍了三个SQL Server存储过程的创建与使用方法,包括统计特定类型客房的入住人数、根据房间号查询客房详情以及删除特定类型的客房记录。 ... [详细]
  • 本文探讨了在SQL Server 2008环境下,当尝试删除拥有数据库架构的用户时遇到的问题及解决方案,包括如何查询和更改架构所有权。 ... [详细]
  • mysql数据库json类型数据,sql server json数据类型
    mysql数据库json类型数据,sql server json数据类型 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
  • spring(22)JdbcTemplate
    2019独角兽企业重金招聘Python工程师标准###1.导入jar包,必须jar包:c3p0、mysql-connector、beans、con ... [详细]
  • 本文介绍如何通过参数化查询来防止SQL注入攻击,确保数据库的安全性。示例代码展示了在C#中使用参数化查询添加学生信息的方法。 ... [详细]
  • 本文将详细介绍 SQL 中的 SUM 函数及其用法,并通过具体示例展示如何在实际场景中应用。 ... [详细]
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社区 版权所有