当前位置: 首页 > 编程笔记 >

mysql中left join设置条件在on与where时的用法区别分析

高朝明
2023-03-14
本文向大家介绍mysql中left join设置条件在on与where时的用法区别分析,包括了mysql中left join设置条件在on与where时的用法区别分析的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了mysql中left join设置条件在on与where时的用法区别。分享给大家供大家参考,具体如下:

一、首先我们准备两张表来进行测试。

CREATE TABLE `a` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `name` varchar(32) DEFAULT '' COMMENT '名称',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `b` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `a_id` int(11) DEFAULT '0' COMMENT 'a表ID',
 `name` varchar(32) DEFAULT '' COMMENT '名称',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

两个表的数据如图所示:

运行下面左连接查询:

select * from a left join b on a.id = b.a_id;

我们分别在on和where后面加上条件,看看执行结果是否相同。

select * from a left join b on a.id = b.a_id and b.id > 3;

select * from a left join b on a.id = b.a_id where b.id > 3;

上面的两条语句,条件我们设置的是一样的都是b.id > 3,为什么显示结果不同。

sql语句查询的关键字顺序一般为 from > where > group by > having > order by

left join 在 from范围,on 条件会先对 left join 的右表进行筛选,筛选完后的结果 where 再进行筛选。

多个 left join 会生成一张临时表,on 条件是对 left join 右表进行条件过滤,where 条件针对最后生成的临时表进行过滤。

所以:

b.id > 3 的条件如果写在 on 后面,则是先对右边表(关联表)进行筛选,得出符合条件的行,然后主表 left join ,返回主表所有的行,右边表没匹配上的用 null 表示。

b.id > 3 的条件如果写在 where 后面,则是先主表 left join 右边表(关联表),返回所有的行,然后 where 条件再对结果进行筛选。

注意:on 后面的条件是针对右边的表(关联表),对主表没什么作用。

select * from a left join b on a.id = b.a_id and a.id > 3;

我们在on 后面添加了对主表的条件 a.id > 3,不过主表的数据仍然全部显示出来了,但是影响了右边表(关联表)的显示。

如果想要对主表进行筛选,应该把条件写在where后。

select * from a left join b on a.id = b.a_id where a.id > 3;

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

 类似资料:
  • 本文向大家介绍MySQL查询条件中放置on和where的区别分析,包括了MySQL查询条件中放置on和where的区别分析的使用技巧和注意事项,需要的朋友参考一下 导语 今天在写 SQL 的时候,遇到一个问题。需求是这样的,查询数据,按照评分倒序、近一周访问量倒序,这样进行排序。问题是常规的写法,将 day >= xxx 条件放到 where 中, 如果某些数据近一周没有访问量,那么这条数据就查不

  • 问题内容: 以下语句给出相同的结果(一个使用,另一个使用): 我只能看到在左外部联接的情况下找到“无与伦比”的情况:( 以找出从未有人发送过的礼物) 在这种情况下,它首先使用,然后使用。是否先做匹配,然后做“辅助”过滤?还是有使用vs 的更一般规则?谢谢。 问题答案: 是整个查询的一部分,是每个单独联接的一部分。 只能引用以前使用的表的字段。 如果与左表中的记录没有实际匹配,则从右表中返回一条记录

  • 问题内容: 我正在制作一个需要使用PHP 函数将日期存储在MySQL中的应用程序。 这些日期需要在MySQL中使用函数返回以小时为单位的时差进行比较,例如: 但是问题是– PHP date函数使用PHP时区设置,而该函数从MySQL服务器获取MySQL timezome。 我正在尝试解决此问题: 它仅适用于PHP。 它仅适用于PHP。 此返回为空。 这从MySQL的控制台抛出错误。 而且对于MyS

  • 本文向大家介绍Where 与 Having之间的区别,包括了Where 与 Having之间的区别的使用技巧和注意事项,需要的朋友参考一下 SQL查询中使用的两个关键字“ Where”和“ Having”都是用于根据给定条件过滤和汇总从数据库中检索到的数据。 根据两个关键字的特征,我们可以区分Where和Have,如下所示: 序号 键 where having 1 定义 SQL查询中的WHERE子

  • 我阅读了kstream.leftjoin,但没有找到确切的区别。

  • 问题内容: 受这个问题的启发,在SET NOCOUNT上有不同的看法… 我们是否应该对SQL Server使用SET NOCOUNT ON?如果没有,为什么不呢? 它的作用 编辑6,2011年7月22日 它抑制了任何DML之后的“受影响的xx行”消息。这是一个结果集,发送时,客户端必须对其进行处理。它很小,但是可以测量(请参见下面的答案) 对于触发器等,客户端将收到多个“受影响的xx行”,这将导致