day03-过滤数据
使用where子句
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
输出:
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE prod_price = 3.49;
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| Fish bean bag toy | 3.49 |
| Bird bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
+---------------------+------------+
3 rows in set (0.00 sec)
mysql>
注意:WHERE 子句的位置
1.在同时使用 ORDER BY 和 WHERE 子句时,应该让 ORDER BY 位于WHERE 之后,否则将会产生错误
2.提示:有多少个 0?
你在练习这个示例时,会发现显示的结果可能是 3.49、3.490、3.4900等。出现这样的情况,往往是因为 DBMS 指定了所使用的数据类型及其默认行为。所以,如果你的输出可能与书上的有点不同,不必焦虑,毕竟从数学角度讲,3.49 和 3.4900 是一样的。
where子句操作符
| 操作符 |
说明 |
操作符 |
说明 |
| = |
等于 |
> |
大于 |
| <> |
不等于 |
>= |
大于等于 |
| != |
不等于 |
!> |
不大于 |
| < |
小于 |
between |
在指定的二个值之间 |
| <= |
小于等于 |
is null |
为NULL值 |
| !< |
不小于 |
|
|
注意:
1.表中列出的某些操作符是冗余的(如< >与!=相同,!< 相当于 >=)。
并非所有 DBMS 都支持这些操作符。想确定你的 DBMS 支持哪些操作符,请参阅相应的文档。
检索单个值
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
输出:
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE prod_price < 10;
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| Fish bean bag toy | 3.49 |
| Bird bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| 8 inch teddy bear | 5.99 |
| 12 inch teddy bear | 8.99 |
| Raggedy Ann | 4.99 |
| King doll | 9.49 |
| Queen doll | 9.49 |
+---------------------+------------+
8 rows in set (0.00 sec)
mysql>
SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;
输出:
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE prod_price <= 10;
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| Fish bean bag toy | 3.49 |
| Bird bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| 8 inch teddy bear | 5.99 |
| 12 inch teddy bear | 8.99 |
| Raggedy Ann | 4.99 |
| King doll | 9.49 |
| Queen doll | 9.49 |
+---------------------+------------+
8 rows in set (0.00 sec)
mysql>
不匹配检查
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
输出:
mysql> SELECT vend_id, prod_name
-> FROM Products
-> WHERE vend_id <> 'DLL01';
+---------+--------------------+
| vend_id | prod_name |
+---------+--------------------+
| BRS01 | 8 inch teddy bear |
| BRS01 | 12 inch teddy bear |
| BRS01 | 18 inch teddy bear |
| FNG01 | King doll |
| FNG01 | Queen doll |
+---------+--------------------+
5 rows in set (0.00 sec)
mysql>
SELECT vend_id, prod_name
FROM Products
WHERE vend_id != 'DLL01';
输出:
mysql> SELECT vend_id, prod_name
-> FROM Products
-> WHERE vend_id != 'DLL01';
+---------+--------------------+
| vend_id | prod_name |
+---------+--------------------+
| BRS01 | 8 inch teddy bear |
| BRS01 | 12 inch teddy bear |
| BRS01 | 18 inch teddy bear |
| FNG01 | King doll |
| FNG01 | Queen doll |
+---------+--------------------+
5 rows in set (0.00 sec)
mysql>
注意:何时使用引号 ?
如果仔细观察上述 WHERE 子句中的条件,会看到有的值括在单引号内,而有的值未括起来。单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。
范围值检查
要检查某个范围的值,可以使用 BETWEEN 操作符。其语法与其他 WHERE子句的操作符稍有不同,因为它需要两个值,即范围的开始值和结束值。
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 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 |
+--------------------+------------+
4 rows in set (0.00 sec)
mysql>
注意:
从这个例子可以看到,在使用 BETWEEN 时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用 AND 关键字分隔。BETWEEN 匹配范围中所有的值,包括指定的开始值和结束值。
空值检查
在创建表时,表设计人员可以指定其中的列能否不包含值。在一个列不包含值时,称其包含空值 NULL。
NULL
无值(no value),它与字段包含 0、空字符串或仅仅包含空格不同。
确定值是否为 NULL,不能简单地检查是否等于 NULL。SELECT 语句有一个特殊的 WHERE 子句,可用来检查具有 NULL 值的列。这个 WHERE 子句就是 IS NULL 子句。其语法如下:
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
输出:
mysql> SELECT prod_name
-> FROM Products
-> WHERE prod_price IS NULL;
Empty set (0.00 sec)
mysql>
这条语句返回所有没有价格(空 prod_price 字段,不是价格为 0)的产品,由于表中没有这样的行,所以没有返回数据。但是,Customers表确实包含具有 NULL 值的列:如果没有电子邮件地址,则 cust_email列将包含 NULL 值:
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;
输出:
mysql> SELECT cust_name
-> FROM Customers
-> WHERE cust_email IS NULL;
+---------------+
| cust_name |
+---------------+
| Kids Place |
| The Toy Store |
+---------------+
2 rows in set (0.00 sec)
mysql>
注意:NULL 和非匹配 通过过滤选择不包含指定值的所有行时,你可能希望返回含 NULL 值的
行。但是这做不到。因为 NULL 比较特殊,所以在进行匹配过滤或非匹配过滤时,不会返回这些结果。
小结
本小结介绍了如何用 SELECT 语句的 WHERE 子句过滤返回的数据。我们学习了如何检验相等、不相等、大于、小于、值的范围以及 NULL值等。
小练习
1.编写 SQL 语句,从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),只返回价格为 9.49 美元的产品。
SELECT prod_id, prod_name
FROM Products
WHERE prod_price = 9.49;
mysql> SELECT prod_id, prod_name
-> FROM Products
-> WHERE prod_price = 9.49;
+---------+------------+
| prod_id | prod_name |
+---------+------------+
| RYL01 | King doll |
| RYL02 | Queen doll |
+---------+------------+
2 rows in set (0.00 sec)
mysql>
2.编写 SQL 语句,从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),只返回价格为 9 美元或更高的产品。
SELECT prod_id, prod_name
FROM Products
WHERE prod_price >= 9;
mysql> SELECT prod_id, prod_name
-> FROM Products
-> WHERE prod_price >= 9;
+---------+--------------------+
| prod_id | prod_name |
+---------+--------------------+
| BR03 | 18 inch teddy bear |
| RYL01 | King doll |
| RYL02 | Queen doll |
+---------+--------------------+
3 rows in set (0.00 sec)
mysql>
3. 结合第 2课和第 3 课编写 SQL 语句,从 OrderItems 表中检索出所有不同订单号(order_num),其中包含 100 个或更多的产品。
SELECT DISTINCT order_num
FROM OrderItems
WHERE quantity >=100;
mysql> SELECT DISTINCT order_num
-> FROM OrderItems
-> WHERE quantity >=100;
+-----------+
| order_num |
+-----------+
| 20005 |
| 20007 |
| 20009 |
+-----------+
3 rows in set (0.00 sec)
mysql>
4.编写 SQL 语句,返回 Products 表中所有价格在 3 美元到 6 美元之间 的产品的名称(prod_name)和价格(prod_price),然后按价格对结果进行排序。(本题有多种解决方案,我们在下一课再讨论,不过你可以使用目前已学的知识来解决它。)
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 3 AND 6
ORDER BY prod_price;
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE prod_price BETWEEN 3 AND 6
-> ORDER BY prod_price;
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| Fish bean bag toy | 3.49 |
| Bird bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| Raggedy Ann | 4.99 |
| 8 inch teddy bear | 5.99 |
+---------------------+------------+
5 rows in set (0.00 sec)
mysql>