发布网友 发布时间:2022-04-13 10:47
共2个回答
热心网友 时间:2022-04-13 12:17
SELECT distinct * FROM EMP E LEFT JOIN EMP M ON E.MGR=M.EMPNO and E.empno is null
这句话里, E.MGR=M.EMPNO and E.empno is null,是作为表连接的条件。即E在M中是否能找到记录的条件,如果能找到,则使用M.*的都是有值的,如果找不到则M.*都是空。
由于是LEFT JOIN,所以从查询结果的行数上看,如果M中没有找到,或者仅找到一个匹配的,查询结果的行数都等于E表中行数。
所以这个SQL执行完就是所有的记录。
and改成where后,先执行: FROM EMP E LEFT JOIN EMP M ON E.MGR=M.EMPNO
会找到所有员工对应的经理,包括经理。
然后执行WHERE E.empno is null 对刚才的结果进行过滤,此时E.EMPNO是所有员工,查询结果的这个值都是非空,所以没有结果
SQL99的标准左外连接:
SELECT * FROM EMP E LEFT JOIN EMP M ON E.MGR = M.EMPNO
WHERE M.EMPNO IS NOT NULL
你就差了一步而已
追问你说的答案不对,楼下那位对的,是我把做外联接定义忘了,a join b 是表a的数据匹配出来,b表虚拟出NULL值,所以应该对b表进行过滤正确是SELECT distinct * FROM EMP M LEFT JOIN EMP E ON E.MGR=M.EMPNO WHERE E.empno is null谢谢你热心助人
。
热心网友 时间:2022-04-13 13:35
外连接针对的是连接的连接,即连接表时on后面的条件。将条件放在on之后和放在where之后是完全不同的:条件放在where之后,是选出的记录必须符合的条件。