LINUX.ORG.RU
решено ФорумAdmin

Как работает порядок сортировки в SQL (ORDER BY). Не могу отдуплять?

 ,


0

1

Можете человеческим языком объяснить дурачку? Как вообще работает этот прекрасное ключевое слово ORDER BY в SQL? Читаю книгу по SQL, и не могу отдуплять. В нем пишется следующее:

По «остальным» сортировка работает, если предыдущие поля в списке ORDER BY равны.

Шо значит предыдущие поля в списке ORDER BY равны? К чему равны? К чему это сравнивается? Допустим есть такая таблица:

-- Таблица "Persons"

 first_name |  last_name   |  year_of_birth
----------------------------------------
  иван      | валуев       |     1989
  александр | глыбин       |     1975
  максим    | тарский      |     1982
  владимир  | пагубин      |     1976

Я хочу отсортировать по first_name и last_name. Отправляю такой запрос:

SELECT first_name, last_name,
FROM Persons
ORDER BY first_name, last_name;

И я вижу такое:

 first_name |  last_name  
--------------------------
  александр | глыбин      
  владимир  | пагубин     
  иван      | валуев      
  максим    | тарский     

А че? Второй критерий last_name не будет действовать шо ли? Только по first_name отсортировал? Вопрос тогда, когда и в каких обстоятельствах может действовать сортировка по второму критерию last_name вот это я не понимаю?

Deleted

Последнее исправление: Deleted (всего исправлений: 2)

Шо значит предыдущие поля в списке ORDER BY равны? К чему равны?

Между собой? Если у тебя 2 ивана, то они сортируются по второму полю

Deleted
()

Я хочу отсортировать по last_name и year_of_birth
ORDER BY first_name, last_name;

Nibbler
()

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

theNamelessOne ★★★★★
()

Если у вас будет более одного first_name «иван» соответственно их фамилии last_name будут отсортированы.
иван петров
иван сидоров
иван яковлев.
А в целом не понято, что вам не понятно.

anc ★★★★★
()

Ответ ищи в одной из переменных

LC_
и опциями, с которой создана БД.

А, стоп, ты про другое, кажется. Пробел попробуй убрать в перечислении.

ORDER BY first_name, пробел last_name

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 3)
Ответ на: комментарий от Deleted

Вы говорите, я хочу отсортировать по field1 затем по field2 и так далее. Если в field1 появятся совпадающие записи на примере «Иван» то будет произведена сортировка по field2

anc ★★★★★
()
Ответ на: комментарий от anc

Да там в первом сообщени просто каша.

SELECT first_name, last_name,
FROM Persons
ORDER BY first_name, last_name;
а в выводе у него ТРИ столбца. Он нам просто голову морочит.

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от anc

То есть это как логическое выражение получается? Внутреннее представление этого алгоритма ORDER BY? Хоть один попадись дубль, перейду ко второму критерию сортировки?

Deleted
()
Ответ на: комментарий от anc

Если у вас будет более одного first_name «иван» соответственно их фамилии last_name будут отсортированы.
иван петров
иван сидоров
иван яковлев.

Всё я понял! Спасибо огромное! ) Немного подправлю:

Если у вас будет более одного «иван» в колонке first_name, соответственно сортировка перейдет по их фамилии last_name.
иван петров
иван сидоров
иван яковлев.

Deleted
()
Ответ на: комментарий от targitaj

, а в выводе сортировка по first_name, year_of_birth

Я этого при всем желании не вижу, даже в исходном варианте (до исправления сообщения) и не мог увидеть исходя из того что first_name уникальны. Просто интересно на основании чего вы предположили что сортировка в выводе «по first_name, year_of_birth» ?

anc ★★★★★
()
Ответ на: комментарий от anc
И я вижу такое:

 first_name |  last_name   |  year_of_birth
----------------------------------------
  александр | глыбин       |     1975
  владимир  | пагубин      |     1976
  иван      | валуев       |     1989
  максим    | тарский      |     1982

хм, точно, 89-82

хз вообще что за каша в первом сообщении

targitaj ★★★★★
()
Ответ на: комментарий от targitaj

Нормальная каша ) Я этот образ из головы нарисовал, поэтому немного ошибочка вышла. Только суть хотел передать.

Deleted
()
Ответ на: комментарий от Deleted

Но в результате ты себя и других за нос водишь. Думаешь одно, пишешь второе, выводы даёшь третьи. И не забудь, сортировка символов определяется выбранной локалью.

targitaj ★★★★★
()
Ответ на: комментарий от targitaj

Я понял, сори за ляпы. Немного поторопился просто )

Deleted
()

А че? Второй критерий last_name не будет действовать шо ли?

Будет, если по первому критерию сортировка не применима, т.е. когда имена одинаковые. Поэтому нормальные люди первым критерием используют фамилию, а вторым имя. Тогда если фамилии одинаковые, то порядок будет определяться именем.

Казалось бы очевидная штука, любой алфавитный список возьми и там будет именно так. Может ты и правда дурачок?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Может ты и правда дурачок?

Возможно )). Ну что ж, дурачок это тоже дар. Спасибо за подробные разъяснения. Лор всегда торт, благодаря таким людям!

Deleted
()
Ответ на: комментарий от Deleted

Лор всегда торт, благодаря таким людям!

«Мы работаем для Вас!» (c)

Но вообще, твой вопрос конечно вызвал недоумение. Ладно, скажу чё-нибудь полезное. Сравнение выполняется по типу столбца, в т.ч. для строк применяется заданный типом collation. Часто (даже неверное, обычно) он бывает case-insensitive, имей в виду. Кроме того без индекса по полям которые указаны в сортировке и без limit (или limit c большим offset) все это может происходить довольно медленно. Индекс желательно иметь покрывающий, т.е. по всем полям в ORDER BY и именно в том порядке.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Предполагаю, что вы хотели написать что-то хорошее (без стеба). Но ваши советы уже выходят за рамки вопроса топика. Например в тему индексов они могут быть как вредные так и полезные с равной долей вероятности. Все зависит от конкретной реализации. Что бы было понятно, вот так по вашему совету потом создадут индекс на 100 полей varchar(100500), выборка, да, быстрее, но любое изменение будет большой попоболью. Индексы это и хорошо и плохо.

anc ★★★★★
()
Ответ на: комментарий от anc

хотели написать что-то хорошее

Я написал «что-то полезное» для ТС, а не «что-то хорошее». Говоря без стёба, я считаю что люди вокруг не клинические идиоты и смогут сами разобраться что хорошо, а что плохо в определённой ситуации, если им показать возможные варианты и «куда копать».

ваши советы уже выходят за рамки вопроса топика

Я ценю твоё замечание, няша, но не мог бы ты в следующий раз высказать его без вот этого высокомерия и снобизма? Было не очень приятно.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Возможно был не правильно понят. Извините. Действительно двояко получилось. Фраза «без стеба» подразумевала что это я не стебусь.
Не каким образом не хотел оскорбить вас.
Я только хотел указать на тот момент, что советовать человеку который только начинает изучать sql «обмазываться индексами» «по поводу и без» не самый лучший вариант. Это отдельная часть в рамках субд, да и даже старой файловой бд тоже. И она достойна отдельных тем (именно во множественном числе).

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 2)
Ответ на: комментарий от anc

Да ладно, с кем не бывает. Мир, дружба. Я согласен с тем что ты сказал по существу, злоупотреблять индексами конечно не стоит.

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.