MYSQL on和where的区别

多表查询语法结构:
table_reference {[INNER] JOIN | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON conditional_expr

在多表查询时,ON和where都表示筛选条件,on先执行,where后执行。
区别:
外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件。
如:

SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.`deptno` AND e.`deptno`=40;

MYSQL on和where的区别_第1张图片

SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.`deptno` WHERE e.`deptno`=40;

MYSQL on和where的区别_第2张图片

来我们分析一下为什么会造成以上两种不同的结果。
on是生成临时表时使用的条件,上面我们采用的是左外连接,左外连接是以左表为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。也就是说emp是左表,dept是右表,条件是emp的deptno与dept中的deptno相等且为40时才连接,但emp表中不存在deptno为40的记录,也就是右表没有符合条件的记录,而记录不足的地方均用NULL来补充。
而where是在临时表生成好后,再对临时表进行过滤。也就是说emp表与dept的连接条件只是emp的deptno与dept中的deptno相等,然后在对生成的临时表进行筛选,由于emp表中不存在deptno为40的记录,所以未找到符合条件的记录。

由于内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所有在内连接时on和where的结果是相同的。而左外、右外与全连接由于它的特殊性,on和where造成的差别大小取决于表达式和表中的数据。

你可能感兴趣的:(MYSQL on和where的区别)