Каков порядок строк в Oracle по умолчанию для запроса на выборку, если не указано условие «order by».
Is it
- порядок вставки строк
- вообще нет порядка по умолчанию
- ни один из вышеперечисленных.
Каков порядок строк в Oracle по умолчанию для запроса на выборку, если не указано условие «order by».
Is it
По словам Тома Кайта: «До тех пор, пока вы не добавите в запрос «упорядочить по», вы не сможете НИЧЕГО сказать о порядке возвращаемых строк. Ну, за исключением «вы не можете полагаться на порядок возвращаемых строк».
См. этот вопрос по адресу asktom.com.
Что касается ROWNUM, то его физически не существует, поэтому его нельзя «освободить». ROWNUM присваивается после извлечения записи из таблицы, поэтому «WHERE ROWNUM = 5» всегда не сможет выбрать какие-либо записи.
@ammoQ: вы можете прочитать эту статью AskTom о групповом заказе. Короче:
Гарантирует ли предложение Group By в запросе, что выходные данные будут отсортированы по столбцам Group By по порядку, даже если нет предложения Order By?
и мы сказали...
ТОЧНО НЕТ,
Такого никогда не было, никогда не было и никогда не будет.
Нет явного порядка по умолчанию. По понятным причинам, если вы создадите новую таблицу, вставите несколько строк и сделаете «выбрать *» без предложения «где», она (весьма вероятно) вернет строки в том порядке, в котором они были вставлены.
Но вы никогда не должны полагаться на порядок по умолчанию. Если вам нужен конкретный порядок, используйте пункт «заказ по». Например, в версиях Oracle до 9i выполнение «группировки по» также приводило к сортировке строк по групповому выражению. В 10g такого поведения больше нет! Из-за этого обновление установок Oracle заставило меня потрудиться.
if you create a **new** table, insert a few rows and do a select
Хотя я бы сказал ...it will _most likely_ return...
- person Amit Naidu; 16.04.2013
Уже было сказано, что Oracle может предоставить вам строки в любом порядке, который он хочет, если вы не укажете предложение ORDER BY. Предполагать, каким будет порядок, если вы не укажете предложение ORDER BY, бессмысленно. И полагаться на это в вашем коде - это "шаг, ограничивающий карьеру".
Простой пример:
SQL> create table t as select level id from dual connect by level <= 10
2 /
Tabel is aangemaakt.
SQL> select id from t
2 /
ID
----------
1
2
3
4
5
6
7
8
9
10
10 rijen zijn geselecteerd.
SQL> delete t where id = 6
2 /
1 rij is verwijderd.
SQL> insert into t values (6)
2 /
1 rij is aangemaakt.
SQL> select id from t
2 /
ID
----------
1
2
3
4
5
7
8
9
10
6
10 rijen zijn geselecteerd.
И это только после простого удаления+вставки. И есть множество других мыслимых ситуаций. Параллельное выполнение, разделы, таблицы, организованные по индексу, и это лишь некоторые из них.
Итог, как уже очень хорошо сказал ammoQ: если вам нужно отсортировать строки, используйте предложение ORDER BY.
select * from another_table order by filed1
- person Toolkit; 18.10.2017
Вы абсолютно точно не можете полагаться на какой-либо порядок, если не укажете order by
. В частности, для Oracle я действительно видел точно такой же запрос (без соединений), запускаемый дважды с интервалом в несколько секунд друг от друга, в таблице, которая не изменилась за это время, возвращая совершенно другой порядок. Это кажется более вероятным, когда набор результатов большой.
Параллельное исполнение, упомянутое Робом ван Вейком, вероятно, объясняет это. См. также документ Oracle Использование параллельного выполнения.
На него влияет индекс, если есть индекс, он вернет порядок по возрастанию, если индекса нет, он вернет вставленный порядок.
Вы можете изменить порядок, в котором данные сохраняются в таблице, с помощью INSERT с предложением ORGANIZATION оператора CREATE TABLE.
organization indexed
и external
, которые имеют особое использование. Подробнее
- person APC; 01.06.2019
Хотя это должен быть rownnum (ваш номер 2), на самом деле это не гарантировано, и вы не должны доверять ему на 100%.
Я считаю, что он использует скрытый атрибут Oracle Rownum.
Таким образом, ваш № 1, вероятно, прав, предполагая, что не было выполнено никаких удалений, которые могли бы освободить ряды для последующего использования.
EDIT: Как уже говорили другие, вам никогда не следует полагаться на это. Помимо удаления, существует множество различных условий, которые могут повлиять на поведение сортировки по умолчанию.