-- join从句可以分为5种:内连接:inner join;全外连接:full outer;左外连接:left outer;右外连接:right outer;交叉连接:cross
1、inner join
考虑如下的两张表(user1,user2):
+----+-----------+----------+
| id | user_name | over |
+----+-----------+----------+
| 1 | 孙悟空 | 斗战胜佛 |
| 2 | 沙僧 | 金身罗汉 |
| 3 | 唐僧 | 功德佛 |
| 4 | 猪八戒 | 净坛使者 |
+----+-----------+----------+
+----+-----------+--------+
| id | user_name | over |
+----+-----------+--------+
| 1 | 孙悟空 | 成佛 |
| 2 | 牛魔王 | 被降伏 |
| 3 | 蛟魔王 | 被降伏 |
| 4 | 鹏魔王 | 被降伏 |
| 5 | 狮驼王 | 被降伏 |
+----+-----------+--------+
内连接得到两张表的公共部分:
mysql> select a.`user_name`,a.`over`,b.`over`
-> from user1 a
-> inner join user2 b
-> on a.`user_name`=b.`user_name`;
+-----------+----------+------+
| user_name | over | over |
+-----------+----------+------+
| 孙悟空 | 斗战胜佛 | 成佛 |
+-----------+----------+------+
1 row in set (0.01 sec)
2、左外连接left join,得到user1表的全部:
mysql> select a.`user_name`,a.`over`,b.`over`
-> from user1 a
-> left join
-> user2 b
-> on a .`user_name`=b.`user_name`;
+-----------+----------+------+
| user_name | over | over |
+-----------+----------+------+
| 孙悟空 | 斗战胜佛 | 成佛 |
| 沙僧 | 金身罗汉 | NULL |
| 唐僧 | 功德佛 | NULL |
| 猪八戒 | 净坛使者 | NULL |
+-----------+----------+------+
4 rows in set (0.00 sec)
通过is null,可以查询到只存在与user1表中的数据。right join类似。
3、全连接full join,获取两个表的全部数据。Mysql中没有提供full join的操作,但是可以通过union all结合left join和right join来实现。
mysql> select a.`user_name`,a.`over`,b.`over`
-> from user1 a left join user2 b
-> on a.`user_name`=b.`user_name`
-> union all
-> select b.`user_name`,b.`over`,a.`over`
-> from user1 a right join user2 b
-> on a.`user_name`=b.`user_name`;
+-----------+----------+----------+
| user_name | over | over |
+-----------+----------+----------+
| 孙悟空 | 斗战胜佛 | 成佛 |
| 沙僧 | 金身罗汉 | NULL |
| 唐僧 | 功德佛 | NULL |
| 猪八戒 | 净坛使者 | NULL |
| 孙悟空 | 成佛 | 斗战胜佛 |
| 牛魔王 | 被降伏 | NULL |
| 蛟魔王 | 被降伏 | NULL |
| 鹏魔王 | 被降伏 | NULL |
| 狮驼王 | 被降伏 | NULL |
+-----------+----------+----------+
9 rows in set (0.00 sec)
4、交叉连接(笛卡尔连接)cross join,做交叉乘积,注意此时不需要指定on条件。
mysql> select a.`user_name`,a.`over`,b.`over` from user1 a cross join user2 b;
+-----------+----------+--------+
| user_name | over | over |
+-----------+----------+--------+
| 孙悟空 | 斗战胜佛 | 成佛 |
| 沙僧 | 金身罗汉 | 成佛 |
| 唐僧 | 功德佛 | 成佛 |
| 猪八戒 | 净坛使者 | 成佛 |
| 孙悟空 | 斗战胜佛 | 被降伏 |
| 沙僧 | 金身罗汉 | 被降伏 |
| 唐僧 | 功德佛 | 被降伏 |
| 猪八戒 | 净坛使者 | 被降伏 |
| 孙悟空 | 斗战胜佛 | 被降伏 |
| 沙僧 | 金身罗汉 | 被降伏 |
| 唐僧 | 功德佛 | 被降伏 |
| 猪八戒 | 净坛使者 | 被降伏 |
| 孙悟空 | 斗战胜佛 | 被降伏 |
| 沙僧 | 金身罗汉 | 被降伏 |
| 唐僧 | 功德佛 | 被降伏 |
| 猪八戒 | 净坛使者 | 被降伏 |
| 孙悟空 | 斗战胜佛 | 被降伏 |
| 沙僧 | 金身罗汉 | 被降伏 |
| 唐僧 | 功德佛 | 被降伏 |
| 猪八戒 | 净坛使者 | 被降伏 |
+-----------+----------+--------+
20 rows in set (0.00 sec)