目录
7.1: 组合where子句
为了进行更强的过滤控制,可以使用两种方式:以and子句的方式或or子句的方式使用;
操作符(operator):
- 用来联接或改变where子句中的子句的关键字。也称为逻辑操作符(logical operator);
7.1.1 :and操作符
为了通过不止一个列进行过滤,可使用and操作符给where子句附加条件;
例子:检索由供应商1003制造且价格小于等于10美元的所有产品的名称和价格;
这条select语句中的where子句包含两个条件,并且用and关键字联结它们。两个满足且呈现出检索结果,不满足则不被检索;
select prod_id, prod_price, prod_name from products
where vend_id = 1003 and prod_price <= 10;
and :
- 用在where子句中的关键字,用来指示检索满足所有给定的条件的行;
7.1.2 : or操作符
or操作符与and操作符不同,它指示Mysql检索匹配任一条件的行;
例子:
此sql语句检索由任一个指定供应商制造(1002或1003)的所有产品的产品名和价格。
(and:两个满足且检索,否则不被检索;or :任意一个满足,且满足)
select prod_name, prod_price from products
where vend_id = 1002 or vend_id = 1003;
or :
- where 子句中使用关键字,用来表示检索匹配任一给定条件的行;
7.1.3:计算次序
where 可包含任意数目的and和or操作符。允许两者结合进行复杂和高级的过滤;
例子:
列出价格为10美元(含)以上且由1002或1003制造的所有产品;
select prod_name, prod_price from products
where vend_id = 1002 or vend_id = 1003 and prod_price >= 10;
SQL在处理or操作符前,优先处理and操作符。因此上述代码会呈现出不符合要求的数据;SQL理解为:供应商1003制造的任何价格10美元(含)以上的产品,或者由供应商1002制造的任何产品,而不管其价格如何;
正确的使用方法,使用圆括号明确地分组相应的操作符:
select prod_name, prod_price from products
where (vend_id = 1002 or vend_id = 1003)
and prod_price >= 10;
由于and操作符高的计算次序优先于or,所以使用圆括号使计算更准确。
where子句中使用圆括号:
- 任何时候使用具有and和or操作符的where子句,都应该使用圆括号明确地分组操作符;
7.2 : IN 操作符
圆括号在where子句中还有另外一种用法,in操作符用来指定条件范围,范围中的每个条件都可以进行匹配;IN取合法值的由逗号分隔的清单,全部括在圆括号中;
例子:
此select语句检索供应商1002和1003制造的所有产品;
select prod_name, prod_price from products
where vend_id In (1002,1003)
order by prod_name;
使用in操作符完成与or相同的功能,下面例子所示:
select prod_name, prod_price from products
where vend_id = 1002 or vend_id = 1003
order by prod_name;
IN操作符优点:
- 使用长的合法选项清单时,in操作符的语法更清楚且直观
- 在使用in时,计算的次序更容易管理(操作符更少)
- in操作符一般比or操作符清单执行更快
- in的最大优点是可以包含其他select语句,使得能够更动态地建立where子句;
in:
- where子句中用来指定匹配值的清单的关键字,功能与or相当;
7.3 :Not操作符
where 子句中的not操作符有且只有一个功能,那就是否定它之后所跟的任何条件;
Not:
- where子句中用来否定条件的关键字;
例子:使用not,列出除了1002和1003之外的所有供应商制造的产品;
select prod_name, prod_price from products
where vend_id not in (1002, 1003)
order by prod_name;
在更复杂的子句中,not是非常有用的;
mysql中的not:
- mysql支持使用not对in、between和exists子句取反,这与多数其他DBMS允许使用not对各种条件取反有很大区别;