内连接里,查询条件写在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子句中,那么必须符合这个条件的记录才会被查询出来,这样就不是保全所有左表的数据了。