本章讲授如何组合WHERE子句以建立功能更强的更高级的搜索条件。
组合WHERE子句
为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND
子句的方式或OR
子句的方式使用。
AND操作符
为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。
举个栗子:
表是这样的:
我们想搜索出即是厨房用具,又卖3000块的物品的名称:
SELECT product_name FROM Product WHERE product_type='厨房用具' AND sale_price=3000;
上述例子中使用了只包含一个关键字AND的语句,把两个过滤条件组合在一起。还可以添加多个过滤条件,每添加一条就要使用一个AND。
OR操作符
OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
AND运算符是满足所有条件才行,OR是满足任一条件即可。
举个栗子:
我们想筛选出所有的衣服,和售价大于6000的商品名称。
SELECT product_name FROM Product WHERE product_type='衣服' OR sale_price>6000;
计算次序
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。而解决方案也是一样的:把想一起执行的条件组合弄在一个括号里即可。
示例:
SELECT product_name FROM Product WHERE product_type='衣服' AND (product_type='厨房用具' OR sale_price>2000);
能用圆括号就用圆括号,它能消除歧义。
IN操作符
圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。 注意哦,不是范围,是把待选项都弄在了括号中。
举个栗子:
SELECT * FROM Product WHERE sale_price IN (500,6800);
上面的SQL语句会筛选出所有售价为500或者是6800的商品。
如果你认为IN操作符完成与OR相同的功能,那么你的这种猜测是对的。
IN操作符的优点:
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN操作符一般比OR操作符清单执行更快。
- IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。(不懂不要紧,日后再说)
NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
SELECT * FROM Product WHERE sale_price NOT IN (500,6800);
为什么使用NOT?对于简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合使用时,NOT使找出与条件列表不匹配的行非常简单。