SQL语句where子句同时包含and和or/left join多个表的情况

当sql语句中where子句同时包含and和or

例子所用表如下:

dep表:

SQL语句where子句同时包含and和or/left join多个表的情况_第1张图片

emp表:

SQL语句where子句同时包含and和or/left join多个表的情况_第2张图片

salary表:

SQL语句where子句同时包含and和or/left join多个表的情况_第3张图片
今天笔试的时候被一个两次left join的sql语句难倒了我,所以通过例子来验证一下,然后又发现where子句中同时and和or的情况,所以来此宝地记录总结一下。

测试用sql语句:

SELECT * from 
(SELECT e.ename,d.dname,s.salary from emp2 e LEFT JOIN dep d on e.did = d.did 
LEFT JOIN salary s on e.eid = s.eid) t4
WHERE t4.ename='李三' OR t4.dname='第三部' and t4.salary>8000 ;

首先看一下两个left join的查询结果:

SQL语句where子句同时包含and和or/left join多个表的情况_第4张图片

此时WHERE t4.ename=‘李三’ OR t4.dname=‘第三部’ and t4.salary>8000 ; 运行整个sql语句的查询结果:

SQL语句where子句同时包含and和or/left join多个表的情况_第5张图片
结果即为查询dname='第三部’且salary>8000的记录 或者姓名为’李三’的记录;

当把where子句改成

SELECT * from 
(SELECT e.ename,d.dname,s.salary from emp2 e LEFT JOIN dep d on e.did = d.did 
LEFT JOIN salary s on e.eid = s.eid) t4
WHERE (t4.ename='李三' OR t4.dname='第三部') and t4.salary>8000 ;

SQL语句where子句同时包含and和or/left join多个表的情况_第6张图片
即为(ename='李三’且salary>8000) 或者 (dname='第三部且salary>8000)

可见,当 where t4.ename=‘李三’ or t4.dname=‘第三部’ and t4.salary>8000 时 and比or优先,先进行and逻辑运算。

文章排版比较乱,例子也有点复杂,见谅…
本文仅为个人记录总结所用,如有错误/侵犯,感谢指出/联系我删除。

你可能感兴趣的:(SQL)