学习目标

  1. 组合where子句,使用更高级的搜索条件
  2. 使用not操作符
  3. 使用in操作符

(目录)

一.组合where子句

WHERE子句在过滤数据时使用的都是单一的条件。 为了进行更强的过滤控制MySQL允许给出多个where子句。 这些子句可以俩种方式使用:以and子句or子句的方式使用。 操作符: 用来联结或改变WHERE子句中的子句的关键字。也称为逻辑操作符( logical operator) 。

1.and操作符

a.查询vend_id,prod_id,prod_name,prod_price,从products表中 根据产品供应商ID>1001,并且,产品价格<40 价格按降序排列 select vend_id,prod_id,prod_name,prod_price from products where vend_id >1001 and prod_price<40 order by prod_price desc; 格式:select 列名1,列名2,列名3,列名4 from 表名 where 列名1>1001 and 列名4<40 order by 列名4 desc; image.png AND 用在WHERE子句中的关键字,用来指示检索满足所有给定条件。 还可以添加多个过滤条件,每添加一条就要使用一个AND。 select vend_id,prod_id,prod_name,prod_price from products where vend_id >1001 and prod_price>5 and prod_price<40 order by prod_price desc;

2.or操作符

OR操作符它指示MySQL检索匹配任一条件的行。 a.查询vend_id,prod_id,prod_name,prod_price,从products表 条件是vend_id >1001 or prod_price<40 prod_price 降序排列

select vend_id,prod_id,prod_name,prod_price from products where vend_id >1001 or prod_price<40 order by prod_price desc; 格式:select 列名1,列名2,列名3,列名4 from 表名 where 列名1>1001 or 列名4<40 order by 列名4 desc;

OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。 image.png

3.计算次序

WHERE可包含任意数目的AND和OR操作符允许两者结合以进行复杂和高级的过滤 。 a.需要列出价格为10美元(含)以上且由1002或1003制造的所有产品。(结果错误) select vend_id,prod_id,prod_name,prod_price from products where vend_id =1002 or vend_id =1003 and prod_price>=10 ;

发现结果不对,vend_id=1002中,价格有低于10的。与预期结果不符。 错误原因:

  1. SQL(像多数语言一样)在处理OR操作符前优先处理AND操作符
  2. 当SQL看到上述WHERE子句时,SQL理解为vend_id =1002 or (vend_id =1003 and prod_price>=10);
  3. 换句话说,由于AND在计算次序中优先级更高,操作符被错误地组合了 。

image.png

b.需要列出价格为10美元(含)以上且由1002或1003制造的所有产品。(结果正确) select vend_id,prod_id,prod_name,prod_price from products where (vend_id =1002 or vend_id =1003) and prod_price>=10 ;

因为圆括号具有较AND或OR操作符高的计算次序DBMS首先过滤圆括号内的OR条件。 SQL语句变成了选择由供应商1002或1003制造的。且价格都在10美元(含)以上的任何产品。 image.png

注:

  1. 应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,易出错。
  2. 使用圆括号没有什么坏处,它能消除歧义。

二.IN操作符(查找俩端点值)

注:列名 between 10 and 80;(这个才是查找连续范围) in的作用与or相同 select vend_id,prod_id,prod_name,prod_price from products where vend_id in (1002,1005) ; image.png 等价 select vend_id,prod_id,prod_name,prod_price from products where vend_id =1002 or vend_id =1005 ; image.png

in的优点:

  1. IN操作符的语法更清楚且更直观。
  2. IN操作符一般比OR操作符清单执行更快。
  3. IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。

三.Not操作符

WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。 NOT定义 :WHERE子句中用来否定后跟条件的关键字。 在与IN操作符联合使用时, NOT使找出与条件列表不匹配的行非常简单。

a.为了列出除1002和1003之外的所有供应商制造的产品 select vend_id,prod_id,prod_name,prod_price from products where vend_id not in (1002,1003) ; 格式:select 列名1,列名2,列名3,列名4 from 表名 where 列名1 not in (1002,1003);

image.png

MySQL 支 持 使 用 NOT 对 IN 、 BETWEEN 和EXISTS子句取反。 1.not对 between 1001 and 1009 and取反 select vend_id,prod_id,prod_name,prod_price from products where vend_id not between 1001 and 1009 ; 格式:select 列名1,列名2,列名3,列名4 from 表名 where 列名1 not between 1001 and 1009 ; image.png

2.not对exists (select vend_id from products where vend_id= 1090) ;进行取反 select vend_id,prod_id,prod_name,prod_price from products where not exists (select vend_id from products where vend_id= 1090) ; 格式:select 列名1,列名2,列名3,列名4 from 表名 where not exists (select 列名1 from products where 列名1= 1090) ; image.png

四.总结

学习了:

  1. and操作符
  2. or操作符
  3. 计算次序
  4. in操作符
  5. not操作符

多思考,多总结,多输出,一键四连~

但行好事,莫问前程,我们下篇见~

往期文章: 6.《过滤数据》:https://blog.51cto.com/SuperBigData/5456902 5.《排序检索数据》:https://blog.51cto.com/SuperBigData/5451534 4.《检索数据》:https://blog.51cto.com/SuperBigData/5449032 3.《使用MySQL》:https://blog.51cto.com/SuperBigData/5437954 2.《MySQL简介》:https://blog.51cto.com/SuperBigData/5436719 1.《了解MYSQL》:https://blog.51cto.com/SuperBigData/5434475