对于如下的两个表user1和user2:
+----+-----------+----------+
| id | user_name | over |
+----+-----------+----------+
| 1 | 孙悟空 | 齐天大圣 |
| 2 | 沙僧 | 金身罗汉 |
| 3 | 唐僧 | 功德佛 |
| 4 | 猪八戒 | 净坛使者 |
+----+-----------+----------+
+----+-----------+--------+
| id | user_name | over |
+----+-----------+--------+
| 1 | 孙悟空 | 成佛 |
| 2 | 牛魔王 | 被降伏 |
| 3 | 蛟魔王 | 被降伏 |
| 4 | 鹏魔王 | 被降伏 |
| 5 | 狮驼王 | 被降伏 |
+----+-----------+--------+
如果我们要获取user1中所有人在user1和user2中的over字段,最直接的做法之一:
mysql> select a.user_name,a.over,(select b.over from user2 b where a.user_name=b.user_name) as over2 from user1 a;
+-----------+----------+-------+
| user_name | over | over2 |
+-----------+----------+-------+
| 孙悟空 | 齐天大圣 | 成佛 |
| 沙僧 | 金身罗汉 | NULL |
| 唐僧 | 功德佛 | NULL |
| 猪八戒 | 净坛使者 | NULL |
+-----------+----------+-------+
4 rows in set (0.00 sec)
这种方式,我们需要将user1的user_name字段和每一个user2的user_name字段去匹配,如果数据量非常大的时候,相对耗费的时间也会非常长。
如果我们通过join子句来优化该查询:
mysql> select a.user_name,a.over,b.over as over2 from user1 a left join user2 b on a.user_name=b.user_name from user1 a;
+-----------+----------+-------+
| user_name | over | over2 |
+-----------+----------+-------+
| 孙悟空 | 齐天大圣 | 成佛 |
| 沙僧 | 金身罗汉 | NULL |
| 唐僧 | 功德佛 | NULL |
| 猪八戒 | 净坛使者 | NULL |
+-----------+----------+-------+
4 rows in set (0.00 sec)