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 与 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

表 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 表示谁被匹配(不表示最终结果的筛选条件)。

==================

原文地址:http://www.cftea.com/c/2007/12/UIEINMQSAOVJIRP5.asp

转载于:https://www.cnblogs.com/alleon/archive/2011/02/14/1954321.html

SQL中on条件与where条件的区别(二)【转】相关推荐

  1. SQL 中的=,in,like之间的区别

    SQL中的=,in,like之间的区别: 三者都可以用来进行数据匹配 .但三者并不相同. 等号是用来查找与单个值匹配的所有数据: IN 是 用来查找与多个值匹配的所有数据: 而 LIKE用来查找与一个 ...

  2. 述 SQL 中的 distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  3. SQL中on、where、having的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.on.where.having就是在这个过程中对数据进行过滤. on是在生成中临时表之前就去作用的,它 ...

  4. SQL中ALL、Any、Some的区别

    SQL语句中存在3个著名的量词,some all 和 any All:只有当其所有数据都满足条件时,条件才成立 Any:只要有一条数据满足条件,条件就成立 Some:其中存在一些数据满足条件,作用和A ...

  5. SQL中IS NOT NULL与!=NULL的区别

    平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...

  6. 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  7. 使用动态SQL中的if标签做条件判断的几种用法和注意点

    使用中踩到的坑记录一下(大神请略过,我只是个菜菜,忽喷!!!万分感谢!!!) <mapper namespace="dynamic"><resultMap id= ...

  8. SQL中内部表和外部表的区别

    对比 内部表 外部表 建表 无需关键字 需使用external关键字 权限 删除表的元数据和内容数据 仅删除元数据 如上表所示: 内部表也就是管理表,最好仅用于存储自己的私人数据: 为防止开发过程中出 ...

  9. SQL中row_numer、rank、dense_rank的区别与用途

    Score表: Id Score 1 100 2 200 3 200 4 300 5 400 row_number,排序后增加行号 SELECT Score, row_nubmer() over(OR ...

  10. SQL 中 _和% 以及 =和like 的 区别

    staff表: =和like 区别:= 匹配一个精准值, like 可以匹配一个范围 select * from staff where name = 'bob'; select * from sta ...

最新文章

  1. HTML按钮中写事件,html 常用button事件
  2. 是时候抛弃web.xml了?
  3. SAP系统中凭证涉及日期
  4. XML与Web数据挖掘
  5. cd : cannot create temp file for here-document: No space left on device
  6. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
  7. 01 svn服务搭建
  8. mysql 设计超市订单图,JSP+MySQL校园网络超市系统的设计与实现
  9. 【Codeforces 977F】Consecutive Subsequence
  10. 工具-管理工具资源集合
  11. pytorch求范数函数——torch.norm
  12. linux常用快捷键大全
  13. 九、 Excel二维码制作和插件推荐
  14. 《点满舔狗相关技能以后,不知为何就转码了》之YOLOP,YOLOPV2推理入门教学
  15. golang--channal与select
  16. AD16显示所有元件文本注释
  17. 接触webGl(three.js)之全景(VR)看房的实现旅程总结
  18. QTextDocument
  19. 【逗老师带你学IT】Kiwi Syslog转存MySQL数据库
  20. 国际物联网展亮相中国苏州 成功促进产业链交流与合作

热门文章

  1. 游戏地图制作---Tiled使用教程
  2. 六级词汇打卡第一天(一)
  3. CCF CSP201903-2二十四点
  4. 买了基金之后要天天盯着吗?
  5. 早晨有好多学生在买早餐吃,这样好吗?家长不给孩子做饭吗?
  6. 你为什么选择考研,考研对你的意义是什么?
  7. 给初创业者的几点建议
  8. 做本地杂志如何赚钱?
  9. 揭秘富人见不得光的第一桶金都是怎么来的
  10. 函数式编程(Functional Programming)