Слайд 1
Элементы языка SQL
Общие сведения
Базовым требованием к реляционным СУБД является
наличие мощного и в тоже время простого языка, позволяющего выполнять
все необходимые пользователям операции. В последние годы таким повсеместно принятым языком стал язык реляционных БД SQL.
SQL - Structured Query Language
(иногда понимается как Standard Query Language).
Язык SQL стал фактически стандартным языком доступа к базам данных. Все СУБД, претендующие на название "реляционные", реализуют тот или иной диалект SQL. Многие нереляционные системы также имеют в настоящее время средства доступа к реляционным данным. Целью стандартизации является переносимость приложений между различными СУБД.
В настоящее время, ни одна система не реализует стандарт SQL в полном объеме. Кроме того, во всех диалектах языка имеются возможности, не являющиеся стандартными. Таким образом, можно сказать, что каждый диалект - это надмножество некоторого подмножества стандарта SQL. Это затрудняет переносимость приложений, разработанных для одних СУБД в другие СУБД.
Слайд 2
Элементы языка SQL
Общие сведения
Язык SQL оперирует терминами, несколько отличающимися
от терминов реляционной теории, например, вместо "отношений" используются "таблицы", вместо
"кортежей" - "строки", вместо "атрибутов" - "колонки" или "столбцы".
Стандарт языка SQL, хотя и основан на реляционной теории, но во многих местах отходит он нее. Например, отношение в реляционной модели данных не допускает наличия одинаковых кортежей, а таблицы в терминологии SQL могут иметь одинаковые строки. Имеются и другие отличия.
Язык SQL является реляционно полным. Это означает, что любой оператор реляционной алгебры может быть выражен подходящим оператором SQL.
Слайд 3
Элементы языка SQL
Средства определения схемы БД
DDL (Data Definition Language)
CREATE
SCHEMA - создать схему базы данных
DROP SHEMA - удалить
схему базы данных
CREATE TABLE - создать таблицу
ALTER TABLE - изменить таблицу
DROP TABLE - удалить таблицу
CREATE DOMAIN - создать домен
ALTER DOMAIN - изменить домен
DROP DOMAIN - удалить домен
CREATE VIEW - создать представление
DROP VIEW - удалить представление
Слайд 4
Элементы языка SQL
Средства определения схемы БД
Создание БД
CREATE {
DATABASE | SHEMA } “”
{ USER “имя_пользователя” [PASSWORD
“пароль”] ]
[ PAGE_SIZE [=] целое ]
[ LENGTH [=] целое [PAGE [S] ] ]
[ DEFAULT CHARASTER SET набор_символов ]
[ <вторичный_файл> ];
<вторичный файл> = FILE “<имя_файла>” [<файлов_информ>] [<вторичный файл>]
<файлов_информ> = LENGTH [ = ] целое [ PAGE [S] ] | STARTING [AT [PAGE]] целое <файлов_информ>
Слайд 5
Элементы языка SQL
Средства определения схемы БД
Создание БД
Слайд 6
Элементы языка SQL
Средства определения схемы БД
Создание БД
Пример:
CREATE DATABASE “D:\BD\SKLAD.GDB”
FILE
“D:\BD\SKLAD.GD1” STARTING AT PAGE 1001
LENGTH 500
FILE “D:\BD\SKLAD.GD\2”
Здесь
определяется БД D:\BD\SKLAD.GDB, состоящая из 3 файлов: первичного длиной 1000 страниц, второго длиной 500 страниц и третьего неопределенной длины.
Слайд 7
Элементы языка SQL
Средства определения схемы БД
Типы данных и домены
Типы
данных:
Символьные (CHAR, VARCHAR)
Целочисленные (INTEGER, SMALLINT)
Вещественные (FLOAT, DOUBLE PRECISION)
Фиксированно-десятичные значения
(DECIMAL, NUMERIC)
Значения типа даты (DATE)
Двоичные (BLOB)
Понятие домена:
CREATE DOMAIN домен [AS] <тип данных>
[DEFAULT {литерал} | NULL | USER]
[NOT NULL] [CHECK (<Ограничение домена>) ]
Пример:
CREATE DOMAIN ID_TYPE AS INTEGER
CHECK (VALUE >= 100);
Слайд 8
Элементы языка SQL
Средства определения схемы БД
Типы данных и домены
Ограничение домена >= {
VALUE
| VALUE [NOT] BETWEEN
AND <значение2>
| VALUE [NOT] LIKE <значение1> [ESCAPE <значение2>]
| VALUE [NOT] IN <значение1> [, <значение2> …])
| VALUE IS [NOT] NULL
| VALUE [NOT] CONTAINING <значение>
| < Ограничение домена >
| NOT < Ограничение домена >
| < Ограничение домена > OR | < Ограничение домена >
| < Ограничение домена > AND < Ограничение домена >
};
где
<оператор> = { = | < | > | <= | >= | != | !< | !> | <> }
Слайд 9
Элементы языка SQL
Средства определения схемы БД
Общий формат оператора создания
таблиц
CREATE TABLE ИмяТаблицы
(
[, | …]);
- определение столбца таблицы.
<опр_столбца> = тип_данных | COMPUTED [ BY ]
{<выражение>) | домен }
[ DEFAULT {литерал | NULL | USER } ]
[NOT NULL] [<огранич_столбца>]
Слайд 10
Элементы языка SQL
Средства определения схемы БД
Пример оператора создания таблиц
CREATE
TABLE SAL_HIST
QUORTER INTEGER NOT NULL,
LAST_YEAR INTEGER,
THIS_YEAR INTEGER,
DELTA
COMPUTED_BY (THIS_YEAR - LAST_YEAR),
PRIMARY KEY (QUORTER) );
Слайд 11
Элементы языка SQL
Средства определения схемы БД
Ограничения целостности
Ограничения целостности бывают
двух видов:
Накладываемые на отдельный столбец;
Накладываемые на всю таблицу.
При наложении на
отдельный столбец :
TOVAR VARCHAR(20) NOT NULL PRIMARY KEY, …
При наложении ограничений на таблицу :
CREATE TABLE … (
TOVAR VARCHAR(20) NOT NULL
…
PRIMARY KEY (TOVAR)
);
Слайд 12
Элементы языка SQL
Средства определения схемы БД
Первичные и уникальные (альтернативные)
ключи
На уровне столбцов:
CREATE TABLE VLADLIM (
KODVLAD INTEGER NOT NULL PRIMARY
KEY,
NAZVVLAD VARCHAR(50) NOT NULL UNIQUE
);
На уровне таблицы:
CREATE TABLE VLADLIM (
KODVLAD INTEGER NOT NULL,
NAZVVLAD VARCHAR(50) NOT NULL,
PRIMARY KEY ( KODVLAD),
UNIQUE ()NAZVVLAD)
);
Слайд 13
Элементы языка SQL
Средства определения схемы БД
Внешний ключ и определение
ссылочной целостности
Внешний ключ строится в дочерней таблице.
Описание формата:
[CONSTRAINT
целостности>]
FOREIGN KEY ( <список столбцов внешнего ключа>)
REFERENCES <имя родительской таблицы>
[ <список столбцов родительской таблицы > ]
[ON DELETE { NO ACTION | CACADE | SET DEFAULT | SET NULL}]
[ON UPDATE { NO ACTION | CACADE | SET DEFAULT | SET NULL}]
Слайд 14
Элементы языка SQL
Средства определения схемы БД
Внешний ключ и определение
ссылочной целостности
Пример:
CREATE TABLE P (
PK_FIELD INTEGER NOT NULL,
OTHER FIELD INTEGER,
PRIMARY KEY
(PK_FIELD)
);
CREATE TABLE F (
PK_FIELD1 INTEGER NOT NULL,
PK_FIELD2 INTEGER NOT NULL,
SOME_FIELD INTEGER,
PRIMARY KEY (PK_FIELD1,PK_FIELD2),
FOREIGN KEY (PK_FIELD1) REFERENCES P
ON UPDATE CASCADE
);
Слайд 15
Элементы языка SQL
Средства определения схемы БД
Требования к значениям столбцов
Примеры
фрагментов ограничений:
CREATE TABLE PERSON _PARAMS (
ID_INTEGER NOT NULL PRIMARY KEY,
HEIGHT
INTEGER NOT NULL,
WIEGHT INTEGER NOT NULL CHECK (HEIGHT > WIEGHT)
);
---------------------------------------------------------------------------------
CREATE TABLE RASHOD (
…
CONSTRAINT PO_DATE_RASH
CHECK (EXISTS (SELECT TOVAR FROM PRIHOD
WHERE PROHOD.TOVAR=RASHOD.TOVAR))
);
------------------------------------------------------------------------------
- Столбец должен содержать сочетание символов USD
…. CHECK (STOLBEZ CONTAINING “USD”)
-Столбец должен начинаться с сочетания символов USD
…. CHECK (STOLBEZ STARTING WITH “USD”)
Слайд 16
Элементы языка SQL
Средства определения схемы БД
Изменение объявлений таблицы
Оператор ALTER
TABLE позволяет:
Добавить определение нового столбца
ALTER TABLE ADD
столбца>;
Удалить столбец из таблицы
ALTER TABLE <имя таблицы> DROP <имя столбца1> [,<имя столбца2>…
3 . Удалить атрибуты целостности таблицы или отдельного столбца
ALTER TABLE <имя таблицы> DROP <имя ограничения целостности>
4. Добавить новые ограничения целостности
ALTER TABLE <имя таблицы> ADD [CONSTRAINT <имя ограничения>] <определение целостности>;
Слайд 17
Элементы языка SQL
Средства определения схемы БД
Удаление таблицы
Удаление таблицы целиком:
DROP
TABLE
Слайд 18
Элементы языка SQL
Работа с индексами
Логическое разделение на ключи индексы
Логический
уровень
Первичный ключ выполняет функцию однозначной идентификации записи в таблицы.
Первичный и внешний ключи строятся для обеспечения ссылочной целостности реляцинно-связанных таблиц.
Индексы служат для сортировок и оптимизации доступа к данным
Физический уровень
Все ключи и индексы преобразуются в физические индексы - специальный механизм, обеспечивающий быстрый доступ к данным.
Слайд 19
Элементы языка SQL
Необходимость создания индексов
Индексы необходимо создавать в случае,
когда по столбцу или группе столбцов:
Часто производится поиск в БД;
Часто
строятся объединения таблиц;
Часто производится сортировка;
Часто производится сортировка;
Не рекомендуется строить индексы по столбцам или группам столбцов, которые:
Редко используются для поиска, объединения , сортировки результатов запроса
Часто меняют значение, что приводит к необходимости часто обновлять индекс и способно существенно замедлить скорость работы с БД;
Содержит небольшое число вариантов значения
Слайд 20
Элементы языка SQL
Работа с индексами
Логическое разделение на ключи индексы
Пример:
CREATE
TABLE SOTR (
ID_SOTR INTEGER NOT NULL,
OTDEL VARCHAR (10),
DOLGNOST CHAR
(10),
FIO VARCHAR(25),
PRIMARY KEY (ID_SOTR));
CREATE INDEX DLJ ON SOTR (DOLGNOST);
Именоваться индексы будут так :
DLJ INDEX ON SOTR (DOLGNOST)
RDB$PRIMARY18 UNIQUE INDEX ON SOTR (ID_SOTR)
Слайд 21
Элементы языка SQL
Работа с индексами
Создание индекса
CREATE [UNIQUE] ASC |
DESC ]
INDEX ИмяИндекса ON ИмяТаблицы (столбец1 [, столбец2 … ]
UNIQUE – требует создания уникального индекса, не допускающего одинаковых значений индексных полей для разных записей таблицы.
ASC – указывает на необходимость сортировки полей по возрастанию (принят по умолчанию)
DESC - указывает на необходимость сортировки полей по убыванию
Определения всех индексов можно вывести оператором
SHOW INDEX ;
Для конкретной таблицы
SHOW INDEX <имя таблицы>;
Удаление существующих ключей
DROP INDEX <имя индекса>;
Слайд 22
Элементы языка SQL
Работа с индексами
Пример:
CREATE TABLE PRIHOD(
ID_PRIHOD INTEGER NOT
NULL PRIMARY KEY,
DATAPRIH DATE NOT NULL,
TOVAR VARCHAR(20) NOT NULL,
KOLVO INTEGER
NOT NULL);
CREATE DESC INDEX D_P
ON PRIHOD (DATAPRIH, TOVAR);
.
Слайд 23
Элементы языка SQL
Работа с индексами
Улучшение производительности индекса
После многократного внесения
изменений в таблицу БД индексы этой таблицы могут быть разбалансированы.
Разбалансировка приводит к тому, что глубина индекса возрастает сверх критического значения.
Для улучшения показателя индекса необходимо выполнить его перестроение:
ALTER INDEX <имя индекса> DEACTIVATE;
ALTER INDEX <имя индекса> ACTIVATE;
Замечания:
Нельзя перестроить индекс, если он используется в данный момент в запросах
Нельзя перестроить индекс, созданный в результате создания первичного ключа, внешнего и уникального ключей.
.
Слайд 24
Элементы языка SQL
Оператор SELECT
Позволяет производить выборки из ТБД и
преобразовывать к нужному виду полученные результаты.
Общий формат:
SELECT [DISTINCT | ALL
] {* | <значение1> [,<значение2> …]}
FROM <таблица1> [ , <таблица2> … ]
[ WHERE <условия_поиска> ]
[ GROUP BY столбец [, столбец1 … ]
[ HAVING < условия_поиска> ]
[ UNION <оператор_select>]
[ PLAN <план_выполнения_запроса>]
[ ORDER BY <список_столбцов>]
Слайд 25
Элементы языка SQL
Оператор SELECT
Простейший формат:
SELECT { * | ,
[, …]}
FROM [ ,
FROM RASHOD
Или так:
SELECT N_RASH, DAT_RASH, KOLVO, TOVAR, POKUP
FROM RASHOD
Слайд 26
Элементы языка SQL
Оператор SELECT
Использование предложения WHERE
Предложение WHERE используется для
включения в НД лишь нужных записей.
В этом случае имеем
следующий формат:
SELECT {* | <значение1> [,<значение2> …]}
FROM <таблица1> [ , <таблица2> … ]
[ WHERE <условия_поиска> ]
Сравнение значения столбца с константой При сравнении столбца с константой условие имеет вид:
<условия поиска > = <оператор> <константа>
Где <оператор> - одна из следующих операций отношения:
<оператор> = { = | < | > | <= | >= | != | !< | !> | <> }
Пример:
SELECT * FROM RASHOD WHERE KOLVO = 20
Слайд 27
Элементы языка SQL
Оператор SELECT
Использование предложения WHERE
Внутреннее соединение таблиц
При сравнении
значения одной таблицы с со значением столбца другой таблицы условие
поиска имеет следующий вид:
<условия поиска > = <имя столбца 1> <оператор> <имя столбца 2>
Пример:
Чтобы выбрать все записи о расходе товара из таблицы RASHOD и для каждого товара указать его цену из таблицы TOVARY, можно использовать такой оператор:
SELECT RASHOD.*, TOVARY.ZENA
FROM RASHOD, TOVARY
WHERE RASHOD.TOVAR = TOVARY.TOVAR
Такой способ соединения называется внутренним соединением.
Слайд 28
Элементы языка SQL
Оператор SELECT
Использование предложения WHERE
Внутреннее соединение таблиц
При внутреннем
соединении двух таблиц A и B логический порядок формирования результирующего
набора данных можно представить следующим образом.
Из столбцов, которые указаны после слова SELECT, составляется промежуточный набор данных путем сцепления результирующих столбцов каждой записи из таблицы А и результирующих столбцов записи из таблицы В.
Из получившегося НД отбрасываются все записи , не удовлетворяющие условию в предложении WHERE.
Замечание:
Фактический порядок выполнения запроса для конкретного SQL-сервера может быть другим.
Слайд 29
Элементы языка SQL
Оператор SELECT
Использование предложения WHERE
Внутреннее соединение таблиц
Пример:
Таблица
A
Таблица B
Промежуточный набор
SELECT A.P1, A.P2, B.P2
FROM A, B
WHERE
A.P2 = B.P1
Окончательный набор
Слайд 30
Элементы языка SQL
Оператор SELECT
Использование псевдонимов таблиц
SELECT …
FROM < таблица1
псевдоним1> [, таблица2 псевдоним 2 … ]
WHERE …
Пример:
SELECT R.*, P.ADRES
FROM
RASHOD R, POKUPATELI P
WHERE P.POKUP = R.POKUP
Слайд 31
Элементы языка SQL
Оператор SELECT
Предложение ORDER BY – определение сортировки
Результирующий
набор данных можно отсортировать с помощью предложения:
ORDER BY
Пример:
SELECT POKUP,
DATRASH, TOVAR, KOLVO
FROM RASHOD
WHERE TOVAR = “Кока-кола”
ORDER BY POKUP, DATARASH
Слайд 32
Элементы языка SQL
Оператор SELECT
Устранение повторяющихся значений
Часто в результирующий НД
необходимо включать не все записи с одинаковым значением комбинации столбцов.
Для этого используется ключевое слово
DISTINCT
Пример:
SELECT DISTINCT TOVAR
FROM RASHOD
Замечание:
использование DISTINCT может существенно замедлить выполнение запроса, т.к. сервер будет тратить дополнительные ресурсы на проверку каждой записи. Обычно применяется в запросах, использующих агрегатные функции.
Слайд 33
Элементы языка SQL
Оператор SELECT
Расчет значений вычисляемых столбцов
Для расчета значений
вычисляемых столбцов результирующего НД используются арифметические выражения. При этом в
списке возвращаемых столбцов после SELECT вместо имени вычисляемого столбца указывается выражение:
SELECT [DISTINCT | ALL ]
{ * | <значение1> [,<значение2> …], <выражение1>[AS <имя_столбца>] …}
FROM <таблица1> [ , <таблица2> … ]
Пример:
SELECT R.*, T.ZENA, R.KOLVO*T.ZENA AS STOIM
FROM RASHOD R, TOVARY T
WHERE R.TOVAR = T.TOVAR
AS STOIM – необязательное присвоение имени вычисляемому столбцу
Слайд 34
Элементы языка SQL
Оператор SELECT
Агрегатные функции
Агрегатные функции предназначены для вычисления
итоговых значений операций над всеми записями НД. К агрегатным относятся
следующие функции:
COUNT(<выражение>) – число вхождений выражения в результирующий НД;
SUM(<выражение>) – суммирует значение выражения;
AVG(<выражение>) – находит среднее значение;
MAX(<выражение>) – определяет максимальное значение;
MIN(<выражение>)- определяет минимальное значение.
Примеры:
SELECT COUNT(DISTINCT POKUP) AS COUNT_POKUP
FROM RASHOD;
-----------------------
SELECT SUM(R.KOLVO*T.ZENA) AS OBS_ZENA
FROM RASHOD R, TOVARY T
WHERE (R.TOVAR = T.TOVAR)
Слайд 35
Элементы языка SQL
Оператор SELECT
Группировка записей
Иногда требуется получить агрегированные значения
не по всему результирующему НД, а по каждой из входящих
в него групп записей, характеризующихся одинаковым значением какого-либо столбца. Для этого перед предложением WHERE вводится предложение:
GROUP BY столбец [ , столбец1 … ]
Примеры:
SELECT R.TOVAR, SUM(R.KOLVO*T.ZENA)
FROM RASHOD R, TOVARY T
WHERE R.TOVAR = T.TOVAR
GROUP BY R.TOVAR, R.DAT_RASH
---------------------------------------------------
SELECT DAT_RASH, COUNT(DISTINCT POKUP)
FROM RASHOD
GROUP BY DAT_RASH
Слайд 36
Элементы языка SQL
Оператор SELECT
Наложение ограничений на группировку записей
Если нужно
в результирующем НД выдавать агрегацию не по всем группам, а
только по группам, которые отвечают некоторому условию то после GROUP BY указывается предложение :
HAVING <агрегатная функция> <отношение> <значение>
Агрегатная функция – одна из функций MIN, MAX, AVG, SUM
Отношение – одна из операций отношения.
Значение – константа, результат вычисления выражения или единичное значение, возвращаемое вложенным оператором SELECT.
Пример:
SELECT POKUP, MIN(KOLVO)
FROM RASHOD
GROUP BY POKUP
HAVING MIN (KOLVO) >= 100
Слайд 37
Элементы языка SQL
Оператор SELECT
Наложение ограничений на группировку записей
Отличие HAVING
от WHERE:
HAVING – исключает из результирующего НД группы с результатами
агрегированных значений;
WHERE – исключает из расчета агрегатных значений по группировкам записи, не удовлетворяющие условию;
В условии поиска WHERE нельзя указывать агрегатную функцию.
Слайд 38
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование логических
выражений
Сложные логические выражения строятся при помощи операторов AND, OR и
NOT.
Замечание:
операторы отношения при построении выражений имеют меньший приоритет, чем логические операции, что избавляет от необходимости расстановки многочисленных скобок.
Пример:
SELECT R.*, T.ZENA
FROM RASHOD R, TOVARY T
WHERE R.TOVAR = T.TOVAR AND
(R.KOLVO <= 30 OR R.KOLVO >= 3000) AND
R.POKUP IS NOT NULL
ORDER BY R.KOLVO
Слайд 39
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Сравнение столбца
с результатом вычисления выражения
или аналогичный способ
<выражение>
Результат вычисления выражения сравнивается содержимым указанного столбца.
Пример:
SELECT R.DAT_RASH, R.TOVAR, T.ZENA
FROM RASHOD R, TOVAR T
WHERE R.TOVAR = T.TOVAR AND T.ZENA > (120 / R.KOLVO)
ORDER BY R.DAT_RASH
Слайд 40
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование BETWEEN
[ NOT ] BETWEEN AND
Указать значение, которое должно
находиться в интервале между значением1 и значением2.
Пример:
SELECT *
FROM RASHOD
WHERE KOLVO BETWEEN 1000 AND 3000
Слайд 41
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование IN
Если
нужно, чтобы значение какого-либо столбца (или результат вычисления некоторого выражения)
совпадало с одним из дискретных значений, в условии поиска указывается предложение:
<значение> [ NOT ] IN ( <значение1> [, <значение2> … ] )
В результирующий НД будут включены только те записи, для которых значение, стоящее слева от IN , равно одному из значений, указанному в списке значений.
Пример:
SELECT *
FROM RASHOD
WHERE KOLVO IN (100, 1000, 3000 )
Замечание. Существует вторая форма использования IN, в которой список возможных значений возвращается вложенным запросом SELECT.
Слайд 42
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование STARTING
Если
нужно, чтобы значение какого-либо символьного столбца (или некоторого выражения) НАЧИНАЛОСЬ
с определенной подстроки, в условии поиска указывается предложение:
<значение> [ NOT ] STARTING [WITH] <подстрока>
Пример:
SELECT *
FROM TOVARY
WHERE TOVAR STARTING WITH ‘C’
Слайд 43
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование CONTAINING
Если
нужно, чтобы значение какого-либо символьного столбца (или некоторого выражения) ВКЛЮЧАЛО
В СЕБЯ определенную подстроку, в условии поиска указывается предложение:
<значение> [ NOT ] CONTAINIG <подстрока>
Пример:
SELECT *
FROM POKUPATELI
WHERE ADRES CONTAINING ‘Стр’
Слайд 44
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование функции
UPPER
Функция преобразует все буквы аргумента в заглавные.
UPPER ()
Обычно эта
функция используется в условиях поиска, когда необходимо игнорировать возможную разницу в высоте букв. Может использоваться как в списке столбцов результирующего НД, так и в условии поиска в предложении WHERE.
Пример:
SELECT *
FROM POKUPATELI
WHERE UPPER(GOROD) = ‘МОСКВА’
Слайд 45
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование LIKE
Предложение
LIKE определяет шаблоны сравнения строковых значений. Если необходимо , чтобы
сравниваемое значение удовлетворяло шаблону, в условии поиска необходимо указать
<значение> [NOT] LIKE <шаблон> [ESCAPE <подшаблон>]
В шаблоне используются специальные символы - «%» и «_».
Символ «%» означает, что на его месте может быть строка любой длины.
Символ «_» используется для указания любого одиночного символа.
ESCAPE определяет символ, появление которого в шаблоне отменяет специальные функции следующего за ним символа.
Примеры:
LIKE “%USD”
LIKE “__94”
WHERE STOLBEZ LIKE “_!%” ESCAPE “!”
Слайд 46
Элементы языка SQL
Оператор SELECT: задание сложных условий поиска
Использование функции
CAST
Для того, чтобы трактовать значение одного типа как значение другого
типа применяется функция CAST:
CAST (<значение> AS <тип_данных>)
Множество типов данных, в которые может быть преобразовано значение:
Примеры:
SELECT *
FROM RASHOD
WHERE CAST(KOLVO AS CHAR(4)) LIKE “%09”
Слайд 47
Элементы языка SQL
Оператор SELECT: использование подзапросов
Вложение подзапросов
Часто невозможно решить
поставленную задачу путем использования единственного запроса. Например, в тех случаях,
когда при использовании условия поиска в предложении WHERE параметр <значение, с которым сравнивать> заранее не определен и должен вычисляться в момент выполнения оператора SELECT.
В этом случае оператор SELECT с подзапросом имеет следующий вид:
SELECT …
FROM …
WHERE <сравниваемое_значение> <оператор> (SELECT …)
Пример:
SELECT KOLVO, DAT_RASH
FROM RASHOD
WHERE KOLVO = (SELECT MAX(KOLVO) FROM RASHOD)
Замечание.
Ошибкой для данного вида запроса является использование вложенного оператора SELECT, возвращающего вместо единичного список значений.
Слайд 48
Элементы языка SQL
Оператор SELECT: использование подзапросов
Вложение подзапросов
Пример1 (ошибочный):
SELECT R.DAT_RASH,
R.TOVAR, R.KOLVO, R.POKUP
FROM RASHOD R
WHERE R.POKUP = (SELECT POK.POKUP
FROM POKUPATELI POK
WHERE UPPER(POK.GOROD) = ‘МОСКВА’)
Пример 2 (исправленный):
SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, R.POKUP
FROM RASHOD R
WHERE R.POKUP IN (SELECT POK.POKUP
FROM POKUPATELI POK
WHERE UPPER(POK.GOROD) = ‘МОСКВА’)
Слайд 49
Элементы языка SQL
Оператор SELECT: использование подзапросов
Вложение подзапросов
Пример 3.
SELECT RRR.*
FROM
RASHOD RRR
WHERE R.POKUP IN
(SELECT R.POKUP
FROM RASHOD R
WHERE KOLVO
=
(SELECT MAX(RSH.KOLVO)
FROM RASHOD RSH) )
Логический порядок выполнения запроса:
Определяется самая крупная покупка – отыскивается максимальное значение в столбце KOLVO («самый вложенный» запрос).
Определяется покупатель, осуществивший эту покупку (средний запрос)
Основной запрос выбирает записи с заданным покупателем.
Слайд 50
Элементы языка SQL
Оператор SELECT: использование подзапросов
Дополнительные возможности
Предложение EXISTS. Требуется
отобрать только те данные, для которых подзапрос возвращает одно или
более значений.
EXISTS (<подзапрос>)
Пример.
Составить список покупателей, которые хотя бы один раз получали товар со склада:
SELECT P.POKUP
FROM POKUPATELI P
WHERE EXISTS (SELECT R.POKUP
FROM RASHOD R
WHERE R.POKUP = P.POKUP )
Слайд 51 Оператор SELECT: использование подзапросов
Дополнительные возможности
Предложение SINGULAR. Требуется выбрать лишь
те записи, для которых подзапрос возвращает только одно значение.
SINGULAR ()
Пример.
Составить
список покупателей, купивших только один товар:
SELECT P.*
FROM POKUPATELI P
WHERE SINGULAR (SELECT *
FROM RASHOD R
WHERE R.POKUP = P.POKUP )
Элементы языка SQL
Слайд 52 Оператор SELECT: использование подзапросов
Дополнительные возможности
Использование ALL, SOME (ANY). Если
в условиях поиска необходимо указать , что сравниваемое значение должно
находиться в определенных отношениях со всеми или некоторыми значениями из множества значений, возвращаемых подзапросом, применяют выражение:
<сравниваемое_значение> [NOT] <оператор> {ALL | SOME | ANY } (<подзапрос>)
ALL указывает, что условие поиска будет истинно только тогда, когда сравниваемое значение находится в нужном отношении со ВСЕМИ значениями, возвращаемыми подзапросом.
WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)
SOME (или ANY) условие истинно, когда сравниваемое значение находится в нужном отношении ХОТЯ БЫ С ОДНИМ значением, возвращаемым подхвпросом.
WHERE STOLBEZ > SOME (SELECT POLE FROM TABLIZA)
Элементы языка SQL
Слайд 53 Оператор SELECT: использование подзапросов
Дополнительные возможности
Использование ALL, SOME (ANY)
Пример.
Определим
все факты отгрузки товара со склада, в которых количество единиц
отгружаемого товара превышает среднее значение.
SELECT * FROM RASHOD R1
WHERE R1.KOLVO > ALL
(SELECT AVG(R2.KOLVO) FROM RASHOD R2
GROUP BY POKUP)
Определим все факты отгрузки товара со склада, в которых количество единиц отгружаемого товара превышает среднее значение отгрузки хотя бы одного товара.
SELECT * FROM RASHOD R1
WHERE R1.KOLVO > SOME
(SELECT AVG(R2.KOLVO) FROM RASHOD R2
GROUP BY POKUP)
Элементы языка SQL
Слайд 54 Оператор SELECT: использование подзапросов
Использование HAVING и агрегатных функций для
вложенных подзапросов
Если в условиях поиска для вложенного запроса нужно указать
агрегатную функцию, используется предложение HAVING.
Пример.
Определим покупателя, у которого средняя покупка больше средней покупки других покупателей. .
SELECT R1.POKUP, AVG(R1.KOLVO) FROM RASHOD R1
GROUP BY R1.POKUP
HAVING AVG(R1.KOLVO) >= ALL
(SELECT AVG(R2.KOLVO) FROM RASHOD R2
GROUP BY POKUP)
Элементы языка SQL
Слайд 55 Оператор SELECT
Внешние соединения
Внешнее соединение таблиц определяется в предложении FROM
согласно следующей спецификации:
SELECT { * | [, …]}
FROM
<таблица1> <вид_соединения> JOIN <таблица2> ON <условие_поиска>
Внешнее соединение отличается от внутреннего тем, что в результирующий НД включаются также записи ведущей таблицы соединения, которые объединяются с пустым множеством записей другой таблицы. Какая из таблиц будет ведущей, определяет вид соединения:
LEFT – (левое внешнее соединение), когда ведущей являются таблица1 (расположена СЛЕВА от вида соединения).
RIGHT – (правое внешнее соединение), когда ведущей являются таблица2 (расположена СПРАВА от вида соединения).
FULL – (полное внешнее соединение), когда ведущими являются и таблица1, и таблица2.
Элементы языка SQL
Слайд 56 Оператор SELECT
Внешние соединения
Таблица A
Таблица B
SELECT A.P1, A.P2, B.P2
FROM A
LEFT JOIN B ON A.P2 = B.P1
Результирующий НД
Элементы языка SQL
Слайд 57 Оператор SELECT
Внешние соединения
Таблица A
Таблица B
SELECT A.P1, A.P2, B.P2
FROM A
RIGHT JOIN B ON A.P2 = B.P1
Результирующий НД
Элементы языка SQL
Слайд 58 Оператор SELECT
Внешние соединения
Таблица A
Таблица B
SELECT A.P1, A.P2, B.P1, B.P2
FROM A
FULL JOIN B ON A.P2 = B.P1
Результирующий НД
Элементы
языка SQL
Слайд 59 Оператор SELECT
Внешние соединения
Пример 1. Несколько последовательных внешних соединений
SELECT R.DAT_RASH,
R.TOVAR, T.ED_IZM, R.KOLVO, P.ADRES
FROM RASHOD R
LEFT JOIN POKUPATELI P
ON R.POKUP = P.POKUP
LEFT JOIN TOVARY T ON R.TOVAR = T.TOVAR
Пример 2. Комбинирование внешних и внутренних соединений
SELECT P.POKUP, R.DAT_RASH, R.TOVAR, T.ED_IZM, R.KOLVO
FROM POKUPATELI P
P LEFT JOIN RASHOD R ON R.POKUP = P.POKUP
INNER JOIN TOVARY T ON R.TOVAR = T.TOVAR
Элементы языка SQL
Слайд 60 Оператор SELECT
Объединение запросов – UNION
Иногда бывает полезным объединить два
или более результирующих наборов данных.
Результирующие наборы должны иметь одинаковую структуру
(состав столбцов).
Если в результирующих наборах имеется одна и та же запись, в сводном наборе она не
дублируется.
SELECT R.*
FROM RASHOD R
WHERE R.TOVAR CONTAINING ‘Сахар’
UNION
SELECT R.*
FROM RASHOD R
WHERE R.KOLVO >= 100
Элементы языка SQL
Слайд 61 Оператор SELECT
Использование IS NULL
Если требуется выдать записи, в которых
некоторый столбец (или результат вычисления выражений) имеет значение NULL, то
в условии достаточно указать предложение:
<значение> IS [NOT] NULL
Пример.
Показать все факты отгрузки товаров со склада, для которых не указан покупатель.
SELECT * FROM RASHOD
WHERE POKUP IS NULL
Элементы языка SQL
Слайд 62 Оператор SELECT
Использование операции сцепления строк
Операция || соединяет два строковых
значения , которые могут быть представлены выражениями:
||
Операцию
можно использовать как после слова SELECT, так и в предложении WHERE
Пример.
Показать в одном столбце имена покупателей и названия их городов:
SELECT POKUP || ‘ (‘ || GOROD || ‘)’
FROM POKUPATELI
Элементы языка SQL
Слайд 63 Оператор INSERT
Формат оператора добавления записей
INSERT INTO [ (столбец1
[ , столбец2 …]) ]
{VALUES ( [, …]) |
<оператор SELECT>}
Список столбцов указывает столбцы, которым будут присвоены значения в добавляемых
записях. Список столбцов может быть опущен. В этом случае подразумеваются все
столбцы объекта.
Поставить в соответствие столбцам списки значений можно двумя способами
Явное указание значений после слова VALUES
Формирование значений при помощи оператора SELECT.
Элементы языка SQL
Слайд 64 Оператор INSERT
Формат оператора добавления записей
INSERT INTO [ (столбец1
[ , столбец2 …]) ]
{VALUES ( [, …]) |
<оператор SELECT>}
Список столбцов указывает столбцы, которым будут присвоены значения в добавляемых
записях. Список столбцов может быть опущен. В этом случае подразумеваются все
столбцы объекта.
Поставить в соответствие столбцам списки значений можно двумя способами
Явное указание значений после слова VALUES
Формирование значений при помощи оператора SELECT.
Элементы языка SQL
Слайд 65 Оператор INSERT
Явное указание списка значений
INSERT INTO [ (столбец1
[ , столбец2 …]) ]
VALUES ( [, …])
Пример.
INSERT INTO
RASHOD (N_RASH, DAT_RASH, KOLVO, TOVAR, POKUP)
VALUES (45 ,”20.01.2005”, 100, “Сахар”, “Саяны”)
Или, если столбцы указаны в полном составе и порядке создания:
INSERT INTO RASHOD
VALUES (45 ,”20.01.2005”, 100, “Сахар”, “Саяны”)
Элементы языка SQL
Слайд 66 Оператор UPDATE
Формат оператора изменения записей
UPDATE
SET столбец1 =
[ , столбец2 = …]
[WHERE ]
Пример.
UPDATE
RASHOD
SET DAT_RASH = “24.01.2005”, KOLVO=KOLVO+2
WHERE DAT_RASH = “20.01.2005”
Элементы языка SQL
Слайд 67 Оператор DELETE
Формат оператора удаления записей
DELETE FROM
[WHERE
]
Пример.
DELETE FROM RASHOD
WHERE (DAT_RASH = “20.01.2005”) AND (TOVAR = “Сахар”)
Элементы
языка SQL
Слайд 68 Работа с просмотрами (VIEW)
Понятие просмотра как виртуальной таблицы
Формирование записей
в просмотре определяется оператором SELECT.
Для создания просмотра применяется оператор:
CREATE
VIEW ИмяПросмотра [ (столбец_view [, столбец_view1 … ] ) ]
AS < оператор_select > [WITH CHECK OPTION]
Необязательный параметр WITH CHECK OPTION определяет, допускать ли для обновляемых просмотров ввод записей, не удовлетворяющих условию формирования просмотра.
Пример:
CREATE VIEW FULL_RASHOD AS
SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, T.ZENA
WHERE R.TOVAR = T.TOVAR
После этого к нему можно обращаться как к обычной таблице БД:
SELECT * FULL_RASHOD
Элементы языка SQL
Слайд 69 Работа с просмотрами (VIEW)
Способы формирования просмотра
Просмотр может создаваться как:
1)
вертикальный срез таблицы, когда в просмотр включается подмножество столбцов таблицы,
например:
CREATE VIEW RASH_VERT AS
SELECT DAT_RASH, TOVAR, KOLVO FROM RASHOD
2) горизонтальный срез таблицы, когда в просмотр включаются все столбце, но не все записи, например:
CREATE VIEW RASH_GORIZ AS
SELECT * FROM RASHOD WHERE TOVAR = “Сахар”
3) вертикально-горизонтальный срез таблицы:
CREATE VIEW RASH_VERT_GORIZ AS
SELECT DAT_RASH, TOVAR, KOLVO FROM RASHOD WHERE TOVAR = “Сахар”
4) подмножество строк и столбцов соединения разных таблиц:
CREATE VIEW FULL_RASHOD AS
SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, T.ZENA
FROM RASHOD R, TOVARY T
WHERE R.TOVAR = T.TOVAR
Элементы языка SQL
Слайд 70 Работа с просмотрами (VIEW)
Обновляемые и необновляемые просмотры
Чтобы просмотру можно
было применять операторы UPDATE, DELETE необходимо одновременное выполнение двух условий:
Просмотр
должен формироваться из записей только одной таблицы;
Оператор SELECT просмотра не должен использовать агрегатных функций, режима DISTINCT, предложения HAVING, соединения таблиц, хранимых процедур и функций, определённых пользователем.
Чтобы в просмотр можно было добавлять записи оператором INSERT необходимо одновременное выполнение трёх условий:
В просмотр должен быть включен каждый столбец таблицы, имеющий атрибут NOT NULL ;
Просмотр должен формироваться из записей только одной таблицы;
Оператор SELECT просмотра не должен использовать агрегатных функций, режима DISTINCT, предложения HAVING, соединения таблиц, хранимых процедур и функций, определённых пользователем.
Элементы языка SQL
Слайд 71 Работа с просмотрами (VIEW)
Дополнительные параметры просмотра
1) Указание имен
столбцов просмотра. Имена столбцов просмотра должны указываться, когда в качестве
столбца определяется выражение:
CREATE VIEW STOIM_RASH (DAT_RASH, TOVAR, STOIM) AS
SELECT R.DAT, R.TOVAR, R.KOLVO*T.ZENA
FROM RASHOD R, TOVARY T
WHERE R.TOVAR = T.TOVAR
2) Использование CHECK OPTION. Если указан CHECK OPTION, то будут отвергаться все попытки добавления новых или изменения существующих записей таким образом, чтобы нарушалось условие WHERE оператора SELECТ.
CREATE VIEW RASH_1000_CHECK AS
SELECT * FROM RASHOD
WHERE KOLVO > 1000
WITH CHECK OPTRION
Нельзя добавить записи со значением поля KOLVO, меньшим 1000
Элементы языка SQL
Слайд 72 Работа с хранимыми процедурами
Понятие хранимой процедуры
Хранимая процедура –
это модуль, написанный на процедурном языке и хранящийся в БД
как метаданные (т.е. данные о данных).
Существует два вида хранимых процедур:
процедуры выбора - могут возвращать более одного значения. В приложении имя ХП выбора подставляется в оператор SELECT вместо имени таблицы или просмотра;
процедуры действия – вообще могут не возвращать данных и используются для реализации каких-либо действий .
Преимущества использования ХП:
1) одну процедуру можно использовать многими приложениями;
2) разгрузка приложения клиента путем переноса части кода на сервер и вследствие этого – упрощение клиентских приложений;
3) при изменении ХП все изменения немедленно становятся доступными для всех клиентских приложений;
4) улучшенные характеристики выполнения, связанные с тем, что ХП выполняются сервером, в частности – уменьшенный сетевой трафик.
Элементы языка SQL
Слайд 73 Работа с хранимыми процедурами
Создание хранимой процедуры
Хранимая процедура создается
оператором:
CREATE PROCEDURE ИмяПроцедур
[ ( входной_параметр тип_данных
[, входной_параметр тип_данных … ]
) ]
[ RETURNS
( выходной_параметр тип_данных
[ , выходной_параметр тип_данных … ] ) ]
AS
[< объявление локальных переменных процедуры>]
BEGIN
< оператор >
[ < оператор > … ]
END ;
Элементы языка SQL
Слайд 74 Работа с хранимыми процедурами
Создание хранимой процедуры
Пример:
CREATE PROCEDURE FIND_MAX_KOLVO
(IN_TOVAR VARCHAR(20))
RETURNS (MAX_KOLVO INTEGER)
AS
BEGIN
SELECT MAX(KOLVO)
FROM RASHOD
WHERE TOVAR = :IN_TOVAR
INTO :MAX_KOLVO;
SUSPEND;
END ;
Элементы языка SQL
Слайд 75 Работа с хранимыми процедурами
Алгоритмический язык хранимых процедур
Формат объявления локальных
переменных:
DECLARE VARIABLE < тип данных >
;
Пример:
CREATE PROCEDURE FULL_ADR (TOVAR VARCHAR(20) )
RETURNS GOROD_ADRES VARCHAR(40)) AS
DECLARE VARIABLE NAIDEN_POKUPATEL VARCHAR(20);
DECLARE VARIABLE MAX_KOLVO INTEGER;
BEGIN
….
END ;
Элементы языка SQL
Слайд 76 Работа с хранимыми процедурами
Алгоритмический язык хранимых процедур
Операторные скобки :
Используются
для указания границ составного оператора
BEGIN
...
END ;
Оператор присваивания:
Имя_переменной = выражение ;
OUT_TOVAR = UPPER(TOVAR);
Оператор условия :
IF ( < условие> ) THEN
< оператор 1>
[ELSE
< оператор 2 > ]:
Элементы языка SQL
Слайд 77 Работа с хранимыми процедурами
Оператор SELECT
Оператор SELECT используется в ХП
для выдачи единичной строки. К обычному формату SELECT в процедурный
оператор добавлено предложение:
INTO :переменная [, переменная … ]
Пример:
…
SELECT AVG(KOLVO), SUM(KOLVO)
FROM RASHOD
WHERE TOVAR = :IN_TOVAR
INTO :AVG_KOLVO, :SUM_KOLVO;
…
Элементы языка SQL
Слайд 78 Работа с хранимыми процедурами
Оператор FOR SELECT … DO
FOR
< оператор SELECT >
DO
< оператор > ;
Оператор SELECT
используется в ХП в расширенном синтаксисе с INTO. Для каждой строки полученного результирующего НД выполняется оператор, следующий за словом DO. Этим оператором часто бывает SUSPEND, который приводит к возврату выходных параметров в вызывающее приложение.
Пример:
CREATE PROCEDURE RASHOD_TOVARA (IN_TOVAR VARCHAR(20) )
RETURNS (OUT_DAT DATE, OUT_POKUP VARCHAR(20),
OUT_KOLVO INTEGER) AS
BEGIN
FOR SELECT DAT_RASH, POKUP, KOLVO FROM RASHOD
WHERE TOVAR = :IN_TOVAR
INTO :OUT_DAT, :OUT_POKUP, :OUT_KOLVO
DO
SUSPEND;
END
Элементы языка SQL
Слайд 79 Работа с хранимыми процедурами
Оператор SUSPEND
Оператор SUSPEND передает в
вызывающее приложение значения результирующих параметров (перечисленных после слова RETURNS в
описании функции), имеющие место на момент выполнения SUSPEND. Когда от оператора SELECT вызывающего приложения приходит запрос на следующее значение выходных параметров , выполнение хранимой процедуры возобновляется.
Пример:
CREATE PROCEDURE POK_LIST (IN_TOVAR VARCHAR(20) )
RETURNS (POK VARCHAR(20) ) AS
DECLARE VARIABLE AVG_KOLVO INTEGER;
BEGIN
SELECT AVG(KOLVO) FROM RASHOD
WHERE TOVAR = :IN_TOVAR
INTO :AVG_KOLVO;
FOR SELECT POKUP FROM RASHOD
WHERE KOLVO >= :AVG_KOLVO
INTO :POK
DO
BEGIN
IF (:POK IS NULL) THEN
POK = “Покупатель не указан”;
SUSPEND;
END
END
Элементы языка SQL
Слайд 80 Работа с хранимыми процедурами
Оператор WHILE … DO
WHILE ()
DO
< оператор > ;
В цикле проверяется выполнение условия. Если
истинно – выполняется оператор. Цикл продолжается пока условие не станет ложным.
Пример:
CREATE PROCEDURE SUM_0_N ( N INTEGER )
RETURNS ( S INTEGER ) AS
DECLARE VARIABLE TMP INTEGER;
BEGIN
S = 0;
TMP=1;
WHILE ( TMP <= N ) DO
BEGIN
S = S+TMP;
TM = TPM + 1;
END
END
Элементы языка SQL
Слайд 81 Работа с хранимыми процедурами
Оператор EXIT
Оператор EXIT инициирует прекращение выполнения
процедуры и выход в вызывающее приложение.
Пример:
CREATE PROCEDURE MAX_VALUE ( А
INTEGER, B INTEGER )
RETURNS ( M_V INTEGER ) AS
DECLARE VARIABLE TMP INTEGER;
BEGIN
IF ( :A IS NULL OR :B IS NULL ) THEN EXIT;
IF ( :A > :B ) THEN M_V = :A ;
ELSE M_V = :B ;
END
Элементы языка SQL
Слайд 82 Работа с хранимыми процедурами
Оператор EXECUTE PROCEDURE
Оператор вызова другой хранимой
процедуры:
EXECUTE PROCEDURE имя [параметр [, параметр … ] ] ;
[
RETURNING_VALUES параметр [, параметр … ] ];
Пример:
…
EXECUTE PROCEDURE AVG_KOLVO (:IN_TOVAR)
RETURNING_VALUE :AVG_KOLVO_TOVAR;
…
Элементы языка SQL
Слайд 83 Работа с хранимыми процедурами
Оператор POST_EVENT
Оператор применяется для посылки сервером
клиентским приложениям сообщения о наступлении какой либо ситуации, связанной с
именем события.
POST_EVENT “Имя события”;
Элементы языка SQL
Слайд 84 Работа с хранимыми процедурами
Изменение и удаление ХП
Изменение ХП:
ALTER
PROCEDURE ИмяПроцедур
[ ( входной_параметр тип_данных
[, входной_параметр тип_данных … ] )
]
[ RETURNS
( выходной_параметр тип_данных
[ , выходной_параметр тип_данных … ] ) ]
AS
< тело процедуры>
Удаление ХП:
DROP PROCEDURE ИмяПроцедуры;
Элементы языка SQL
Слайд 85 Работа с триггерами
Общие понятия
Триггер – это процедура в БД,
автоматически вызываемая SQL-сервером при обновлении, удалении или добавлении новой записи
в таблицу БД.
По событию изменения триггеры различают на вызываемые при:
Добавлении новой записи
Изменении существующей записи
Удалении записи
По отношению к событию, влекущему их вызов, триггеры различаются на:
Выполняемые до наступления события
Выполняемы после наступления события
Элементы языка SQL
Слайд 86 Работа с триггерами
Общие понятия
Особенности:
Непосредственно обратиться к триггеру нельзя
Нельзя
передавать параметры и получать значения выходных параметров
Триггер всегда реализует действие
Преимущества
использования триггеров:
Автоматическое обеспечение каскадных воздействий, выполняющихся на сервере.
Изменения в триггерах не влекут необходимости изменения клиентских приложений.
Обязательное выполнение бизнес-правил, реализованных с использованием триггеров для всех приложений работающих с БД.
Все изменения вносимые триггером выполняются в рамках одной транзакции. Как следствие, при откате транзакции откатываются также и все изменения, внесенные в БД триггерами.
Элементы языка SQL
Слайд 87 Работа с триггерами
Создание триггеров
Триггер создается оператором:
CREATE TRIGGER ИмяТриггера FOR
ИмяТаблицы
[ ACTIVE | INACTIVE ]
{ BEFORE | AFTER
}
{ DELETE | INSERT | UPDATE }
[ POSITION номер ]
AS
[<объявление локальных переменных>]
BEGIN
<оператор>
END
Элементы языка SQL
Слайд 88 Работа с триггерами
Создание триггеров
Пример (обеспечение каскадных воздействий):
CREATE TRIGGER AD_TOVARY
FOR TOVARY
ACTIVE
AFTER DELETE
POSITION 1
AS
BEGIN
DELETE FROM RASHOD
WHERE RASHOD.TOVAR = TOVARY.TOVAR;
END`
Элементы
языка SQL
Слайд 89 Работа с триггерами
Значения OLD и NEW
Значение OLD.имя_столбца позволяет обратиться
к состоянию столбца, имевшему место до внесения возможных изменений, а
значение NEW.имя_столбца - к состоянию столбца, имевшему место после внесения возможных изменений.
Пример:
CREATE TRIGGER BU_TOVARY FOR TOVARY
ACTIVE
BEFORE UPDATE
AS
BEGIN
IF ( OLD.TOVAR <> NEW.TOVAR ) THEN
UPDATE RASHOD
SET TOVAR = NEW.TOVAR
WHERE TOVAR = OLD.TOVAR;
END
Элементы языка SQL
Слайд 90 Работа с триггерами
Изменение и удаление триггеров
Изменение существующего триггера:
ALTER TRIGGER
ИмяТриггера FOR ИмяТаблицы
[ ACTIVE | INACTIVE ]
{ BEFORE
| AFTER }
{ DELETE | INSERT | UPDATE }
[ POSITION номер ]
AS <тело триггера>
Удаление триггера:
DROP TRIGGER ИмяТриггера
Элементы языка SQL
Слайд 91 Исключения
Пример определение исключения:
CREATE EXCEPTION
UNKNOWN_EMP_ID «Неизвестный идентификатор”
Пример вызова исключения:
EXCEPTION UNKNOWN_EMP_ID
Пример удаления исключения:
DROP EXCEPTION UNKNOWN_EMP_ID
Элементы
языка SQL
Слайд 92 Использование генераторов в InterBase
Основные понятия
В InterBase отсутствует аппарат автоинкрементных
столбцов. Вместо этого для установки уникальных значений столбцов используются генераторы.
Генератор
– хранимый на сервере БД механизм, возвращающий уникальные значения , никогда не совпадающие со значениями, выданными тем же самым генератором в прошлом.
Для создания генератора используется оператор:
CREATE GENERATOR ИмяГенератора ;
Установка стартового значения генератора:
SET GENERATOR ИмяГенератора TO СтартовоеЗначение;
Обращение к генератору (получение уникального значения):
GEN_ID( ИмяГенератора , Шаг )
Элементы языка SQL
Слайд 93 Использование генераторов в InterBase
Основные понятия
Пример:
CREATE GENERATOR RASHOD_N_RASH;
SET GENERATOR
RASHOD_N_RASH TO 20 ;
CREATE TRIGGER BI_RASHOD FOR RASHOD
ACTIVE
BEFORE INSERT
AS
BEGIN
NEW.N_RASH = GEN_ID(RASHOD_N_RASH, 1);
END
Элементы языка SQL
Слайд 94 Транзакции
Назначение трaнзакции:
Откат изменений и целостность БД
Понятие транзакции
Транзакция – это
единичное или чаще групповое изменение БД, которое или выполняется полностью,
или не выполняется вообще.
Результаты выполнения транзакции записываются в БД только в том случае, если вся транзакция завершилась успешно. Таким образом, транзакция переводит БД из одного целостного состояния в другое.
Начало транзакции инициируется оператором :
SET TRANSACTION [имя транзакции]
Подтверждение транзакции, т.е. санкционирование физического запоминания сделанных изменений в БД выполняется оператором COMMIT
COMMIT WORK [TRANSACTION name]
Отказаться от физического запоминания сделанных изменений («откатить изменения») можно с помощью оператора.
ROLLBACK WORK [TRANSACTION name]
Замечание. Описанные выше операторы представлены в упрощенном формате. Полный формат содержит дополнительные параметры управления транзакциями.
Физическое проектирование БД
Слайд 95 Транзакции
Уровни изоляции транзакций
При одновременной работе нескольких клиентов с одной
и той же БД возникают проблемы одновременного изменения данных.
Пусть пользователь
A получил данные из таблицы RASHOD и впоследствии изменил их. В это же время с той же записью в таблице RASHOD работает пользователь B. Он также изменил записи в той же записи, что и A, и пытается подтвердить их. Пользователь C работает с таблицей RASHOD в режиме «только для чтения». Сразу же возникает группа вопросов:
Позволять или не позволять B изменять запись, если A еще не подтвердил ее изменение?
Позволять ли C видеть изменения, внесенные A и B?
Может ли A видеть изменения, внесенные B, и наоборот?
Для разрешения указанных проблем на стороне клиента определены три уровня изоляции (разграничения) транзакций.
Для разрешения указанных проблем на стороне клиента определены три уровня изоляции (разграничения) транзакций.
Физическое проектирование БД
Слайд 96 Транзакции
Уровни изоляции транзакций
При уровне изоляции транзакций Dirty Read («грязное
чтение») конкурирующие транзакции видят изменения, внесенные, но не подтвержденные текущей
транзакцией. Если текущая транзакция откатит сделанные изменения, другие транзакции будут обладать недостоверными данными. Этот уровень изоляции может привести к серьезным ошибкам и применяется крайне редко – фактически он не изолирует конкурирующие транзакции.
При уровне Read Committed («подтвержденное чтение») конкурирующие транзакции работают с данными, какими они были на момент старта транзакции A. однако, если транзакция A внесла изменения в запись и подтвердила их, а незавершенная транзакция вновь прочитала эти данные, она увидит изменения.
Уровень изоляции Repetable Read («повторяющееся чтение») заставляет конкурирующие транзакции оперировать с собственными (локальными) версиями одной и той же записи. Если транзакция A читает какую-то запись, она, как и при уровне ReadCommited, получит последнюю подтвержденную ее версию. Однако, если другая транзакция изменит эту запись, а транзакция A вновь прочитает ее, она не увидит внесенных изменений, т.е. A видит всегда одну и ту же версию записи. Изменения, которые вносят конкурирующие транзакции в одну и ту же запись, могут конфликтовать. В этом случае фактически изменит данные первая завершенная транзакция, а попытки подтвердить свои изменения второй и всеми другими незавершенными транзакциями, изменившими те же записи, будут отвергнуты.
Физическое проектирование БД
Слайд 97 Транзакции
Уровни изоляции транзакций
Разные серверы БД различным образом интерпретируют уровни
изоляции транзакций
Физическое проектирование БД
Слайд 98 Транзакции
Уровни изоляции транзакций
Физическое проектирование БД
В InterBase с учетом управляющих
параметров формат оператора начала транзакции выглядит следующим образом:
SET TRANSACTION [
имя транзакции ]
[ READ WRITE | READ ONLY ]
[ WAIT | NO WAIT ]
[[ ISOLATION LEVEL ] {SNAPSHOT | READ COMMITTED [ [ NO ] RECORD_VERSION]}]
------------------------------
READ WRITE | READ ONLY WAIT – устанавливает уровень доступа к данным (по умолчанию READ WRITE )
WAIT | NO WAIT – определяет поведение при возникновении конфликта при обновлении записи данной транзакции с другой транзакцией, ранее сделавшей изменение в той же записи: WAIT (по умолчанию) побуждает данную транзакцию ожидать завершения конкурирующей транзакции; NO WAIT определяет аварийное завершение данной транзакции.
ISOLATION LEVEL – определяет уровни изоляции транзакций на сервере (по умолчанию SNAPSHOT, что соответствует уровню REPETABLE READ.
READ COMMITTED разрешает стартующей транзакции читать только подтвержденные записи:
NO RECORD_VERSION (по умолчанию) – читается последняя версия записи, даже если она не подтверждена другой транзакцией; при этом если указан параметр WAIT, стартующая транзакция будет ожидать подтверждения последней версии; RECORD VERSION – читается последняя подтвержденная версия записи.
Пример.
SET TRANSACTION WAIT
ISOLATION LEVEL READ COMMITTED
Слайд 99 Учет особенностей используемого сервера БД
Основная часть проблем физического проектирования баз
данных в большой степени зависит от особенностей используемого сервера баз
данных. В частности, это относится к планированию размещения в дисковой памяти различных частей базы данных: таблиц, индексов, BLOB'ов, журналов и т.д. Соответствующие рекомендации обычно содержатся в руководстве администратора используемой системы. Но можно, тем не менее, выделить некоторые общие соображения, которые осмысленны вне зависимости от деталей реализации сервера. Прежде всего это касается индексов.
Понятно, что чем больше индексов существует над таблицами базы данных, тем более вероятным будет выполнение запросов по выборке данных и тем медленнее будут выполняться операции модификации базы данных.
Физическое проектирование БД
Слайд 100 Учет особенностей используемого сервера БД
В большинстве систем индекс создается автоматически
для каждого определенного в таблице первичного, возможного и внешнего ключа.
Здесь никуда не денешься: потребность в определении ключей следует из семантики предметной области, а для поддержания и использования ключей СУБД нуждается в соответствующих индексах. Но вот что касается дополнительных индексов, вводимых для целей более эффективного выполнения запросов, то с ними нужно быть очень аккуратным. Требуется тщательный предварительный анализ наиболее важного набора запросов (к сожалению далеко не всегда это возможно). Нужно также отдавать себе отчет в том, что создание нового индекса для большой заполненной таблицы - это серьезная дорогостоящая операция (как правило, СУБД выполняет сортировку строк таблицы в соответствии со значением ключевого атрибута).
Хотя в языке SQL и в большинстве его реализаций допускается динамическое изменение реляционной схемы базы данных, не все такие изменения выполняются дешево и безопасно. Дешево и безопасно можно создать новую таблицу с набором индексов и добавить столбец к существующей заполненной таблице. Дорого и опасно уничтожается большая заполненная таблица или ее отдельный столбец. (Опасно в том смысле, что, как правило, соответствующие операции не журнализуются.)
Физическое проектирование БД
Слайд 101 Противоречия теории и практики нормализации
Достаточно часто абсолютно правильно спроектированная
реляционная схема базы данных мешает эффективному выполнению транзакций в конкретной
прикладной области при использовании конкретного сервера баз данных. Часто это связано с особенностями синхронизации параллельно выполняемых транзакций.
Пример:
Сервером используется блокировка строк, и в базе данных находится широкая правильно спроектированная таблица, обладающая тем свойством, что небольшое число столбцов меняется, а основная их часть только читается. Тогда любая изменяющая таблицу может транзакция заблокировать все читающие транзакции. Решение снова состоит в том, чтобы немного отойти от теории и разбить таблицу на две: изменяемую и только читаемую.
Физическое проектирование БД
Слайд 102Денормализация для оптимизации
Если еще раз внимательно посмотреть на шаги
процесса построения «хорошей» нормализованной схемы реляционной базы данных, то можно
заметить, что на каждом шаге нормализации порождаются потенциальные соединения отношений. Для некоторых приложений это несущественно, для других - критично. Известно, что если для выполнения запроса к базе данных требуется выполнить десять соединений, то ни один из современных серверов баз данных не обеспечивает умеренное время ответа.
Поэтому иногда приходится жертвовать идеями и работать с недостаточно нормализованной схемой БД. Конечно, при работе с такой схемой могут возникать аномалии изменений, но с ними можно бороться другими способами, например, с помощью триггеров.
Физическое проектирование БД
Слайд 103Денормализация для оптимизации
Если еще раз внимательно посмотреть на шаги
процесса построения «хорошей» нормализованной схемы реляционной базы данных, то можно
заметить, что на каждом шаге нормализации порождаются потенциальные соединения отношений. Для некоторых приложений это несущественно, для других - критично. Известно, что если для выполнения запроса к базе данных требуется выполнить десять соединений, то ни один из современных серверов баз данных не обеспечивает умеренное время ответа.
Поэтому иногда приходится жертвовать идеями и работать с недостаточно нормализованной схемой БД. Конечно, при работе с такой схемой могут возникать аномалии изменений, но с ними можно бороться другими способами, например, с помощью триггеров.
Физическое проектирование БД
Слайд 104Оптимизация запросов
Оптимизация запросов к БД связана с построением адекватной запросам
и оптимальной структуры индексов таблиц БД и оптимизации собственно текстов
запросов.
Оптимальная структура индексов
От структуры индексов таблиц БД в огромной степени зависит эффективность выполнения запросов. При выполнении запросов сервер БД обычно сначала просматривает список индексов, определенных для участвующих в запросе таблиц. Затем выбирается одна из двух схем выполнения запроса – использовать имеющиеся индексы или последовательно просмотреть таблицы. Оптимизатор сервера стремиться выполнить запрос с максимальным быстродействием и с минимальными накладными расходами.
Физическое проектирование БД
Слайд 105Оптимизация запросов
«Полезность» индекса
Эффективность использования индекса при поиске информации в таблице
БД сильно зависит от того, построен ли индекс по уникальным
значениям и, если нет, насколько отличаются данные, по которым он построен.
Рассмотрим пример возможного логического порядка использования индексов при выполнении запроса для некоторого сервера БД (в общем случае для конкретного сервера БД реальный порядок выполнения запроса может быть другим).
Пусть необходимо выбрать из таблицы из таблицы RASHOD все записи о расходе товара за 10.10.2006, у которых количество расходуемого товара превышает 300 единиц.
SELECT *
FROM RASHOD
WHERE DAT_RASH = “10.10.2007” AND
KOLVO > 300
Физическое проектирование БД
Слайд 106Оптимизация запросов
«Полезность» индекса
SELECT *
FROM RASHOD
WHERE DAT_RASH = “10.10.2007”
AND
KOLVO > 300
В случае отсутствия индексов поиск записей, удовлетворяющих запросу,
осуществляется путем перебора всех записей в таблице, т.е. путем последовательного доступа, что обеспечивает наименьшую эффективность выполнения запроса. В случае нескольких индексов, по которым можно осуществить поиск , выбирается для использования тот, у которого выше показатель полезности индекса (selectivity).
Показатель полезности индекса рассчитывается как число различающихся значений индексных полей внутри индекса, отнесенное к среднему количеству записей. Для участия в выполнении запроса выбираются индексы с максимальным уровнем полезности. Такие индексы обеспечивают более быстрый поиск. Максимальным индексом полезности обладают уникальные индексы, т.е. индексы, построенные по определениям первичных и уникальных ключей.
В некоторых случаях оптимизатор сервера БД не может корректно определить полезность индекса. В решения этой проблемы в диалектах языка SQL существуют способы принудительного использования того или иного индекса при выполнении запроса.
Физическое проектирование БД
Слайд 107Оптимизация запросов
Целесообразность создания индексов
Индексы необходимо создавать в случае, когда по
столбцу или группе столбцов:
Часто производится поиск в БД;
Часто строятся соединения
таблиц;
Часто производится сортировка;
Не рекомендуется строить индексы по столбцам или группам столбцов, которые:
Редко используются для поиска, объединения , сортировки результатов запроса
Часто меняют значение, что приводит к необходимости часто обновлять индекс и способно существенно замедлить скорость работы с БД;
Содержит небольшое число вариантов значения.
Физическое проектирование БД
Слайд 108Оптимизация запросов
Частичное использование составного индекса
Если запросы часто используют для поиска
одни и те же столбцы, следует построить по этим столбцам
индекс (если это возможно) так, чтобы чаще используемые столбцы выступали в качестве ведущих полей индекса. Тогда при поиске может быть использована часть индексных полей.
Следует помнить, что при использовании в запросах не всех столбцов из индекса, можно использовать только непрерывную последовательность столбцов, что важно для указания порядка сортировки в предложении ORDER BY.
Порядок следования условий по столбцам в предложении WHERE оператора SELECT не важен (если условия объединяются по AND).
Физическое проектирование БД
Слайд 109Оптимизация запросов
Многопоточность поиска по OR и IN
При частом использовании в
условной части WHERE оператора SELECT нескольких столбцов, между собой операцией
«или» (OR)
SELECT *
WHERE A=100 OR B=200 OR C= 300
вместо индекса по столбцам A,B,C лучше создать несколько индексов, построенных по каждому из этих полей, поскольку в противном случае будет осуществлен последовательный просмотр всей таблицы.
Важно помнить, что при использовании оператора OR в условной части оператора SELECT каждая часть условия влечет за собой отдельное сканирование участвующих в запросе таблиц.
Отдельный поток поиска порождает и каждый элемент в списке IN. Например,
WHERE A IN (100, 200, 300)
интерпретируется как
WHERE A=100 OR A=200 OR A=300 .
Однако при указании диапазона BETWEEN
WHERE A BETWEEN 100 AND 300
этого не происходит. Поэтому, где возможно, следует заменять IN на BETWEEN.
Физическое проектирование БД
Слайд 110Оптимизация запросов
Уменьшение общего количества индексов.
Следует стремиться к уменьшению количества индексов,
поскольку при большом их количестве снижается скорость добавления, изменения и
удаления записей в таблицах БД. Как правило, в БД определяется два вида индексов:
индексы фактически использующиеся запросами для доступа к данным
индексы, внесенные в БД для обеспечения ссылочной целостности.
В некоторых случаях, когда требуется обеспечить повышенную производительность, такие индексы, не использующиеся при доступе к данным, следует удалить, а ссылочную целостность обеспечивать с использованием триггеров.
Физическое проектирование БД
Слайд 111Оптимизация клиентских приложений
Минимизация соединений с БД
Каждое соединение с БД потребляет
системные ресурсы, и их чрезмерный расход может сказаться на эффективности
доступа к БД. Поэтому рекомендуется снижать число соединений клиентского приложения с удаленной БД к минимуму, а в идеале иметь одно соединение с каждой БД.
Использование SQL-ориентированных компонентов при построении клиентских приложений
Использование SQL-ориентированных компонентов (например, в Delphi компонент TQuery вместо TTable) позволяет уйти от «навигационного способа» обработки данных, который был характерен для локальных и файл-серверных СУБД, и, как следствие, решает задачу снижения трафика в вычислительной сети.
Физическое проектирование БД
Слайд 112Оптимизация клиентских приложений
Перенос тяжести вычислительной работы на сервер
При работе с
удаленными БД следует стремиться перенести тяжесть вычислительной работы на сервер,
по возможности оставив приложению клиента лишь работу по реализации интерфейса с пользователем, отсылки запросов к серверу и интерпретации полученных от него данных.
Не надо обращаться к серверу с запросом необоснованно большого объема данных, на которые приходится накладывать фильтры в самом клиентском приложении.
Следует максимально использовать возможности сервера, помня о том, что он может выполнять большинство требований приложения быстрее, кроме того, серверу не надо пересылать данные самому себе по сети.
Запросы, требующие при своем выполнении ветвящихся и циклических алгоритмов, а также всевозможные вычисления значений, основанные на текущих данных из БД, реализуйте при помощи хранимых процедур. Бизнес правила, связанные с транзакционными изменениями ряда таблиц, реализуйте при помощи триггеров. Получайте уникальные значения числовых полей при помощи генераторов.
Перенос тяжести вычислительной работы на сервер, во-первых, убыстряет работу клиентского приложения, а во-вторых, минимизирует возможность возникновения ошибок.
Физическое проектирование БД
Слайд 113Классификация архитектур построения приложений баз данных
По технологии обработки данных
По технологии
обработки данных базы данных подразделяются на централизованные и распределенные.
Централизованная база
данных хранится в памяти одной вычислительной системы. Эта вычислительная система может быть мэйнфреймом - тогда доступ к ней организуется с использованием терминалов - или файловым сервером локальной сети ПК.
Распределенная база данных состоит из нескольких, возможно, пересекающихся или даже дублирующих друг друга частей, которые хранятся в различных ЭВМ вычислительной сети. Работа с такой базой осуществляется с помощью системы управления распределенной базой данных (СУРБД).
Технологии построения информационных систем – приложений БД
Слайд 114Классификация архитектур построения приложений баз данных
По способу доступа к данным
По
способу доступа к данным базы данных разделяются на
БД с
локальным доступом
БД с сетевым доступом.
Для всех современных баз данных можно организовать сетевой доступ с многопользовательским режимом работы.
Централизованные базы данных с сетевым доступом могут иметь следующую архитектуру:
файл-сервер;
клиент-сервер базы данных;
"тонкий клиент" - сервер приложений - сервер базы данных (трехуровневая архитектура).
Технологии построения информационных систем – приложений БД
Слайд 115Классификация архитектур построения приложений баз данных
Схема работы с БД в
локальной сети с выделенным файловым сервером
Архитектура систем БД с
сетевым доступом предполагает выделение одной из машин сети в качестве центральной (файловый сервер). На этот компьютер устанавливается операционная система (ОС) для выделенного сервера. На нем же хранится совместно используемая централизованная БД в виде одного или группы файлов. Все другие компьютеры сети выполняют функции рабочих станций Файлы базы данных в соответствии с пользовательскими запросами передаются на рабочие станции, где и производится обработка информации. При большой интенсивности доступа к одним и тем же данным производительность информационной системы падает. Пользователи могут создавать также локальные БД на рабочих станциях.
Технологии построения информационных систем – приложений БД
Слайд 116Классификация архитектур построения приложений баз данных
Схема работы с БД в
архитектуре "Клиент-сервер"
В этой архитектуре на выделенном сервере, работающем под
управлением серверной операционной системы, устанавливается специальное программное обеспечение (ПО) - сервер БД. СУБД подразделяется на две части: клиентскую и серверную. Основа работы сервера БД - использование языка запросов (SQL). Запрос на языке SQL, передаваемый клиентом (рабочей станцией) серверу БД, порождает поиск и извлечение данных на сервере. Извлеченные данные транспортируются по сети от сервера к клиенту. Тем самым, количество передаваемой по сети информации уменьшается во много раз.
Технологии построения информационных систем – приложений БД
Слайд 117Классификация архитектур построения приложений баз данных
Схема работы с БД в
трехуровневой архитектуре
Трехуровневая архитектура функционирует в Интранет- и Интернет-сетях. Клиентская
часть ("тонкий клиент"), взаимодействующая с пользователем, представляет собой HTML-страницу в Web-браузере либо Windows-приложение, взаимодействующее с соответствующими сервисами. Вся программная логика вынесена на сервер приложений, который обеспечивает формирование запросов к базе данных, передаваемых на выполнение серверу баз данных. Сервер приложений может быть Web-сервером или специализированной программой.
Технологии построения информационных систем – приложений БД
Слайд 118Базовая архитектура сервера баз данных
Типичный сервер баз данных на
логическом уровне отвечает за выполнение следующих функций:
поддержание логически согласованного
набора файлов;
обеспечение языка манипулирования данными;
восстановление информации после разного рода сбоев;
организацию реально параллельной работы нескольких пользователей.
Технологии построения информационных систем – приложений БД
Слайд 119Базовая архитектура сервера баз данных
На физическом уровне сервером БД
реализуются следующие функции:
Непосредственное управление данными во внешней памяти
Эта функция
включает обеспечение необходимых структур внешней памяти как для хранения непосредственных данных, входящих в БД, так и для служебных целей, например, для убыстрения доступа к данным в некоторых случаях (обычно для этого используются индексы).
Управление буферами оперативной памяти
Серверы баз данных обычно работают с БД значительного размера; по крайней мере этот размер обычно существенно больше доступного объема оперативной памяти. Понятно, что если при обращении к любому элементу данных будет производиться обмен с внешней памятью, то вся система будет работать со скоростью устройства внешней памяти. Практически единственным способом реального увеличения этой скорости является буферизация данных в оперативной памяти.
Технологии построения информационных систем – приложений БД
Слайд 120Базовая архитектура сервера баз данных
На физическом уровне сервером БД
реализуются следующие функции (продолжение):
Управление транзакциями
Понятие транзакции необходимо для поддержания
логической целостности БД. Но понятие транзакции гораздо более важно в многопользовательских СУБД. То свойство, что каждая транзакция начинается при целостном состоянии БД и оставляет это состояние целостным после своего завершения, делает очень удобным использование понятия транзакции как единицы активности пользователя по отношению к БД.
С управлением транзакциями в многопользовательской СУБД связаны важные понятия сериализации транзакций и сериального плана выполнения смеси транзакций.
Под сериализаций параллельно выполняющихся транзакций понимается такой порядок планирования их работы, при котором суммарный эффект смеси транзакций эквивалентен эффекту их некоторого последовательного выполнения. Сериальный план выполнения смеси транзакций - это такой план, который приводит к сериализации транзакций.
Существует несколько базовых алгоритмов сериализации транзакций. В централизованных СУБД наиболее распространены алгоритмы, основанные на синхронизационных захватах объектов БД.
Технологии построения информационных систем – приложений БД
Слайд 121Базовая архитектура сервера баз данных
На физическом уровне сервером БД
реализуются следующие функции (продолжение):
Журнализация
Одним из основных требований к СУБД
является надежное хранение данных во внешней памяти. Под надежностью хранения понимается то, что СУБД должна быть в состоянии восстановить последнее согласованное состояние БД после любого аппаратного или программного сбоя.
Поддержание надежного хранения данных в БД требует избыточности хранения данных, причем та часть данных, которая используется для восстановления должна храниться особо надежно. Наиболее распространенным методом поддержания такой избыточной информации является ведение журнала изменений БД.
Журнал - это особая часть БД, недоступная пользователям СУБД и поддерживаемая с особой тщательностью (иногда поддерживаются две копии журнала, располагаемые на разных физических дисках), в которую поступают записи обо всех изменениях основной части БД.
Технологии построения информационных систем – приложений БД
Слайд 122Базовая архитектура сервера баз данных
На физическом уровне сервером БД
реализуются следующие функции (продолжение):
Языки БД
Для работы с базами данных
используются специальные языки, в целом называемые языками баз данных. В ранних СУБД поддерживалось несколько специализированных по своим функциям языков. Чаще всего выделялись два языка - язык определения схемы БД (SDL - Sсhema Definition Language) и язык манипулирования данными (DML - Data Manipulation Language).
В современных СУБД обычно поддерживается единый интегрированный язык, содержащий все необходимые средства для работы с БД, начиная от ее создания, и обеспечивающий базовый пользовательский интерфейс с базами данных. Стандартным языком наиболее распространенных в настоящее время реляционных СУБД является язык SQL.
Технологии построения информационных систем – приложений БД
Слайд 123 Реализация доступа к базам данных в среде DELPHI
VCL-библиотека классов среды
проектирования Delphi предоставляет ряд классов, позволяющих быстро и эффективно разрабатывать
различные приложения баз данных. Эти классы представлены следующими группами:
компоненты для доступа к данным, реализующие:
доступ через машину баз данных BDE (Borland Database Engine), предоставляющую доступ через ODBC-драйверы или через внутренние драйверы машины баз данных BDE (компоненты страницы BDE-палитры инструментов);
доступ через ADO-объекты (ActiveX Data Objects), в основе которого лежит применение технологии OLE DB (компоненты страницы ADO);
доступ к локальному или удаленному SQL-серверу InterBase (компоненты страницы InterBase);
доступ посредством легковесных драйверов dbExpress;
доступ к БД при многозвенной архитектуре (компоненты страницы DataSnap);
визуальные компоненты, реализующие интерфейс пользователя;
компоненты для связи источников данных с визуальными компонентами, предоставляющими интерфейс пользователя;
компоненты для визуального проектирования отчетов.
: Проектирование приложений БД
Слайд 124 Реализация доступа к базам данных в среде DELPHI
Основными механизмами доступа
к данным, поддерживаемым в Delphi, являются:
ODBC - доступ через ODBC-драйверы
БД или BDE-драйверы;
OLE DB - доступ с использованием провайдеров данных (OLE DB - это метод доступа к любым данным через стандартный COM-интерфейс);
средства dbExpress, использующие легковесные драйверы БД;
Средства IBExpress при непосредственном взаимодействии с InterBase
средства доступа к распределенным наборам данных в многозвенной архитектуре.
: Проектирование приложений БД
Слайд 125 Реализация доступа к базам данных в среде DELPHI
Самый простой механизм
управления данными, использующий ODBC-драйверы, может быть реализован по следующей схеме:
В
модуль данных (или в форму) добавляется компонент набора данных (объект класса TDataSet) и устанавливается связь с источником данных, определяемая свойством DatabaseName. Связь может быть указана одним из трех способов: по имени базы данных, каталогу или псевдониму (способ указания связи может быть ограничен типом источника данных). Список всех псевдонимов доступен на этапе проектирования.
В модуль данных (или в форму) добавляется компонент источника данных (TDataSourse), являющийся центральным связующим звеном между набором данных и элементами управления, отображающими эти данные. Свойство DataSet компонента типа TDataSourse указывает набор данных, формируемый компонентами таких классов как TTable или TQuery. Если компоненты набора данных и источника данных расположены в модуле данных, то их следует добавить в проект (команда меню File | Use unit).
В форму добавляются элементы управления для работы с данными, такие как TDBGrid, TDBEdit, TDBCheckbox. Они связываются с компонентом источником данных, который указывается свойством DataSource. Имя поля набора данных определяется свойством DataField.
: Проектирование приложений БД
Слайд 126 Упрощенная схема работы с базами данных для двухзвенных архитектур в
среде Delphi
: Проектирование приложений БД
Сервер БД
TDataBase
TTable, TQuery,
TDataSet
TDataSourse
TDBGrid, TDBEdit,
TDBText
и др.
Свойство DataSet
Свойство DataSourse
TADOConection
TADOTable, TADOQuery,
TADODataSet
TSQLConection
TSQLTable, TSQLQuery,
TSQLDataSet,
TSQLClientDataSet
TIBDataBase
TIBTable, TIBQuery,
TIBDataSet
Машина БД
BDE
Провайдеры
OLE DB
dbExpress
InterBase
(IBExpress)
Компонент "источник данных"
Визуальные компоненты для работы с данными
Невизуальные компоненты набора данных
Слайд 127 Наборы данных
Набор данных - это упорядоченная последовательность строк, извлеченных из
источника данных.
Каждая строка набора данных состоит из полей, указываемых в
свойствах класса.
Предком всех классов наборов данных является класс TDataSet. Он определяет основу структуры всех наборов данных - массив компонентов типа TField (каждый элемент массива соответствует столбцу таблицы).
В зависимости от механизма доступа, используемого приложением, базовыми классами набора данных могут быть:
TTable, TQuery, TStoredProc - для однозвенных или двухзвенных приложений, использующих машину баз данных BDE. Класс TQuery дополнительно позволяет выполнять параметрические запросы;
TClientDataSet - для реализации клиентского набора данных и для многозвенной архитектуры, использующей распределенный доступ;
TADODataSet - для приложений, использующих ADO-объекты;
TSQLDataSet ,TSQLTable и TSQLQuery - для доступа к базе данных посредством dbExpress.
TIBDataSet, TIBTable, TIBQuery - для доступа к базе данных посредством IBExpress.
: Проектирование приложений БД
Слайд 128 Наборы данных
Для определения набора данных необходимо задать следующие свойства (здесь
и далее, на примере компонентов IBExpress):
для класса TIBTable - значения
свойств DatabaseName и TableName;
для класса TIBQuery - значение свойства SQL и, возможно, свойства DatabaseName.
Набор данных предварительно должен быть открыт. Открыть набор данных можно одним из следующих способов:
Query1.Active:= True;
или
Query1.Open;
Аналогично, закрыть набор данных можно вызовом метода Close или установив значение свойства Active равным False.
Для компонента типа TIBQuery метод Open может быть выполнен только для закрытого набора данных: попытка открыть уже открытый набор данных инициирует ошибку.
Открытие набора данных влечет за собой:
инициацию событий BeforeOpen и AfterOpen;
установку состояния набора данных в dsBrowse;
открытие курсора для набора данных;
если в момент открытия набора данных произошла ошибка, то состояние набора данных устанавливается в dsInactive, а курсор закрывается.
Включение кэширования изменений:
По умолчанию при переходе от одной записи набора данных к другой происходит запись всех сделанных изменений в базу данных (для модифицируемых НД).
Чтобы включить режим кэшированного обновления, следует установить значение свойства CachedUpdates равным True для компонента набора данных. Для присвоения кэшированного обновления вызывается метод ApplyUpdates, а для отмены - CancelUpdates.
: Проектирование приложений БД
Слайд 129 Классы библиотеки VCL Delphi
Класс TDataSet
Класс TDataSet является базовым для всех
классов наборов данных, наследующих общие свойства и методы этого класса,
включая следующие часто используемые:
Active свойство, определяющее, открыт ли набор данных;
DataSource свойство, указывающее родительскую таблицу (для таблиц, связанных отношением родительская - дочерняя);
Bof свойство, определяющее, находится ли курсор на первой записи набора данных;
Eof свойство, определяющее, достигнут ли конец набора данных;
FieldCount свойство, указывающее количество полей в наборе данных;
Fields свойство, представляющее собой массив полей набора данных и используемое для доступа к этим полям.
Found свойство, определяющее, успешно ли выполнен поиск методами FindFirst, FindLast, FindNext или FindPrior;
Modified свойство, определяющее, была ли изменена активная запись;
RecordCount свойство, содержащее общее число записей в наборе данных;
State свойство, указывающее текущее состояние набора данных. Это свойство может принимать следующие значения:
dsInactive - набор данных закрыт;
dsBrowse - данные доступны только для просмотра;
dsEdit - можно изменять активную запись;
dsInsert - активной записью является новая запись, пока не сохраненная;
dsSetKey - просмотр ограниченного множества записей (SetRange) или поиск записи;
dsCalcFields - выполняется обработчик события OnCalcFields;
dsFilter - выполняется обработчик события OnFilterRecord;
dsOpening - набор данных находится в процессе открытия.
: Проектирование приложений БД
Слайд 130 Классы библиотеки VCL Delphi
Класс TDataSet
Append метод, добавляющий в конец набора
данных новую запись;
Delete метод, удаляющий текущую запись из базы
данных. Если в момент удаления записи набор данных находится в неактивном состоянии, то инициируется исключение;
Edit метод, переводящий текущую запись в режим редактирования;
Cancel метод, отменяющий изменения, сделанные в текущей записи;
Post метод, выполняющий внесение изменений в базу данных;
Refresh метод, выполняющий обновление результирующего набора путем повторного извлечения данных из БД;
Insert метод, вставляющий в набор данных новую запись;
InsertRecord метод, вставляющий в набор данных новую запись со значениями, которые указаны параметрами метода;
Close метод, закрывающий набор данных;
Open метод, открывающий набор данных;
First метод, устанавливающий курсор на первую запись набора данных и делающий эту запись активной;
Last метод, устанавливающий курсор на последнюю запись набора данных и делающий эту запись активной;
Next метод, перемещающий курсор на следующую запись набора данных и делающий эту запись активной;
Prior метод, перемещающий курсор на предыдущую запись набора данных и делающий эту запись активной.
: Проектирование приложений БД
Слайд 131 Классы библиотеки VCL Delphi
Класс TDataSet
Пример 1.
Table1.Edit; // Включение режима
редактирования
Table1.Fields.Fields[6].AsString := Edit1.Text;
Table1.Post; // Присвоение изменений Свойство Fields
Пример 2.
var S: String;
begin
S := Fields[0].FieldName; // Имя первого поля
S := Fields[1].FieldName; // Имя второго поля..
end;
Пример 3.
var s: String; i: Integer; d: TDateTime;
s := Fields[0].AsString;
i := Fields[0].AsInteger;
d := Fields[0].AsDate;
Пример 4.
// Вместо Fields[n] можно использовать функцию FieldsByName('имя_поля’) - метод, определяющий
// поле набора данных по его имени;
s := Fields[0].AsString;
s := FieldsByName('F1').AsString;
Table1.FieldByName('F1').AsInteger:=StrToInt(Edit1.Text);
: Проектирование приложений БД
Слайд 132 Классы библиотеки VCL Delphi
Класс TDataSourse
Класс TDataSource реализует связь между компонентами
- наборами данных и элементами управления, используемыми для отображения данных.
При построении отношений между таблицами "родительская-дочерняя" компонент "источник данных" служит для связывания наборов данных, указывая родительский набор данных. Класс TDataSource содержит набор свойств и методов, используемых для доступа к набору данных, включая следующие:
AutoEdit свойство, определяющее, будет ли автоматически вызываться метод Edit набора данных при получении фокуса элементом управления, ассоциированным с источником данных;
DataSet свойство, указывающее используемый набор данных. Изменяя значение свойства DataSet во время выполнения, можно эффективно переключаться на работу с различными наборами данных, отображая разные наборы данных в одних и тех же элементах управления. Например:
DataSource.DataSet := Table1;
Enabled свойство, определяющее, будет ли элемент управления отображать ассоциированные с ним данные, или будет отображаться пустым;
State свойство, позволяющее определить состояние используемого набора данных.
Например:
if DataSource1.Dataset <> nil then
//Кнопка доступна только в том случае, если набор данных находится в состоянии
//редактирования или вставки новой записи
BtnPost1.Enabled := DataSource1.State in [dsEdit, dsInsert];
: Проектирование приложений БД
Слайд 133 Классы библиотеки VCL Delphi
Класс TIBTable
Компонент типа TIBTable используется для доступа
к БД InterBase посредством определения источника данных DSN и имени
таблицы базы данных. При этом допускается выбор всех полей таблицы или только части полей, а также задание фильтра, определяющего, какие строки таблицы будут доступны.
Компоненты типа TIBTable могут использовать все свойства и методы, наследуемые от класса TDataSet, а также свойства и методы класса TIBTable для набора данных, включая следующие:
DatabaseName свойство, определяющее имя источника данных DSN;
CanModify свойство, определяющее, может ли приложение выполнять вставку, редактирование и удаление записей в таблице;
DefaultIndex свойство, определяющее, должны ли данные в таблице быть упорядочены при ее открытии. Если значение свойства равно True (по умолчанию), то выполняется упорядочивание по первичному ключу или уникальному индексу;
IndexName свойство, позволяющее определить вторичный индекс, используемый для сортировки открываемого набора данных;
Exclusive свойство, позволяющее установить исключительный режим доступа к таблице (значение свойства должно быть определено до открытия таблицы);
: Проектирование приложений БД
Слайд 134 Классы библиотеки VCL Delphi
Класс TIBTable
MasterSource свойство, определяющее имя компонента "источник
данных" родительской таблицы для установления отношения между таблицами "родительская-дочерняя";
MasterFields
свойство, определяющее одно или несколько полей из родительской таблицы, служащих для связи с соответствующими полями данной дочерней таблицы (Это задает отношение между родительской и дочерней таблицами. Поля в списке разделяются точкой с запятой);
ReadOnly свойство, позволяющее установить для таблицы режим доступа "только для чтения";
TableName свойство, указывающее используемую таблицу базы данных;
RecNo свойство, указывающее номер текущей записи набора данных;
FindKey метод, выполняющий поиск значения или значений, перечисленных в списке, для ключевого поля;
FindNearest метод, перемещающий курсор на запись, содержащую значение, наиболее близкое к указанному значению ключевого поля (поиск может выполняться как по одному значению, так и по нескольким, если используется составной индекс).
: Проектирование приложений БД
Слайд 135 Классы библиотеки VCL Delphi
Класс TIBQuery
Компонент типа TIBQuery позволяет выполнять любой
SQL-оператор, допустимый по синтаксису InterBase. Если в качестве выполнимого оператора
используется SQL-оператор SELECT, то компонент возвращает набор данных (результирующий набор).
В отличие от класса TIBTable, класс TIBQuery позволяет создавать наборы данных из нескольких таблиц, а также ограничивать получаемый набор данных определенными условиями. Это отменяет необходимость извлечения всех записей таблицы в набор данных, что, в свою очередь, экономит память, сокращает сетевой трафик для удаленных баз данных и уменьшает время доступа.
Для определения набора данных TIBQuery следует установить значение свойства SQL и свойства DatabaseName (свойство DatabaseName определяет имя источника данных). По умолчанию, набор данных, формируемый компонентом типа TIBQuery, не является редактируемым.
Для того чтобы значения в созданном наборе данных можно было редактировать, необходимо выполнить следующие действия:
связать компонент TIBQuery с компонентом типа TIBUpdateSQL
Query1.UpdateObject:= UpdateSQL1;
определить для последнего значение свойств ModifySQL, InsertSQL, UpdateSQL
: Проектирование приложений БД
Слайд 136 Классы библиотеки VCL Delphi
Класс TIBQuery
Класс TQuery содержит свойства и методы,
используемые для работы с набором данных, включая следующие:
DataSource свойство, позволяющее
указать родительский набор данных (для отношения "родительский-дочерний").
Например, если свойство SQL содержит значение
'SELECT * FROM RASHOD WHERE TOVAR = :TOVAR‘ ,
то значение переменной связи :TOVAR будет определяться из источника данных, указанного свойством DataSource.
Params свойство, содержащее список параметров для SQL-оператора.
Например:
Query3.SQL.Clear; // Очищаем значение свойств
// Динамически формируем код SQL-оператора INSERT
Query3.SQL.Add('INSERT INTO ADDRESS (F1, F2)');
// Имена параметров указываются после символа :
Query3.SQL.Add('VALUES (:F1, :F2)');
// Устанавливаем значение параметров
Query3.Params[0].AsString := 'Abc';
Query3.Params[1].AsInteger := 123;
// Выполнение SQL-оператора
Query3.ExecSQL;
: Проектирование приложений БД
Слайд 137 Классы библиотеки VCL Delphi
Класс TIBQuery
SQL свойство, содержащее текст SQL-оператора (для
автоматического формирования SQL-оператора можно вызвать из контекстного меню компонента TQuery
диалог SQL Builder);
DatabaseName свойство, определяющее имя подключаемого источника данных (имя DSN источника данных или имя, введенное классом типа TDatabase);
ExecSQL метод, выполняющий SQL-оператор, указанный свойством SQL (для SQL- оператора, создающего набор данных, вместо ExecSQL используется метод Open). ExecSQL можно вызывать для таких SQL-операторов как INSERT, UPDATE, DELETE, CREATE TABLE и т. п.
Если перед вызовом Open или ExecSQL не был вызван метод Prepare, то SQL-оператор
будет одновременно и откомпилирован, и выполнен.
Prepare метод, выполняющий компиляцию SQL-оператора. Вызов этого метода перед ExecSQL увеличивает скорость выполнения запроса при многократном повторении вызовов ExecSQL для одного и того же оператора (например, параметризированного запроса). Это позволяет откомпилировать SQL-оператор только один раз, а затем многократно его выполнять.
: Проектирование приложений БД
Слайд 138 Классы библиотеки VCL Delphi
Класс TIBUpdateSQL
Объект типа TIBUpdateSQL позволяет для наборов
данных, созданных с доступом
"только для чтения", поддерживать возможность их
обновления посредством выполнения
SQL-оператора.
Класс TIBUpdateSQL реализует следующие свойства и методы:
DeleteSQL свойство, определяющее SQL-оператор DELETE.
InsertSQL свойство, определяющее SQL-оператор INSERT.
ModifySQL свойство, определяющее SQL-оператор UPDATE.
ExecSQL метод, выполняющий один из заданных SQL-операторов (в зависимости от значения параметра, указываемого следующими константами: ukDelete, ukInsert,ukModify).
: Проектирование приложений БД
Слайд 139 Классы библиотеки VCL Delphi
Класс TIBDatabase
Класс TIBDatabase реализует работу с объектом
"база данных" и предоставляет средства контроля над соединением с базой
данных.
Класс TIBDataBase реализует следующие свойства и методы:
DatabaseName свойство, определяющее путь к БД
DеfaultTransaction свойство, определяющее транзакцию по умолчанию для
соединения с БД.
Params свойство, определяющее параметры соединения.
например:
user_name=SYSDBA
password=masterkey
lc_ctype=WIN1251
Open метод, открывающий соединение с БД
Сlose метод, закрывающий соединение с БД
: Проектирование приложений БД
Слайд 140 Классы библиотеки VCL Delphi
Класс TIBTransaction
Класс TIBTransaction позволяет управлять транзакциями.
Свойства и
методы:
InTransaction свойство, указывающее, был ли выполнен для базы данных вызов
метода StartTransaction.
DеfaultDatabase свойство, определяющее компонент соединения с БД по умолчанию.
Params свойство, определяющее параметры транзакции
Пример:
read_commited
rec_version
nowait
StartTransaction метод, открывающий новую транзакцию;
Commit метод, выполняющий фиксацию текущей транзакции;
Rollback метод, выполняющий откат текущей транзакции;
: Проектирование приложений БД
Слайд 141 Классы библиотеки VCL Delphi
Классы компонентов управления данными
Компоненты управления данными расположены
на странице Data Controls палитры компонентов. Многие из этих компонентов
аналогичны элементам управления страницы Standard, с тем лишь отличием, что связаны через источник данных (компонент типа TDataSource) с определенным полем (или полями) из набора данных (компонентов типа TTable или TQuery).
Библиотека VCL предоставляет следующие классы компонентов управления данными:
TDBGrid - класс, позволяющий отображать записи набора данных в виде таблицы и управлять этими записями.
TDBNavigator - класс, предоставляющий средства навигации по набору данных, а также возможности добавления новых записей, включения режима редактирования, присвоения и отмены сделанных изменений. TDBText - класс, позволяющий в качестве надписи отображать значение поля текущей записи набора данных.
TDBEdit - класс, реализующий работу с однострочным полем редактирования.
TDBMemo - класс, реализующий многострочное поле редактирования, в котором можно отображать и изменять значение поля набора данных.
TDBImage - класс, реализующий объект "рисунок", в котором можно отображать и изменять значение поля набора данных формата BLOB.
: Проектирование приложений БД
Слайд 142 Классы библиотеки VCL Delphi
Классы компонентов управления данными
TDBRadioGroup - класс, реализующий
группу радиокнопок, которые связаны с полем базы данных. Применение такого
объекта предоставляет пользователю удобную возможность устанавливать значение поля базы данных, выбирая его из предлагаемых опций.
TDBCheckBox - класс, реализующий компонент "флажок", который связан с полем базы данных.
TDBListBox - класс, реализующий компонент "список", который используется для отображения значений поля набора данных. Значения, отображаемые в списке, содержатся в свойстве Items.
TDBComboBox - класс, реализующий компонент "раскрывающийся список", который используется для отображения значений поля набора данных. Значения, отображаемые в списке, содержатся в свойстве Items.
TDBLookupListBox - класс, позволяющий выполнять просмотр списка, заполненного значениями полей из другого набора данных.
TDBCtrlGrid - класс, реализующий особый вид таблицы, в которой каждая запись отображается на отдельной панели (количество панелей в компоненте указывается значением свойства RowCount).
: Проектирование приложений БД
Слайд 143 Классы библиотеки VCL Delphi
События, инициируемые для наборов данных
При работе с
наборами данных могут инициироваться следующие события:
AfterCancel и BeforeCancel - происходит
после/до отмены в приложении всех изменений, сделанных для текущей записи.
AfterClose и BeforeClose - происходит после/до закрытия набора данных и перевода базы данных в состояние dsInactive.
AfterDelete и BeforeDelete - инициируется после/до удаления приложением текущей записи, перевода набора данных в состояние dsBrowse и перемещения позиции курсора на предыдущую запись.
AfterEdit и BeforeEdi - происходит после/до начала редактирования приложением текущей записи.
AfterInsert и BeforeInsert - происходит после/до того как приложение вставит новую запись.
AfterOpen и BeforeOpen - происходит после/до того как приложение откроет набор данных, но до того, как какие-либо доступные данные будут отображены.
AfterPost и BeforePost - происходит до завершения переноса значений активной записи в базу данных или внутренний кэш.
AfterRefresh и BeforeRefresh - происходит после/до обновления набора данных.
: Проектирование приложений БД
Слайд 144 Классы библиотеки VCL Delphi
События, инициируемые для наборов данных
AfterScroll и BeforeScroll
- происходит после/до перемещения позиции курсора на другую запись.
OnCalcFields -
происходит при открытии набора данных, перевода его в состояние dsEdit, перемещении фокуса ввода от одного компонента к другому или от одного столбца к другому, при изменениях записи или при извлечении записи из базы данных, но только в том случае, если значение свойства AutoCalcFields равно True;
OnDeleteError - инициируется, если при попытке удаления строки произошла ошибка - было брошено исключение.
OnEditError - инициируется, если при попытке изменения или вставки записи произошла ошибка - было брошено исключение.
OnPostError - инициируется, если при попытке передать изменение или вставку новой записи происходит ошибка - бросается исключение.
OnFilterRecord - происходит при изменении активной записи и только в том случае, если свойство State набора данных установлено равным dsFilter, а свойство Filtered равно True. Чтобы запись была включена в набор данных, для нее следует установить параметр Accept равным True.
OnNewRecord - происходит при вставке или добавлении новой записи.
: Проектирование приложений БД
Слайд 145 Применение многозвенных архитектур
: Проектирование приложений БД
Сервер БД
TDCOMConection
TClietntDataSet
TDataSourse
TDBGrid, TDBEdit,
TDBText
и др.
Свойство DataSet
Свойство DataSourse
Приложение – Сервер (Remote Data Module)
Приложение -
Клиент
TDataSetProvider
TDataSet
TDatabase
Свойство RemoteServer
Свойство ServerName или ServerGuide
Свойство ProviderName
Свойство DataSet
Слайд 146 Применение многозвенных архитектур
Применение многозвенной архитектуры позволяет вынести бизнес-логику работы
с данными в приложение-сервер.
При многозвенной архитектуре приложение разбивается на ряд
компонентов, которые могут выполняться на различных компьютерах.
Такая архитектура позволяет реализовывать доступ к серверу БД из приложения-сервера, не имея на клиентских машинах никаких драйверов доступа к базе данных.
Большое преимущество использования такой архитектуры заключается также в возможности изменения серверной части без необходимости перетрансляции клиентского приложения.
Приложение-сервер получает набор данных стандартным способом - через один из компонентов набора данных, таких как TTable или Tquery, и пересылает его с помощью компонента TDataSetProvider компоненту TClientDataSet в приложение-клиент. Приложение-сервер реализуется как удаленный модуль данных, представляющий из себя СОМ-объект. Доступ к такому компоненту может быть выполнен посредством DCOM с любого удаленного компьютера.
: Проектирование приложений БД