组合WHERE子句
AND操作符
例子:
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4 ;
OR操作符:
SELECT prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' ;
求值顺序:
WHERE 子句可以包含任意数目的AND和OR操作符。允许两者结合以进行复杂、高级的过滤。
但是,AND和OR两个哪个的优先级高呢?
SELECT prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
结果:
返回的行中有4行价格小于10。但我们需要的大于10的且生产厂商为’DLL01’或’BRS01’的产品。显然,返回数据没有按照预期进行过滤。原因在于,SQL在处理OR操作符前,优先处理AND操作符。当SQL处理上述语句时,操作是这样的:由供应商BRS01制造的价格为10美元以上的所有产品,以及由供应商DLL01制造的所有产品,而不管其价格如何。也就是说,AND在求值过程中优先级更高。
为了正确地解决问题,我们需要使用圆括号:
SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
这次结果是正确的:
这是因为圆括号具有比AND或OR操作符更高的优先级。
IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。例子:
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;
NOT操作符
WHERE子句中的NOT操作符可以否定其后所跟的任何条件。
例子
SELECT prod_name
FROM products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;