当没有任何记录通过全部条件时,查询就不会返回行。查询本身运行正确:数据库只是没有找到匹配的内容。
考题要求你用文字解释,所以必须指出确切的原因。这一课为数据库与查询推理单元收尾。
常见原因有哪些?
按以下顺序检查:
- 不可能同时成立的条件。 一个字段不能同时等于两个不同的值。
- 数据之外的值。 测试的值不在表里,例如价格高于最大值。
- 拼写或类型不匹配。
"herbs"不是"Herb",数字也不是文本。 - 本该用 OR 却用了 AND。 AND 要求所有条件同时成立。
- 边界问题。
>不包括该值本身。
例题
使用 Plants 表:
| PlantID | Name | Type | Price | Stock | Indoor |
|---|---|---|---|---|---|
| P01 | Fern | Foliage | 12.50 | 8 | TRUE |
| P02 | Cactus | Succulent | 6.00 | 25 | TRUE |
| P03 | Rose | Flowering | 15.00 | 0 | FALSE |
| P04 | Mint | Herb | 4.50 | 40 | FALSE |
| P05 | Orchid | Flowering | 28.00 | 3 | TRUE |
| P06 | Basil | Herb | 5.00 | 12 | FALSE |
| P07 | Aloe | Succulent | 9.50 | 15 | TRUE |
| P08 | Hibiscus | Flowering | 18.00 | 6 | FALSE |
SELECT Name FROM Plants
WHERE Type = "Flowering" AND Indoor = TRUE AND Stock > 5
这条查询没有返回行。为什么?
步骤 1,列出通过第一个条件的记录。 Type = “Flowering”:Rose、Orchid、Hibiscus。
步骤 2,应用第二个条件。 Indoor = TRUE:Rose 是 FALSE,Orchid 是 TRUE,Hibiscus 是 FALSE。只剩 Orchid。
步骤 3,应用第三个条件。 Stock > 5:Orchid 的库存是 3,不大于 5。Orchid 不通过。
步骤 4,说明原因。 唯一的室内开花植物是 Orchid,它的库存是 3,所以没有记录满足全部三个条件。
最终答案:没有行,因为唯一通过前两个测试的记录没有通过 Stock 测试。一次过滤一个条件,就能看出最后一条记录是在哪里被淘汰的。
要留意的错误
常见的失误是回答“表是空的”或“查询有错误”。
错误答案:“Plants 表里没有开花植物。”
这是错的:Rose、Orchid 和 Hibiscus 都是开花植物。
纠正:说出每个条件之后剩下的记录,并指出是哪个测试把它去掉的。解释无结果时如果没有指出具体的条件,就拿不到分数。
自我检测
1. 为什么 WHERE Type = "Herb" AND Type = "Succulent" 什么也不返回?
查看答案
一条记录的 Type 只有一个值,所以不可能同时是 Herb 和 Succulent。这两个条件不可能同时为真。用 OR 则会返回 Mint、Basil、Cactus 和 Aloe。
2. 为什么 WHERE Price > 28 什么也不返回?怎样修改才能返回一行?
查看答案
最高价格是 28.00(Orchid),而 > 不包括它。改成 >= 28 就会返回 Orchid。
3. 学生写了 WHERE Type = "herb"。他们预期得到几行?实际可能得到什么?
查看答案
他们预期 2 行(Mint、Basil)。小写拼写是否匹配,取决于数据库是否忽略大小写,所以为稳妥起见,要与存储的拼写 "Herb" 完全一致。
接下来学什么
用原创练习题完成本单元。在只读 SQL 练习实验室尝试空结果的情况,亲眼看看它是怎么发生的。
如果你想学会把这样的解释写成清楚的考试答案,可以看看我们的计算机科学线上一对一补习。