这个练习室让你在一个名为 Books 的小型虚构表上练习 SELECT 查询。表有十二行,列为 BookID、Title、Genre、Pages、Price 和 Stock。
只接受只读查询,所以你可以放心尝试,每个结果都附有逐步的推演过程。
怎么使用?
- **从八个练习中选一个。**每个练习是一句通俗的任务,例如“显示所有 Fantasy 书籍的 Title 和 Price。”
- **在文本框里写查询。**有些练习一开始就给了一条差不多正确的查询。先预测它会返回什么。
- 按运行查询。重置会让练习室回到初始状态。
- 读推演过程,再把你的结果与预期结果对比。
支持:SELECT 加列名、* 或 COUNT、SUM、AVG、MIN、MAX;FROM Books;WHERE 可用 =、<>、<、>、<=、>=、AND、OR、NOT、LIKE、BETWEEN 和 IN;ORDER BY;LIMIT。文字值要放在单引号里。
怎么看结果?
推演过程按真实的思考顺序展开:FROM Books 从全部 12 行开始,WHERE 只保留条件为真的行并说明剩下几行,ORDER BY 排序,LIMIT 保留前几行,SELECT 决定显示哪些列。
然后你会看到自己的表和预期表并排显示,并提示两者是否一致,以及本练习中行的顺序是否也重要。
例子演示
选择练习“显示缺货(Stock 为 0)的 Mystery 或 Science 书籍的 Title”。初始查询是:
SELECT Title FROM Books WHERE Genre = ‘Mystery’ OR Genre = ‘Science’ AND Stock = 0
运行后得到三行:Silent Harbour、Paper Lanterns 和 Night Train。预期结果只有两行。为什么?
AND 比 OR 先计算。所以这条查询的意思是“Mystery,或者(Science 且缺货)”。每本 Mystery 都符合,不管有没有库存。
没有 Science 书的 Stock 为 0,所以第二部分没有加任何行。
用括号修正:WHERE (Genre = ‘Mystery’ OR Genre = ‘Science’) AND Stock = 0。现在先判断类别,再判断库存。结果是 Silent Harbour 和 Night Train,与预期一致。
再试第二个:“数一数价格低于 20 的书有几本。”SELECT COUNT(*) FROM Books WHERE Price < 20 返回 5,对应价格 18.5、14、19.9、16.5 和 9.9。
然后测试防护:输入 DROP TABLE Books,看看它是如何被拒绝的。
有哪些假设和限制?
- 数据是虚构且固定的。不使用任何个人数据,也不能连接外部数据库。
- 只运行一条只读 SELECT。多余的语句、注释和文件函数都会被拒绝。
- 这是小型解释器,不是完整的数据库引擎。不支持连接、GROUP BY 和子查询,把普通列与聚合函数混用也会被拒绝。
- 文字比较需要引号。拿数字与文字比较会给出明确的错误提示。
- 仅用于原创练习。它不会批改需要评分的课业,也不使用你自己的数据。
哪些课程解释了这些结果?
先看写一个简单的 SELECT 筛选条件。例子中的括号问题,是用正确的布尔分组组合条件的主题。当你得到零行时,请读解释为什么查询没有返回任何行。
想做综合题,可以试试数据库与查询推理练习,整个主题见数据库与查询推理。如果你走的是 ICT 实践路线,正确使用多个查询条件在数据库软件里讲的是同样的分组思路。
想让老师陪你检查查询?请看在线一对一 Computer Science 补习或 ICT 补习。更多工具见学习工具目录。