
- •Общие сведения о Технологии ado
- •Компоненты доступа к данным
- •Демонстрационная база данных
- •Создание базы данных
- •МодулЬ данных
- •Создание приложения, работающего с базой данных Создание главной формы. Оформим главное окно приложения в виде панели инструментов, содержащей кнопки по числу основных операций (рис. 8).
- •Создание рабочих форм. Перейдем к созданию рабочих форм, открываемых кнопками главной формы. Рабочие формы необходимо сделать модальными.
- •Создание запросов
- •Insert into Имя_таблицы (Список_полей
- •Values (Список_значений)
Создание запросов
Компонент ADOQuery. Наиболее гибко определить условия отбора записей из нескольких таблиц позволяет компонент ADOQuery (панель dbGo). Работать с набором отобранных записей можно как с компонентом ADOTable. Особенностью компонента ADOQuery является использование специального языка для работы с реляционными БД – SQL (Structured Query Language).
Простая выборка данных. Для выборки данных используется оператор SELECT. В простейшем виде оператор имеет формат:
SELECT Список_Полей FROM Список_Таблиц
Например:
SELECT ZNaim, ZTelef FROM Zakazcik
Выполнив такой запрос, получим таблицу (временный НД), из двух столбцов. Если требуется выбрать все поля из таблицы, используется символ «*»:
SELECT * FROM Zakazcik
Если после слова SELECT указать ключевое слово DISTINCT, то в результирующий список не включаются записи, содержащие повторяющиеся значения.
SELECT DISTINCT NZKod FROM Naklad
Выборка из связанных таблиц. Простейший оператор SELECT допускает одновременную выборку данных из нескольких таблиц, но в этом формате не учитывает возможные связи между таблицами.
Например, рассмотрим следующий запрос:
SELECT * FROM Naklad, Zakazcik
Если выполнить этот запрос, то получим ненужный НД, в котором каждая накладная повторяется столько раз, сколько записей хранится в таблице Zakazcik.
Чтобы учесть реляционную связь по полям NZKod и ZKod, следует установить критерий отбора:
SELECT * FROM Naklad, Zakazcik WHERE ZKod = NZKod
Критерий отбора формулируется в секции, начинающейся зарезервированным словом WHERE (где). Чтобы связать две таблицы, мы указали, что для каждой записи таблицы Naklad (она открывает перечень таблиц) в поле NZKod содержится шифр связанной с ней записи из таблицы Zakazcik.
В результирующем НД будет столько записей, сколько их имеется в таблице Naklad, причем к каждой записи Naklad будут справа добавлены все поля записи таблицы Zakazcik с информацией об указанном в накладной партнере.
Сортировка записей. Если итоговый НД требуется отсортировать, то надо использовать ключевые слова ORDER BY, после которых указывается поле, по которому выполняется сортировка. По умолчанию она выполняется по возрастанию.
Если же требуется выполнить сортировку по убыванию, то после имени поля добавляется ключевое слово DESC:
SELECT NNom, NData, NSumma FROM Naklad
WHERE NZKod = 3
ORDER BY NSumma DESC
Формируется НД, содержащий три столбца: номер накладной, дата и сумма для заказчика, имеющего код 3. Сортировка осуществляется по убыванию суммы.
Сложные критерии отбора. В секции WHERE можно указывать условное выражение. В нем используются операции сравнения <, >, =, < >, >=, <=, логические операции OR, AND, NOT и круглые скобки. Эти операции SQL совпадают с операциями Object Pascal. В результирующий НД попадают только те записи, значения полей которых удовлетворяют указанному условию. Например:
SELECT NNom, NData, ZNaim, NSumma
FROM Naklad, Zakazcik
WHERE ZKod = NZKod
AND (NSumma>10000 OR NData > = #22.09.03#)
ORDER BY NNom
В этом примере отбираются только те накладные, для которых сумма отгрузки превышает 10 000 рублей или которые выписаны не ранее 22 сентября 2003 г. Текстовые значения и значения типа «дата-время» заключаются в символы «#».
С помощью зарезервированного слова IN (в [диапазоне]) можно перечислить несколько допустимых значений поля. Следующий запрос отбирает названия 1, 3 и 4-го изделий из таблицы Izdelie:
SELECT INaim FROM Izdelie
WHERE IKod IN (1, 3, 4)
Вместо перечня допустимых значений в круглых скобках после операции IN можно разместить вложенный оператор SELECT.
Псевдонимы таблиц и комментарии. В таблицах нашей демонстрационной БД нет совпадающих имен полей за счет того, что каждое поле в любой таблице начинается с буквы, соответствующей начальной букве имени таблицы.
Если бы, например, таблицы Izdelie и Zakazcik содержали одноименные поля Naim, то для исключения неоднозначности имена полей пришлось бы дополнить именами их таблиц:
SELECT NNom, Izdelie.Naim, Zakazcik.Naim
FROM Naklad, Izdelie, Zakazcik
Поскольку совпадающие имена таблиц могут встречаться и в других секциях запроса, для сокращения в SQL разрешено вместо имени таблицы использовать ее псевдоним. Псевдоним указывается за именем таблицы в секции FROM:
SELECT
/* Совпадающие имена полей дополняются псевдонимами таблиц */
NNom, I.Naim, Z.Naim
/* Псевдонимы задаются символами сразу за именем таблицы */
FROM Naklad, Izdelie I, Zakazcik Z
В любом месте запроса может стоять комментарий, который выделяется парой символов «/*».
Агрегатные функции и группировка записей. В секции SELECT можно также использовать одну из агрегатных функций:
AVG – возвращает среднее значение аргумента;
COUNT – подсчитывает количество вхождений аргумента во все записи НД;
MAX – возвращает максимальное значение аргумента;
MIN – возвращает минимальное значение аргумента;
SUM – суммирует значения аргумента.
В качестве аргумента агрегатной функции может использоваться произвольное выражение, составленное из полей НД. Список всех заказчиков с указанием суммы стоимости всех поставленных им изделий дает такой запрос:
SELECT SUM (NSumma), ZNaim
FROM Naklad, Zakazcik
WHERE ZKod = NZKod
GROUP BY ZNaim
Нужно получить не только суммы поставок, но и имена партнеров, поэтому в запросе в секции SELECT указана агрегатная функция и поле таблицы Zakazcik.
Для подобного рода запросов, в которых вместе с агрегатными функциями фигурируют и поля таблиц, SQL требует секции группировки GROUP BY, в которой в обязательном порядке перечисляются все поля, указанные в секции SELECT.
Количество накладных, связанных с поставкой изделий, вернет запрос:
SELECT COUNT (NZKod) FROM Naklad
В то же время следующий запрос вернет количество заказчиков:
SELECT COUNT (DISTINCT NZKod) FROM Naklad
Создание и удаление таблиц и индексов. Таблицы в современных СУБД создаются с помощью визуальных средств, однако некоторые эффективные, но максимально упрощенные СУБД поставляются без вспомогательного инструментария, и создавать структуру БД приходится вручную. При этом, прежде всего, требуется создать таблицу. Это делается с помощью следующего оператора:
CREATE TABLE Имя_таблицы (0пределения_полей)
Здесь Имя_таблицы – произвольное имя, не совпадающее с именами уже существующих в БД таблиц; Определения_полей – список имен полей с обязательным указанием их типов. Например:
CREATE TABLE NewTable (Field1 CHAR(20), Field2 INT)
При определении текстовых полей полезно явно указывать кодировку символов, иначе в такой столбец невозможно будет ввести русскоязычные строки:
CREATE TABLE NewTable (Field1 CHAR(20) CHARACTER
SET Win1251, Field2 INT)
Допустимые типы полей зависят от типа таблиц. При использовании таблиц типа Paradox, в операторе CREATE TABLE можно применять следующие типы полей:
CHAR(N), CHARACTER(N) – символьное поле длиной N символов (до 255);
INT, INTEGER – соответствует типу Integer языка Object Pascal;
SMALLINT – соответствует типу Smallint языка Object Pascal;
BLOB – цепочка байтов неопределенной длины;
FLOAT – соответствует типу Real языка Object Pascal;
DATE – поле для хранения даты;
BOOLEAN – соответствует типу Boolean языка Object Pascal.
За типом поля при его описании можно указывать зарезервированные слова NOT NULL (поле не может быть пустым), PRIMARY KEY (по полю строится первичный ключ), UNIQUE (значения поля не должны повторяться). Например:
CREATE TABLE Test
(ID integer NOT NULL PRIMARY KEY, Stroka char(50) )
Для удаления существующей таблицы используется оператор
DROP TABLE Имя_таблицы
Для создания индекса служит оператор
CREATE INDEX Имя_индекса ON Имя_таблицы (Список_полей)
Например: CREATE INDEX Index1 ON NewTab1e(Field1)
Следующий оператор удаляет ранее созданный индекс:
DROP INDEX Имя_индекса
Вставка, удаление и редактирование записей. В таблицу БД запись вставляется с помощью оператора