最近学习了数据库的各种join,在这里总结下。
先准备两个表,我的表是这样的:
TableA:
id name -- ---- 1 Pirate 2 Monkey 3 Ninja 4 Spaghetti
TableB:
id name -- ---- 1 Rutabaga 2 Pirate 3 Darth Vader 4 Ninja
总共有inner,full,left,right,cross这几种join,下面就一种一种的写。
1. inner
语句:
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
结果:
图示:+------+--------+------+--------+| id | name | id | name |+------+--------+------+--------+| 1 | Pirate | 2 | Pirate || 3 | Ninja | 4 | Ninja |+------+--------+------+--------+
2. left就是两表的交集部分。
语句:
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 |
+------+-----------+------+--------+
图示:
3. right表A的全部和表B中与A匹配部分,空出的地方用NULL补上。
这个和left差不多,就是表A的全部和表B中与A匹配部分,空出的地方用NULL补上,不累述了。
4. full
语句:
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
但是这样的语句在mysql中不行,会报错,因为mysql压根不支持。在mysql中可以通过 LEFT JOIN + UNION + RIGHT JOIN 的方式 来实现。这样写:
SELECT * FROM tableA LEFT JOIN tableB ON TableA.name=TableB.name UNION SELECT * FROM TableA RIGHT 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 |
+------+-----------+------+-------------+
图示:
就是两表合集。空出的部分用NULL补上。
5. cross
语句:
SELECT * FROM TableA CROSS JOIN TableB
结果:
+------+-----------+------+-------------+
| id | name | id | name |
+------+-----------+------+-------------+
| 1 | Pirate | 1 | Rutabaga |
| 2 | Monkey | 1 | Rutabaga |
| 3 | Ninja | 1 | Rutabaga |
| 4 | Spaghetti | 1 | Rutabaga |
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | 2 | Pirate |
| 3 | Ninja | 2 | Pirate |
| 4 | Spaghetti | 2 | Pirate |
| 1 | Pirate | 3 | Darth Vader |
| 2 | Monkey | 3 | Darth Vader |
| 3 | Ninja | 3 | Darth Vader |
| 4 | Spaghetti | 3 | Darth Vader |
| 1 | Pirate | 4 | Ninja |
| 2 | Monkey | 4 | Ninja |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | 4 | Ninja |
+------+-----------+------+-------------+
这个不知道怎么图示了,结果是乘积关系,表B中的每一个和表A的全部组合一次,数量是两者数据之积。