目录
组合WHERE 子句
AND操作符
OR操作符
求值顺序
在WHERE 子句中使用圆括号
IN 操作符
为什么要使用IN 操作符?
NOT 操作符
也可使用<>操作符来完成。
说明:MariaDB 中的NOT
组合WHERE 子句
AND操作符
要通过不止一个列进行过滤,可以使用AND 操作符给WHERE 子句附加条件。
OR操作符
OR 操作符与AND 操作符正好相反,它指示DBMS 检索匹配任一条件的行。事实上,许多DBMS 在OR WHERE 子句的第一个条件得到满足的情况下,就不再计算第二个条件了(在第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来)。
求值顺序
SQL(像多数语言一样)在处理OR 操作符前,优先处理AND 操作符。
圆括号具有比AND 或OR 操作符更高的求值顺序,所以DBMS首先过滤圆括号内的OR条件。
在WHERE 子句中使用圆括号
任何时候使用具有AND 和OR 操作符的WHERE 子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。
IN 操作符
WHERE 子句中用来指定要匹配值的清单的关键字,功能与OR 相当。
IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN 取一组由逗号分隔、括在圆括号中的合法值。
你可能会猜测 IN 操作符完成了与 OR 相同的功能,恭喜你猜对了!
为什么要使用IN 操作符?
其优点如下。
在有很多合法选项时,IN 操作符的语法更清楚,更直观。
在与其他AND 和OR 操作符组合使用IN 时,求值顺序更容易管理。
IN 操作符一般比一组OR 操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
IN 的最大优点是可以包含其他SELECT 语句,能够更动态地建立WHERE 子句。第11 课会对此进行详细介绍。
NOT 操作符
WHERE 子句中用来否定其后条件的关键字。
WHERE 子句中的NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为NOT 从不单独使用(它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。
NOT 关键字可以用在要过滤的列前,而不仅是在其后。
SELECT prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name;
也可使用<>操作符来完成。
SELECT prod_name FROM Products WHERE vend_id <> 'DLL01' ORDER BY prod_name;
在实际的工作中,更加倾向于 <> 的写法,逻辑更加的清晰明了,也更加简洁。
为什么使用NOT?对于这里的这种简单的WHERE 子句,使用NOT 确实没有什么优势。但在更复杂的子句中,NOT 是非常有用的。例如,在与IN 操作符联合使用时,NOT 可以非常简单地找出与条件列表不匹配的行。
说明:MariaDB 中的NOT
MariaDB 支持使用NOT 否定IN、BETWEEN 和EXISTS 子句。大多数DBMS 允许使用NOT 否定任何条件。