一、WHERE子句
数据库表一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。如下:
SELECT prod_price,prod_name
FROM products
WHERE prod_price=2.5;
1.1 WHERE子句操作符
操作符 | 说明 |
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
示例(小于):
SELECT prod_name,prod_price
FROM products
WHERE prod_price<10;
示例(不等于):
SELECT vend_id,prod_name
FROM products
WHERE vend_id!=1003;
示例(范围值检查):
为了检查某个范围的值,可使用BETWEEN操作符。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
SELECT prod_name,prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;
1.2 组合WHERE子句
为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。
1.2.1 AND操作符(优先级高于OR)
为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。示例如下:
SELECT prod_id,prod_name,prod_price
FROM products
WHERE vend_id=1003 AND prod_price<=10;
上例中SQL语句检索由供应商1003制造且价格小于等于10美元的所有产品的名称和价格。这条SELECT语句中的WHERE子句包含两个条件,并且用AND关键字联结它们。AND指示DBMS返回满足所有给定条件的行。操作结果如下:
1.2.2 OR操作符(优先级低于AND)
OR操作符指示MySQL检索匹配任一条件的行。示例如下:
SELECT prod_id,prod_name,prod_price,vend_id
FROM products
WHERE vend_id=1002 or vend_id=1003;
由于AND操作符的优先级高于OR,因此SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。可以使用()圆括号改变计算次序。
1.2.3 IN操作符
圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。
示例:
SELECT prod_name,prod_price,vend_id
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;
上例中SELECT语句检索供应商1002和1003制造的所有产品。IN操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。IN操作符和OR操作符的功能是一样的。只是相比于OR操作符,IN操作符有如下优点:
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN操作符一般比OR操作符清单执行更快。
- IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。
1.2.4 NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
示例:
SELECT prod_name,prod_price,vend_id
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
NOT否定跟在它之后的条件,因此,上例不是匹配1002和1003的vend_id,而是匹配1002和1003之外供应商的vend_id。
二、使用通配符进行过滤
前文介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,共同点是过滤中使用的值都是已知的。但是,这种过滤方法并不是任何时候都好用。例如,怎样搜索产品名中包含文本anvil的所有产品?用简单的比较操作符肯定不行,必须使用通配符。利用通配符可创建比较特定数据的搜索模式。
通配符(wildcard): 用来匹配值的一部分的特殊字符。
2.1 LIKE操作符
为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
2.1.1 %通配符
%表示任何字符出现任意次数。例如,为了找出所有以词jet起头的产品,可使用以下SELECT语句:
SELECT prod_name,prod_price,vend_id
FROM products
WHERE prod_name LIKE 'jet%';
上例使用了搜索模式'jet%'。在执行这条子句时,将检索任意以jet起头的词。%告诉MySQL接受jet之后的任意字符,不管它有多少字符。同理,搜索模式'%anvil%'表示匹配任何位置包含文本anvil的值,而不论它之前或之后出现什么字符。
2.1.2 下划线(_)通配符
下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
示例:
SELECT prod_name,prod_price,vend_id
FROM products
WHERE prod_name LIKE '_ ton%';
2.2 通配符使用
正如所见,MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一些使用通配符要记住的技巧:
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
三、结束
本文时对MySQL必知必会的学习笔记,主要介绍了WHERE过滤语句。