一、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;

MySQL怎么筛选出null值 mysql怎么筛选数据_mysql

 示例(不等于):

SELECT vend_id,prod_name 
FROM products 
WHERE vend_id!=1003;

MySQL怎么筛选出null值 mysql怎么筛选数据_操作符_02

 示例(范围值检查):

        为了检查某个范围的值,可使用BETWEEN操作符。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。

SELECT prod_name,prod_price 
FROM products 
WHERE prod_price BETWEEN 5 AND 10;

MySQL怎么筛选出null值 mysql怎么筛选数据_MySQL_03

 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返回满足所有给定条件的行。操作结果如下:

MySQL怎么筛选出null值 mysql怎么筛选数据_mysql_04

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;

MySQL怎么筛选出null值 mysql怎么筛选数据_操作符_05

         由于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;

MySQL怎么筛选出null值 mysql怎么筛选数据_操作符_06

 

        上例中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;

MySQL怎么筛选出null值 mysql怎么筛选数据_MySQL_07

         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%';

MySQL怎么筛选出null值 mysql怎么筛选数据_搜索_08

        上例使用了搜索模式'jet%'。在执行这条子句时,将检索任意以jet起头的词。%告诉MySQL接受jet之后的任意字符,不管它有多少字符。同理,搜索模式'%anvil%'表示匹配任何位置包含文本anvil的值,而不论它之前或之后出现什么字符。 

 2.1.2 下划线(_)通配符

下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。 

示例:

SELECT prod_name,prod_price,vend_id 
FROM products 
WHERE prod_name LIKE '_ ton%';

MySQL怎么筛选出null值 mysql怎么筛选数据_搜索_09

 2.2 通配符使用

        正如所见,MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一些使用通配符要记住的技巧:

  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。 
  • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。 
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

三、结束

        本文时对MySQL必知必会的学习笔记,主要介绍了WHERE过滤语句。