Rumah > pangkalan data > tutorial mysql > mssql中sql各种联合查询

mssql中sql各种联合查询

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-06-07 17:48:58
asal
1704 orang telah melayarinya

本文章介绍了关于sql中的所有联合查询,包括left join ,right join ,INNER JOIN 等查询,有需要学习的朋友可以参考一下本文章。

在sql server中,我们经常能用到连接,今天总结一下连接的基础知识。
连接的分类:

  • 交叉连接CROSS JOIN
  • 内连接INNER JOIN
  • 外连接{左外连接LEFT [OUTER] JOIN ;右外连接RIGHT [OUTER] JOIN;全外连接full [outer] join}
  • 自连接

以下通过例子来了解各个连接的异同点:

有两张表Teacher表和Course表:

交叉连接:

1.如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
 * from Course cross join Teacher
Salin selepas log masuk
结果为:

由此结果可知,它的结果与 SELECT * FROM Course,Teacher 的结果相同。

2.如果有WHERE子句的话,往往会先生成两个表行数乘积的数据表然后才根据WHERE条件从中选择。

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
1. select * from Course,Teacher where Course.T#=Teacher.T#<br>2. select * from Course cross join Teacher where Course.T#=Teacher.T#<font size="2"><strong><span>  (注:cross join后加条件只能用where,不能用on)</span></strong><br></font>3. select * from Course inner join Teacher on Course.T#=Teacher.T#
Salin selepas log masuk

结果为:

一般情况下,在效率上,Where可能具有和Inner join一样的效率,但是,在多表连接时,我们并不推荐使用where语句。
所以如果可以选择,我们最好使用语句3,有时使用Join语句可以帮助检查语句中的无效或者误写的关联条件。

内连接

内连接表示两边表同时符合条件的组合,就相当于普通的CROSS JOIN,只是格式不一样,
INNER JOIN在后面有一个ON子句(相当于WHERE)的搜索条件,用于过滤返回的行。
内连接没有笛卡尔积那么复杂要先生成行数乘积的数据表,所以内连接的效率要高于笛卡尔积的交叉连接。

外连接

指定条件的内连接,仅仅返回符合连接条件的条目。
外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者两边连接(全外连接时)的所有数据行。

1)左外连接LEFT [OUTER] JOIN
显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select * from Course left outer join Teacher on Course.T#=Teacher.T#
Salin selepas log masuk
结果为:

2)右外连接RIGHT [OUTER] JOIN
显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select * from Course right outer join Teacher on Course.T#=Teacher.T#
Salin selepas log masuk
结果为:

3)全外连接full [outer] join

显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集。

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select * from Course full outer join Teacher on Course.T#=Teacher.T#
Salin selepas log masuk
结果为:

自连接

其实,在Sql Server中,我们还经常用到一种连接——自连接。
通过以下的例子,来了解自连接:
表树形结构表tb_TestTreeView

解决问题: 树形层次结构显示
/*
 这是一个地区表,里面存放了地区名及其所属上级地区,假设现在需要查询出各地区及其所属上级地区。
*/

自连接的方法1:

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select [Name] as '地区名',<br>  (select [Name] from tb_TestTreeView as a<br>    where a.ID = b.Parent ) as '上级地区名'<br>from tb_TestTreeView as b
Salin selepas log masuk

自连接的方法2:

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select a.[Name] as '地区名',<br>       b.[Name] as '上级地区名'<br>from tb_TestTreeView as a<br>left join tb_TestTreeView as b<br>     on a.Parent = b.ID
Salin selepas log masuk

结果为:

自连接三级(左联接):

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select a.[Name] as '地区名',<br>       b.[Name] as '上级地区名',<br>       c.[Name] as '上上级地区名'<br>from tb_TestTreeView as a<br>left join tb_TestTreeView as b<br>     on a.Parent = b.ID <br>left join tb_TestTreeView as c<br>     on b.parent=c.id
Salin selepas log masuk

结果为:

自连接三级(内联接):

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select a.[Name] as '地区名',<br>       b.[Name] as '上级地区名',<br>       c.[Name] as '上上级地区名'<br>from tb_TestTreeView as a<br>inner join tb_TestTreeView as b<br>     on a.Parent = b.ID <br>inner join tb_TestTreeView as c<br>     on b.parent=c.id
Salin selepas log masuk

结果为:

自连接四级(左链接):

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select a.[Name] as '地区名',<br>       b.[Name] as '上级地区名',<br>       c.[Name] as '上上级地区名',<br>       d.[Name] as '上上上级地区名'<br>from tb_TestTreeView as a<br>left join tb_TestTreeView as b<br>     on a.Parent = b.ID <br>left join tb_TestTreeView as c<br>     on b.parent=c.id<br>left join tb_TestTreeView as d<br>     on c.parent=d.id
Salin selepas log masuk

结果为:

自连接四级(内链接):

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
 代码如下 复制代码
select a.[Name] as '地区名',<br>       b.[Name] as '上级地区名',<br>       c.[Name] as '上上级地区名',<br>       d.[Name] as '上上上级地区名'<br>from tb_TestTreeView as a<br>inner join tb_TestTreeView as b<br>     on a.Parent = b.ID<br>inner join tb_TestTreeView as c<br>     on b.Parent = c.ID<br>inner join tb_TestTreeView as d<br>     on c.Parent = d.ID
Salin selepas log masuk

结果为:

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan