Поиск и упорядочение информации в БД


Фильтрация данных
Последовательный поиск
Сортировка записей
Индексирование баз данных
Создание индексного файла
Открытие индекса 
Поиск и обработка данных с использованием индексов


        Фильтрация данных
    SET FILTER TO <условие> - установка FOR  - условия  для всех последующих команд обработки данных
    SET FILTER TO - отмена ранее поставленных условий
 
                USE STUDENTS
                SET FILTER TO Group=21402
                BROWSE
    Команда действует исключительно на активную БД.


        Последовательный поиск
    LOCATE FOR<условие> [<границы>] [WHILE<условие>]  - в случае успешного поиска указатель записей устанавливается на найденную запись, функция FOUND() = .T.
    При  неудачном поиске RECNO() = RECCOUNT()+1, FOUND() = .F., EOF() = .T.
    CONTINUE - продолжение поиска
    LOOKUP(<поле1>,<выражение>,<поле2>) - ищет первое вхождение искомого значения.


        Сортировка записей
    Сортировка записей - выполняется путём создания новой БД, в которой физическое размещение записей соответствует заданному принципу. По умолчанию числовые поля упорядочиваются по возрастанию, даты - в хронологическом порядке, строки - по алфавиту, логические - .F., .T..
    SORT ON <поле1[ключ]>, <поле1[ключ]>, [<поле2[ключ]>,….] TO <Имя_новой_БД> [<границы>] [<условия>]
    Элемент списка полей может иметь ключ /A - сортировка по возрастанию, /D - сортировка по убыванию, /C - сортировка символьного поля без учёта регистра. Первое поле в списке считается главным.
    Упорядоченность по главному полю - глобальная, по остальным - локальная, в пределах подмножества записей.


        Индексирование баз данных
    Индексирование баз данных - механизм ускоренного поиска данных. (Подробнее про индексирование смотрите здесь).
    Для индексирования создаются индексные файлы. Размер индексного файла сравним с объёмом дискового пространства, занимаемого полем БД, по которому было проведено индексирование.
    Типы индексных файлов:
1) Одноиндексные “IDX” - компактные и обычные.
2) Мультииндексные “CDX” - всегда компактные:
        a) Структурные (имя совпадает с именем БД)
        b) Обычные (произвольное имя)
    Тэг  - отдельный ключ в мультииндексном файле.
    Структурный индексный файл всегда открыт для своей БД и не указывается в списке индексов.
    Один из открытых  IDX -файлов задаёт ведущий  индекс, которого может и не быть.
    Приоритеты (если не указано особо): “IDX”, структурный, “CDX”.


        Команда индексирования (создание индексного файла):

INDEX ON <выражение> TO <IDX-файл> [FOR<условие>] [COMPACT] [DESCENDING] [UNIQUE] [ADDITIVE]
INDEX ON <выражение> TAG <имя_тега структурного CDX-файла> [FOR<условие>] [COMPACT] [DESCENDING] [UNIQUE] [ADDITIVE]
INDEX ON <выражение> TAG <имя_тега> OF <CDX-файл> [FOR<условие>] [COMPACT] [DESCENDING] [UNIQUE] [ADDITIVE]

<выражение> - обычно имя поля, по которому идёт индексирование, либо несколько полей, также может быть функцией, в том числе пользовательской.
FOR<условие> - устанавливает режим отбора (фильтр)
COMPACT - для IDX - файлов
DESCENDING - по убыванию
UNIQUE - записи с одинаковым ключом не включаются в индекс
ADDITIVE - не закрывая другие индексы.



        Открытие индекса.
    USE <DBF-файл> [INDEX <список индексных файлов> [ORDER<ведущий индекс>] [ASCENDING|DESCENDING]] - используется для открытия БД вместе с индексными файлами. Если не используется ORDER, то первый в списке индекс становится ведущим (главным).

    <N> - номер среди IDX - файлов или тэгов
ORDER <ведущий индекс>     <имя IDX-файла>
    [TAG] <имя тэга> [OF <имя CDX-файла>]

<ведущий индекс> - явно задаёт номер главного индексного файла среди перечисленных в списке. Указание ORDER без аргумента или задание N=0 означает, что ведущий индекс не будет назначен. Нумерация индексов ведётся с 1, нумерация «сквозная» для всех индексных файлов.
ASCENDING|DESCENDING - определяет порядок использования индекса (по возрастанию или по убыванию), даже если при его создании было задано противоположное.

    SET INDEX TO [<список индексных файлов> [ORDER<ведущий индекс>] [ASCENDING|DESCENDING] [ADDITIVE]] - открывает индексные файлы для активной БД. Параметры те же.
ADDITIVE - открытие новых индексов не закрывает старые.
SET INDEX TO - закрывает все индексные файлы кроме структурного.
SET ORDER TO <ведущий индекс> - назначает ведущий индекс или изменяет его.
SET ORDER TO - отменяет ведущий индекс.
COPY INDEXES <список IDX-файлов> [TO <имя CDX -файла>] - копирует указанные IDX - файлы в CDX-файл, где они становятся тэгами. Если параметр TO … отсутствует, копирование идёт в структурный файл.

    COPY TAG <имя_тэга>[OF <имя_CDX-файла>] TO <имя_IDX-файла> - снимает копию тэга в виде IDX-файла.

    CLOSE INDEX - аналогична SET INDEX TO.
    При изменении проиндексированных полей индексы автоматически перестраиваются. Чтобы не тратить время на переиндексирование, при редактировании индексы отключаются. Однако, если впоследствии не перестроить индексы, может возникнуть фатальная ошибка работы с БД.

    REINDEX - обновляет все индексные файлы, открытые в текущей рабочей области.



        Поиск и обработка данных с использованием индексов
    SEEK<выражение> - быстрый поиск по ведущему индексу. По этой команде будет найдена первая в БД запись, удовлетворяющая выражению. Если поиск удачен функция RECNO() выдаст номер соответствующей записи, а функция FOUND() принимает значение  .T..
Существует модификация функции указания номера записи: RECNO(0), которая в случае неудачного поиска возвращает номер записи имеющий самое близкое значение к ключу.

    Функция SEEK (<выражение>[,<область>]) - выполняет поиск записи в индексном файле и устанавливает на неё указатель, возвращая .T. , если поиск удачен, и .F. в противном случае.
Выражение для поиска должно по типу совпадать с индексным выражением!
Суть индексного поиска - метод деления пополам упорядоченного списка (k=0.67).