在查询中可以将AND运算符、OR运算符和NOT运算符综合起来使用,但这3个运算符拥有不同的优先级,它们的优先级顺序(由高到低)如图6.6所示。
图6.6 逻辑运算符的优先级别
了解运算符的优先级,在使用时非常重要。如果不掌握运算符的优先级,在使用时就可能达不到预期的效果。下面是一个说明AND运算符和OR运算符优先级的例子。
示例06 在goods商品信息表中,应用OR运算符和AND运算符组合查询商品信息,查询出商品分类id(cat_id)为191或123,并且商品的本店价格(shop_price)大于2000元的所有商品。
输入:
输出(如图6 . 7所示):
图6.7 使用OR、AND运算符组合查询
由图6.7中的运行结果可以看出,商品分类id为191并且商品本店价格小于2000元的商品也被查询出来,显然没有达到预期的效果。出现该问题的原因在于求值的顺序,SQL在处理OR运算之前,会优先处理AND运算,所以在结果中查询出商品分类id为123且商品本店价格大于2000元的商品,以及商品分类id为191的所有商品。要解决这个问题,可以使用小括号对运算符和查询条件进行分组。
输入:
输出(如图6 . 8所示):
图6.8 使用OR、AND运算符组合查询
说明
因为小括号具有比AND、OR或NOT运算符更高的优先级,所以在WHERE子句中使用不同的逻辑运算符时,都应该使用小括号对运算符和查询条件进行明确分组。
示例07 在bookinfo图书信息表中,使用OR、AND和NOT运算符组合查询图书信息,查询出图书名称(BookName)包含“PHP”或“JSP”,并且不是机械工业出版社出版的所有图书名称、出版社(publisher)和图书作者(Writer)。
输入:
输出(如图6 . 9所示):
图6.9 使用逻辑运算符组合查询
示例08 在goods商品信息表中,使用NOT运算符和AND运算符查询商品信息,查询出商品分类id(cat_id)不是191和123的所有商品分类id、商品名称(goods_name)和商品本店价格(shop_price)。
输入:
输出(如图6 . 10所示):
图6.10 使用逻辑运算符组合查询