
- •1. Основные сведения о языке sql
- •2. Определение данных
- •2.1. Создание и удаление таблицы
- •2.2. Изменение состава полей таблицы
- •2.3. Создание и удаление индекса
- •IndName on Personnel.Db (Name)
- •IndNamePosition on Personnel.Db (Name, Position)
- •3. Отбор данных из таблиц
- •3.1. Описание оператора select
- •3.2. Управление полями
- •3.3. Простое условие отбора записей
- •3.4. Сложные критерии отбора записей
- •3.5 Группирование записей
- •3.6. Сортировка записей
- •Var s: string;
- •3.7. Соединение таблиц
- •4. Модификация записей
- •4.1. Редактирование записей
- •4.2. Вставка записей
- •Insert into Store
- •Values ("Торшер", 499.9, 10);
- •Insert into CardsArchives
- •4.3. Удаление записей
- •5. Статический и динамический запросы
- •Var str: string;
3.6. Сортировка записей
Как уже говорилось, сортировка представляет собой упорядочивание записей по возрастанию или убыванию значений полей. Список полей, по которым выполняется сортировка, указывается в операнде order by. Порядок полей в этом операнде определяет порядок сортировки: сначала записи упорядочиваются по значениям поля, указанного в этом списке первым, затем записи, имеющие одинаковое значение первого поля, упорядочиваются по второму полю и т. д.
Поля в списке обозначаются именами или номерами, которые соответствуют номерам в списке полей после слова select.
По умолчанию сортировка происходит в порядке возрастания значений полей. Для указания обратного порядка сортировки по какому-либо полю нужно указать после имени этого поля описатель desc.
Замечание
В отличие от набора данных Table, средствами языка SQL можно выполнять сортировку для набора данных Query и по неиндексированным полям. Однако по индексированным полям таблицы сортировка выполняется быстрее. При этом состав полей индекса должен соответствовать списку полей, указанных в операнде order by.
Пример запроса на сортировку записей:
SELECT * FROM Personnel.db
ORDER BY Name
Сортировка записей задана по полю Name. Полученный набор данных может иметь вид:
Code Name Position Salary
6 Васин Н.Е. Водитель 2500
1 Иванов P.O. Директор 6700
4 Кузнецов П.А. Секретарь 3600
2 Петров А.П. Менеджер 5200
5 Попов А.Л. Водитель 2400
3 Семенова И.И. Менеджер 5200
Еще один пример запроса на сортировку — на этот раз по двум полям:
SELECT Name, Position, Salary
FROM Personnel.db
ORDER BY Position, Salary DESC
или
SELECT Name, Position, Salary
FROM Personnel.db
ORDER BY 2, 3 DESC
В набор данных входят поля Name, Position и Salary всех записей. Записи отсортированы по полям Position и Salary, при этом по полю Salary упорядочивание выполняется в порядке убывания значений. Полученный набор данных будет таким:
Name Position Salary
Васин Н.Е. Водитель 2500
Попов А.Л. Водитель 2400
Иванов P.O. Директор 6700
Петров А.П. Менеджер 5200
Семенова И.И. Менеджер 5200
Кузнецов П.А. Секретарь 3600
Если по полям Position и Salary построен индекс, то операции с набором данных будут выполняться быстрее.
При разработке приложения управление сортировкой осуществляется посредством различных элементов формы, например, кнопок и переключателей.
Рассмотрим следующий пример. Пользователь управляет сортировкой с помощью двух групп переключателей: в первой задается вид, во второй — направление сортировки. Сортировка выполняется после нажатии кнопки btnSort с названием Отсортировать. На рис. 8.1 показан вид формы на этапе проектирования.
Рис. 8.1. Окно сортировки набора данных
Ниже приводится обработчик события нажатия кнопки btnSort.
procedure TForml.btnSortClick(Sender: TObject);
Var s: string;
begin
Queryl.Close;
Queryl.SQL.Clear;
Queryl.SQL.Add('SELECT * FROM Personnel.db');
case RadioGroup2.Itemlndex of
0: s : = " ;
1: s:='DESC?;
end;
case RadioGroupl.Itemlndex of
0: s:='ORDER BY P_Name ' + s;
1: s:='ORDER BY P_Birthday '+ s;
2: s:='ORDER BY P_Position ' + s + ', P_Salary ' + s;
3: s: = ";
end;
Queryl.SQL.Add(s);
Queryl.Open;
end;
При нажатии кнопки btnSort для набора данных Queryl происходит подготовка и выполнение SQL-запроса. Текст запроса формируется в зависимости от состояния переключателей, управляющих сортировкой.
Когда в SQL-запросе отсутствует параметр order, по умолчанию записи упорядочиваются по первому полю. Поэтому в рассматриваемом примере отсутствие сортировки и сортировка по полю Name приводят к одинаковому результату.