博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4.高级数据过滤 ---SQL
阅读量:5934 次
发布时间:2019-06-19

本文共 2758 字,大约阅读时间需要 9 分钟。

一、AND操作符


 要通过不止一个列进行过滤,可以使用A ND操作符给WHERE子句附加条件.

SELECT prod_id, prod_price, prod_nameFROM ProductsWHERE vend_id = 'DLL01' AND prod_price <= 4;

分析▼

此SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。这条SELECT语句中的WHERE子句包含两个条件,
用A ND关键字联结在一起。A ND指示DBMS只返回满足所有给定条件的行。如果某个产品由供应商DLL01制造,但价格高于4美元,则不检索
它。类似地,如果产品价格小于4美元,但不是由指定供应商制造的也不被检索

*可以增加多个过滤条件,每个条件间都要使用A ND关键字。

二、OR操作符


 OR操作符与A ND操作符正好相反,它指示DBMS检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件得到满足的情况

下,就不再计算第二个条件了(在第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来)

SELECT prod_name, prod_priceFROM ProductsWHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;

分析▼

此SQL语句检索由任一个指定供应商制造的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。如果这里
使用的是A ND操作符,则没有数据返回(因为会创建没有匹配行的WHERE子句)。

OR

WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。

 

三、求值顺序


 

SELECT prod_name, prod_priceFROM ProductsWHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’AND prod_price >= 10;
输出▼prod_name prod_price------------------- ----------Fish bean bag toy 3.4900Bird bean bag toy 3.4900Rabbit bean bag toy 3.490018 inch teddy bear 11.9900Raggedy Ann 4.9900

分析▼

请看上面的结果。返回的行中有4行价格小于10美元,显然,返回的行未按预期的进行过滤。为什么会这样呢?原因在于求值的顺序。
SQL(像多数语言一样)在处理OR操作符前,优先处理A ND操作符。当SQL看到上述WHERE子句时,它理解为:由供应商BRS01制造的价格
为10美元以上的所有产品,以及由供应商DLL01制造的所有产品,而不管其价格如何。换句话说,由于A ND在求值过程中优先级更高,操作符
被错误地组合了。

 此问题的解决方法是使用圆括号对操作符进行明确分组。请看下面的SELECT语句及输出:

 

SELECT prod_name, prod_priceFROM ProductsWHERE (vend_id = 'DLL01' OR vend_id = ‘BRS01’)AND prod_price >= 10;
输出▼prod_name prod_price------------------- ----------18 inch teddy bear 11.9900

分析▼

这条SELECT语句与前一条的唯一差别是,将前两个条件用圆括号括了起来。因为圆括号具有比A ND或OR操作符更高的求值顺序,所以DBMS
首先过滤圆括号内的OR条件。这时,SQL语句变成了选择由供应商DLL01或BRS01制造的且价格在10美元及以上的所有产品,这正是我们希望
的结果。

提示:在WHERE子句中使用圆括号

任何时候使用具有A ND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希
望的那样。使用圆括号没有什么坏处,它能消除歧义。

 

四、IN操作符


 IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

 IN取一组由逗号分隔、括在圆括号中的合法值

SELECT prod_name, prod_priceFROM ProductsWHERE vend_id IN ( 'DLL01', 'BRS01' )ORDER BY prod_name;
输出▼prod_name prod_price------------------- ----------12 inch teddy bear 8.990018 inch teddy bear 11.99008 inch teddy bear 5.9900Bird bean bag toy 3.4900Fish bean bag toy 3.4900Rabbit bean bag toy 3.4900Raggedy Ann 4.9900

分析▼

此SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。

 你可能会猜测IN操作符完成了与OR相同的功能,恭喜你猜对了!

 

为什么要使用IN操作符?其优点为:

*在有很多合法选项时,IN操作符的语法更清楚,更直观。
*在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
*IN操作符一般比一组OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
*IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。
IN
WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

 

五、NOT操作符


 WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为NOT从不单独使用(它总是与其他操作符一起使用),

所以它的语法与其他操作符有所不同。NOT关键字可以用在要过滤的列前,而不仅是在其后。

NOT                                                               

WHERE子句中用来否定其后条件的关键字。

分析▼

为什么使用NOT?对于这里的这种简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在
与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。
说明:MariaDB中的NOT
MariaDB支持使用NOT否定IN、BETWEEN和EXISTS子句。大多数DBMS允许使用NOT否定任何条件。

转载于:https://www.cnblogs.com/lbonet/p/7462753.html

你可能感兴趣的文章
mysql 添加新用户
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
图像边框 border-image属性
查看>>
了解Parallels中的 Modern.IE 测试环境
查看>>
运维自动化之zabbix (macros)(6)
查看>>
负载均衡基础实践
查看>>
流量监控与端口镜像
查看>>
《Windows服务器配置与管理》 文件共享服务器搭建
查看>>
linux 配置手册(一) Linux 基本网络配置
查看>>
ServletConfig对象和ServletContext对象
查看>>
Kubernetes之路 2 - 利用LXCFS提升容器资源可见性
查看>>
Java源码解读扫盲【集合--HashMap】
查看>>
Linux环境变量
查看>>
浅析克隆
查看>>
EL表达式取List<Map<String, Object>>map的值
查看>>
如何在Java代码中使用SAP云平台CloudFoundry环境的环境变量
查看>>
广州三本找Java实习经历
查看>>
浅谈 Mybatis中的 ${ } 和 #{ }的区别
查看>>
python 笔记 之 python 使用数据库-封装
查看>>