/ / Zapytanie SQL brak porządku według zapytania - sql

Zapytanie SQL bez porządku według zapytania - sql

Dostałam się do gorącej debaty (w której brały udział wszystkie kapitaliki) z grupą przyjaciół

W 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

Jaki jest wynik tego zapytania?

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

Odpowiedzi:

4 dla odpowiedzi № 1

Wstawione zamówienie niekoniecznie będzie kolejnością w zestawie wyników.

Odpowiedź MOŻE być b., Ale nic w specyfikacji SQL dla SELECT nie gwarantuje (bez klauzuli ORDER BY kolejność jest nieokreślona).

Najlepszą odpowiedzią jest e.


4 dla odpowiedzi nr 2

Zmienilbym to na jedną z istniejących odpowiedzi, ale niestety, za mało reputacji ...

Myślę, że wszyscy zgadzają się co następuje:

  1. Zestaw wyników składa się z dwóch wartości w odpowiedzi (b) w żadnej określonej kolejności.
  2. Standard SQL nie dyktuje żadnej kolejności, w której te dwie wartości są zwracane z instrukcji. Więc (e) jest formalnie poprawną odpowiedzią.
  3. Wydaje się, że istnieją pewne dowody na to, że tak jestlogika do zamówienia baza danych zwróci wartości, kolejność wstawiania lub klucz podstawowy "indeks". Oznacza to, że przez większość czasu zwracany wynik będzie deterministyczny, w tym możliwie (b).
  4. Jak wspomniano w (2), nie jest to gwarantowane, więc jeśli chcesz zamówić lub polegać na nim, użyj znaku order by klauzula.

Mam nadzieję, że to podsumowuje wszystkie odpowiedzi w górę.


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

ale tak naprawdę, porządek jest arbitralny i zależy od podstawowej implementacji magazynu db. tabele nie są zamówione z natury. jeśli chcesz konkretnego zamówienia, użyj klauzuli ORDER BY.


2 dla odpowiedzi № 4

Rezultatem zapytania powinno być (b), ale każdy, kto argumentuje przeciwko (e), jest bardzo odważny - jeśli nie ma "porządku przez", to kolejność jest niezdefiniowana i jest zbiorem nieuporządkowanym.

Brzmi jak niemądry argument. Jeśli chcesz zamówić, określ klauzulę "sortuj według".

edytować: Odpowiedź (e) jest bardzo słabo sformułowana. Powinien powiedzieć "wynik jest nieokreślony i nie gwarantuje, że którykolwiek z powyższych". Niepoprawne jest stwierdzenie "żadnego z powyższych", ponieważ prawdopodobnie spowoduje to (b), nawet jeśli nie jest prawdą, że będzie "zawsze" (b).


1 dla odpowiedzi nr 5

mi. Kolejność zwracanych wyników zależy tylko od kolejności wstawienia w przypadku braku fragmentacji.

Widzieliśmy to w dużej bazie danych, w której się znaleźliśmyprzez lata na raportach bez sortowania na RecirdId (co było polem Identity). Przez lata wyniki wracały w kolejności numerycznej bez klauzuli porządkowej. Jednak pewnego dnia raporty zaczęły pojawiać się w głupim rozkazie.

Dodaliśmy klauzulę Zlecenie ORAZ utworzono zadania, aby częściej budować indeksy.


0 dla odpowiedzi № 6

Odpowiedzią rozsądną jest (b).

To dlatego, że te dwa rzędy zrobić mieć code in ("BE", "CH", "DE","MU"), więc ci dwaj zwrócą prawdę; w ten sposób zostaną wybrane wiersze. Dodatkowe miejsca w kodach na Chennai i Delhi oznaczają, że nie jest to dokładny odpowiednik, jak słusznie wskazują poniższe komentarze.

Technicznie, nie ma gwarancji, że (b) jako odpowiedź, ponieważ wyniki w bazie danych nie są gwarantowane w żadnej kolejności, chyba że użytkownik określi "zamówienie". Ale jeśli "jesteś za zestaw wyników, dostaniesz (b). Jeśli kolejność wyników jest dla ciebie ważna, to (e) jest bardziej "poprawna".