Отметим, что рассмотренные выше операции between и in также реализуют логические операции:between —логическоеи,ain —логическоеили.
Записи набора данных могут быть сгруппированы по некоторому признаку. Группу образуют записи с одинаковыми значениями в полях, перечисленных в списке операнда group by. При группировании записей их проще анализировать и обрабатывать, например, с помощью статистических функций.
Группирование записей автоматически исключает повтор значений в полях, заданных для группирования, т. к. записи с совпадающими значениями этих полей объединяются в одну группу.
Пример запроса с группированием записей:
SELECT C_Date, COUNT(C_Date)
FROM Cards
WHERE C_Date BETWEEN "01.06.2008" AND "03.06.2008"
GROUP BY C_Date
Для каждой даты из указанного периода выводится количество записей, в которых она встречается. Если не выполнить группирование, то в набор данных попадут все записи, а при использовании группирования все даты для полученного набора данных уникальны.
Функция count выводит для каждой группы (сформированной по полю даты) число записей в группе. Полученный набор данных может иметь следующий вид:
С_Date COUNT(С_Date)
01.06.08 20
02.06.08 17
03.06.08 8 В этом примере поле даты С_Date использовано в операторе SELECT трижды, в общем случае можно использовать различающиеся поля.
Совместно с операндом group by можно использовать операнд having, с помощью которого задаются дополнительные условия группирования записей.
Рассмотрим пример запроса:
^ SELECT C_Date, COUNT(C_Date)
FROM Cards
GROUP BY C_Date
HAVING.COUNT(C_Date) > 50
Здесь отбираются данные для дат, когда движение товара было интенсивным – общее число записей в соответствующей группе превышало 50. Так как не указан ограничивающий период времени, то при отборе в набор данных будут учитываться записи таблицы Cards с любыми датами.
3.1.3 Последовательная навигация по записям
Для выполнения действий по последовательному перебору записей, начиная от некоторой стартовой записи и до конца набора данных, используют цикл while...do или repeat...until:
with Tablel do begin
First;
while not EOF do begin
{Какие-либо действия над очередной записью} Next; end; {while} end; {with}
with Tablel do begin
First;
repeat
{Какие-либо действия над очередной записью} until not FindNext; end; {with}
Точно так же можно перемещаться от конца НД к его началу:
with Tablel do begin
Last;
while not BOF do begin
{Какие-либо действия над очередной записью} Prior; end; {while} end; {with}
with Tablel do begin
Last;
repeat
{Какие-либо действия над очередной записью} until not FindPrior; end; {with}
Если НД допускает вызов записи по ее номеру (его свойство IsSequenced в этом случае должно содержать значение True), можно использовать цикл for. Например, следующий обработчик события TForm. On Act ivate поместит все значения строкового поля BName НД Books в многострочное текстовое поле Memol:
procedure TForml.FormActivate(Sender: TObject); var
Замечу, что для компонентов TTable и TQuery, связанных с файл-серверными таблицами БД, свойство IsSequenced всегда содержит значение True. В клиент-серверной архитектуре оно зависит от используемого сервера БД. Свойство RecNo набора данных определяет порядковый номер обрабатываемой записи (нумерация начинается с 1), а его свойство RecordCount — количество записей.
Во всех случаях следует помнить, что если в ходе выполнения цикла последовательного перебора записей изменится ключевое поле записи или в НД будет вставлена новая (удалена старая) запись, курсор НД может изменить свое положение и правильная работа цикла будет нарушена. Если, например, мы хотим удалить все записи из таблицы, следующий фрагмент программы будет неверным:
with Tablel do while not EOF do begin
Delete; Next; end;
После удаления очередной записи курсор НД перейдет на следующую, но вызов Next заставит его сместиться еще раз, и очередная запись будет пропущена. Правильный вариант:
with Tablel do while not EOF do
Delete;
3.2 Запросы на изменение данных в БД
3.2.1 Обеспечение целостности, достоверности и непротиворечивости данных
Целостность данных – система правил, используемых для поддержания связей между записями в связанных таблицах, обеспечивающих защиту от случайного удаления или изменения данных.
Обеспечение целостности БД – система мер, направленных на поддержание правильности данных в БД в любой момент времени.
Целостность данных обеспечивается набором специальных предложений, называющихся ограничениями целостности.
Ограничения целостности – это набор определенных правил, которые устанавливают допустимость данных и связей между ними. Ограничения целостности могут относиться к разным объектам БД: атрибутам (полям), записям, отношениям, связям между ними.
Для полей могут быть использованы следующие виды ограничений:
1. Тип и формат поля автоматически допускают ввод только данных определенного типа.
2. Задание диапазона значений, как правило, используется для числовых полей. Диапазон значений может быть ограничен с двух сторон (закрытый диапазон), а может с какой-то одной: верхней или нижней (открытый диапазон).
3. Недопустимость пустого поля. Позволяет избежать появления в БД недописанных записей, в которых пропущены какие-либо обязательные атрибуты.
4. Задание списка значений, позволяет избежать излишнего разнообразия данных, если его можно ограничить.
5. Проверка на уникальность значения какого-либо поля, позволяет избежать появления записей-дубликатов.