SQL Server进阶(四):联接

测试数据脚本

 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,N'A' union all
12  select 2,N'钱二',19,N'A' union all
13  select 3,N'张三',17,N'A' union all
14  select 4,N'李四',18,N'A' 
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,N'B' union all
30  select 2,N'tom',19, N'B' union all
31  select 3,N'刘一',17,N'B' union all
32  select 4,N'jack',18,N'B'
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

小结

猜你喜欢

转载自www.cnblogs.com/cnki/p/5264273.html