数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要制定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。
输入:
SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;
分析:
这条语句从Products表中检索两个列,但不返回所有行,只返回prod_price值为3.49的行。
操作符 |
说明 |
操作符 |
说明 |
= |
等于 |
> |
大于 |
<> |
不等于 |
>= |
大于等于 |
!= |
不等于 |
!> |
不大于 |
< |
小于 |
BETWEEN |
在指定的两个值之间 |
<= |
小于等于 |
IS NULL |
为NULL值 |
!< |
不小于 |
|
|
4.2.1 检查单个值
列出所有价格小于10的产品
输入:
SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;
4.2.2 不匹配检查
列出所有不是供应商DLL01制造的产品
输入:
SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01';
SELECT vend_id, prod_name FROM Products WHERE vend_id != 'DLL01';
4.2.3 范围值检查
要检查某个范围的值,可以使用BETWEEN操作符。需要两个值,范围的开始值和结束值。
检索价格在5和10之间的所有产品:
输入:
SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
在使用BETWEEN时,必须指定两个值,所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
4.2.4 空值检查
在创建表时,表设计人员可以指定其中的列能否不包含值。在一个列不包含值时,称其包含空值NULL。
NULL 无值,它与字段包含0、空字符串或仅仅包含空格不同。
确定值是否为NULL,不能简单地检查是否=NULL。SELECT子句用来检查具有NULL值的列为IS NULL
输入:
SELECT prod_nameFROM Products WHERE prod_price IS NULL;
这条语句返回所有没有价格(空prod_price字段,不是价格为0)的产品,由于表中没有这样的行,所以没有返回数据。但是,Customers表确实包含具有NULL值的列:如果没有电子邮件地址,则cust_email列将包含NULL值。
SELECT cust_name FROM Customers WHERE cust_email IS NULL;
过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中。
为了更强的过滤控制,SQL给出多个WHERE子句,即AND子句或OR子句。
5.1.1 AND操作符
要通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。
SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4;
检索出由供应商DLL01制造且价格小于等于4的所有产品的名称和价格。
AND指示DBMS只返回满足所有给定条件的行。
5.1.2 OR操作符
OR操作符与AND操作符正好相反,它指示DBMS检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件得到满足的情况下,就不再计算第二条件了(在第一个条件满足时,不管第二个条件是否满足,相应的行都被检索出来)。
输入:
SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
分析:
OR错左幅告诉DBMS匹配任一条件而不是同时匹配两个条件。
5.1.3 求值顺序
WHERE子句可以包含任意数目的AND和OR操作符。允许两者结合已进行复杂、高级的过滤。
输入:
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
分析:
SQL在处理OR操作符前,优先处理AND操作符。
当SQL看到上述WHERE子句时,它理解为:由供应商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操作符更高的求值顺序,导致首先过滤圆括号内的OR条件。
提示:在WHERE子句中使用圆括号
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。
输入:
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( 'DLL01' , 'BRS01')
ORDER BY prod_name;
分析:
SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须在圆括号中。完成了与OR相同的功能。
为什么要使用IN操作符?
1)在有很多合法选项时,IN操作符的语法更清楚,更直观。
2)在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
3)IN操作符比一组OR操作符执行得更快。
4)IN的最大优点是可以包含其他SELECT语句,能够更动态的建立WHERE子句。
IN
WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。
WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为NOT从不单独使用(它总是与其他操作符一起使用)所以它的语法与其他操作符有所不同。NOT关键字可以用在要过滤的列前,而不仅是在其后。
NOT
WHERE子句中用来否定其后条件的关键字
输入:
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
分析:
NOT否定跟在其后的条件,DBMS是不匹配vend_id为DLL01,而是匹配非DLL01之外的所有东西。