left join inner join on 和where区别

在使用left join 时,on和where条件的区别:
1:on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2:where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
3: inner join是在生成临时表以后再进行过滤的,而且对左表和右表都起作用。

员工表:
left join inner join on 和where区别_第1张图片
部门表:
left join inner join on 和where区别_第2张图片
查询:

select * from dept left join emp on dept.deptno = emp.deptno;
+----+--------+--------+----+------+-----+--------+
| id | deptno | name   | id | name | sex | deptno |
+----+--------+--------+----+------+-----+--------+
|  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
|  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
|  3 |      3 | 市场部 |  3 | 小李 | 女  |      3 |
|  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
|  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
+----+--------+--------+----+------+-----+--------+




select * from dept left join emp on dept.deptno = emp.deptno and emp.sex ='男';
+----+--------+--------+------+------+------+--------+
| id | deptno | name   | id   | name | sex  | deptno |
+----+--------+--------+------+------+------+--------+
|  2 |      2 | 运营部 |    1 | 小张 | 男   |      2 |
|  1 |      1 | 技术部 |    2 | 小王 | 男   |      1 |
|  1 |      1 | 技术部 |    4 | 小杨 | 男   |      1 |
|  1 |      1 | 技术部 |    5 | 小郑 | 男   |      1 |
|  3 |      3 | 市场部 | NULL | NULL | NULL | NULL   |
+----+--------+--------+------+------+------+--------+

on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。显然左连接再加上新的条件:emp.sex='男’,筛选第五行记录。


Where:

 select * from dept left join emp on dept.deptno = emp.deptno where emp.
sex ='男';
+----+--------+--------+----+------+-----+--------+
| id | deptno | name   | id | name | sex | deptno |
+----+--------+--------+----+------+-----+--------+
|  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
|  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
|  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
|  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
+----+--------+--------+----+------+-----+--------+
where是生成临时表以后再进行过滤,对左右表都进行筛选。而and后面的语句如果是对left join中的左表进行过滤将不起任何作用,对右表进行过滤的话,那么左表还是返回所有行,只是右表会被过滤掉一部分行。


inner join  
   select * from dept inner join emp on dept.deptno = emp.deptno and emp.sex ='男';
+----+--------+--------+----+------+-----+--------+
| id | deptno | name   | id | name | sex | deptno |
+----+--------+--------+----+------+-----+--------+
|  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
|  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
|  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
|  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
+----+--------+--------+----+------+-----+--------+
  
select * from dept inner join emp on dept.deptno = emp.deptno where emp.sex ='男';
+----+--------+--------+----+------+-----+--------+
| id | deptno | name   | id | name | sex | deptno |
+----+--------+--------+----+------+-----+--------+
|  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
|  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
|  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
|  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
+----+--------+--------+----+------+-----+--------+
内连接inner join on and 或者on where不管是对左表还是右表进行过滤,实际都是在生成临时表以后再进行过滤的,而且对左表和右表都起作用,这与左连接left join有本质的区别!!


你可能感兴趣的:(left join inner join on 和where区别)