SQL Server进阶:Join联结查询

Posted cnki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server进阶:Join联结查询相关的知识,希望对你有一定的参考价值。

测试数据脚本

技术分享图片
 1 CREATE TABLE Atable
 2   ( 
 3      S#    INT, 
 4      Sname nvarchar(32), 
 5      Sage  INT, 
 6      Sfrom  nvarchar(8) 
 7   ) 
 8 
 9 
10  insert into Atable 
11  select 1,N刘一,18,NA union all
12  select 2,N钱二,19,NA union all
13  select 3,N张三,17,NA union all
14  select 4,N李四,18,NA 
15 
16  
17 
18 
19  CREATE TABLE Btable
20   ( 
21      S#    INT, 
22      Sname nvarchar(32), 
23      Sage  INT, 
24      Sfrom  nvarchar(8) 
25   ) 
26 
27 
28  insert into Btable
29  select 1,N李四,18,NB union all
30  select 2,Ntom,19, NB union all
31  select 3,N刘一,17,NB union all
32  select 4,Njack,18,NB
View Code

数据表

技术分享图片

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

1.cross join

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

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

技术分享图片

2.inner join == join

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

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

怎么理解内联接:

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

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

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

技术分享图片

3.left outer join == left join

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

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

技术分享图片

4.right outer join == right jion

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

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

技术分享图片

5.full outer  join  == full join  

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

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

技术分享图片

6.union与union all

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

通过UNION运算符来将两张表纵向联接,基本方式为:
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;
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

小结

技术分享图片

 

以上是关于SQL Server进阶:Join联结查询的主要内容,如果未能解决你的问题,请参考以下文章

sql 的并集UNION和内联结INNER JOIN 有啥区别?感觉结果是一样的。

Microsoft SQL Server 代码片段收集

mysql联表查询,使用phpStudy自带的

MySQL必知应会-第15章-联结表

求助sql语句,多个join嵌套

联结表