解析mysql left( right ) join使用on与where筛选的差异

今天做项目遇到了一个问题,是以前没注意的。我用的是Spring MVC+ Hibernate
JPA + MySQL数据库。在插入数据后SQL执行日志中会多出一条select语句:复制代码 代码如下:Hibernate: insert into
click_statstic (logDate, memoId, src, typeId) values (?, ?, ?,
?)Hibernate: select
last_insert_id()表中有个主键是自增列。可是在以往的项目中,没发现有这样的问题。于是在网上各种找也找不到原因。心想可能是配置问题。

有这样的一个问题mysql查询使用mysql中left(right)join筛选条件在on与where查询出的数据是否有差异。
可能只看着两个关键字看不出任何的问题。那我们使用实际的例子来说到底有没有差异。

最终在persistence.xml配置文件中找到了这样一条配置:复制代码 代码如下:property
name=”hibernate.temp.use_jdbc_metadata_defaults” value=”false”
/把这条配置删除就没有了多余的select语句。具体原因和这样做的目的是什么不得而知。如果有知道的朋友请分享下~多谢了。

例如存在两张表结构
表结构1
复制代码 代码如下:
drop table if EXISTS A; 
CREATE TABLE A ( 
  ID int(1) NOT NULL, 
  PRIMARY KEY  (ID) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

表结构2 复制代码 代码如下:
drop table if EXISTS B; 
CREATE TABLE B ( 
  ID int(1) NOT NULL, 
  PRIMARY KEY  (ID) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

表一插入数据 复制代码 代码如下:
insert into A values ( 1 ); 
insert into A values ( 2 ); 
insert into A values ( 3 ); 
insert into A values ( 4 ); 
insert into A values ( 5 ); 
insert into A values ( 6 ); 

表二插入数据 复制代码 代码如下:
insert into B values ( 1 ); 
insert into B values ( 2 ); 
insert into B values ( 3 ); 

完成后A,B表数据如下:

图片 1

语句一 复制代码 代码如下:
select  A.ID as AID, B.ID as BID   from A left join B on A.ID = B.ID
where B.ID<3

语句二 复制代码 代码如下:
select  A.ID as AID, B.ID as BID  from A left join B on A.ID = B.ID and 
B.ID<3 

以上两个语句的查询结果是否一致。
反正一切我是没有注意到这两个查询存在任何差异的【以前也没这么写过sql】。
我们看看实际结果
语句一的查询结果

图片 2

 

语句二的查询结果为:

 

图片 3

 

发现两个查询存在差异。

为什么会存在差异,这和on与where查询顺序有关。

我们知道标准查询关键字执行顺序为
from->where->group by->having->order
by[ 记得不是很清楚呢]

left join 是在from范围类所以
先on条件筛选表,然后两表再做left join。

而对于where来说在left
join结果再次筛选。