2019-08-04
WHERE
子句的位置
在同时使用ORDER BY
和WHERE
子句时,应该让ORDER BY
位于WHERE
之后,否则将会产生错误。
范围值检查
mysql> SELECT prod_name, prod_price
-> FROM products
-> WHERE prod_price BETWEEN 5.99 AND 10;
+----------------+------------+
| prod_name | prod_price |
+----------------+------------+
| .5 ton anvil | 5.99 |
| 1 ton anvil | 9.99 |
| Bird seed | 10.00 |
| Oil can | 8.99 |
| TNT (5 sticks) | 10.00 |
+----------------+------------+
5 rows in set (0.00 sec)
BETWEEN
匹配范围中所有的值,包括指定的开始值和结束值。
空值检查
在创建表时,表设计人员可以指定其中的列是否可以不包含值。在一个列不包含值时,称其位包含空值NULL
。
NULL
无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。
mysql> SELECT prod_name
-> FROM products
-> WHERE prod_price IS NULL;
Empty set (0.00 sec)
mysql> SELECT cust_id
-> FROM customers
-> WHERE cust_email IS NULL;
+---------+
| cust_id |
+---------+
| 10002 |
| 10005 |
+---------+
2 rows in set (0.11 sec)
NULL
与不匹配
在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL
值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。
因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL
的行。
WHERE
可包含任意数目的AND
和OR
操作符。允许两者结合以进行复杂和高级的过滤。
注意:AND
在计算次序中优先级更高。
IN
操作符
IN
操作符完成与OR
相同的功能,为什么要使用IN
操作符?
- 在使用长的合法选项清单时,
IN
操作符的语法更清楚且更直观。- 在使用
IN
时,计算的次序更容易管理(因为使用的操作符更少)。IN
操作符一般比OR
操作符清单执行更快。IN
的最大优点是可以包含其他SELECT
语句,使得能够更动态地建立WHERE
子句。
NOT
操作符
mysql> SELECT prod_name, prod_price
-> FROM products
-> WHERE vend_id NOT IN (1002, 1003)
-> ORDER BY prod_name;
+--------------+------------+
| prod_name | prod_price |
+--------------+------------+
| .5 ton anvil | 5.99 |
| 1 ton anvil | 9.99 |
| 2 ton anvil | 14.99 |
| JetPack 1000 | 35.00 |
| JetPack 2000 | 55.00 |
+--------------+------------+
5 rows in set (0.02 sec)
MySQL
中的NOT
MySQL
支持使用NOT
对IN
、BETWEEN
和EXISTS
子句取反,这与其他多数DBMS
允许使用NOT
对各种条件取反有很大差别。
LIKE
操作符
%
表示任何字符出现任意次数。但是不能匹配NULL
mysql> SELECT cust_email
-> FROM customers;
+---------------------+
| cust_email |
+---------------------+
| ylee@coyote.com |
| NULL |
| rabbit@wascally.com |
| sam@yosemite.com |
| NULL |
+---------------------+
5 rows in set (0.00 sec)
mysql> SELECT cust_email
-> FROM customers
-> WHERE cust_email LIKE '%';
+---------------------+
| cust_email |
+---------------------+
| ylee@coyote.com |
| rabbit@wascally.com |
| sam@yosemite.com |
+---------------------+
3 rows in set (0.00 sec)
_
只匹配单个字符而不是多个字符,且总是匹配一个字符,不能多也不能少。
使用通配符的技巧
通配符搜索的处理一般要比前面讨论的其他搜索花更长的时间。
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。