SQL joins操作图:

SQL-Joins

设计两张表A和B,记录如下:

1

2

3

4

5

6

id name       id  name

-- ----       --  ----

1  Pirate     1   Rutabaga

2  Monkey     2   Pirate

3  Ninja      3   Darth Vader

4  Spaghetti  4   Ninja

1. 内联合(inner join)只生成同时匹配表A和表B的记录集

1

2

3

4

5

6

7

8

SELECT * FROM TableA

INNER JOIN TableB

ON TableA.name = TableB.name

 

id  name       id   name

--  ----       --   ----

1   Pirate     2    Pirate

3   Ninja      4    Ninja

图解如下:

2. 全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null

1

2

3

4

5

6

7

8

9

10

11

12

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

图解如下:

 

3. 左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null

1

2

3

4

5

6

7

8

9

10

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

图解如下:

 

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。

1

2

3

4

5

6

7

8

9

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唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。

1

2

3

4

5

6

7

8

9

10

11

12

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

图解如下: