УПОРЯДОЧЕНИЕ С ПОМОЩЬЮ МНОГОЧИСЛЕНЫХ СТОЛБЦОВ
Мы можем также упорядочивать таблицу с помощью другого столбца, например с помощью поля amt, внутри упорядочения поля cnum. (вывод показан в Таблице 7.5 ):
SELECT *
FROM Orders
ORDER BY cnum DESC, amt DESC;
SQL Execution Log
SELECT * FROM Orders
ORDER BY cnum DESC, amt DESC;
onum | amt | odate | cnum | snum |
3006 | 1098.16 | 10/03/1990 | 2008 | 1007 |
3001 | 18.69 | 10/03/1990 | 2008 | 1007 |
3002 | 1900.10 | 10/03/1990 | 2007 | 1004 |
3011 | 9891.88 | 10/06/1990 | 2006 | 1001 |
3008 | 4723.00 | 10/05/1990 | 2006 | 1001 |
3010 | 1309.95 | 10/06/1990 | 2004 | 1002 |
3007 | 75.75 | 10/04/1990 | 2004 | 1002 |
3005 | 5160.45 | 10/03/1990 | 2003 | 1002 |
3009 | 1713.23 | 10/04/1990 | 2002 | 1003 |
3003 | 767.19 | 10/03/1990 | 2001 | 1001 |
Таблица 7.5: Упорядочение вывода с помощью многочисленых полей
Вы можете использовать ORDER BY таким же способом сразу с любым числом столбцов. Обратите внимание что, во всех случаях, столбцы которые упорядочиваются должны быть указаны в выборе SELECT. Это - требование ANSI которые в большинстве, но не всегда, предписано системе. Следующая команда, например, будет запрещена:
SELECT cname, city
FROM Customers
GROUP BY cnum;
Так как поле cnum не было выбранным полем, GROUP BY не cможет найти его чтобы использовать для упорядочения вывода. Даже если ваша система позволяет это, смысл упорядочения не будет понятен из вывода, так что включение (в предложение SELECT) всех столбцов, используемых в предложении ORDER BY, в принципе желательно.
УПОРЯДОЧЕНИЕ АГРЕГАТНЫХ ГРУПП
ORDER BY может кроме того, использоваться с GROUP BY для упорядочения групп. Если это так, то ORDER BY всегда приходит последним. Вот - пример из последней главы с добавлением предложения ORDER BY. Перед сгруппированием вывода, порядок групп был произвольным; и мы, теперь, заставим группы размещаться в последовательности:
SELECT snum, odate, MAX (amt)
FROM Orders
GROUP BY snum, odate
GROUP BY snum;
Вывод показывается в Таблице 7.6.
SQL Execution Log
SELECT snum, odate, MAX (amt) FROM Orders
GROUP BY snum, odate ORDER BY snum ;
snum | odate | amt |
1001 | 10/06/1990 | 767.19 |
1001 | 10/05/1990 | 4723.00 |
1001 | 10/05/1990 | 9891.88 |
1002 | 10/06/1990 | 5160.45 |
1002 | 10/04/1990 | 75.75 |
1002 | 10/03/1990 | 1309.95 |
1003 | 10/04/1990 | 1713.23 |
1004 | 10/03/1990 | 1900.10 |
1007 | 10/03/1990 | 1098.16 |
Таблица 7.6: Упорядочение с помощью группы
Так как мы не указывали на возрастание или убывание порядка, возрастание используется по умолчанию.
УПОРЯДОЧЕНИЕ ВЫВОДА ПО НОМЕРУ СТОЛБЦА
Вместо имен столбца, вы можете использовать их порядковые номера для указания поля используемого в упорядочении вывода. Эти номера могут ссылаться не на порядок столбцов в таблице, а на их порядок в выводе.
Другими словами, поле упомянутое в предложении SELECT первым, для ORDER BY - это поле 1, независимо от того каким по порядку оно стоит в таблице. Например, вы можете использовать следующую команду чтобы увидеть определенные поля таблицы Продавцов, упорядоченными в порядке убывания к наименьшему значению комиссионных (вывод показывается в Таблице7.7 ):
SELECT sname, comm
FROM Salespeople
GROUP BY 2 DESC;
SQL Execution Log
SELECT sname, comm FROM Salespeople
ORDER BY 2 DESC;
sname | comm |
Peel | 0.17 |
Serres | 0.13 |
Rifkin | 0.15 |
Таблица 7. 7: Упорядочение использующее номера
Одна из основных целей этой возможности ORDER BY - дать вам возможность использовать GROUP BY со столбцами вывода также как и со столбцами таблицы. Столбцы производимые агрегатной функцией, константы, или выражения в предложении SELECT запроса, абсолютнопригодны для использования с GROUP BY, если они ссылаются к ним с помощью номера. Например, давайте сосчитаем порядки каждого из наших продавцов, и выведем результаты в убывающем порядке, как показано в Таблице 7.8:
SELECT snum, COUNT (DISTINCT onum )
FROM Orders
GROUP BY snum
ORDER BY 2 DESC;
SQL Execution Log
SELECT snum, odate, MAX (amt) FROM Orders
GROUP BY snum ORDER BY 2 DESC;
snum | odate |
1001 | 3 |
1002 | 3 |
1007 | 2 |
1003 | 1 |
1004 | 1 |
Таблица 7.8: Упорядочение с помощью столбца вывода
В этом случае, вы должны использовать номер столбца, так как столбец вывода не имеет имени; и вы не должны использовать саму агрегатную функцию. Строго говоря по правилам ANSI SQL, следующее не будет работать, хотя некоторые системы и пренебрегают этим требованием:
SELECT snum, COUNT (DISTINCT onum )
FROM Orders
GROUP BY snum
GROUP BY COUNTОМ (DISTINCT onum ) DESC;
Это будет отклонено большинством систем!
УПОРЯДОЧЕНИЕ С ПОМОЩЬЮ ОПРЕТОРА NULL
Если имеются пустые значения (NULL) в поле которое вы используете для упорядочивания вашего вывода, они могутут или следовать или предшествовать каждому другому значению в поле. Это - возможность которую ANSI оставил для индивидуальных программ. Данная программа использует ту или иную форму.
РЕЗЮМЕ
В этой главе, вы изучили как заставить ваши запросы делать больше, чем просто выводить значения полей или объединять функциональные данные таблиц. Вы можете использовать поля в выражениях: например, вы можете умножить числовое поле на 10 или даже умножить его на другое числовое поле. Кроме того, вы можете помещать константы, включая и символы, в ваш вывод, что позволяет вам помещать текст непосредственно в запрос и получать его в выводе вместе с данными таблицы.
Это дает вам возможность помечать или объяснять ваш вывод различными способами.
Вы также изучили как упорядочивать ваш вывод. Даже если таблица сама по себе остается неупорядоченной, предложение ORDER BY дает вам возможность управлять порядком вывода строк данного запроса. Вывод запроса может быть в порядке возрастания или убывания, и столбцы могут быть вложенными один внутрь другого.
Понятие выводимых столбцов объяснялось в этой главе. Вы теперь знаете что выводимые столбцы можно использовать чтобы упорядочивать вывод запроса, но эти столбцы - без имени, и следовательно должны опреде ляться их порядковым номером в предложении ORDER BY.
Теперь, когда вы увидели что можно делать с выводом запроса основанного на одиночной таблице, настало время чтобы перейти к возможностям улучшенного запроса и узнать как сделать запрос любого числа таблиц в одной команде, определив связи между ними как вы это обычно делали.
Это будет темой Главы 8.