组合WHERE子句以建立功能更强、更高级的搜素条件。
1.组合WHERE子句
为了实现更强的过滤控制,SQL允许给出多个WHERE子句。这些子句有两种使用方式,即以操作符AND或OR进行联结或改变。
(1)AND操作符
用来指示检索满足所有给定条件的行。
输入:
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
此SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。
输出:
可以增加多个过滤条件,每个条件间都要使用AND关键字。
(2)OR操作符
用来只是DBMS检索匹配任一条件的行。第一个条件满足时,不管第二个条i安是否满足,相应的行都将被检索出来。
输入:
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id ='BRS01';
此SQL语句检索由任一指定供应商制造的所有产品的产品名和价格。
输出:
(3)求值顺序
AND在求值过程中优先级更高,在使用具有AND和OR操作符的WHERE子句时,都应该使用圆括号对操作符进行明确分组。
当需要列出价格为10美元及以上,且由DLL01或BRS01制造的所有产品时,若未使用圆括号进行分组,输入:
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id ='BRS01'
AND prod_price >= 10;
输出:
可看到有4行价格小于10美元。这是因为执行上述WHERE子句时,先执行AND,后执行OR,这样只要vend_id满足为DLL01,不管vend_id是否为BRS01且AND prod_price是否为10。
应该使用圆括号进行分组,正确输入:
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id ='BRS01')
AND prod_price >= 10;
输出:
圆括号具有比AND或OR操作符更高的求值顺序,所以DBMS首先过滤括号中的OR条件。这样SQL筛选出价格为由DLL01或BRS01制造且10美元及以上的所有产品。
2.IN操作符
用来指定条件范围,范围中每个条件均可匹配。IN取一组由逗号分隔、括在圆括号中的合法值。
输入:
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
输出:
在此SQL语句中,IN操作符完成了与OR相同的功能,即输入:
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操作符
有且只有一个功能:否定其后所跟的任何条件。
输入:
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
输出:
DBMS匹配非DLL01之外的所有东西。
也可以使用<>操作符来完成,输入:
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;
输出:
在更复杂的子句中,与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。