SQL的Join使用图解教程

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

假设咱们有两张表。函数

Table A 是左边的表。 
Table B 是右边的表。 
其各有四条记录,其中有两条记录是相同的,以下所示: 
复制代码 代码以下:
id name id name 
-- ---- -- ---- 
1 Pirate 1 Rutabaga 
2 Monkey 2 Pirate 
3 Ninja 3 Darth Vader 
4 Spaghetti 4 Ninja性能

下面让咱们来看看不一样的Join会产生什么样的结果。 
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name3d

id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 Ninja
inner join 内联接产生的结果集中,是A和B的交集。blog


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

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 Vaderselect

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

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

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...

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表中没有的集合。

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表都没有出现的数据集。   
还须要注意的是咱们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,由于其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式以下: 
复制代码 代码以下:
SELECT * FROM TableA 
CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,通常来讲,咱们不多用到这个语法。可是咱们得当心,若是不是使用嵌套的select语句,通常系统都会产生笛卡尔乘积然再作过滤。这是对于性能来讲是很是危险的,尤为是表很大的时候。