常用的表连接

在使用关系型数据库时,多表联查是很常见的事情,在关联两个表时按大类可分为内连接和外连接,而外连接又有左外连接,右外连接和全外连接之分。在实际工作中使用最多的要属左外连接和内连接,下面对这两种方式做简单介绍。

内连接用inner join表示,也可简写成join;左连接用left join表示。

假设语句为A join B on condition,内连接执行过程可用如下伪代码表示:

for a in table A:
    for b in table B:
        if condition(a, b) holds:
            AddToResult(a, b)

即对表A中的每一条记录a,遍历表B中的各条记录,检查连接条件是否成立,如果成立,则将(a,b)构成一条大的记录加到结果集中。

同样地,假设语句为A left join B on condition,左连接执行过程可表示为:

for a in table A:
    found = false
    for b in table B:
        if condition(a, b) holds:
            AddToResult(a, b)
            found = true
    if not found:
        AddToResult(a, NULL)

易见,左连接与内连接的区别在于:对于主表中的某条记录,如果副表中不存在作何与之满足连接条件的记录,那么将会在结果集中插入一条仅含主表信息的记录,对应的副表信息为NULL。

下面通过一个例子加以说明:

mysql> select * from t1;
+------+--------+
| id   | name   |
+------+--------+
|    1 | chenfy |
|    2 | maq    |
|    2 | zhumy  |
|    5 | zhaol  |
|    4 | zhongy |
+------+--------+

mysql> select * from t2;
+------+--------+
| id   | name   |
+------+--------+
|    1 | chenfy |
|    2 | mac    |
|    3 | dengc  |
|    5 | zhaozb |
|    5 | zhangl |
+------+--------+

mysql> select t1.id, t1.name, t2.id, t2.name from t1 join t2 on t1.id=t2.id;
+------+--------+------+--------+
| id   | name   | id   | name   |
+------+--------+------+--------+
|    1 | chenfy |    1 | chenfy |
|    2 | maq    |    2 | mac    |
|    2 | zhumy  |    2 | mac    |
|    5 | zhaol  |    5 | zhaozb |
|    5 | zhaol  |    5 | zhangl |
+------+--------+------+--------+

mysql> select t1.id, t1.name, t2.id, t2.name from t1 left join t2 on t1.id=t2.id;
+------+--------+------+--------+
| id   | name   | id   | name   |
+------+--------+------+--------+
|    1 | chenfy |    1 | chenfy |
|    2 | maq    |    2 | mac    |
|    2 | zhumy  |    2 | mac    |
|    5 | zhaol  |    5 | zhaozb |
|    5 | zhaol  |    5 | zhangl |
|    4 | zhongy | NULL | NULL   |
+------+--------+------+--------+
Table of Contents