SQL-запрос нет порядка за вопросом - PullRequest
0 голосов
/ 09 октября 2009

Ввязался в бурную дискуссию (были включены все заглавные буквы) с группой друзей

В 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 ]

4 голосов
/ 09 октября 2009

Я бы отредактировал это в одном из существующих ответов, но, увы, репутации недостаточно ...

Я думаю, что все согласны со следующим:

  1. Набор результатов состоит из двух значений в ответе (b) в произвольном порядке.
  2. Стандарт SQL не предписывает порядок, в котором эти два значения возвращаются из оператора. Итак, (е) формально правильный ответ.
  3. Кажется, есть некоторые доказательства того, что есть логика порядка, в котором база данных будет возвращать значения, либо порядок вставки, либо "индекс" первичного ключа. Это означает, что большую часть времени возвращаемый результат будет детерминированным, включая, возможно, (b).
  4. Как отмечено в (2), это не гарантируется, поэтому, если вы хотите заказать или полагаться на него, используйте предложение order by.

Надеюсь, что это суммирует все ответы.

4 голосов
/ 09 октября 2009

Добавленный заказ не обязательно будет порядком в наборе результатов.

Ответ МОЖЕТ быть b., Но ничто в спецификации SQL для SELECT не гарантирует этого (без предложения ORDER BY порядок не определен).

Лучший ответ е.

3 голосов
/ 09 октября 2009
mysql> select name from test where code in ('BE','CH','DE','MU');
+------------+
| name       |
+------------+
| BENGALOORU | 
| MUMBAI     | 
+------------+
2 rows in set (0.00 sec)

но на самом деле порядок произвольный и зависит от базовой реализации хранилища БД. Таблицы по сути не упорядочены. если вы хотите конкретный порядок, используйте предложение ORDER BY.

2 голосов
/ 09 октября 2009

Результат запроса должен быть (b), но любой, кто спорит с (e), очень смелый - если нет «порядка по», то порядок не определен, и это неупорядоченный набор.

Звучит как глупый аргумент. Если вы хотите заказать, укажите предложение 'order by'.

edit: Ответ (e) сформулирован очень плохо. В нем должно быть указано, что «результат не определен и не гарантируется, что это что-либо из перечисленного» Неправильно утверждать «ничего из вышеперечисленного», потому что вполне вероятно, что это приведет к (б), даже если это неправда, что «всегда» будет (б).

1 голос
/ 09 октября 2009

е. Порядок возвращаемых результатов зависит только от порядка вставки, где не было фрагментации.

Мы видели это в большой базе данных, где годами обходились в отчетах без сортировки по RecirdId (это было поле Identity). В течение многих лет результаты возвращались в числовом порядке без упорядочения по пунктам. Однако однажды отчеты стали выходить в тупой форме.

Мы добавили предложение Order By И создали задания для более частого перестроения индексов.

0 голосов
/ 09 октября 2009

Разумный ответ (б).

Это потому, что эти две строки do имеют code in ('BE', 'CH', 'DE','MU'), поэтому эти две вернут true; таким образом строки будут выбраны. Лишние пробелы в кодах для Ченнаи и Дели означают, что это не точное совпадение, как справедливо отмечают комментарии ниже.

Технически , вы не гарантированно будете иметь (b) в качестве ответа, поскольку результаты базы данных не гарантируются в любом порядке, если вы не укажете «order by». Но если вы после set результатов, вы получите (б). Если порядок результатов важен для вас, то (e) более «правильный».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...