数据过滤-WHERE组合子句
本章讲授如何组合WHERE子句以建立功能更强的更高级的搜索条件。 我们还将学习如何使用NOT和IN操作符。
1.组合WHERE子句
上一章介绍的WHERE子句在过滤数据时使用的都是单一条件过滤。事实上为了数据的准确性我们还可以使用多个条件进行过滤,可以使用AND子句或者OR子句的方式来完成。
📖 操作符(operator)
用来联结或改变WHERE子句中的子句的关键字。也称为逻辑运算符。
1.1 AND操作符
下面的这个例子是使用AND操作符来给WHERE子句附加条件。
输入 :
SELECT uid, week, minute
FROM products
WHERE week = 1 AND minute = 22
输出:
分析:此SQL语句检索week为1并且minute为22数据。
📖 AND 用在WHERE子句中的关键字,用来指示检索满足所有给定的条件的行。
上述例子中使用了只包含一个关键字AND的语句,把两个过滤条件组合在一起。还可以添加多个过滤条件,每添加一条就要使用一个AND.
1.2 OR操作符
OR操作符和AND操作符不同,他指示MSQL检索匹配任一条件的行。
输入:
SELECT uid, week, minute
FROM products
WHERE week = 1 OR minute = 22
分析:检索week为1或者minute为22的数据。满足一个条件即可。
1.3 计算次序
SQL在处理OR操作前优先处理AND操作符。
解决方法就是使用()
输入:
SELECR prod_name,pro_price
FROM producets
WHERE wend_id = 1002 OR vand_id = 1003 AND prod_price >= 10;
改成:
SELECR prod_name,pro_price
FROM producets
WHERE (wend_id = 1002 OR vand_id = 1003) AND prod_price >= 10;
分析:
这条SELECT 语句 与前条的唯一差别是,这条语句中,前两个条件用圆括号括起来。因为圆括号具有较AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。
在WHERE子句中使用圆括号
任何时候使用具有AND和OR操作符的WHERE语句,都应该使用过圆括号明确的分组操作操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此
1.4 IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全部在圆括号中。
输入:
SELECT prod_name , prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name
输出:
分析:
此SELECT语句检索供应商1002和1003制造的所有产品。IN操作符后跟又逗号分隔的合法值清单,整个清单必须扩在圆括号内。
⭐️ IN操作符和OR功能相同,但IN操作符比OR操作符执行更快
OR写法:
SELECT prod_name , prod_price
FROM products
WHERE vend_id = 1002 OR vend_id =1003
ORDER BY prod_name
IN操作符优点:
- 在使用长的合法选项清单的时,IN操作符的语法更清楚且更直观。
- 在使用 IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN 操作符一般比OR操作符清单执行更快。
- IN 的最大的优点是可以包含其他SEKECT语句,使的能够更动态的建立 WHERE 语句。
1.5 NOT操作符
NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
📖 NOT WHERE子句中用来否定后跟条件的关键字。
使用:
列出除1002和1003之外的所有供应商制造的产品。
输入:
SELECT prod_name , prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
分析: 这里的NOT 否定跟在它之后的条件,因此,MySQL不是匹配1002和1003 的vendi_id,而是匹配 1002和1003 之外供应商的vend_id.
✏️ MySQL 中的NOT
MySQL支持使用 NOT 对 IN 、 BETWEEN 和 EXISTS 子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。
小结
本章讲授如何用AND和OR操作符组合成WHERE子句,而且还讲授了如
何明确地管理计算的次序,如何使用IN和NOT操作符。