在join中,on和where的区别

https://www.cnblogs.com/zzdbullet/p/10405540.html

https://blog.csdn.net/qq_39429962/article/details/83994190

left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。

right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。

inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。

full join:外连接,返回两个表中的行:left join + right join。

cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

join on:on后边写条件,以后边的条件为准生成一个临时表存储数据。

join where :不会生成中间表。

on和where的区别:

  1. 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面

  2. 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。

两个表在,join时,首先做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤。

在使用left jion时,on和where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

先准备两张表:

image

inner join:

image
image

结果没有区别,前者是先求笛卡尔积然后按照on后面的条件进行过滤,后者是先用on后面的条件过滤,再用where的条件过滤。

left join:

image
image

在on为选择条件时,id为4的记录还在,这是由left join的特性决定的,使用left join时on后面的条件只对右表有效(可以看到右表的id=4的记录为NULL)

在where为选择条件时,where过滤掉了左表中的内容。

原文:

https://blog.csdn.net/u013468917/article/details/61933994

https://www.cnblogs.com/guanshan/articles/guan062.html

https://blog.csdn.net/qq_34778597/article/details/82967016

你可能感兴趣的:(在join中,on和where的区别)