只检索需要的数据,则需要指定搜索条件,搜索条件也称为过滤条件
在SELECT语句中,WHERE子句跟在FROM子句之后使用
使用WHERE子句
下述语句,从PRODUCTS表中检索出3列,但是不返回所有的行,只返回PROD_PRICE = 3.49的行
mysql> SELECT PROD_ID,PROD_NAME,PROD_PRICE FROM PRODUCTS;
+---------+---------------------+------------+
| PROD_ID | PROD_NAME | PROD_PRICE |
+---------+---------------------+------------+
| BNBG01 | Fish bean bag toy | 3.49 |
| BNBG02 | Bird bean bag toy | 3.49 |
| BNBG03 | Rabbit bean bag toy | 3.49 |
| BR01 | 8 inch teddy bear | 5.99 |
| BR02 | 12 inch teddy bear | 8.99 |
| BR03 | 18 inch teddy bear | 11.99 |
| RGAN01 | Raggedy Ann | 4.99 |
| RYL01 | King doll | 9.49 |
| RYL02 | Queen doll | 9.49 |
+---------+---------------------+------------+
9 rows in set (0.00 sec)
mysql> SELECT PROD_ID,PROD_NAME,PROD_PRICE FROM PRODUCTS WHERE PROD_PRICE = 3.49;
+---------+---------------------+------------+
| PROD_ID | PROD_NAME | PROD_PRICE |
+---------+---------------------+------------+
| BNBG01 | Fish bean bag toy | 3.49 |
| BNBG02 | Bird bean bag toy | 3.49 |
| BNBG03 | Rabbit bean bag toy | 3.49 |
+---------+---------------------+------------+
注意!!
在同时使用WHERE子句和ORDER BY子句时,应该让ORDER BY子句位于WHERE子句之后,否则会产生错误
SQL过滤 VS 应用过滤
数据也可以在应用层进行过滤,为此,SQL的SELECT语句为客户端应用检索出超出实际所需的数据,然后,客户端代码对返回的数据进行循环,提取出所需的行。
但是!这种做法不妥,优化数据库之后,可以更快速,有效地对数据进行过滤。而让客户端应用处理数据库的工作将会影响应用的性能,并且使创建的应用完全不具备可伸缩性。此外,如果在客户端过滤数据,服务器不得不通过网络发送多余的数据,这将会导致网络资源的浪费。
WHERE子句操作符
检索单个值
列出所有价格小于10美元的产品
mysql> SELECT PROD_ID,PROD_NAME,PROD_PRICE FROM PRODUCTS WHERE PROD_PRICE < 10;
+---------+---------------------+------------+
| PROD_ID | PROD_NAME | PROD_PRICE |
+---------+---------------------+------------+
| BNBG01 | Fish bean bag toy | 3.49 |
| BNBG02 | Bird bean bag toy | 3.49 |
| BNBG03 | Rabbit bean bag toy | 3.49 |
| BR01 | 8 inch teddy bear | 5.99 |
| BR02 | 12 inch teddy bear | 8.99 |
| RGAN01 | Raggedy Ann | 4.99 |
| RYL01 | King doll | 9.49 |
| RYL02 | Queen doll | 9.49 |
+---------+---------------------+------------+
不匹配检查
列出所有不是供应商DLL01制造的产品
mysql> SELECT PROD_NAME,VEND_ID FROM PRODUCTS
-> WHERE VEND_ID != 'DLL01';
+--------------------+---------+
| PROD_NAME | VEND_ID |
+--------------------+---------+
| 8 inch teddy bear | BRS01 |
| 12 inch teddy bear | BRS01 |
| 18 inch teddy bear | BRS01 |
| King doll | FNG01 |
| Queen doll | FNG01 |
+--------------------+---------+
注意!因为不同的DBMS,所以,!=
不等于操作符会有多种表示方法
注意!单引号用来限制字符串,如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不需要引号。
范围值检查
检索某个范围的值,需要用到BETWEEN操作符。
它与其他的WHERE操作符不同,它需要2个值,即范围的开始值和结束值
检索价格在5美元和10美元之间的所有产品
mysql> SELECT PROD_NAME,PROD_PRICE FROM PRODUCTS
-> WHERE PROD_PRICE BETWEEN 5 AND 10;
+--------------------+------------+
| PROD_NAME | PROD_PRICE |
+--------------------+------------+
| 8 inch teddy bear | 5.99 |
| 12 inch teddy bear | 8.99 |
| King doll | 9.49 |
| Queen doll | 9.49 |
+--------------------+------------+
空值检查
NULL
无值,它与字段包含0、空字符串或者仅仅包含空格不同
检查空值,不是简单的使用= NULL
。
使用的子句是IS NULL
检索出用户邮箱为空的用户名列
mysql> SELECT CUST_NAME FROM CUSTOMERS
-> WHERE CUST_EMAIL IS NULL;
+---------------+
| CUST_NAME |
+---------------+
| Kids Place |
| The Toy Store |
+---------------+
NULL VS 非匹配
通过过滤选择不包含指定值的所有行时,我们可能会希望返回包含NULL值的行。但是,这是做不到的。因为未知是有特殊含义的,数据库不知道它们是否匹配,所以,在进行匹配过滤或者非匹配过滤时,不会返回这些结果。