我有一张名为 STUDENT 的桌子
+-----------+-----------+-----------+---------------+
| StudentID | FirstName | LastName | EnrollmenDate |
+-----------+-----------+-----------+---------------+
| 1 | x | x | x |
| 2 | x | x | x |
| 3 | x | x | x |
+-----------+-----------+-----------+---------------+
写一个查询拉出最后注册的学生?
a) 从 STUDENTorder by EnrollmentDate Desc 选择前 1 *
或者
b) 选择 * from STUDENT 其中 EnrollmentDate = (select Max(EnrollmentDate) from STUDENT)
我倾向于在面试中问这个问题。一位候选人回答 b) 我期待 a)。哪个更好查询?
第二个查询不一定这样做,这取决于
EnrolmentDate
列的数据类型和数据的粒度。如果该列不包含时间成分,则查询将返回学生注册的最后一天注册的所有学生,这不满足问题。如果有时间分量,则有可能(但不太可能)返回多行。(编辑:Alex Kuznetsov 在评论中正确地指出,第一个查询不一定返回最后注册的学生,但是,它保证返回该事件中的记录,而不是所有记录,这通常是令人满意的。我认为我的观点更多的是比较这两个查询是比较苹果和橘子,可以这么说。)
无论如何,如果我们假设所有注册日期/时间都是唯一的,那么根据给出的内容,问题的答案也不一定是明确的。你需要让我符合你所说的更有效率的意思。
第一个查询只会扫描一次,但可能会导致昂贵的排序(您没有说表上存在哪些索引,所以我假设没有)。后一个查询将进行扫描以查找最大值,然后进行另一次扫描以查找所有匹配的行,这可能会使用较少的 CPU,但会使用更多的逻辑 I/O。完全有可能第二个查询总体上更便宜(同样,没有可用的索引)。
话虽如此,如果我要开始对此业务操作进行性能调优,我肯定会从查询 (a) 开始。