外连接 ON 条件的三个作用及与 WHERE 的区别
来源:互联网 发布:制作请帖的软件 编辑:程序博客网 时间:2024/04/30 13:34
SELECT *
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=1 AND b.id=2
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 与 b.id 相同的记录才进行匹配。
- a.id=1 符合这个条件的记录被另一个表匹配。
- b.id=2 符合这个条件的记录去匹配另一个表。
可以看到 a.id=b.id 指定如何匹配;a.id=1 表示谁被匹配(不表示最终结果的筛选条件);b.id=2 表示用谁去匹配(不表示最终结果的筛选条件)。
实例
表 a:
id v
----
1 a1
2 a2
3 a3
4 a4
5 a5
----
1 a1
2 a2
3 a3
4 a4
5 a5
表 b:
id v
----
1 b1
2 b2
3 b3
4 b4
5 b5
----
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
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
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
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
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
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
2 a2 2 b2
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
另外我又试了其它几个sql语句结果如下:
SQL 语句:
SELECT a.*,b.*
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=1
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=1
结果:
1 a1 1 b1
2 a2 NULL NULL
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
SQL 语句:
SELECT a.*,b.*
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=18
结果:FROM a LEFT JOIN b ON a.id=b.id
AND a.id=18
1 a1 NULL NULL
2 a2 NULL NULL
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
SQL 语句:
SELECT a.*,b.*
FROM a LEFT JOIN b ON a.id=b.id
AND b.id=2
结果:FROM a LEFT JOIN b ON a.id=b.id
AND b.id=2
1 a1 NULL NULL
2 a2 2 b2
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
SQL 语句:
SELECT a.*,b.*
FROM a LEFT JOIN b ON a.id=b.id
AND b.id=18
结果:FROM a LEFT JOIN b ON a.id=b.id
AND b.id=18
1 a1 NULL NULL
2 a2 NULL NULL
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
SQL 语句:
SELECT a.*,b.*
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=2 AND b.id=2
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=2 AND b.id=2
结果:
1 a1 NULL NULL
2 a2 2 b2
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
SQL 语句:
SELECT a.*,b.*
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=18 AND b.id=2
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=18 AND b.id=2
结果:
1 a1 NULL NULL
2 a2 NULL NULL
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
SQL 语句:
SELECT a.*,b.*
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=2 AND b.id=18
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=2 AND b.id=18
结果:
1 a1 NULL NULL
2 a2 NULL NULL
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
FROM a RIGHT JOIN b
- 外连接 ON 条件的三个作用及与 WHERE 的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- SQL:外连接on条件与where条件的区别
- SQL:外连接on条件与where条件的区别
- 外连接 ON 条件的三个作用
- on条件与where条件的区别
- on条件与where条件的区别
- on条件与where条件的区别
- on条件与where条件的区别
- on条件与where条件的区别
- on条件与where条件的区别
- on条件与where条件的区别
- 右外连接ON 与 WHERE 的限制作用
- 外联结的ON条件与WHERE条件的区别
- SQL中on条件与where条件的区别&&on、where、having的区别
- SQL中on条件与where条件的区别
- NDK Build 参数
- javascript 遍历一个对象object 有时会用到(转自:http://blog.csdn.net/peng_wu01/article/details/5569247)
- UPDATE、DELETE 语句中的子查询
- C++ Vector 使用心得
- 您绝对想不到的 SQL 子查询错误
- 外连接 ON 条件的三个作用及与 WHERE 的区别
- select into 和 insert into select 两种表复制语句
- 使用VS2005网站管理工具的方法
- asp.net2.0数据访问工具--DataSource
- 静态视图 动态视图 区别 定义
- zend framework 多语言配置及实例
- 别为iptables日志付出太多-一种Linux防火墙优化方法
- Android中Activity与Service如何通过广播交换复杂对象数据
- 普通table表格样式及代码大全(全)