2013-03-26 8 views
16

Я хочу отсортировать таблицу товаров по двум колонкам: prod_price и prod_name.SQL ORDER BY multiple columns

SELECT prod_id, prod_price, prod_name 
FROM Products 
ORDER BY prod_price, prod_name; 

Как осуществляется сортировка здесь? Я думаю, что это происходит сначала prod_price, а затем prod_name. Кроме того, как это выше запрос отличается от этого:

SELECT prod_id, prod_price, prod_name 
FROM Products 
ORDER BY prod_name; 

Моя продукция таблица выглядит следующим образом:

CREATE TABLE Products 
(
    prod_id char(10)  NOT NULL , 
    vend_id char(10)  NOT NULL , 
    prod_name char(255)  NOT NULL , 
    prod_price decimal(8,2) NOT NULL , 
    prod_desc text   NULL 
); 

ответ

29

Сортировка в ORDER BY выполняется первым столбцом, а затем каждым дополнительным столбцом в указанном операторе.

Например, рассмотрим следующие данные:

Column1 Column2 
======= ======= 
1   Smith 
2   Jones 
1   Anderson 
3   Andrews 

Запрос,

SELECT Column1, Column2 FROM thedata ORDER BY Column1, Column2 

бы сортировать по всем значениям в Column1

, а затем отсортировать столбцы по Column2 в произвести это:

Column1 Column2 
======= ======= 
1   Anderson 
1   Smith 
2   Jones 
3   Andrews 

Другими словами, данные сначала сортируются в порядке Column1, а затем каждое подмножество (Column1 строк, которые имеют 1 в качестве их значения) сортируются по порядку второго столбца.

Разница между двумя опубликованными вами заявками заключается в том, что строки в первом будут отсортированы сначала на prod_price (порядок цен, от самого низкого до самого высокого), а затем по порядку имени (что означает, что если два элемента имеют такая же цена, первая с нижним альфа-значением для имени будет указана первой), а вторая будет сортироваться только в порядке имени (что означает, что цены будут отображаться в порядке, основанном на prod_name, без учета цены).

+0

И только для удовольствия (но не только для удовольствия): есть еще один способ сортировки данных в СУБД, который поддерживает синтаксис окна: 'select *, count (*) over (order by Column1, Column2) из ​​thedata' – Abelisto

0

Да, сортировка отличается.

Элементы в списке ORDER BY применяются в заказе.
Позже пункты только заказывают сверстники слева от предыдущего шага.

Почему бы вам не просто попробуйте?

+0

Я думаю, что сортировка по prod_name выполняется только тогда, когда столбцы prod_price имеют одинаковые значения, иначе они сортируются по prod_name. Скажите, правильно ли я – user2201462

+0

@ user2201462: Это то, что означает слово * peer *. Эти строки одинаковы для определенного элемента ORDER BY. Только те, которые подлежат следующему пункту. –

1

Это зависит от размера вашей базы данных.

SQL основан на теории SET: при запросе таблицы нет порядка, используемого по умолчанию.

Итак, если бы вы выполнили первый запрос, он сначала заказывал бы по цене продукта, а затем по названию продукта, ЕСЛИ в ценовой категории были какие-то дубликаты, например, $ 20, тогда они будут заказывать эти дубликаты по их именам , поэтому всегда поддерживая, что при запуске запроса он всегда возвращает тот же набор результатов в том же порядке.

Если вы должны были выполнить второй запрос, он будет заказывать только имя, поэтому, если бы было два продукта с одинаковым именем (по какой-то нечетной причине), то у них не было бы гарантированного заказа после запуска запрос.

5

Результаты упорядочиваются по первому столбцу, затем по второму и т. Д. Для количества столбцов, в которое включено предложение ORDER BY. Если вы хотите, чтобы результаты отсортированы в порядке убывания, предложение ORDER BY должно использовать ключевое слово DESC непосредственно после имени или номера соответствующего столбца.

Проверить этот пример

SELECT first_name, last_name, hire_date, salary 
FROM employee 
ORDER BY hire_date DESC,last_name ASC; 

Он прикажет подряд. Сначала закажите Hire_Date, затем LAST_NAME - Hire_Date.

1

Да, сортировка выполняется по-другому. в первом сценарии, заказы на основе столбца1 и в дополнение к этому процессу далее путем сортировки colmun2 на основе столбца 1 .. во втором сценарии, он заказывает полностью только на основе столбца 1 ... проследуйте простым примером ... u будет быстро.