- 论坛徽章:
- 0
|
关于sql joins的图形解说 .
原文:http://www.codinghorror.com/blog ... n-of-sql-joins.html
翻译:
我喜欢这种查询方式,现在让我们来看看它是如何工作的。假设我们有如下的两张表。表A在左边,表B在右边。我们将用下面的四条记录进行互相的组装查询。
[plain] view plaincopyprint?- 01.id name id name
- 02.-- ---- -- ----
- 03.1 <span style="color:#cc0000;">Pirate</span> 1 Rutabaga
- 04.2 Monkey 2 <span style="color:#cc0000;">Pirate
- 05.</span>3 <span style="color:#cc0000;">Ninja</span> 3 Darth Vader
- 06.4 Spaghetti 4 <span style="color:#cc0000;">Ninja</span>
- id name id name
- -- ---- -- ----
- 1 <span style="color:#cc0000;">Pirate</span> 1 Rutabaga
- 2 Monkey 2 <span style="color:#cc0000;">Pirate
- </span>3 <span style="color:#cc0000;">Ninja</span> 3 Darth Vader
- 4 Spaghetti 4 <span style="color:#cc0000;">Ninja</span>
复制代码 让我们用不同的方式根据name这个字段join这些表进行查询,来看看是否我们能得出一个能够和这些漂亮的图解相吻合的结论。
[sql] view plaincopyprint?01.SELECT * FROM TableA 02.INNER JOIN TableB 03.ON TableA.name = TableB.name 04. 05.id name id name 06.-- ---- -- ---- 07.1 Pirate 2 Pirate 08.3 Ninja 4 Ninja 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] view plaincopyprint?01.SELECT * FROM TableA 02.FULL OUTER JOIN TableB 03.ON TableA.name = TableB.name 04. 05.id name id name 06.-- ---- -- ---- 07.1 Pirate 2 Pirate 08.2 Monkey null null 09.3 Ninja 4 Ninja 10.4 Spaghetti null null 11.null null 1 Rutabaga 12.null null 3 Darth Vader 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] view plaincopyprint?01.SELECT * FROM TableA 02.LEFT OUTER JOIN TableB 03.ON TableA.name = TableB.name 04. 05.id name id name 06.-- ---- -- ---- 07.1 Pirate 2 Pirate 08.2 Monkey null null 09.3 Ninja 4 Ninja 10.4 Spaghetti null null 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来填充。
[sql] view plaincopyprint?01.SELECT * FROM TableA 02.LEFT OUTER JOIN TableB 03.ON TableA.name = TableB.name 04.WHERE TableB.id IS null 05. 06.id name id name 07.-- ---- -- ---- 08.2 Monkey null null 09.4 Spaghetti null null 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
Left outer join produces a complete set of records from Table A, with the matching records (where available) in Table B. If there is no match, the right side will contain null.
[sql] view plaincopyprint?01.SELECT * FROM TableA 02.FULL OUTER JOIN TableB 03.ON TableA.name = TableB.name 04.WHERE TableA.id IS null 05.OR TableB.id IS null 06. 07.id name id name 08.-- ---- -- ---- 09.2 Monkey null null 10.4 Spaghetti null null 11.null null 1 Rutabaga 12.null null 3 Darth Vader 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
Full outer join To produce the set of records unique to Table A and Table B, we perform the same full outer join, thenexclude the records we don't want from both sides via a where clause.
还有一个cross join查询,这个就不用图解了:- [sql] view plaincopyprint?01.SELECT * FROM TableA 02.CROSS JOIN TableB SELECT * FROM TableA
- CROSS JOIN TableB
复制代码 这种连接查询是把每个记录都查出来的并且叠加匹配,结果12行,很多原始数据集合。如果你做这种匹配查询,你会发现为什么对于查询大数据时是一种危险的连接了。
|
|