依旧是SELECT语句的 WHERE 子句:
高级数据过滤:
组合WHERE子句:用来联结或改变WHERE子句中的子句的关键字, 也称为逻辑操作符。
AND操作符:
mysql> SELECT prod_id, prod_price, prod_name -> FROM products -> WHERE vend_id = 'DLL01' AND prod_price <= 4; +---------+------------+---------------------+ | prod_id | prod_price | prod_name | +---------+------------+---------------------+ | BNBG01 | 3.49 | Fish bean bag toy | | BNBG02 | 3.49 | Bird bean bag toy | | BNBG03 | 3.49 | Rabbit bean bag toy | +---------+------------+---------------------+ 3 rows in set (0.06 sec)
此SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。
这条SELECT语句中的WHERE子句包含两个条件,用AND关键字联结在一起。 AND指示DBMS只返回满足所有给定条件的行。 如果某个产品由供应商DLL01制造, 但价格高于4美元, 则不检索它。 类似地, 如果产品价格小于4美元, 但不是由指定供应商制造的也不被检索。
进行排序的:
mysql> SELECT prod_id, prod_price, prod_name -> FROM products -> WHERE vend_id = 'DLL01' AND prod_price <= 4 -> ORDER BY prod_name; +---------+------------+---------------------+ | prod_id | prod_price | prod_name | +---------+------------+---------------------+ | BNBG02 | 3.49 | Bird bean bag toy | | BNBG01 | 3.49 | Fish bean bag toy | | BNBG03 | 3.49 | Rabbit bean bag toy | +---------+------------+---------------------+ 3 rows in set (0.10 sec)
OR操作符:
OR操作符与AND操作符正好相反, 它指示DBMS检索匹配任一条件的行。 事实上, 许多DBMS在OR WHERE子句的第一个条件得到满足的情况下, 就不再计算第二个条件了( 在第一个条件满足时, 不管第二个条件是否满足, 相应的行都将被检索出来)。当第一条件不满足时才执行第二条件 。
mysql> SELECT vend_id, prod_name, prod_price -> FROM products -> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'; +---------+---------------------+------------+ | vend_id | prod_name | prod_price | +---------+---------------------+------------+ | DLL01 | Fish bean bag toy | 3.49 | | DLL01 | Bird bean bag toy | 3.49 | | DLL01 | Rabbit bean bag toy | 3.49 | | BRS01 | 8 inch teddy bear | 5.99 | | BRS01 | 12 inch teddy bear | 8.99 | | BRS01 | 18 inch teddy bear | 11.99 | | DLL01 | Raggedy Ann | 4.99 | +---------+---------------------+------------+ 7 rows in set (0.00 sec)
OR: WHERE子句中使用的关键字, 用来表示检索匹配任一给定条件的行。
求值顺序:
在SQL语言中也有优先级顺序,其中()优先级高于AND操作符,而AND操作符的优先级高于OR操作符的优先级(在WHERE子句中使用圆括号。任何时候使用具有AND和OR操作符的WHERE子句, 都应该使用圆括号明确地分组操作符。)
IN操作符:
IN操作符用来指定条件范围, 范围中的每个条件都可以进行匹配。 IN取一组由逗号分隔、 括在圆括号中的合法值。
mysql> SELECT prod_name, prod_price -> FROM products -> WHERE vend_id IN ( 'DLL01', 'BRS01' ) -> ORDER BY prod_name; +---------------------+------------+ | prod_name | prod_price | +---------------------+------------+ | 12 inch teddy bear | 8.99 | | 18 inch teddy bear | 11.99 | | 8 inch teddy bear | 5.99 | | Bird bean bag toy | 3.49 | | Fish bean bag toy | 3.49 | | Rabbit bean bag toy | 3.49 | | Raggedy Ann | 4.99 | +---------------------+------------+ 7 rows in set (0.63 sec)
此SELECT语句检索由供应商DLL01和BRS01制造的所有产品。 IN操作符后跟由逗号分隔的合法值, 这些值必须括在圆括号中。这里IN操作符完成了与OR相同的功能。
下面的代码等同于上面的代码:
mysql> SELECT prod_name, prod_price -> FROM products -> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' -> ORDER BY prod_name; +---------------------+------------+ | prod_name | prod_price | +---------------------+------------+ | 12 inch teddy bear | 8.99 | | 18 inch teddy bear | 11.99 | | 8 inch teddy bear | 5.99 | | Bird bean bag toy | 3.49 | | Fish bean bag toy | 3.49 | | Rabbit bean bag toy | 3.49 | | Raggedy Ann | 4.99 | +---------------------+------------+ 7 rows in set (0.00 sec)
NOT操作符:
WHERE子句中的NOT操作符有且只有一个功能, 那就是否定其后所跟的任何条件。 因为NOT从不单独使用( 它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。 NOT关键字可以用在要过滤的列前, 而不仅是在其后。
mysql> SELECT vend_id, prod_name -> FROM products -> WHERE NOT vend_id = 'DLL01' -> ORDER BY vend_id, prod_name; +---------+--------------------+ | vend_id | prod_name | +---------+--------------------+ | BRS01 | 12 inch teddy bear | | BRS01 | 18 inch teddy bear | | BRS01 | 8 inch teddy bear | | FNG01 | King doll | | FNG01 | Queen doll | +---------+--------------------+ 5 rows in set (0.00 sec)
这里的NOT否定跟在其后的条件,因此,DBMS不是匹配vend_id为DLL01, 而是匹配非DLL01之外的所有东西。
上述的例子也可以使用<>操作符来完成:
mysql> SELECT vend_id, prod_name -> FROM products -> WHERE vend_id <> 'DLL01' -> ORDER BY vend_id, prod_name; +---------+--------------------+ | vend_id | prod_name | +---------+--------------------+ | BRS01 | 12 inch teddy bear | | BRS01 | 18 inch teddy bear | | BRS01 | 8 inch teddy bear | | FNG01 | King doll | | FNG01 | Queen doll | +---------+--------------------+ 5 rows in set (0.00 sec)
上述总结:
1)如何用AND 和 OR 操作符组合成WHERE子句
2)如何管理求值顺序,如何使用 IN 和 NOT 操作符
用通配符进行过滤:
LIKE操作符:使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤。
通配符:用来匹配值的一部分的特殊字符。
搜索模式:由字面值、 通配符或两者组合构成的搜索条件。
通配符本身实际上是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较。
通配符搜索只能用于文本字段( 字符串),非文本数据类型字段不能使用通配符搜索。
百分号(%)通配符:
最常使用的通配符是百分号(%) 。 在搜索串中, % 表示任何字符出现任意次数。
mysql> SELECT prod_id, prod_name -> FROM products -> WHERE prod_name LIKE 'Fish%'; +---------+-------------------+ | prod_id | prod_name | +---------+-------------------+ | BNBG01 | Fish bean bag toy | +---------+-------------------+ 1 row in set (0.04 sec)
此例子使用了搜索模式 'Fish%'。 在执行这条子句时, 将检索任意以Fish起头的词。 %告诉DBMS接受Fish之后的任意字符, 不管它有多少字符。
mysql> SELECT prod_id, prod_name -> FROM products -> WHERE prod_name LIKE '%bean bag%'; +---------+---------------------+ | prod_id | prod_name | +---------+---------------------+ | BNBG01 | Fish bean bag toy | | BNBG02 | Bird bean bag toy | | BNBG03 | Rabbit bean bag toy | +---------+---------------------+ 3 rows in set (0.00 sec)
通配符可在搜索模式中的任意位置使用, 并且可以使用多个通配符。 搜索模式'%bean bag%'表示匹配任何位置上包含文本bean bag的值, 不论它之前或之后出现什么字符。
%通配符除了能匹配一个或多个字符外, %还能匹配0个字符。 %代表搜索模式中给定位置的0个、 1个或多个字符。这一点需要注意。
请注意NULL: 通配符%看起来像是可以匹配任何东西, 但有个例外,这就是NULL。子句WHERE prod_name LIKE '%'不会匹配产品名称为NULL的行。如下所示:
mysql> SELECT cust_email, cust_name -> FROM customers; +-----------------------+---------------+ | cust_email | cust_name | +-----------------------+---------------+ | [email protected] | Village Toys | | NULL | Kids Place | | [email protected] | Fun4All | | [email protected] | Fun4All | | NULL | The Toy Store | +-----------------------+---------------+ 5 rows in set (0.01 sec) -- 上面显示所在列的所有行,下面使用通配符搜索,可以看到 % 并不能匹配名称为 NULL 的行 mysql> SELECT cust_email, cust_name -> FROM customers -> WHERE cust_email LIKE '%'; +-----------------------+--------------+ | cust_email | cust_name | +-----------------------+--------------+ | [email protected] | Village Toys | | [email protected] | Fun4All | | [email protected] | Fun4All | +-----------------------+--------------+ 3 rows in set (0.00 sec)
下划线(_)通配符:
另一个有用的通配符是下划线( _) 。 下划线的用途与%一样, 但它只匹配单个字符, 而不是多个字符。
mysql> SELECT prod_id, prod_name -> FROM products -> WHERE prod_name LIKE '__ inch teddy bear'; +---------+--------------------+ | prod_id | prod_name | +---------+--------------------+ | BR02 | 12 inch teddy bear | | BR03 | 18 inch teddy bear | +---------+--------------------+ 2 rows in set (0.01 sec) mysql> SELECT prod_id, prod_name -> FROM products -> WHERE prod_name LIKE '% inch teddy bear'; +---------+--------------------+ | prod_id | prod_name | +---------+--------------------+ | BR01 | 8 inch teddy bear | | BR02 | 12 inch teddy bear | | BR03 | 18 inch teddy bear | +---------+--------------------+ 3 rows in set (0.00 sec)
上面可以看出,两个下划线只能匹配两个字符,而且还必须是两个字符,与 (%) 能匹配0个字符不同,( _ ) 总是刚好匹配一个字符, 不能多也不能少。
SQL的通配符很有用。但这种功能是有代价的,即通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。 这里给出一些使用通配符时要记住的技巧。
1)不要过度使用通配符。 如果其他操作符能达到相同的目的, 应该使用其他操作符。
2)在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处, 搜索起来是最慢的。
3)仔细注意通配符的位置。 如果放错地方, 可能不会返回想要的数据。
上述总结:
1)介绍了什么是通配符并且介绍如何在WHERE 子句中使用SQL 通配符