sql server join ,inner join ,left join ,right join 的使用

测试数据脚本

CREATE TABLE Atable
  (
     S#    INT,
     Sname nvarchar(32),
     Sage  INT,
     Sfrom  nvarchar(8)
  ) 

 insert into Atable
 select 1,N‘李四‘,18,N‘A‘ union all
 select 2,N‘tom‘,19, N‘A‘ union all
 select 3,N‘刘一‘,17,N‘A‘ union all
 select 4,N‘jack‘,18,N‘A‘

 CREATE TABLE Btable
  (
     S#    INT,
     Sname nvarchar(32),
     Sage  INT,
     Sfrom  nvarchar(8)
  ) 

 insert into Btable
 select 1,N‘刘一‘,18,N‘B‘ union all
 select 2,N‘钱二‘,19,N‘B‘ union all
 select 3,N‘张三‘,17,N‘B‘ union all
 select 4,N‘李四‘,18,N‘B‘

数据表

Join(麻蛋  废话不多说 有图有真相)

1.cross join

  交叉连接不需要任何连接条件。两个表的的数据直接进行笛卡尔积运算。如果一个表有m行,而另一个表有n行,将得到m*n的结果集。


1

SELECT FROM Atable as A  cross join Btable as order by A.S#

2.inner join == join

  内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。

  对两个输入表进行笛卡尔积,然后根据指定的谓词对结果行进行过滤。

怎么理解内联接:

  理解内联接最容易的方法是认为A表中每一行同C表中的所有行进行比较,如果A表中的id和C表中的id相等,则匹配成功。

  另外一种更正式的方法是在关系代数的基础上来考虑内联接,联接运算首先对两个表求笛卡尔积(4行A记录*5行C记录=20行记录),然后根据条件C.id=A.id对行进行过滤,最终返回16行。


1

SELECT FROM Atable as A  INNER JOIN Btable as ON A.Sname = B.Sname

3.left outer join == left join

  产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。


1

SELECT FROM Atable as left outer join Btable as ON A.Sname = B.Sname

4.right outer join == right jion

  产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。


1

SELECT FROM Atable as right outer join Btable as ON A.Sname = B.Sname

5.full outer  join  == full join  

  产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。


1

SELECT FROM Atable as full join Btable as ON A.Sname = B.Sname

6.union与union all

  区别就是联合查询的时候union会去重,union all不会去重


1

通过UNION运算符来将两张表纵向联接,基本方式为:


1

2

3

4

5

6

7

SELECT 列1 , 列2 FROM 表1

UNION

SELECT 列3 , 列4 FROM 表2;

UNION ALL为保留重复行:

SELECT 列1 , 列2 FROM 表1

UNION ALL

SELECT 列3 , 列4 FROM 表2;


1

2

SELECT Sname FROM Atable  UNION  SELECT Sname FROM  Btable 

SELECT Sname FROM Atable  UNION ALL SELECT Sname FROM  Btable 

自交叉联接

  对同一个表进行联接,就是自联接。交叉联接、内联接、外联接都支持自联接。

SELECT A1.a,A2.a FROM A AS A1 CROSS JOIN A AS A2

  A表有4行,查询会生成一个包含4*4=16行的数据的结果集。

  在自联接中,必须为表起别名。如果不为表指定别名,联接结果中的列名就会有歧义。

  比如在本例中,别名为A1,A2。

小结

原文地址:https://www.cnblogs.com/baili-luoyun/p/11132004.html

时间: 2024-08-07 01:28:15

sql server join ,inner join ,left join ,right join 的使用的相关文章

SQL Server的三种物理连接之Hash Join(三)

简介 在 SQL Server 2012 在一些特殊的例子下会看到下面的图标: Hash Join分为两个阶段,分别为生成和探测阶段. 首先是生成阶段,将输入源中的每一个条目经过散列函数的计算都放到不同的Hash Bucket中,其中Hash Function的选择和Hash Bucket的数量都是黑盒,通常来讲,查询优化器都会使用连接两端中比较小的哪个输入集来作为第一阶段的输入源. 接下来是探测阶段,对于另一个输入集合,同样针对每一行进行散列函数,确定其所应在的Hash Bucket,在针对这

Sql Server 与 MySql 在使用 update inner join 时的区别

Sql Server update tb_User set pass = ''-- 此处pass前不要加 tb_User 别名usr from tb_User usr inner join tb_Address addr on usr.nAddressFK = addr.nAddressID where usr.id=123 MySql UPDATE mem_world AS mw1 INNER JOIN mem_world AS mw2 ON mw1.parentid = mw2.wid SE

SQL SERVER中 外联接即(left join)on 和 where 的区别

使用内联接,无论在JOIN 子句还是 WHERE 子句中,条件具有相同的结果,但使用外联接时并非如此. 当条件在JOIN子句时,SQL SERVER包括外表的所有行,然后使用条件包括第二个表中的行. 当限制置于WHERE子句时,先执行联接,然后将where子句应用于联接行. 上述表述不是很明白 ,以下的解释更清楚. 即:ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行. 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有

INNER JOIN与LEFT JOIN在SQL Server的性能

我创建了INNER JOIN 9桌,反正需要很长的(超过五分钟).所以,我的民歌改变INNER JOIN来LEFT JOIN LEFT JOIN的性能较好,在首次尽管我所知道的.之后我变了,查询的速度显著提高. 我想知道为什么LEFT JOIN的速度比INNER JOIN? 我的样子如下:SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D因此没有 更新: 这是我的简单架构的. FROM sidisaleshdr

SQL Server Join方式

1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQL Server中的三种Join方式 在Sql Server中,每一个join命令,在内部执行时,都会采用三种更具体的join方式来运行.这三种join的方法是:nested loops join.merge join和hash join.这三种方法,没有哪一种是永远最好的,但是都有其最适合的上下文.S

SQL Server nested loop join 效率试验

从很多网页上都看到,SQL Server有三种Join的算法, nested loop join, merge join, hash join. 其中最常用的就是nested loop join. 在介绍nested loop join的很多文章里,都提到如果两个表做nested loop join,取行数较小的表作为外循环表,行数较多的表作为内循环表, join的效率会比较高. 其中之一的原因是如果内循环表做join的列上有合适的索引的话,那么外循环的每一条输入数据可以做索引的seek,这样就

SQL Server Join

SQL Server Join 执行顺序 ON 定义表连接字段(数据量大的时候添加索引也可以查询速度进行优化 On.. And.. : And 限定的条件是在 Join之前对目标表的数据进行限定 Where 对连接后的数据进行过滤筛选 SELECT * FROM EMPLOY E LEFT JOIN DEPARTMENT D ON E.DEPTNO=D.DEPTNO AND D.DEPTNO=40-- EMPLOY 表不添加限制,所有连接之前获取所有EMPLOY表的数据 相当于Select *

【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inner join的问题: 下面的两个语句都是left join的,但是一个却转化成了 inner join drop table a,B go create table a(id int) insert into a select 1 union all select 2 create table b

关于sql server中的 jion,inner join, left join ,left outer join, right join,right outer join 的几点使用心得

平时我们做关联,一般都是2~3张表,不太关注这样繁杂的写法,那今天咱们就看看这些写法吧 对将要说的这三种,先说一下要介绍的要点:on后面的条件可以放几个?什么时候结合着where条件一起使用? 大家可以先看看这个帖子,帖子的名字是:sqlserver left join的on中如何添加多个查询条件?? 链接:http://bbs.csdn.net/topics/270023422 开始咱们的介绍吧 首先对于join 分三块: 1.  join .join inner (内联) 我们平时的写法是:

SQL中把筛选条件放在left outer join的on 和 where 后面的区别

create table [Table_1]([PKey] int,[FKey] int,[value1] int,[value2] int)create table[Table_2]([PKey] int,[value1] int,[value2] int)drop table [Table_1]drop table [Table_2]delete[Table_1]delete[Table_2]insert into [Table_1] values(1,0,21,31)insert into