AND 只有在两个条件都为真时才保留记录。OR 只要至少一个为真就保留。括号会强制某一部分条件先计算。
没有括号时,AND 先于 OR 计算。这正是括号位置成为数据库与查询推理考试陷阱的原因。
这些运算符怎样运作?
| A | B | A AND B | A OR B |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE | TRUE |
| FALSE | TRUE | FALSE | TRUE |
| FALSE | FALSE | FALSE | FALSE |
加上 AND 会让查询更严格,所以只会减少行。加上 OR 会让查询更宽松,所以只会增加行。布尔与数制实验室可以帮你建立这样的真值表。
例题
这是 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 = "Herb" OR Type = "Succulent" AND Price > 6
SELECT Name FROM Plants
WHERE (Type = "Herb" OR Type = "Succulent") AND Price > 6
查询 1。 AND 先算,所以条件的意思是:Herb,或者(Succulent 且 Price > 6)。Mint 和 Basil 是香草,所以都通过。Cactus 是多肉植物,但 6.00 不大于 6,所以不通过。Aloe 是多肉植物,价格 9.50,所以通过。结果:Mint、Basil、Aloe(3 行)。
查询 2。 先算括号:植物必须是 Herb 或 Succulent,并且价格高于 6。Mint 4.50 不通过,Basil 5.00 不通过,Cactus 6.00 不通过,Aloe 9.50 通过。结果:Aloe(1 行)。
文字相同,括号不同,结果是三行对一行。
要留意的错误
常见的失误是从左到右读条件,忽略 AND 的优先级。
错误答案:“查询 1 只返回 Aloe,因为价格测试适用于香草和多肉植物。”
这种读法加上了查询里并不存在的括号。
纠正:在测试任何一行之前,先自己在 AND 周围写上括号。自己写查询时,即使括号可有可无,也一律加上。
自我检测
1. WHERE Type = "Flowering" AND Indoor = TRUE 返回哪些植物?
查看答案
Flowering:Rose(室外)、Orchid(室内)、Hibiscus(室外)。只有 Orchid 两个条件都通过。
2. WHERE Stock = 0 OR Price > 20 返回几行?
查看答案
Stock = 0:Rose。Price > 20:Orchid。合起来共 2 行:Rose 和 Orchid。
3. 改写 Type = "Herb" OR Type = "Foliage" AND Indoor = TRUE,让 Indoor 测试同时适用于两种类型。
查看答案
(Type = "Herb" OR Type = "Foliage") AND Indoor = TRUE
接下来学什么
接下来学习解释查询为什么没有返回行。单元练习题包含更多分组题。
当分组题在压力下仍然出错时,我们的老师可以通过计算机科学线上一对一补习帮助你。