学习目标
- 组合where子句,使用更高级的搜索条件
- 使用not操作符
- 使用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; 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匹配任一条件而不是同时匹配两个条件。
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的。与预期结果不符。 错误原因:
- SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。
- 当SQL看到上述WHERE子句时,SQL理解为vend_id =1002 or (vend_id =1003 and prod_price>=10);
- 换句话说,由于AND在计算次序中优先级更高,操作符被错误地组合了 。
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美元(含)以上的任何产品。
注:
- 应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,易出错。
- 使用圆括号没有什么坏处,它能消除歧义。
二.IN操作符(查找俩端点值)
注:列名 between 10 and 80;(这个才是查找连续范围) in的作用与or相同 select vend_id,prod_id,prod_name,prod_price from products where vend_id in (1002,1005) ; 等价 select vend_id,prod_id,prod_name,prod_price from products where vend_id =1002 or vend_id =1005 ;
in的优点:
- IN操作符的语法更清楚且更直观。
- IN操作符一般比OR操作符清单执行更快。
- 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);
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 ;
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) ;
四.总结
学习了:
- and操作符
- or操作符
- 计算次序
- in操作符
- 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