觉得很有帮助,用来学习。

即使你认为自己已对 MySQL 的 LEFT JOIN 理解深刻,但我敢打赌,这篇文章肯定能让你学会点东西!

ON 子句与 WHERE 子句的不同

一种更好地理解带有 WHERE ... IS NULL 子句的复杂匹配条件的简单方法

Matching-Conditions 与 Where-conditions 的不同

关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒

ON条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。

如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据

在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。

让我们看一个 LFET JOIN 示例:

ON 子句和 WHERE 子句有什么不同?

一个问题:下面两个查询的结果集有什么不同么?

用例子来理解最好不过了:

第一条查询使用 ON 条件决定了从 LEFT JOIN的 product_details表中检索符合的所有数据行。

第二条查询做了简单的LEFT JOIN,然后使用 WHERE 子句从 LEFT JOIN的数据中过滤掉不符合条件的数据行。

再来看一些示例:

所有来自product表的数据行都被检索到了,但没有在product_details表中匹配到记录(product.id = product_details.id AND product.amount=100 条件并没有匹配到任何数据)

同样,所有来自product表的数据行都被检索到了,有一条数据匹配到了。

使用WHERE ... IS NULL 子句的 LEFT JOIN

当你使用 WHERE ... IS NULL 子句时会发生什么呢?

如前所述,WHERE 条件查询发生在 匹配阶段之后,这意味着 WHERE ... IS NULL 子句将从匹配阶段后的数据中过滤掉不满足匹配条件的数据行。

纸面上看起来很清楚,但是当你在ON 子句中使用多个条件时就会感到困惑了。

我总结了一种简单的方式来理解上述情况:

将 IS NULL 作为否定匹配条件

使用 !(A and B) == !A OR !B逻辑判断

看看下面的示例:

让我们检查一下 ON 匹配子句:

我们可以把 IS NULL 子句 看作是否定匹配条件。

这意味着我们将检索到以下行:

就像在C语言中的逻辑 AND 和 逻辑 OR表达式一样,其操作数是从左到右求值的。如果第一个参数做够判断操作结果,那么第二个参数便不会被计算求值(短路效果)

看看别的示例:

Matching-Conditions 与 Where-conditions 之战

如果你吧基本的查询条件放在 ON子句中,把剩下的否定条件放在 WHERE子句中,那么你会获得相同的结果。

例如,你可以不这样写:

你可以这样写:

你可以不这样写:

可以这样写:

这些查询真的效果一样?

如果你只需要第一个表中的数据的话,这些查询会返回相同的结果集。有一种情况就是,如果你从 LEFT JOIN的表中检索数据时,查询的结果就不同了。

如前所属,WHERE 子句是在匹配阶段之后用来过滤的。

例如:

总附注:

如果你使用 LEFT JOIN 来寻找在一些表中不存在的记录,你需要做下面的测试:WHERE 部分的 col_name IS NULL(其中 col_name 列被定义为 NOT NULL),MYSQL 在查询到一条匹配LEFT JOIN 条件后将停止搜索更多行(在一个特定的组合键下)。

oracle join 和 where 的区别

http://blog.csdn.net/li2008xue2008ling/article/details/8456619

mysql left join on_mysql,left join on相关推荐

  1. mysql中join on_Mysql inner join on的用法实例(必看)

    语法规则 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_ ...

  2. 如何在MySQL中进行FULL OUTER JOIN?

    我想在MySQL中进行完全外部联接. 这可能吗? MySQL是否支持完全外部联接? #1楼 在SQLite中,您应该这样做: SELECT * FROM leftTable lt LEFT JOIN ...

  3. mysql的left join和inner join的效率对比,以及如何优化

    一.前言 最近在写代码的时候,遇到了需要多表连接的一个问题,初始sql类似于: select * from a left join b on a.x = b.x left join c on c.y ...

  4. MySQL第9天:MySQL索引优化分析之join查询

    MySQL索引优化分析之join查询 #编写时间:2017.3.12 #编写地点:广州 常见join查询: 1.SQL执行顺序:手写.机读.总结 (1)手写 (2)机读 (3)总结 2.join图 3 ...

  5. mysql sql left right inner join区别及效率比较

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  6. Mysql 优化器内部JOIN算法hash join On-Disk Hash Join Grace Hash Join Hybrid hash join过程详解

    Mysql 各种hash join算法讲解 hash join的概述 提到hash join之前自然得说Nest loop join,以两个表的关联为例,它其实是个双层循环,先遍历外层的表(n条),再 ...

  7. Mysql 优化器内部JOIN算法hash join Nestloopjoin及classic hash join CHJ过程详解

    Mysql hash join之classic hash join CHJ过程详解 hash join的历史 优化器里的hash join算法在SQL Server.Oracle.postgress等 ...

  8. mysql join性能_Mysql Join语法解析与性能分析

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  9. mysql语法中的join_MySQL JOIN 语法说明与 图解

    一.MySQL JOIN 分类 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记 ...

最新文章

  1. Simulink仿真---PMSM滞环电流控制仿真模型学习
  2. phpstorm 控制台运行
  3. 影响一生的职业建议 [转] - 看懂了不一定在高位,在高位的必须看懂了、信息量很大,多学学!...
  4. tomcat服务器安装
  5. Javascript 获取url参数,hash值 ,cookie
  6. Tomcat配置和Web应用程序开发
  7. 主流开源开发者工具落地阿里云,进一步提升开发者体验
  8. 测试项目:车牌检测,行人检测,红绿灯检测,人流检测,目标识别
  9. 免安装Oracle客户端使用PL/SQL连接Oracle
  10. pytho---之easydict使用
  11. 删除60天之前的elasticsearch索引
  12. 技术晨读_20160215
  13. 计算机教室网络同传及保护,用好联想网络同传系统解放信息技术教师
  14. html查看订单详情,订单详情、订单状态.html
  15. 程序设计 :题解+总结
  16. 寻宝游戏 HDU - 6289 (DP)
  17. 出现leaked ServiceConnection 的解决办法
  18. 【Valve】Dead Thread Detection Valve
  19. arduino yun 京东_ArduinoYun教程之配置Arduino Yun环境
  20. 现在啥软件都有开源,BI 呢?

热门文章

  1. 推荐 2 个用 VS Code 直接浏览 GitHub 代码!只需要 1s !
  2. linux shell字符串及字符串长度获取方式
  3. js基于lodash实现前端防抖与节流
  4. python django ansible自动化运维管理平台源码收藏
  5. Scala中的二维数组乘法
  6. 【收藏】使用命令行创建maven web项目
  7. idea安装golang插件(仅针对2017年之前的idea版本)
  8. Java设计模式之享元flyweight模式代码示例
  9. nginx 配置文件nginx.conf结构
  10. Redis命令:INCR key加1