表数据:
情景需求:假如需要列出价格为10美元及以上,且由DLL01或BRS01制造的所有产品。
SQL写法一:
此种写法sql语句的执行顺序是先查询出由DLL01和BRS01制造的所有产品,也就是小括号里面的
sql,其查询结果为:
然后mysql自动再以此表为基础查询prod_price>10的行,其查询结果为:
以上是第一种sql写法,当然也有第二种,也是更为简便的一种。
SQL写法二:(也是or子句和and子句相结合的写法)
此种写法是or子句和and子句相结合的写法,or子句和and子句的顺序可以改变,或是这样:
你可能要问,or子句为什么要带小括号呢?
因为SQL(像多数语言一样)在处理or操作符前,优先处理and操作,而且小括号比and或or操作的更有优先权,所以在此例中,sql运行时先过滤的时小括号内的or条件,这事,sql语句才符合我们的要求。如果不带小括号:
将会出现下面这种结果:
此时SQL理解会先执行where后的vend_id=‘DLL01’ ,然后执行prod_price>10,也就是说sql只执行了这两个条件,并且这两个条件是or的关系,因为
这个代码查询出来的结果也是上面那个结果。
但如果sql写成这样:
其查询结果则是:
说明sql先执行的是prod_price=10 AND vend_id =‘DLL01’,然后执行的是OR vend_id=‘BRS01’。
从这个事例也可以说明一个问题:where条件过滤时,and,or,()这三个的执行顺序是:小括号内语句的先执行,然后是and子句,然后是or子句。
*总结与提示:*在where子句中使用小括号。
任何时候使用具有and和or操作符的where子句,都应该使用小括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。
以上是本人学习《SQL必知必会》的学习笔记,表数据也是来源于此书。
本文知识笔记如有错误之处,还请诸位不吝赐教!