曲径通幽论坛

标题: LEFT JOIN 和 RIGHT JOIN [打印本页]

作者: beyes    时间: 2012-6-27 11:21
标题: LEFT JOIN 和 RIGHT JOIN
LEFT JOIN 是一种查询类型(连接查询),它全称为“左外连接”(LEFT OUT JOIN),是外连接的一种,RIGHT JOIN 的意思类似。下面以实例来演示 LEFT JOIN 和 RIGHT JOIN 的使用。

查询一个数据库中的一个名为 pw_tools 的数据表中的一部分字段结果如下:
[attach]656[/attach]



再查询一个名为 pw_member 的数据表中的一个 uid 的字段的部分信息如下:
[attach]657[/attach]


下面使用 LEFT JOIN 来连接上面两部分信息,命令如下图所示:
[attach]658[/attach]



分析上面的查询语句:
[Plain Text] 纯文本查看 复制代码
SELECT t.id,t.name,t.filename,t.descrip,u.uid FROM pw_tools t LEFT JOIN pw_members u ON t.id=u.uid;

首先需要注意的是,上面命令中的 t.id 和 u.uid 中的 t 和 u 并不是实际存在的表名,而是在此用来分别指代 pw_tools 和 pw_members 这两个表,也可以省略掉 t 和 u,那么命令可变成:
[Plain Text] 纯文本查看 复制代码
SELECT id, name, filename, descrip, uid FROM pw_tools  LEFT JOIN pw_members ON pw_tools.id=pw_members.uid;

由于 id 和 uid 的名字并不冲突,因此上面的命令还可以精简成:
[Plain Text] 纯文本查看 复制代码
SELECT id, name, filename, descrip, uid FROM pw_tools  LEFT JOIN pw_members ON id=uid;

然而实际上,像第一种方法中使用 t 和 u 来指代相应的表名比较好,因为这样写起来逻辑清晰也比较简洁。

需要注意的是,这种别名在上面的命令逻辑里是可以有效解析的,但不能像下面这么用,否则会发生找不到相应字段的错误,比如:
mysql> SELECT t.id, t.name, t.filename, t.descrip FROM pw_tools;
ERROR 1054 (42S22): Unknown column 't.id' in 'field list'

为什么解析器知道 t 和 u 能够分别指代 pw_tools 和 pw_members 这两个表呢?原因正是在于 LEFT JOIN 这个指令上。由于它的作用是连接两个表的查询的,因此从 t LEFT JOIN pw_members 这里可以知道 t 是一个不同于 pw_members 的表,又因为此处只有 pw_tools 和 pw_members 这两张表,所以 t 所表示的表只能是 pw_tools 。此外,从精简形式的命令(pw_tools  LEFT JOIN pw_members)也可以看到 LEFT JOIN 两边是连接两个表名的。同样可以知道 u 表示的是 pw_members 的表。

在命令的输出结果中,uid 列为 NULL 的地方表示这里本身就是没有该项记录,需要注意的是,uid 字段在整个 pw_members 表中远不止有上面列出的二十多条,之所以只输出二十几条,是由左表中的行数决定的。

ON t.id=u.uid 并不是说得满足 t.id=u.uid 这个条件的 uid 项才列出来,它只是个附加条件,说的是如果 t.id 如果等于 u.uid ,那么就在输出结果中的 uid 中显示其值,否则就以 NULL 来表示。

对于 RIGHT ON ,同样的道理,如下执行结果:
[attach]659[/attach]




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2