SQL必知必会——高级数据过滤(五)

1、组合where子句

为了进行更强的过滤控制,sql允许给出多个where子句,这些子句有两种使用方式,即以and子句或or子句的方式使用。

注意:
1、操作符:用来联结或改变where子句中的子句的关键字,也称为逻辑操作符

1.1、and操作符

#检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格;
SELECT  prod_id , prod_price , prod_name
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4 ;

1.2 、or操作符

#检索由供应商DLL01或者BRS01制造的所有产品的产品名和价格;
SELECT   prod_name ,prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' ;

1.3、求值顺序

列出价格为10美元及以上,且有DLL01或BSR01制造的产品。

输入:

SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
#错误

输出:
SQL必知必会——高级数据过滤(五)_第1张图片
分析:
返回的行中由四行价格小于10美元,显然返回的行未按预期的进行过滤。原因就是AND操作符的优先级比OR操作符的优先级高,所有这里理解为:由供应商BRS01制造的价格为10美元以上的所有产品,以及由供应商制造的所有产品而且不管其价格如何。

输入:

SELECT prod_name,prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
#正确
#正确的语句和前一条的唯一差别就是,将前两个条件用圆括号括了起来

输出:
在这里插入图片描述

注意:
1、任何时候使用具有and和or操作符的whereziju,都应该使用圆括号明确的分组操作符。不要过分依赖默认求值顺序,即使他确实如你希望的那样。使用圆括号没有什么坏处,他能消除歧义。

2、in操作符

IN:
WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

SELECT prod_name,prod_price
FROM products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name ;
SELECT prod_name,prod_price
FROM products
WHERE vend_id = ’DLL01‘ OR vend_id = 'BRS01'
ORDER BY prod_name ;

为什么要使用IN操作符
1、再由很多合法选项时,IN操作符的语法更清楚,更直观。
2、在与其他AND和OR操作符组合使用IN时,求职顺序更容易管理。
3、IN操作符一般比一组OR操作符执行的更快。
4、IN的最大优点是可以包含其他SELECT语句,能够更动态的建立WHERE子句。

3、not操作符

WHERE子句中的NOT操作符由且只有一个功能,那就是否定其后所更的任何条件。

SELECT prod_name
FROM produtcts
WHERE NOT vend_id = 'dll01'
ORDER BY  prod_name ;

分析:
这里的NOT否定跟在其后的条件,因此,DBMS不是匹配vend_id为DLL01,而是匹配非DLL01之外的所有东西。

#以上的例子也可以使用<>操作符来完成
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name ;

分析:
为什么使用NOT?对于这里的这种简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。

你可能感兴趣的:(sql)