SELECT *
FROM a LEFT JOIN b ON a.id=b.id AND a.id=1 AND b.id=2 这里 ON 中有三个条件,其意义分别为:
可以看到 a.id=b.id 指定如何匹配;a.id=1 表示谁被匹配(不表示最终结果的筛选条件);b.id=2 表示用谁去匹配(不表示最终结果的筛选条件)。 实例 表 a: id v
---- 1 a1 2 a2 3 a3 4 a4 5 a5 表 b: id v
---- 1 b1 2 b2 3 b3 4 b4 5 b5 SQL 语句: SELECT *
FROM a LEFT JOIN b ON a.id=b.id AND a.id=1 AND b.id=2 结果: 1 a1 NULL NULL
2 a2 NULL NULL 3 a3 NULL NULL 4 a4 NULL NULL 5 a5 NULL NULL 为什么会有这样的结果呢,据条件可知:a 表只有第一条记录被匹配,后面的记录都不被匹配;b 表只拿第二条记录去匹配 a 表的第二条记录,可是 a 表的第二条记录不参加匹配,所以 b 表结果全部为 NULL。 我们再看看把条件写在 WHERE 中的结果 SQL 语句: SELECT *
FROM a LEFT JOIN b ON a.id=b.id WHERE a.id=1 AND b.id=2 结果: 结果是零条记录,什么也没有,本来连接后结果为: 1 a1 1 b1
2 a2 2 b2 3 a3 3 b3 4 a4 4 b4 5 a5 5 b5 可是并没有符合 a.id=1 且 b.id=2 的记录,所以为零条记录。 再回顾一下 WHERE 中的三个条件。下面的示例演示了:a 表中只有 a.id>1 的记录才参加匹配(但要全部选出来,因为它是左连接的左边的表),b 表中只有 b.id=2 的记录才参加匹配(只有它才有被选出来的机会,因为它是左连接的右边的表) SQL 语句: SELECT *
FROM a LEFT JOIN b ON a.id=b.id AND a.id>1 AND b.id=2 结果: 1 a1 NULL NULL
2 a2 2 b2 3 a3 NULL NULL 4 a4 NULL NULL 5 a5 NULL NULL RIGHT JOIN RIGHT JOIN 和 LEFT JOIN 类似,只是颠倒一下“主表”和“辅表”,如下 SQL 语句 SELECT *
FROM a RIGHT JOIN b ON a.id=b.id AND a.id=1 AND b.id=2 a.id=1 表示用谁去匹配(不表示最终结果的筛选条件);b.id=2 表示谁被匹配(不表示最终结果的筛选条件)。 |
|
来自: kittywei > 《sqlserver》