SQL的Join使用图解教程

原文:https://blog.csdn.net/jamesdodo/article/details/81183644

Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join具体联接表或函数进行查询的特性。

假设我们有两张表。

Table A 是左边的表。 
Table B 是右边的表。 
其各有四条记录,其中有两条记录是相同的,如下所示: 
 

左边表A 右边表B
id name   id name
1 Pirate   1 Rutabaga 
2 Monke   2 Pirate
3 Ninja   3 Darth Vader
4 Spaghetti   4 Ninja


下面让我们来看看不同的Join会产生什么样的结果。

 

第一种:join... on...交集

SELECT     *     FROM TableA  INNER   JOIN  TableB   ON TableA.name = TableB.name

查询结果
id name   id name
1 Pirate   2 Pirate
3 Ninja   4 Ninja

inner join 内联接产生的结果集中,是A和B的交集。

SQL的Join使用图解教程_第1张图片
  

 

 

 

第二种:Full outer join ...  on...并集

SELECT * FROM TableA  FULL OUTER JOIN TableB ON TableA.name = TableB.name

查询结果
id name   id name
1 Pirate   2 Pirate
2 Monkey   null null
3 Ninja   4 Ninja
4 Spaghetti   null null
null null   1 Rutabaga
null null   3 Darth Vader

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

SQL的Join使用图解教程_第2张图片

 

 

 

第三种:左完交集 left  outer join ... on ...

 SELECT * FROM TableA  LEFT OUTER JOIN TableB  ON TableA.name = TableB.name

查询结果
id name   id name
1 Pirate   2 Pirate
2 Monkey   null null
3 Ninja   4 Ninja
4 Spaghetti   null null

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

也可直接 left join .... 如果right outer join 正好相反,产生B的完全集,A表匹配有值,没有则NULL取代。可也直接right join...

SQL的Join使用图解教程_第3张图片

 

 

第四种:左完缺集: (后面的where区别)

SELECT * FROM TableA  LEFT OUTER JOIN TableB ON TableA.name = TableB.name
                 WHERE TableB.id IS null

查询结果
id name   id name
2 Monkey   null null
4 Spaghetti   null null

产生在A表中有而在B表中没有的集合。

SQL的Join使用图解教程_第4张图片

 

 

 

 

第五种:左右完缺集(全集中挖云交集,即左右均为空的)

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
                  WHERE TableA.id IS null   OR TableB.id IS null

查询结果
id name   id name
2 Monkey   null null
4 Spaghetti   null null
null null   1 Rutabaga
null null   3 Darth Vader

产生A表和B表都没有出现的数据集。 

 SQL的Join使用图解教程_第5张图片 

 

 

 

 

第六种:笛卡尔积 CROSS JOIN

还需要注意的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,

因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下: 
复制代码 代码如下:
SELECT * FROM TableA  CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。
 

你可能感兴趣的:(SQL,Server,数据库原理)