Программирование >>  Программирование баз данных 

1 ... 23 24 25 [ 26 ] 27 28 29 ... 346


Rebecca

Laszlo

Margie

Shoop

Mark

McArthur

Britta

Simon

Brandon

Heidepriem

Jose

Lugo

Suchitra

Mohan

Chris

Okelberry

Abercrombie

Dudenhoefer

(12 row(s) affected)

Итак, результирующий набор, который первоначально состоял из 289 строк, теперь сократился всего лишь до 12.

Конструкция ORDER BY

Несложно убедиться в том, что результаты большинства запросов, которые рассматривались до сих пор в настоящей главе, расположены не случайно, а в виде определенной алфавитной или числовой последовательности. Следует отметить, что такое упорядочение результатов складывается не по стечению обстоятельств. Многие начинающие разработчики с удивлением узнают об этом, но действительно так и происходит. Тем не менее, если в запросе не указано, что результаты должны быть отсортированы в каком-то определенном порядке, получение этих данных происходит в том порядке, который выбирает сама СУБД SQL Server. Выбор применяемого по умолчанию способа сортировки всегда осуществляется на основании принятого СУБД SQL Server решения о том, какой способ сбора требуемых данных связан с наименьшими издержками. Как правило, выборка данных происходит с учетом либо физической последовательности данных в таблице, либо с учетом структуры индексов, используемых СУБД SQL Server для поиска данных.

Конструкцию ORDER BY удобно рассматривать как аналог команды сортировать по... . Эта конструкция предоставляет возможность определить последовательность, в которой должны поступать затребованные данные. В конструкции ORDER BY можно использовать любые сочетания столбцов, при условии, что эти столбцы (указанные непосредственно или в каких-либо выражениях) находятся в таблицах, перечисленных в конструкции FROM.

Рассмотрим следующий запрос:

SELECT Name, ProductNumber, ReorderPoint FROM Production.Product;

Oh должен привести к получению таких результатов: Name ProductNumber ReorderPoint

Adjustable Race AR-5381 750

Bearing Ball BA-8327 750

Road-750 Black, 48 BK-R19B-48 75

Road-750 Black, 52 BK-R19B-52 75

(504 row(s) affected)

Оказалось, что результаты запроса были отсортированы в порядке возрастания значений столбца Product ID. Этот способ сортировки выбран СУБД SQL Server.



Причина этого состоит в том, что СУБД SQL Server было принято решение по выбору такого наиболее подходяш;его способа выборки данных, в котором используется индекс, обеспечиваюш;ий сортировку данных в соответствии со значениями столбца ProductID. Просто так оказалось, что решение, принятое СУБД, приводит к наименьшим затратам при выполнении запроса (с точки зрения израсходованного процессорного времени и количества выполненных операций ввода-вывода). Если бы точно такой же запрос был выполнен после того, как указанная в нем таблица выросла и стала гораздо больше, то СУБД SQL Server могла бы выбрать совсем другой план выполнения и поэтому отсортировала бы данные полностью иным образом. Но мы имеем также возможность задавать схемы упорядочения принудительно, изменив запрос так, чтобы он принял следующую форму:

SELECT Name, ProductNumber, ReorderPoint FROM Production.Product ORDER BY Name;

Обратите внимание на то, что в этом запросе конструкция WHERE не потребовалась. Наличие или отсутствие этой конструкции зависит от того, с какой целью применяется запрос, но следует помнить, что если в запросе присутствует конструкция WHERE, то она должна быть задана перед конструкцией ORDER BY.

К сожалению, последний запрос в действительности не приводит к получению данных, отличных от приведенных выше, поэтому не позволяет ознакомиться с тем, как сортировка влияет на конечные результаты. Поэтому модифицируем запрос так, чтобы в нем данные сортировались по-другому - по значениям столбца ProductNumber:

SELECT Name, ProductNumber, ReorderPoint FROM Production.Product ORDER BY ProductNumber;

Теперь результаты становятся совсем другими. В выводе присутствуют те же данные, но порядок их представления существенно изменился:

Name ProductNumber ReorderPoint

Adjustable Race AR-5381 750

Bearing Ball BA-8327 750

LL Bottom Bracket BB-7421 375

ML Bottom Bracket BB-8107 375

Classic Vest, L VE-C304-L 3

Classic Vest, M VE-C304-M 3

Classic Vest, S VE-C304-S 3

Water Bottle - 30 oz. WB-H098 3

{504 row(s) affected)

СУБД SQL Server по-прежнему выбирает метод предоставления пользователю требуемых результатов с наименьшими издержками, но конкретный набор операций, фактически осуществляемый для решения этой задачи, немного изменяется, поскольку другим становится и сам характер запроса.

Следует отметить, что операцию сортировки можно было бы также выполнить с использованием числовых полей.



На основании приведенного выгие запроса могут быть сделаны неправильные выводы. Изучая приведенное подмножество данных, можно легко стать жертвой заблуждения, что данные отсортированы по полю ReorderPoint, поскольку создается впечатление, что значения данных в этом поле неуклонно уменьшаются, но такая ситуация возникает исключительно в результате случайного совпадения, и анализ всех фактически полученных данных показывает, что значения, определяющие условия возобновления заказа, на самом деле не отсортированы (а в настоящей книге ради сокращения объема изложения приведена лишь часть данных).

А теперь предположим, что требования к получаемым данным немного изменились, и в связи с этим откорректируем применяемый оператор в целях получения данных еще из одного столбца. Weight:

SELECT Name, ProductNumber, Weight FROM Production.Product WHERE Weight > 80 0 ORDER BY Weight DESC;

После выполнения этого запроса будут получены следующие результаты: Name ProductNumber Weight

LL Road Rear Wheel RW-R623 1050.00

ML Road Rear Wheel RW-R762 1000.00

LL Road Front Wheel FW-R623 900.00

HL Road Rear Wheel RW-R820 890.00

ML Road Front Wheel FW-R762 850.00

(5 row(s) affected)

В рассматриваемом запросе заслуживают внимания несколько особенностей. Во-первых, в нем используются многие конструкции, о которьгх шла речь в этой главе. Мы объединили условие конструкции WHERE с конструкцией ORDER BY. Во-вторых, в конструкцию ORDER BY введено нечто новое - ключевое слово DESC. Это ключевое слово сообщает СУБД SQL Server, что конструкция ORDER BY должна действовать, сортируя данные в порядке убывания, а не в порядке возрастания значений данных, предусмотренном по умолчанию. (Чтобы явно указать, что сортировка данных должна осуществляться по возрастанию, следует ввести ключевое слово ASC.)

На этом возможности сортировки не исчерпываются. Теперь рассмотрим, как можно отсортировать данные по нескольким столбцам. Для этого достаточно ввести запятую, а за ней указать имя следующего столбца, по которому требуется выполнить сортировку.

Предположим, например, что необходимо получить распечатку всех заказов, которые были размещены в период с 8 по 9 июля 1996 года. Но чтобы усложнить задачу, примем допущение, что заказы требуется отсортировать по дате, а также выполнить еще одну сортировку по значениям столбца CustomerlD. Кроме того, просто ради интереса примем еще одно небольшое допущение: необходимо в первую очередь расположить заказы, поступившие позже всех (отсортировать по дате в порядке убывания).

Запрос, соответствующий указанным требованиям, должен выглядеть следующим образом:

SELECT OrderDate, CustomerlD FROM Sales.SalesOrderHeader

WHERE OrderDate BETWEEN 2001-07-08 AND 2001-07-09 ORDER BY OrderDate DESC, CustomerlD;



1 ... 23 24 25 [ 26 ] 27 28 29 ... 346

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика