msyql-join
一. join
有A和B,两张表,字段如下:
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja
下面讨论两张表的各种连接:
1.1 Inner join
产生的结果集中,是A和B的交集
SELECT * FROM TableA INNER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 Ninja
1.2 Full outer join
Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。
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
1.3 Left outer join
Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以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
1.4 LEFT OUTER JOIN ... 结合where
产生在A表中有而在B表中没有的集合。
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
1.5 FULL OUTER JOIN ... 结合where
产生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
1.6 cross join笛卡尔积
SELECT * FROM TableA CROSS JOIN TableB

浙公网安备 33010602011771号