Понимание SQL
Шрифт:
Как мы подчеркивали, таблицы - это неупорядоченные наборы данных, и данные которе выходят из их, не обязательно появляются в какой-то определенной последовательности. SQL использует команду ORDER BY чтобы позволять вам упорядочивать ваш вывод. Эта команда упорядочивает вывод запроса согласно значениям в том или ином количестве выбранных столбцов. Многочисленые столбцы упорядочиваются один внутри другого, также как с GROUP BY, и вы можете определять возрастание (ASC ) или убывание (DESC ) для каждого столбца. По умолчанию установлено - возростание. Давайте рассмотрим нашу таблицу порядка приводимую в порядок с помощью номера заказчика (обратите внимание на значения в cnum столбце):
SELECT *
FROM Orders
ORDER BY cnum DESC;
Вывод показывается в Рисунке 7.4.
SELECT * FROM Orders ORDER BY cnum DESC;
onum | amt | odate | cnum | snum |
3001 | 18.69 | 10/03/1990 | 2008 | 1007 |
3006 | 1098.16 | 10/03/1990 | 2008 | 1007 |
3002 | 1900.10 | 10/03/1990 | 2007 | 1004 |
3008 | 4723.00 | 10/05/1990 | 2006 | 1001 |
3011 | 9891.88 | 10/06/1990 | 2006 | 1001 |
3007 | 75.75 | 10/04/1990 | 2004 | 1002 |
3010 | 1309.95 | 10/06/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. 4:
Мы можем также упорядочивать таблицу с помощью другого столбца, например с помощью поля amt, внутри упорядочения поля cnum. (вывод показан в Таблице 7.5 ):
SELECT *
FROM Orders
ORDER BY cnum DESC, amt DESC;
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.
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;
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: