外连接和内连接join条件

581 阅读1分钟

内连接里,查询条件写在on子句或者where子句,效果相同

SELECT e.ename, d.dname 
FROM t_emp e
JOIN t_dept d ON e.deptno = d.deptno 
AND d.deptno = 10

因为该sql语句是内连接,所以on子句中的所有条件必须都满足才能查询出数据

SELECT e.ename, d.dname 
FROM t_emp e
JOIN t_dept d ON e.deptno = d.deptno 
WHERE d.deptno = 10

上面两个sql语句执行结果是相同的

外连接里,查询条件写在on子句或者where子句,效果不同

SELECT e.ename, d.dname 
FROM t_emp e
LEFT JOIN t_dept d ON e.deptno = d.deptno 
AND d.deptno = 10

t_emp表是左表,t_dept表是右表,左连接会保留左表所有的记录跟右表进行连接,右表如果有符合条件的记录,就会拿这样的记录跟左表进行连接,如果右表没有符合条件的记录,那么右表就会用null值与左表进行连接,所以说在外连接的on子句中写的这个条件,并没有强求一定符合条件才能查询出记录,不符合连接条件同样会查询出记录。

SELECT e.ename, d.dname 
FROM t_emp e
LEFT JOIN t_dept d ON e.deptno = d.deptno 
WHERE d.deptno = 10

如果把条件写在where子句中,那么必须符合这个条件的记录才会被查询出来,这样就不是保全所有左表的数据了。