SQL查询没有问题排序

时间:2009-10-09 05:09:34

标签: sql

与一群朋友进行了激烈辩论(涉及所有大写句子)

在SQL中,

create table test(
    id int,
    code varchar(10),
    name varchar(30)
)
insert into test values (1,'BE','BENGALOORU')
insert into test values (2,' CH','CHENNAI')
insert into test values (3,' DE','DELHI')
insert into test values (4,'MU','MUMBAI')
select name from test where code in ('BE','CH','DE','MU')
drop table test

此查询的结果是什么?

a. BENGALOORU, CHENNAI, DELHI, MUMBAI
b. BENGALOORU, MUMBAI
c. BENGALOORU
d. BENGALOORU, CHENNAI, DELHI 
e. None of above options since there is no order by

6 个答案:

答案 0 :(得分:4)

插入的顺序不一定是结果集中的顺序。

答案可能是b。,但SELECT的SQL规范中没有任何内容可以保证它(没有ORDER BY子句,订单是未定义的)。

最好的答案是e。

答案 1 :(得分:4)

我将其编辑成现有的答案之一,但唉,声誉不够......

我认为每个人都同意以下内容:

  1. 结果集由答案(b)中的两个值组成,没有特别的顺序。
  2. SQL标准没有规定从语句返回这两个值的任何顺序。所以(e)是正式的正确答案。
  3. 似乎有一些证据表明数据库返回值的顺序是逻辑,无论是插入顺序还是主键“索引”。这意味着在大多数情况下,返回的结果将是确定性的,包括可能的(b)。
  4. 如(2)所述,这不能保证,因此如果您想订购或依赖订单,请使用order by条款。
  5. 希望这总结所有答案。

答案 2 :(得分:3)

mysql> select name from test where code in ('BE','CH','DE','MU');
+------------+
| name       |
+------------+
| BENGALOORU | 
| MUMBAI     | 
+------------+
2 rows in set (0.00 sec)

但实际上,排序是任意的,取决于db存储的底层实现。表本身并不是有序的。如果您想要特定的排序,请使用ORDER BY子句。

答案 3 :(得分:2)

查询的结果应该是(b)但是反对(e)的任何人都非常勇敢 - 如果没有'order by'那么订单是未定义的,并且它是一个无序集。

听起来像是一个愚蠢的论据。如果您需要订单,请指定“订购依据”条款。

编辑答案(e)的措辞非常差。它应该声明'结果是未定义的,并且不能保证是上述任何一种'。陈述“以上都不是”是不正确的,因为它很可能导致(b),即使它不是'总是'(b)也不是真的。

答案 4 :(得分:1)

即返回结果的顺序仅取决于没有碎片的插入顺序。

我们在一个大型数据库中看到了这一点,我们在报告中多年来没有对RecirdId进行排序(这是我的身份字段)。多年来,结果以数字顺序返回,没有order by子句。然而,有一天报道开始以愚蠢的顺序出现。

我们添加了一个Order By子句并创建了更频繁重建索引的作业。

答案 5 :(得分:0)

明智的答案是(b)。

这是因为那两行code in ('BE', 'CH', 'DE','MU'),所以这两行将返回true;因此将选择行。钦奈和德里代码中的额外空格意味着它不是完​​全匹配,正如下面的评论正确指出的那样。

技术上,您不能保证(b)作为答案,因为除非您指定“order by”,否则不保证数据库结果的顺序是任何顺序。但是如果你在设置结果之后,你会得到(b)。如果结果顺序对您很重要,那么(e)更“正确”。