这十道题涵盖字段、记录、键、SELECT 筛选、布尔分组和空结果,由易到难。全部使用同一张虚构的 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 |
第 1 题。 这张表有几个字段、几条记录?
查看答案
字段是列:PlantID、Name、Type、Price、Stock、Indoor,共 6 个字段。记录是数据行 P01 到 P08,共 8 条记录。标题行不是记录。
第 2 题。 哪个字段是最合适的主键?为什么 Type 和 Indoor 不合适?
查看答案
PlantID 在每条记录中都不同,而且是专门为唯一而创建的。Type 会重复(Herb 出现两次),Indoor 只有两个值,所以都无法识别单一记录。
第 3 题。 为 Price、Stock 和 Indoor 各选一个最合适的数据类型。
查看答案
Price:real(有小数,例如 12.50)。Stock:integer(整数)。Indoor:Boolean(TRUE 或 FALSE)。
第 4 题。 写一条查询,显示每种香草(herb)的 Name,并给出结果。
查看答案
SELECT Name
FROM Plants
WHERE Type = "Herb"
记录 P04 和 P06 通过。结果:Mint、Basil。
第 5 题。 写一条查询,列出价格低于 10 的植物的 Name 和 Price,并说明返回几行。
查看答案
SELECT Name, Price
FROM Plants
WHERE Price < 10
Cactus 6.00、Mint 4.50、Basil 5.00、Aloe 9.50 通过。共 4 行。
第 6 题。 写一条查询,显示每种缺货植物的 Name。
查看答案
SELECT Name
FROM Plants
WHERE Stock = 0
只有 Rose 的 Stock 是 0。结果:Rose。
第 7 题。 这条查询返回什么?
SELECT Name FROM Plants
WHERE Indoor = TRUE AND Price >= 9.5
查看答案
室内植物:Fern 12.50、Cactus 6.00、Orchid 28.00、Aloe 9.50。价格至少 9.5:Fern、Orchid、Aloe 通过;Cactus 不通过。结果:Fern、Orchid、Aloe。
第 8 题。 写一条查询,显示室内植物的 Name,价格最高的在前,并给出结果。
查看答案
SELECT Name
FROM Plants
WHERE Indoor = TRUE
ORDER BY Price DESC
室内植物价格:Orchid 28.00、Fern 12.50、Aloe 9.50、Cactus 6.00。结果:Orchid、Fern、Aloe、Cactus。
第 9 题。 学生想要价格高于 6 的香草或多肉植物,却写成:
SELECT Name FROM Plants
WHERE Type = "Herb" OR Type = "Succulent" AND Price > 6
写出这条查询实际返回的行,然后改正查询。
查看答案
AND 先算:Herb,或者(Succulent 且 Price > 6)。Mint 和 Basil 因为是香草而通过。Cactus(6.00)不通过。Aloe(9.50)通过。实际结果:Mint、Basil、Aloe。
改正后的查询:
SELECT Name FROM Plants
WHERE (Type = "Herb" OR Type = "Succulent") AND Price > 6
这样只返回 Aloe,因为 Mint、Basil 和 Cactus 的价格都是 6 或更低。
第 10 题。 解释为什么这条查询没有返回行。
SELECT Name FROM Plants
WHERE Type = "Succulent" AND Stock > 20 AND Indoor = FALSE
查看答案
多肉植物是 Cactus 和 Aloe。库存大于 20 只剩 Cactus(25),因为 Aloe 只有 15。Cactus 的 Indoor = TRUE,所以不满足 Indoor = FALSE。没有记录通过全部三个条件,所以没有行返回。查询本身有效,只是唯一通过两个测试的记录没有通过最后一个。
如果做错了
- 第 1 至 3 题(术语、键、类型):回到区分字段、记录与表和选择合适的键。
- 第 4 至 6 题和第 8 题(写筛选、排序):复习写出简单的 SELECT 筛选。
- 第 7 题和第 9 题(AND、OR、括号):复习用正确的布尔分组组合条件。
- 第 10 题(空结果):复习解释查询为什么没有返回行。
把每个失误连同原因记进错题记录,几天后再到只读 SQL 练习实验室重做这条查询。回到单元概览规划下一个主题。
如果同样的错误一再出现,我们的老师可以通过计算机科学线上一对一补习帮助你。