Введение в курс "Базы данных"

E-mail Печать PDF
Рейтинг пользователей: / 9
ХудшийЛучший 
Индекс материала
Введение в курс "Базы данных"
Классификация БД по их использованию
Реляционные БД (MS Access)
Ключи
Связи между таблицами
Неформальные методы приведения таблиц к третьей нормальной форме
Операции в БД (VBA)
Операции над записями
SQL
Оператор Select
DISTINCT
FROM
Группировка
Объединение таблиц
Параметры
Перекрёстные запросы
Обновление данных
Удаление данных
Подчинённые запросы
Создание таблиц
Добавление новых полей
Tехнология разработки программного обеспечения, использующего базы данных
Доступ к данным в VB 6.0
Работа с записями
Отчёты в VB6
Доступ к данным в C++ Builder
Отчёты в C++ Builder
Создание многоуровневых приложений
Доступ к данным в C# (Visual Studio 2005)
Создание отчётов
OLAP технологии. XML язык
SQL Server
Триггер
Программирование триггера
XML
Все страницы

Введение в курс "Базы данных"

В терминологии баз данных существует 2 различных понятия: база данных и банк данных.

Банком данных называется система специальным образом организованных данных, программных, технических и языковых средств, предназначенных для централизованного накопления и коллективного использования данных. Иными словами, это совокупность взаимосвязанных объектов, которые имеют средства для доступа к базам данных и набор специальных языков для работы с ней.

База данных(БД) - система специальным образом организованных данных, которая обеспечивает редактирование, хранение и быстрый доступ к информации как одного, так и нескольких пользователей одновременно.

Как правило, при работе с БД пользователь имеет дело именно с языком, а не с данными.

 


Любой банк данных делится на 2 части: база данных и средства доступа к БД.

Классификация БД по способу хранения данных

1.     

Студент

 

Кафедра

 

Факультет

 

Факультет

 

Университет

 
Иерархическая БД - её структура представлена в виде дерева.
Пример.

2.                                                  Сетевые БД - это иерархические БД, у которых разрешён переход от одного узла к другому на одном уровне. В рассмотренном выше примере это переход от одного студента к другому.

3.                                                  Реляционные БД. Их основу составляют таблицы. Основной недостаток - реляционные БД состоят из набора "плоских" таблиц.

4.                                                  Объектные БД. Данные представляют собой набор объектов.

5.                                                  Постреляционные БД. В таких БД данные хранятся в виде т.н. "разряженных" таблиц. Хранить данные в виде обычных массивов - многомерных кубов - нерационально из-за большого объёма неиспользуемой памяти на диске. Фактически она не используется, однако занимает огромные физические объёмы памяти. Вследствие этого хранить данные при таком подходе предлагается в виде списка индексов: (значение; индекс1 (н-р, фамилия); индекс2; :) - разряженных массивов. Вместо индексов допускается использование текста. Подобный подход к построению БД представлен программным продуктом Cache.


Классификация БД по их использованию

1.      Локальные БД - БД, которые работают на одном компьютере и в любой момент времени с этой БД работает только 1 человек.

2.      Сетевые БД - БД, которые имеют сервер и клиентские места. Все клиентские места (компьютеры) обращаются к одной и той же БД. Они могут быть организованы следующим образом:

a.      Файл-серверные системы. Если БД находится на файл-сервере, то при работе все данные скачиваются на локальный компьютер, обрабатываются и отсылаются обратно на файл-сервер. При такой организации требуется мощная и производительная вычислительная техника как на сервере, так и на клиентских компьютерах, т.к. им приходится обрабатывать большие объёмы информации.

b.     Клиент-серверные системы. В подобных системах передаются не все данные, а только те, которые были запрошены. При этом  большими вычислительными возможностями должен обладать компьютер, на котором работает серверное приложение. Компьютеры с клиентским оснащением могут быть слабее по мощности. Основным недостатком является дороговизна программного обеспечения: "клиент-сервер", "Сервер БД".

 
 
 

 


c.                                 Распределённые БД - БД состоит из нескольких частей, расположенных на разных серверах (например, БД поездов; в каждом городе располагается сервер с информацией об исходящих/входящих поездах).


Реляционные БД (MS Access)

Основой реляционных БД являются отношения, которые называются таблицей, причём эти отношения/таблицы представлены в "плоском" виде (это их основной недостаток).

Таблица (отношение) состоит из записей (строк таблицы). Каждая запись состоит из полей, и каждая запись имеет одну и ту же структуру. Поля и записи - это столбцы и строки в таблице.

Создание таблицы.

1.      Определить имя таблицы - текст.

2.      Определить структуру таблицы - имена, размеры и типы полей.

Типы полей в реляционных БД

Тип поля определяется от тех операций, которые будут выполняться над этим данными этого поля и от тех данных, которые будут храниться в этом поле.

1.      Текстовое поле. В нём хранится любая текстовая информация. Длина этого поля - 255 символов. Наиболее распространённые операции:
объединение строк: "+", "&";
Сравнение строк: like - сравнение строк, "*" - любое количество любых символов (могут быть пустыми), "?" - один любой символ (должен быть обязательно). Например, [A-K]* - все поля, начинающиеся с букв от А до К; [A,K]* - все поля, начинающиеся либо с А, либо с К. Знаки: >, <, >=, <=, <> используются для сравнения символов в строке. В Access сравнивается первый несовпадающий символ в зависимости от расположения в алфавите. Например, ВАСЯ > ВАНЯ. Все функции работы со строками применимы как в VBA, так и непосредственно в Access.

2.      Числовые поля. Операции, допустимые с числовыми полями: +, -, *, /, >, <, =. Операция like с числовыми полями НЕДОПУСТМА.

a.      Целые - делятся по размеру; длина 1 байт. Длинное целое - 4 байта.

b.     Вещественные

                                                               i.     Простые вещественные - 4 байта - 7 точных знаков.

                                                             ii.     Двойной точности - 8 байт.

3.      Логические поля. В Access принимают значения: -1, 1. Допустимые операции: И, ИЛИ, НЕ.

4.      Дата/время. Размер - 4 байта. Допустимые операции над датами: вычитание/сложение с числом, сравнение.
1-я часть - дни, начиная от 01.01.1900.
2-я часть - количество секунд, прошедших в этих сутках.
Для работы с данными этого поля используются специальные функции для выделения даты/времени. Существует 3 вида дат (Д - день, М - месяц, Г - год):

a.      ДД.ММ.ГГГГ - русская дата.

b.     ДД-ММ-ГГГГ - европейская дата.

c.      #ММ/ДД/ГГГГ# - американская дата, которая используется для работы в Access.

5.      Поле типа Memo. Максимальная длина - 1,2 Гб. В нём может храниться любой текст. Как правило, данные этого поля хранятся в отдельном файле. Допустимые операции: запись и чтение.

6.      Поле типа OLE. Длина - до 1,2 Гб. В нём хранится любая информация вместе ссылкой на программу, с помощью которой можно просмотреть содержимое хранимой информации. Допустимые операции: запись и чтение.

7.      Поле битовой информации. Представляет собой область памяти для хранения собственно программ.  Длина - 1,2 Гб.

8.      Поле-счётчик - длинное целое поле, которое изменяет своё значение при добавлении новой записи. Оно устанавливает уникальный числовой идентификатор для каждой записи. Никакие операции, изменяющие значение этого поля недопустимы.


Ключи

Ключом в таблице называется одно или несколько полей, однозначно определяющих запись. Основной ключ в MS Access - поле счётчик.

Существует 5 видов ключей:

1.      Возможные ключи. Они представляют собой набор атрибутов, однозначно идентифицирующих запись в таблице. Каждая таблица должна иметь хотя бы один возможный ключ, хотя  таких ключей может быть несколько. Один из ключей должен быть первичным, остальные будут альтернативными.

2.      Первичные ключи - один из возможных ключей, выбранных пользователем.

3.      Альтернативные ключи - возможные ключи, которые не являются первичными.

4.      Общие ключи. Общим ключом называется любой атрибут, используемый для объединения 2 таблиц. Как правило, общие ключи являются внешними.

5.      Внешние ключи. Внешним ключом называется совокупность атрибутов, ссылающихся на первичный или альтернативный ключ другой сущности.

6.      Составной ключ - ключ, который состоит из нескольких полей.

Понятие ключа связано с понятием индекса. Индексации может подвергаться как одно поле, так и несколько. Под индексацией понимается установление соответствия между значением поля и определенным индексом (обычно числовым). Они предназначены для упорядочивания записей. Их основной недостаток: перестройка индексов происходит каждый раз при изменении таблицы. Чем больше индексов, тем дольше будут обрабатываться изменение таблицы, поэтому необходимо индексировать только те поля, по которым необходим поиск. Основное преимущество индексов - ускоренный поиск и сортировка записей по индексу. Кроме того можно установить уникальность индекса, что обеспечит уникальность вводимых записей по нему (например, установив уникальный составной индекс по полям место и время в таблице по бронированию авиабилетов, можно избежать возможности ввода некорректных данных). В Access всегда строится индекс по ключевому полю.


Связи между таблицами

Связи между таблицами бывают 3 типов:

1.      Связь "один к одному", когда каждой записи в первой таблице соответствует 1 запись во второй таблице.

2.      Связь "Один ко многим", когда одной записи в одной таблице соответствует множество записей во второй таблице.

3.     

1

 

1

 

 

 

 

 
Связь "Многие ко многим", когда одной записи из первой таблицы соответствует множество записей из второй таблицы, и одной записи из второй таблицы соответствует множество записей из первой таблицы. Такие связи в реляционных БД НЕДОПУСТИМЫ. Они преобразуются в две связи один-ко-многим через внедрение вспомогательной таблицы.

Поддержка целостности данных

Поддержка целостности данных предназначена для исключения ошибок при вводе данных и их редактировании, а также при удалении ненужных записей. При включенном режиме невозможно удалить записи из первой таблицы, если существуют связанные с ней записи во второй таблице. Например, имеется 2 таблицы: наименований товаров и их приход. При включённой поддержке целостности данных при удалении (или изменении ключевого поля) одного из товаров в таблице Товары будут также удалены (изменены) записи, соответствующие этому товару, в таблице Приход.

Характерные черты:

1.      При изменении значения ключевого поля в 1-й таблице автоматически изменяется  значение в связанных записях.

2.      Невозможно ввести во вторую таблицу в поле внешнего ключа значение, которого нет в первой таблице.

Допустимые опции:

1.      Каскадное обновление.

2.      Каскадное удаление.

Нормализация БД

При создании БД, в первую очередь необходимо разработать её структуру. Следующим шагом должна быть её нормализация.

Нормализация БД предназначена для уменьшения объёма хранимых данных и снижения вероятности ошибки при вводе данных и затрат труда при этом.

Пример.

Имеется следующая таблица, в которой содержаться данные по товарным накладным:

№ накладной

Дата

Поставщик

Адрес

Товар

Цена

Количество

Стоимость

               

Она имеет очевидные недостатки:

1.      Одна накладная может иметь разные даты вследствие человеческой ошибки.

2.      У одного и того же товара могут быть разные цены.

3.      Адреса у одного и того же поставщика могут быть разные

4.      Стоимость можно ввести неверно.

Для того чтобы устранить эти недостатки, таблицу необходимо привести к 3-й нормальной форме (всего существует 5 нормальных форм).

1.      Первая нормальная форма. Таблица соответствует 1-й нормальной форме, если каждый столбец содержит атомарные (которые нельзя разделить на более простые) значения, а в таблице не содержаться повторяющиеся группы. В рассматриваемом примере повторяющейся группой является накладная, следовательно, часть полей повторяется. Группы удаляются помощью добавления таблиц. Создаём дополнительную таблицу "Накладная".

2.      Чтобы привести таблицу ко второй нормальной форме необходимо, чтобы таблица была в первой нормальной форме, и каждый столбец должен зависеть от ключевого поля. В примере выделяется ещё одна таблица, в которой содержаться код товара (ключевое поле), наименование товара и его цена.

3.      БД находится в 3 нормальной форме, если она находится во второй нормальной форме, и каждый столбец зависит от первичного ключа и не зависти от части ключа. В таблице не должны присутствовать поля, которые можно вычислить, как бы сложно это ни было. Таким образом, в отдельную таблицу также выделяются поставщик, его уникальный идентификатор, его адрес и телефон.


Неформальные методы приведения таблиц к третьей нормальной форме

1.      Определить таблицы таким образом, чтобы записи в каждой таблице описывали объекты одного и того же типа (н-р, товары, поставщики, накладные).

2.      Если в таблице появляются поля, содержащие аналогичные данные, необходимо её разделить.

3.      Не заполнять в таблице данные, которые могут быть вычислены.

4.      Необходимо как можно больше использовать вспомогательные таблицы.


Операции в БД (VBA)

Операции над отношениями/таблицами

1.      Операции создания таблицы/отношения

a.      Имя таблицы,

b.     Создание коллекции полей (значение имён полей, их типов, длины и пр.)
Создание таблицы программно:
Dim db as Database
Dim tb as Tabledef
Dim fil as Field
Set db = CurrentDb   - присоединение объекта к открытой БД
Set tb = db.CreateTableDef("ct")  - создание таблицы
Set fil = tb.Createfield("имяПоля", dbtext, 40) - создание текстового поля длиной 40
tb.fields.Append fil - добавление в конец таблицы созданного поля
Set fil = tb.Createfield("код", dblong)
fil.attributes = dbAutoIncrement
tb.fields.Append fil
:
tb.Fields.Refresh - сохранение изменений в таблице
db.tableDefs.Append tb - добавление таблицы в БД в конец коллекции
Set tb = Nothing - освобождение памяти

2.      Операция создания индекса.
Dim ind as Index
Set db = CurrentDb
set tb = db.TableDefs("ct")
Set ind = tb.CreateIndex("ind1") - создание индекса
ind.Primary = true - делаем индекс первичным
Set fil = ind.CreateField("код",dbLong) - создаём поле индекса
ind.Fields.Append  fil
tb.Indexes.Append ind
tb.Indexes.Refresh

3.      Открытие таблицы с помощью команды DoCmd, в которой хранятся все макрокоманды.
DoCmd.OpenTable "ct", acViewDesign - открытие таблицы в режиме конструктора

4.      Открытие индекса.

5.      Операция выбора таблицы (SetFocus).

6.      Выбор источника данных для формы.
Me.RecordSource = "ct"

7.      Закрытие таблицы. Может происходить без сохранения и с сохранением (операция Close с параметрами; операция Update).

8.      Удаление таблицы.
db.TableDefs.Delete "ct"

9.      Удаление индекса.


Операции над записями

При запуске приложения создаётся копия таблицы, которая называется RecordSet. Именно с ней и происходит взаимодействие при работе с базой данных через форму. После внесения изменений сохранения вносятся в базовую таблицу. Для перемещения по записям существуют следующие команды:

Me.RecordSet.MoveFirst - перемещается на первую запись;

Me.RecordSet.MoveLast  - перемещает текущую запись на последнюю;

Me.RecordSet.MoveNext - перемещает текущую запись на следующую позицию;

Me.RecordSet.MovePreview  - перемещает текущую запись на предыдущую позицию.

Для того чтобы перемещения не были видны на экране (в MS Access), необходимо все действия производить через RecordSetClone.

Операции над записями:

1.      Функция EOF принимает значение Истина только тогда, когда указатель находится после последней записи.

2.      Функция BOF принимает значение Истина только тогда, когда указатель находится перед первой записью.

3.      Модификация записей. Выполняется в 2 этапа:

a.      изменение значения поля;

b.     сохранение записи (Update).

4.      Добавление новой записи.
Add - добавляет запись в то место, где стоит указатель;
AddNew - добавляет запись в конец БД.

5.      Удаление. При выполнении команды Delete запись помечается к удалению.

6.      Операции поиска

a.      Операции поиска по индексированной таблице - seek один параметр.

b.     Операции поиска по неиндексированной таблице - find.

Чтобы использовать операцию seek, необходимо индексировать поле. Активным может быть только один индекс. Существуют также функции FindNext, которая возвращает следующее значение, удовлетворяющее условию.
Н-р, Me.RecordSet.FindFirst  "Товар = 'Хлеб'".

7.      Переход по записям. Может осуществляться с помощью команды/макроса: DoCmd.GoToRecord, , acNext; RecordSet.MoveNext.

8.      Изменение значения. Редактирование значения (пример):
Me.Recordset.Edit
Me.Recordset.Fields(1) = Me.Поле1.Value (значение Value доступно, если элемент активен)
Me.Recordset.Update

9.      Добавление записей.
Me.Recordset.AddNew
Me.Recordset.Fields(1) = "Значение"
Me.Recordset.Update



SQL

SQL (Structured Query Language) - структурный язык запросов. Он поваляет создавать и работать с реляционными базами данных.

 

Этот язык является директивным, т.е. пользователь должен указать какой результат его интересует, а не то, каким образом он будет получен (например, пользователь может указать какие данные необходимо ему получить из БД, а не способ их получения). Преимущества этого языка: наглядность и лёгкость восприятия, т.к. каждая программа - это один оператор. Недостаток заключается в том, что нельзя получить промежуточные данные и контролировать процесс выполнения программы.

 

Существует множество диалектов языка и стандартный язык. Первоначально язык разработан фирмой IBM, но большой вклад внесла фирма ORACLE. Мы рассмотрим стандарт и его отличие применительно к ACCESS и ядру базы данных Microsoft Jet.

 

Существует два вида SQL.

 

1.       Интерактивный, применяемый для выполнения действий непосредственно над базой с целью получить результат, который  используется непосредственно человеком.

 

2.       Встроенный язык, который используется в языках программирования для получения данных для дальнейшей обработки. Результаты записываются в переменные.

 

Весь язык делится на 3 секции (раздела)

 

1.       Секция определения данных (DATA DIFINITION LANGUAGE) DDL  предназначена для создания таблиц и индексов в стандарте ANSI  язык определения схемы SDL.

 

2.       Секция манипулирования данными DML.

 

3.      Секция управления данными DCL.

 

Типы данных используемых в SQL

Стандарт поддерживает только два типа текстовый (char и varchar) и числовой(integer, decimal). Дата и время присутствуют практически во всех диалектах.

 

Типы данных языка SQL ядра базы данных Microsoft Jet включают 13 основных типов данных, определенных в ядре базы данных Microsoft Jet, и несколько синонимов, которые можно использовать вместо основных типов.

 

Далее перечислены основные типы данных.  Синонимы описаны в разделе "Зарезервированные слова" SQL ядра базы данных Microsoft Jet.

 

1.         BINARY. 1 байт   на символ. В поле этого типа могут храниться данные любого типа.  Данные    не преобразуются (например, в текстовые) и отображаются в том же виде, в каком они вводятся в это поле.

2.         BIT. 1 байт. Значения "Да" (Yes) и "Нет" (No), а также поля, содержащие одно из двух возможных значений.

3.         BYTE. 1 байт. Целое значение от 0 до 255.

4.         COUNTER.                4 байт. Число, автоматически увеличиваемое ядром базы данных Microsoft Jet при добавлении в таблицу новой записи.  В ядре базы данных Microsoft Jet этому типу данных соответствует тип данных Long.

5.         CURRENCY                8 байт   Масштабируемое целое
от         -922 337 203 685 477,5808 до 922 337 203 685 477,5807.

6.         DATETIME. Переменные типа Date (значения даты и времени) сохраняются как 64-разрядные (8-байтовые) числа с плавающей точкой стандарта IEEE, представляющие даты в диапазоне от 1 января 100 г. до 31 декабря 9999 г. и значения времени от 0:00:00 до 23:59:59.  Переменным типа Date могут быть присвоены любые значения, задаваемые распознаваемыми датами в явном представлении (литералами даты)8 байт. (Дата или время) (см. DOUBLE); допустим любой год от 100 до 9999.

7.         GUID. 128 бит. Уникальный идентификатор, используемый при вызовах удаленных процедур.

8.         SINGLE. 4 байт. Число с плавающей точкой и одинарной точностью

от -3,402823E38 до -1,401298E-45 для отрицательных значений,

 

от 1,401298E-45 до 3,402823E38 для положительных значений или значение 0.

 

9.         DOUBLE     8 байт   Число с плавающей точкой и двойной точностью

от -1,79769313486232E308 до -4,94065645841247E-324 для отрицательных значений,

 

от 4,94065645841247E-324 до 1,79769313486232E308 для положительных значений или значение 0.

 

10.     SHORT. 2 байт. Короткое целое от -32 768 до 32 767.

11.     LONG. 4 байт. Длинное целое от -2 147 483 648 до 2 147 483 647.

12.     LONGTEXT. 1 байт на символ. От 0 до 1,2 Гбайт.

13.     LONGBINARY. Не ограничено от 0 до 1,2 Гбайт.  Используется для объектов ActiveX.

14.     TEXT. 1 байт на символ. От 0 до 255 символов.

Примечание.   В инструкциях SQL допускается также использование зарезервированного слова VALUE.

Операторы манипулирования данными


Оператор Select

Синтаксис

 

SELECT [предикат] { * | таблица.* | [таблица.]поле_1

 

[AS псевдоним_1] [, [таблица.]поле_2 [AS псевдоним_2] [, ...]]}

 

FROM выражение [, ...] [IN внешняяБазаДанных]

 

[WHERE... ]

 

[GROUP BY... ]

 

[HAVING... ]

 

[ORDER BY... ]

 

[WITH OWNERACCESS OPTION]

 

Аргументы инструкции SELECT:

 

ПРЕДИКАТ - один из следующих предикатов отбора: ALL, DISTINCT, DISTINCTROW или TOP.  Предикаты используются для ограничения числа возвращаемых записей.  Если они отсутствуют, по умолчанию используется предикат ALL.

 


DISTINCT

Исключает записи, которые содержат повторяющиеся значения в выбранных полях.  Чтобы запись была включена в результат выполнения запроса, значения в каждом поле, включенном в инструкцию SELECT, должны быть уникальными.  Например, в таблице "Сотрудники" есть однофамильцы.  Если две записи содержат значение "Иванов" в поле "Фамилия", то следующая инструкция SQL возвратит только одну из них:

SELECT DISTINCT

 

Фамилия

 

FROM Сотрудники;

 

Если предложение SELECT содержит более одного поля, то для включения записи в результат выполнения запроса необходимо, чтобы совокупность значений во всех этих полях была уникальной.

 

DISTINCTROW - опускает данные, основанные на целиком повторяющихся записях, а не отдельных повторяющихся полях.  Например, создан запрос, объединяющий таблицы "Клиенты" и "Заказы" по полю "Клиент".  В поле "Клиент" таблицы "Клиенты" нет повторяющихся значений, однако, они есть в одноименном поле таблицы "Заказы", поскольку каждый клиент может разместить несколько заказов.  Следующая инструкция SQL показывает, как можно использовать предикат DISTINCTROW для получения списка клиентов, разместивших хотя бы один заказ, без включения сведений о самих заказах:

SELECT DISTINCTROW Название

 

FROM Клиенты INNER JOIN Заказы

 

ON Клиенты.КодКлиента = Заказы.КодКлиента

 

Если опустить предикат DISTINCTROW, в результат выполнения запроса будет включено несколько строк о каждом клиенте, сделавшем несколько заказов. Предикат DISTINCTROW влияет на результат только в том случае, если в запрос включены не все поля из анализируемых таблиц.  Предикат DISTINCTROW игнорируется, если запрос содержит только одну таблицу или все поля всех таблиц.

 

TOP n [PERCENT]             

 

Возвращает определенное число записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY.  Следующая инструкция SQL позволяет получить список 25 лучших студентов выпуска 2007 года:

 

SELECT TOP 25

 

Имя, Фамилия

 

FROM Студенты

 

WHERE ГодВыпуска = 2007

 

ORDER BY СреднийБалл DESC;

 

Если предложение ORDER BY будет опущено, запрос возвратит произвольный набор 25 записей из таблицы "Студенты", удовлетворяющих предложению WHERE. Предикат TOP не осуществляет выбор между равными значениями.  Если в предыдущем примере средние балы двадцать пятого и двадцать шестого студента будут равны, то запрос возвратит 26 записей. Кроме того, можно использовать зарезервированное слово PERCENT для возврата определенного процента записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY.  Предположим, что вместо 25 лучших студентов следует отобрать студентов, попавших в последние 10 процентов:

 

SELECT TOP 10 PERCENT

 

Имя, Фамилия

 

FROM Студенты

 

WHERE ГодВыпуска = 2007

 

ORDER BY СреднийБалл ASC;

 

Предикат ASC обеспечивает возврат последних значений.  Значение, следующее после предиката TOP должно быть числовым значением типа Integer без знака. Предикат TOP не влияет на возможность обновления запроса.

 

ТАБЛИЦА - имя таблицы, из которой отбираются записи.

 

* - Указывает, что выбраны все поля заданной таблицы или таблиц.

 

ПОЛЕ_1, ПОЛЕ_2 - имена полей, из которых должны быть отобраны данные.  Если включить несколько полей, они будут извлекаться в указанном порядке.

 

ПСЕВДОНИМ_2, ПСЕВДОНИМ_2  - имена, которые станут заголовками столбцов вместо исходных названий столбцов в таблице.

 

ВЫРАЖЕНИЕ - имена одной или нескольких таблиц, которые содержат отбираемые данные.

 

внешняяБазаДанных - имя базы данных, которая содержит таблицы, указанные с помощью аргумента выражение, если они не находятся в текущей базе данных.

 

При выполнении этой операции ядро базы данных Microsoft Jet находит указанную таблицу или таблицы, извлекает заданные столбцы, выделяет строки, соответствующие условию отбора, и сортирует или группирует результирующие строки в указанном порядке.

 

Инструкции SELECT не изменяют данные в базе данных. Обычно слово SELECT является первым словом инструкции SQL.  Большая часть инструкций SQL является инструкциями SELECT или SELECT...INTO.

 

Ниже приведен минимальный синтаксис инструкции SELECT:

 

SELECT поля FROM таблица

 

Для отбора всех полей таблицы можно использовать символ звездочки (*).  Следующая инструкция отбирает все поля из таблицы "Сотрудники":

 

SELECT * FROM Сотрудники;

 

Если несколько таблиц, включенных в предложение FROM, содержат одноименные поля, перед именем такого поля следует ввести имя таблицы и оператор "." (точка).  Предположим, что поле "Отдел" содержится в таблицах "Сотрудники" и "Начальники".  Следующая инструкция SQL отберет поле "Отдел" из таблицы "Сотрудники" и поле "Начальник" из таблицы "Начальники":

 

SELECT Сотрудники.Отдел, Начальники.Начальник

 

FROM Сотрудники INNER JOIN Начальники

 

WHERE Сотрудники.Отдел = Начальники.Отдел;

 

При создании объекта Recordset ядро базы данных Microsoft Jet использует имя поля таблицы в качестве имени объекта Field в объекте Recordset.  Если требуется другое имя поля, или выражение, создающее поле, не определяет имя, используйте зарезервированное слово AS.  В следующем примере заголовок "Рождение" становится именем объекта Field в результирующем объекте Recordset:

 

SELECT [Дата рождения] AS Рождение

 

FROM Сотрудники;

 

При работе со статистическими функциями или запросами, которые возвращают повторяющиеся имена объекта Field, используйте предложение AS для задания другого имени объекта Field.  В следующем примере заголовок "Численность" задается для возвращаемого объекта Field результирующего объекта Recordset:

 

SELECT COUNT(КодСотрудника)AS Численность

 

FROM Сотрудники;

 

Для дальнейшего отбора и организации искомых данных в инструкцию SELECT можно добавлять многие другие предложения.

 


FROM

Указывает таблицы или запросы, которые содержат поля, перечисленные в инструкции SELECT.

 

Синтаксис:

 

SELECT списокПолей

 

FROM выражение [IN внешняяБазаДанных]

 

Аргументы инструкции SELECT, содержащей предложение FROM:

 

ВЫРАЖЕНИЕ - выражение, определяющее одну или несколько таблиц, откуда извлекаются данные.  Это выражение может быть именем отдельной таблицы, именем сохраненного запроса или результатом операции INNER JOIN, LEFT JOIN, или RIGHT JOIN.

 

внешняяБазаДанных - Полное имя внешней базы данных, содержащей таблицы, указанные в аргументе выражение.

 

Предложение FROM должно присутствовать в каждой инструкции SELECT. Порядок следования имен таблиц в аргументе выражение не существенен. Следующий пример показывает, как отобрать данные из таблицы "Сотрудники":

 

SELECT Фамилия, Имя

 

FROM Сотрудники;

 

WHERE

Определяет, какие записи из таблиц, перечисленных в предложении FROM, следует включить в результат выполнения инструкции SELECT, UPDATE или DELETE.

 

Синтаксис:

 

SELECT списокПолей

 

FROM выражение

 

WHERE условиеОтбора

 

Инструкция SELECT, содержащая предложение WHERE, состоит из трех частей:

 

условиеОтбора - выражение, которому должны удовлетворять записи, включаемые в результат выполнения запроса.

 

Ядро базы данных Microsoft Jet отбирает записи, соответствующие условиям, перечисленным в предложении WHERE.  Если не задавать предложение WHERE, запрос возвращает все строки таблицы.  Если в запросе определить несколько таблиц и не включить предложение WHERE или JOIN, запрос будет возвращать скалярное произведение таблиц.

 

Предложение WHERE не является обязательным, однако, если оно присутствует, то должно следовать после предложения FROM.  Например, можно отобрать всех сотрудников отдела продаж (WHERE Отдел = 'Продажи') или всех клиентов в возрасте от 18 до 30 лет (WHERE Возраст Between 18 And 30).

 

Допускается использование различных выражений.  Например, следующая инструкция SQL отбирает всех сотрудников, зарплата которых превышает 810 000 рублей:

 

SELECT Фамилия, Оклад

 

FROM Сотрудники

 

WHERE Оклад > 810000;

 

Предложение WHERE может содержать до 40 выражений, связанных логическими операторами, такими как And и Or.

 

Имена полей, которые содержат пробелы или знаки препинания, необходимо заключать в квадратные скобки ([ ]).  Например, в таблицу, содержащую сведения о клиентах, можно включить сведения о привычках клиентов:

 

SELECT [Любимый ресторан]

 

При указании аргумента условиеОтбора литералы даты символы дат должны вводиться в американском формате, даже если используется неамериканская версия ядра базы данных Jet.  Например, дата 10 мая 1996 года записывается в России как 10.05.94, а в США как 5/10/94.  Обязательно заключите даты в символы "решетки" (#), как показано в следующих примерах.

 

Для отбора записей с этой датой в российской базе данных необходимо использовать следующую инструкцию SQL:

 

SELECT *

 

FROM Заказы

 

WHERE ДатаИсполнения = #5/10/96#;

 

Кроме того, можно применять функцию DateValue, которая поддерживает международные стандарты, заданные в Microsoft Windows.  Например, для отбора записей в американской базе данных можно использовать следующий текст программы:

 

SELECT *

 

FROM Заказы

 

WHERE ДатаИсполнения = DateValue('5/10/96');

 

Для российской базы данных текст программы будет выглядеть так:

 

SELECT *

 

FROM Заказы

 

WHERE ДатаИсполнения = DateValue('10.5.96');

 


Группировка

Объединяет записи с одинаковыми значениями в указанном списке полей в одну запись.  Если инструкция SELECT содержит статистическую функцию SQL, например, Sum или Count, то для каждой записи будет вычислено итоговое значение.

 

Синтаксис:

 

SELECT списокПолей

 

FROM таблица

 

WHERE условиеОтбора

 

[GROUP BY группируемыеПоля]

 

группируемыеПоля - имена полей (до 10), которые используются для группировки записей.  Порядок имен полей в аргументе группируемыеПоля определяет уровень группировки для каждого из этих полей. Предложение GROUP BY является необязательным.Итоговые значения не рассчитываются, если инструкция SELECT не содержит статистической функции SQL.

 

Значения Null, которые находятся в полях, заданных в предложении GROUP BY, группируются и не опускаются.  Однако статистические функции SQL не обрабатывают значения Null.

 

Если поле, включенное в предложение GROUP BY, не является полем типа Memo или объекта ActiveX, оно может содержать ссылку на любое поле, перечисленное в предложении FROM, даже если это поле не включено в инструкцию SELECT, при условии, что инструкция SELECT содержит по крайней мере одну статистическую функцию SQL.  Ядро базы данных Jet не поддерживает группировку полей МЕМО или объекта ActiveX.

 

При использовании предложения GROUP BY все поля в списке полей инструкции SELECT должны быть либо включены в предложение GROUP BY, либо использоваться в качестве аргументов статистической функции SQL.

 

SELECT Сотрудники.Отдел, Sum(Сотрудники.Зарплата) AS Sum_Зарплата

 

FROM Сотрудники

 

GROUP BY Сотрудники.Отдел;

 

Используйте предложение WHERE для исключения записей из группировки, а предложение HAVING для применения фильтра к записям после группировки.

 

Определяет, какие сгруппированные записи отображаются при использовании инструкции SELECT с предложением GROUP BY.  После того как записи будут сгруппированы с помощью предложения GROUP BY, предложение HAVING отберет те из полученных записей, которые удовлетворяют условиям отбора, указанным в предложении HAVING.

 

Синтаксис:

 

SELECT списокПолей

 

FROM таблица

 

WHERE условиеОтбора

 

GROUP BY группируемыеПоля

 

[HAVING условиеГруппировки]

 

Предложение HAVING является необязательным. Предложение HAVING похоже на предложение WHERE, которое определяет, какие записи должны быть отобраны.  После того как записи будут сгруппированы с помощью предложения GROUP BY, предложение HAVING указывает, какие из полученных записей должны быть отобраны:

 

SELECT Сотрудники.Отдел, Sum(Сотрудники.Зарплата) AS Sum_Зарплата

 

FROM Сотрудники

 

GROUP BY Сотрудники.Отдел

 

HAVING (((Sum(Сотрудники.Зарплата))>3000));

 

Предложение HAVING может содержать до 40 выражений, связанных логическими операторами, такими как And и Or.

 


Объединение таблиц

Существует 2 способа объединения таблиц:

 

Объединение записей из двух таблиц, если связующие поля этих таблиц содержат одинаковые значения. Оно осуществляется с помощью 3 операторов: INNER JOIN, LEFT JOIN, RIGHT JOIN.
Синтаксис:
FROM таблица_1 INNER JOIN таблица_2 ON таблица_1.поле_1 оператор таблица_2.поле_2

 

ТАБЛИЦА_1, ТАБЛИЦА_2 - имена таблиц, записи которых подлежат объединению.

 

ПОЛЕ_1, ПОЛЕ_2 - Имена объединяемых полей.  Если эти поля не являются числовыми, то должны иметь одинаковый тип данных и содержать данные одного рода, однако, поля могут иметь разные имена.

 

ОПЕРАТОР - любой оператор сравнения: "=," "<," ">," "<=," ">=," или "<>".

 

Операцию INNER JOIN можно использовать в любом предложении FROM.  Это самые обычные типы связывания.  Они объединяют записи двух таблиц, если связующие поля обеих таблиц содержат одинаковые значения. Операцию INNER JOIN можно использовать с таблицами "Начальники" и "Сотрудники" для отбора всех сотрудников каждого отдела.

 

SELECT Начальники.Фамилия, Начальники.Отдел, Сотрудники.Фамилия, Сотрудники.Отдел

 

FROM [Начальники] INNER JOIN Сотрудники ON Начальники.Отдел = Сотрудники.Отдел;

 

Попытка объединить поля Memo или объекта ActiveX приведет к возникновению ошибки. Допускается объединение двух числовых полей подобных типов, например, поле счетчика и поля с типом "Длинное целое".  Однако нельзя объединить типы полей "С плавающей точкой (4 байт)" и "С плавающей точкой (8 байт)".

 

SELECT поля

 

FROM таблица_1 INNER JOIN таблица_2

 

ON таблица_1.поле_1 оператор таблица_2.поле_1 AND

 

ON таблица_1.поле_2 оператор таблица_2.поле_2) OR

 

ON таблица_1.поле_3 оператор таблица_2.поле_3)];

 

Операции JOIN могут быть вложенными; в таком случае используйте следующий синтаксис:

 

SELECT поля

 

FROM таблица_1 INNER JOIN

 

(таблица_2 INNER JOIN [( ]таблица_3 

 

[INNER JOIN [( ]таблица_X [INNER JOIN ...)] 

 

ON таблица_3.поле_3 оператор таблица_X.поле_X)]

 

ON таблица_2.поле_2 оператор таблица_3.поле_3) 

 

ON таблица_1.поле_1 оператор таблица_2.поле_2;

 

Операции LEFT JOIN или RIGHT JOIN могут быть вложены в операцию INNER JOIN, но операция INNER JOIN не может быть вложена в LEFT JOIN или RIGHT JOIN.

 

Для отбора же всех начальников  (в том числе тех, у которых нет ни одного сотрудника) или всех сотрудников (в том числе тех, которых нет начальника) следует использовать операцию LEFT JOIN или RIGHT JOIN, которая создает внешнее объединение.

 

Синтаксис:

 

FROM таблица_1 [ LEFT | RIGHT ] JOIN таблица_2

 

ON таблица_1.поле_1 оператор таблица_2.поле_2

 

Используйте операцию LEFT JOIN для создания левого внешнего объединения, при котором все записи из первой (левой) таблицы включаются в динамический набор, даже если во второй (правой) таблице нет соответствующих им записей.

 

Используйте операцию RIGHT JOIN для создания правого внешнего объединения, при котором все записи из второй (правой) таблицы включаются в динамический набор, даже если в первой (левой) таблице нет соответствующих им записей.

 

2-й способ объединения таблиц заключается в простом последовательном присоединении к записям первой таблицы записей второй таблицы. Такое объединение осуществляется с помощью оператора UNION. Он создает запрос на объединение, который объединяет результаты нескольких независимых запросов или таблиц.

 

Синтаксис:

 

[TABLE] запрос_1 UNION [ALL] [TABLE] запрос_2 [UNION [ALL] [TABLE] запрос_n [ ... ]]

 

Ниже перечислены аргументы операции UNION:

 

ЗАПРОС_1 - инструкция SELECT, имя сохраненного запроса или имя сохраненной таблицы, перед которым стоит зарезервированное слово TABLE.

 

В одной операции UNION можно объединить в любом наборе результаты нескольких запросов, таблиц и инструкций SELECT. По умолчанию повторяющиеся записи не возвращаются при использовании операции UNION, однако, в нее можно добавить предикат ALL, чтобы гарантировать возврат всех записей.  Кроме того, такие запросы выполняются быстрее. Все запросы, включенные в операцию UNION, должны отбирать одинаковое число полей; при этом типы данных и размеры полей не обязаны совпадать.

 

Используйте псевдонимы только в первом предложении SELECT, потому что в остальных они пропускаются.  В предложении ORDER BY ссылайтесь на поля по их названиям в первом предложении SELECT.

 

В каждом аргументе запрос допускается использование предложения GROUP BY или HAVING для группировки возвращаемых данных.            В конец последнего аргумента запрос можно включить предложение ORDER BY, чтобы отсортировать возвращенные данные. В Microsoft Access аргументами операции UNION (запрос1, запрос2,...запросN) могут служить инструкция SELECT, имя сохраненного запроса Microsoft Access или имя сохраненной таблицы Microsoft Access с предшествующим зарезервированным словом TABLE.

 


Параметры

Описывают имя и тип данных каждого параметра в запросе с параметрами.

 

Синтаксис:

 

PARAMETERS имя типДанных [, имя типДанных [, ...]]

 

ИМЯ - имя параметра. используется для обращения к этому параметру.  Значение аргумента имя может быть строкой, которая отображается в окне диалога при выполнении запроса.  Строку, содержащую пробелы и знаки препинания, необходимо заключить в квадратные скобки ([ ]) .  Например, допустимыми значениями этого аргумента являются [Минимальная цена] и [Сведения за какой месяц Вы хотите получить?].

 

ТИПДАННЫХ -                один из первичных типов данных SQL ядра Microsoft Jet или их синонимы.

 

Для регулярно выполняемых запросов можно использовать описание PARAMETERS, чтобы создать запрос с параметрами.  Запрос с параметрами помогает автоматизировать процесс изменения условий отбора запроса.  При наличии запроса с параметрами программа должна поставлять параметры при каждом запуске запроса.

 

Описание PARAMETERS является необязательным, однако, если оно присутствует, то должно находиться перед всеми остальными инструкциями, в том числе, перед инструкцией SELECT.

 

Для разделения параметров в описании следует использовать запятые.  В следующем примере описаны два параметра:

 

PARAMETERS [Минимальная цена] Currency Currency, [Начальная дата] DateTime;

 

В предложении WHERE или HAVING можно использовать аргумент имя, но не типДанных.

 

При выполнении запроса с параметрами Microsoft Access выводит приглашение пользователю ввести параметры, определяющие условия отбора в запросе. Это позволяет создать запрос, возвращающий записи на основе заданного пользователем условия.

 

В аргументах текст, перечисленных в описании PARAMETERS, задается текст, выводящийся в каждом из диалоговых окон, которые открываются для ввода соответствующего параметра при запуске запроса. Эти диалоговые окна создаются автоматически.

 


Перекрёстные запросы

(Является аналогом сводных таблиц в MS Excel).

 

Синтаксис:

 

TRANSOFORM статистическаяФункция AS значение

 

SELECT оператор FROM таблица GROUP BY [значение]

 

PIVOT списокИмёнСтолбцов

 

СТАТИСТИЧЕСКАЯФУНКЦИЯ - функция, которая выполняется над данными, указанными в операторе SELECT.

 

Перекрёстный запрос включает в себя заголовки столбцов и заголовки строк. Пример перекрёстного запроса, который возвращает количество сотрудников в каждом отделе, родившихся в каждом из месяцев.

 

Transform Count(Код) as Значение

 

Select Отдел, Count(Код) as [Итоговое значение]

 

From Сотрудники

 

Group By Отдел

 

Pivot Format([Родился], "mmm") in ("Янв","Фев" :)

 


Обновление данных (запрос

Update) UPDATE создает запрос на обновление, который изменяет значения полей указанной таблицы на основе заданного условия отбора.

 

Синтаксис:

 

UPDATE таблица

 

SET новоеЗначение

 

WHERE условиеОтбора;

 

Таблица - имя таблицы, данные в которой следует изменить.

 

НовоеЗначение - выражение, определяющее значение, которое должно быть вставлено в указанное поле обновленных записей.

 

условиеОтбора - выражение, отбирающее записи, которые должны быть изменены.  При выполнении этой инструкции будут изменены только записи, удовлетворяющие указанному условию.

 

Инструкцию UPDATE особенно удобно использовать для изменения сразу многих записей или в том случае, если записи, подлежащие изменению, находятся в разных таблицах. Одновременно можно изменить значения нескольких полей.  Следующая инструкция SQL увеличивает зарплату отделу проектирования на 20% и  устанавливает премию20%.

 

UPDATE Сотрудники

 

SET Сотрудники.Зарплата = Зарплата*1.2, Сотрудники.премия = 20

 

WHERE (((Сотрудники.Отдел)="Проектирование"));

 

 

Инструкция UPDATE не приводит к созданию результирующего набора записей.  Чтобы узнать, какие записи будут изменены, сначала просмотрите результаты запроса на выборку, использующего те же самые условия отбора, а затем выполните запрос на обновление записей. Инструкция UPDATE не возвращает записи, поэтому при ее выполнении результаты не выводятся в режиме таблицы.

 

В следующем примере премия в 30% утанавливается всем подчиненым Ткаченко

 

UPDATE Сотрудники INNER JOIN [Начальники] ON Сотрудники.номер_отдела = Начальники.Код SET Сотрудники.премия = 30

 

WHERE (((Начальники.Фамилия)="Ткаченко"));

 


Удаление данных (запрос

Delete) Создает запрос на удаление записей, предназначенный для удаления записей из одной или нескольких таблиц, перечисленных в предложении FROM, которые удовлетворяют предложению WHERE.

 

Синтаксис:

 

DELETE [таблица.*]

 

FROM таблица

 

WHERE условиеОтбора

 

Таблица - необязательное имя таблицы, из которой удаляются записи.

 

условиеОтбора - выражение, определяющее удаляемые записи.

 

Инструкция DELETE особенно удобна для удаления большого количества записей. Чтобы удалить из базы данных целую таблицу, можно использовать метод Execute вместе с инструкцией DROP.  Однако при таком удалении таблицы теряется ее структура.  Если же применить инструкцию DELETE, удаляются только данные.  При этом сохраняются структура таблицы и все остальные ее свойства, такие как атрибуты полей и индексы.

 

Инструкцию DELETE можно использовать для удаления записей из таблиц, связанных отношением "один-ко-многим" с другими таблицами.  Операции каскадного удаления приводят к удалению записей из таблиц, находящихся на стороне отношения "многие", когда в запросе удаляется соответствующая им запись на стороне "один".  Например, в отношении между таблицами "Клиенты" и "Заказы", таблица "Клиенты" расположена на стороне "один", а таблица "Заказы" на стороне "многие".  Если разрешено каскадное удаление, то удаление записи из таблицы "Клиенты" приводит к удалению соответствующих записей из таблицы "Заказы". Запрос на удаление удаляет записи целиком, а не только содержимое указанных полей.  Чтобы удалить данные в конкретном поле, следует создать запрос на обновление, который заменяет имеющиеся значения на значения Null.

 

·              Нельзя восстановить записи, удаленные с помощью запроса на удаление.  Чтобы узнать, какие записи будут удалены, просмотрите сначала результаты запроса на выборку, использующего те же самые условие отбора, а затем выполните запрос на удаление.

 

·              Регулярно выполняйте резервирование данных.  Непреднамеренно удаленные записи могут быть восстановлены по резервной копии.

 

В Microsoft Access выполнение инструкции DELETE не приводит к выводу результатов отчета в режиме таблицы.

 

Удаляются все записи отдела рекламы

 

DELETE

 

FROM Сотрудники

 

WHERE (((Сотрудники.Отдел)="Реклама"));

 


Подчинённые запросы

Это инструкции Select, вложенные в инструкции Select, Insert, Delete, Update или другой подчинённый запрос. Они создаются 3 способами. С помощью ключевых слов: ANY/ALL/SOME с использованием любого из видов отношений (>, <, =, <>).

 

ANY, SOME - синонимы, используются для отбора записей в главном запросе, которые удовлетворяют сравнению с любой из записей, отобранных в подчинённом запросе.

 

Select Товары, Наименование

 

From Товары

 

Where Товары.Цена >= ANY (Select Цена From :)

 

ALL используется для отбора записей, которые удовлетворяют сравнению со всеми записями подчинённого запроса.

 

Кроме того используется оператор IN, который позволяет сравнивать данное значение со значениями массива. Следующий пример возвращает данные по товарам, скидка по которым больше 25%.

 

Select *

 

From Товары

 

Where Товары.Код in (Select КодТовара From Заказано Where Скидка >= 25)

 

Для проверки пустых полей используются функции Exist и Not Exist.

 

Подчинённые запросы можно вставлять как в блок Where, как условие для отбора, так и в блок Select, но при этом подчинённый запрос должен возвращать одно значение.

 


Создание таблиц

Создание таблиц при помощи SQL запросов особенно актуально в системах типа Клиент - Сервер, для того чтобы управлять БД на сервере через компьютер клиента.

 

Ядро базы данных Microsoft Jet не поддерживает использование инструкции CREATE TABLE или любой другой инструкции языка определения данных (DDL) с базами данных, несовместимыми со стандартом Microsoft Jet.  Вместо них применяются методы Create объектов доступа к данным (DAO).

 

Синтаксис

 

CREATE TABLE таблица (поле_1 тип [(размер)]

 

[NOT NULL] [индекс_1] [, поле_2 тип [(размер)]

 

[NOT NULL] [индекс_2] [, ...]] [, CONSTRAINT составнойИндекс [, ...]])

 

Таблица - имя создаваемой таблицы.

 

поле_1, поле_2 - имена одного или нескольких полей, создаваемых в новой таблице.  Таблица должна содержать хотя бы одно поле.

 

Тип - тип данных поля в новой таблице.

 

Размер - размер поля в символах (только для текстовых и двоичных полей).

 

индекс_1, индекс_2 - предложение CONSTRAINT, предназначенное для создания простого индекса.  Для получения более подробных сведений смотрите описание предложения CONSTRAINT.

 

составнойИндекс - предложение CONSTRAINT, предназначенное для создания составного индекса.  Для получения более подробных сведений смотрите описание предложения CONSTRAINT.

 

Инструкция CREATE TABLE используется для описания новой таблицы, ее полей и индексов.  Если для поля добавлено ограничение NOT NULL, то при добавлении новых записей это поле должно содержать допустимые данные. Предложение CONSTRAINT устанавливает различные ограничения на поле и может быть использовано для определения ключа.  Кроме того, для создания ключа или дополнительного индекса для существующей таблицы можно использовать инструкцию CREATE INDEX.

 

Допускается использование ограничения NOT NULL для одиночного поля, а также внутри именованного предложения CONSTRAINT, применяемого к одиночному полю или к именованному предложению CONSTRAINT.  Ограничение NOT NULL можно наложить на поле только один раз, в противном случае возникает ошибка выполнения.

 

В следующем примере создается новая таблица с двумя текстовыми полями:

 

CREATE TABLE ПерваяТаблица (Имя TEXT, Фамилия TEXT);

 

В следующем примере создается новая таблица с двумя текстовыми полями и одним полем даты/времени. Из этих трех полей создается  уникальный индекс:

 

CREATE TABLE ВтораяТаблица (Имя TEXT,

 

Фамилия TEXT, ДатаРождения DATETIME,

 

CONSTRAINT МойИндекс UNIQUE (Имя, Фамилия, ДатаРождения));

 

В следующем примере создается новая таблица с двумя текстовыми полями и числовым полем. Поле SSN делается ключевым полем.

 

CREATE TABLE ТретьяТаблица (Имя TEXT, Фамилия TEXT, SSN INTEGER

 

CONSTRAINT МойИндекс PRIMARY KEY);

 

Создание ограничения с помощью предложения CONSTRAINT подобно применению индекса, хотя оно также применяется для установления отношений между таблицами.

 

Предложение CONSTRAINT используется в инструкциях ALTER TABLE и CREATE TABLE для создания или удаления индексов.  Существуют два типа предложений CONSTRAINT: одно для создания простого индекса (по одному полю), а второе для создания составного индекса (по нескольким полям). Ядро базы данных Microsoft Jet не поддерживает использование инструкции CONSTRAINT и всех инструкций языка определения данных (DDL) с базами данных, несовместимыми со стандартом Microsoft Jet.  Используйте вместо них методы Create объектов доступа к данным (DAO).

 

Синтаксис

 

Простой индекс:

 

CONSTRAINT имя {PRIMARY KEY | UNIQUE | NOT NULL |

 

REFERENCES внешняяТаблица [(внешнееПоле_1, внешнееПоле_2)]}

 

Составной индекс:

 

CONSTRAINT имя

 

{PRIMARY KEY (ключевое_1[, ключевое_2 [, ...]]) |

 

UNIQUE (уникальное_1[, уникальное_2 [, ...]]) |

 

NOT NULL (непустое_1[, непустое_2 [, ...]]) |

 

FOREIGN KEY (ссылка_1[, ссылка_2 [, ...]])

 

REFERENCES внешняяТаблица [(внешнееПоле_1 [, внешнееПоле_2 [, ...]])]}

 

Имя - имя индекса, который следует создать.

 

ключевое_1, ключевое_2 - имена одного или нескольких полей, которые следует назначить ключевыми.

 

уникальное_1, уникальное_2               - имена одного или нескольких полей, которые следует включить в уникальный индекс.

 

непустое_1, непустое_2 - имена одного или нескольких полей, в которых запрещаются значения Null.

 

ссылка_1, ссылка_2 - имена одного или нескольких полей, включенных во внешний ключ, которые содержат ссылки на поля в другой таблице.

 

внешняяТаблица - имя внешней таблицы, которая содержит поля, указанные с помощью аргумента внешнееПоле.

 

внешнееПоле_1, внешнееПоле_2 - имена одного или нескольких полей во внешнейТаблице, на которые ссылаются поля, указанные с помощью аргумента ссылка_1, ссылка_2.  Это предложение можно опустить, если данное поле является ключом внешнейТаблицы.

 

Предложение CONSTRAINT, предназначенное для создания простого индекса, располагается сразу после описания типа поля в предложении, определяющем поля в инструкции ALTER TABLE или CREATE TABLE.

 

Применяйте предложение CONSTRAINT, предназначенное для создания составного индекса, если требуется использовать зарезервированное слово CONSTRAINT вне предложения, описывающего поля в инструкции ALTER TABLE или CREATE TABLE.

 

Предложение CONSTRAINT позволяет создать для поля индекс одного из двух описанных ниже типов:

 

·              Для создания уникального индекса используйте зарезервированное слово UNIQUE.  Это означает, что в таблице не может быть двух записей, имеющих одно и то же значение в этом поле.  Уникальный индекс создается для любого поля или любой группы полей. Если в таблице определен составной уникальный индекс, то комбинация значений включенных в него полей должна быть уникальной для каждой записи таблицы, хотя отдельные поля и могут иметь совпадающие значения.

 

·              Для создания ключа таблицы, состоящего из одного или нескольких полей, используйте зарезервированные слова PRIMARY KEY.  Все значения ключа таблицы должны быть уникальными и не значениями Null.  Кроме того, в таблице может быть только один ключ

 

Нельзя использовать зарезервированные слова PRIMARY KEY при создании индекса в таблице, в которой уже определен ключ; в противном случае возникнет ошибка.

 

·              Для создания внешнего ключа можно использовать зарезервированные слова FOREIGN KEY.  Если ключ внешней таблицы состоит из нескольких полей, необходимо использовать предложение CONSTRAINT, предназначенное для создания составного индекса.  При этом следует перечислить все поля, содержащие ссылки на поля во внешней таблице, а также указать имя внешней таблицы и имена полей внешней таблицы, на которые ссылаются поля, перечисленные выше, причем в том же порядке.  Если последние поля являются ключом внешней таблицы, то указывать их необязательно, поскольку ядро базы данных считает, что в качестве этих полей следует использовать поля, составляющие ключ внешней таблицы.

 


Добавление новых полей

Добавление новых полей изменяет структуру таблицы, созданной с помощью инструкции CREATE TABLE. Ядро базы данных Microsoft Jet не поддерживает использование инструкции ALTER TABLE и всех инструкций языка определения данных (DDL) с базами данных, несовместимыми со стандартом Microsoft Jet.  Используйте вместо них методы Create объектов доступа к данным (DAO).

 

Синтаксис:

 

ALTER TABLE таблица {ADD {COLUMN поле тип[(размер)] [NOT NULL]

 

[CONSTRAINT индекс] | CONSTRAINT составнойИндекс} |

 

DROP {COLUMN поле I CONSTRAINT имяИндекса} }

 

Таблица - имя изменяемой таблицы.

 

Поле - имя поля, добавляемого в таблицу или удаляемого из нее.

 

Тип - тип данных поля.

 

Размер - размер поля в символах (только для текстовых и двоичных полей).

 

индекс - индекс для поля.  Для получения более подробных сведений о создании индекса смотрите описание предложения CONSTRAINT.

 

составнойИндекс - описание составного индекса, добавляемого к таблице.  Для получения более подробных сведений смотрите описание предложения CONSTRAINT.

 

имяИндекса - имя составного индекса, который следует удалить.

 

С помощью инструкции ALTER TABLE существующую таблицу можно изменить несколькими способами, например:

 

·              Добавить новое поле в таблицу с помощью предложения ADD COLUMN.  В этом случае укажите имя поля, его тип и (для текстовых и двоичных полей) необязательный размер.  Например, следующая инструкция добавляет в таблицу "Сотрудники" текстовое поле "Примечания" длиной 25 символов:

 

ALTER TABLE Сотрудники ADD COLUMN Примечания TEXT(25)

 

Если для поля добавлено ограничение NOT NULL, то при добавлении новых записей это поле должно содержать допустимые данные.

 

·              Добавить составной индекс с помощью зарезервированных слов ADD CONSTRAINT.  Для получения более подробных сведений о составных индексах смотрите описание предложения CONSTRAINT.

 

·              Удалить поле с помощью зарезервированных слов DROP COLUMN.  В этом случае укажите только имя поля.

 

·              Удалить составной индекс с помощью зарезервированных слов DROP CONSTRAINT.  В этом случае укажите только имя составного индекса, следующее за зарезервированным словом CONSTRAINT.

 

Примечания

 

·              Нельзя добавить или удалить одновременно несколько полей или индексов.

 

·              Инструкцию CREATE INDEX можно использовать для добавления к таблице простого или составного индекса, а инструкции ALTER TABLE и DROP для удаления индекса, созданного с помощью инструкций ALTER TABLE или CREATE INDEX.

 

·              Допускается использование ограничения NOT NULL для одиночного поля, а также внутри именованного предложения CONSTRAINT, применяемого к одиночному полю или к именованному предложению CONSTRAINT.  Ограничение NOT NULL можно наложить на поле только один раз, в противном случае возникает ошибка выполнения.

 

В следующем примере в таблицу <Сотрудники> добавляется поле <Оклад>, имеющее денежный тип:

 

ALTER TABLE Сотрудники ADD COLUMN Оклад CURRENCY;

 

В следующем примере поле <Оклад> удаляется из таблицы <Сотрудники>:

 

ALTER TABLE Сотрудники DROP COLUMN Оклад;

 

В следующем примере из таблицы <Заказы> удаляется существующий внешний ключ:

 

ALTER TABLE Заказы DROP CONSTRAINT СотрудникиЗаказы;

 

В следующем примере внешний ключ снова добавляется в таблицу <Заказы>:

 

ALTER TABLE Заказы ADD CONSTRAINT СотрудникиЗаказы FOREIGN KEY (КодСотрудника) REFERENCES Сотрудники (КодСотрудника);

 

Создание ограничения с помощью предложения CONSTRAINT подобно применению индекса, хотя оно также применяется для установления отношений между таблицами.

 

Предложение

CONSTRAINT используется в инструкциях ALTER TABLE и CREATE TABLE для создания или удаления индексов.  Существуют два типа предложений CONSTRAINT: одно для создания простого индекса (по одному полю), а второе для создания составного индекса (по нескольким полям).

 

В следующем примере создается новая таблица с двумя текстовыми полями:

 

CREATE TABLE ПерваяТаблица (Имя TEXT, Фамилия TEXT);

 

В следующем примере создается новая таблица с двумя текстовыми полями и одним полем даты/времени. Из этих трех полей создается  уникальный индекс:

 

CREATE TABLE ВтораяТаблица (Имя TEXT,

 

Фамилия TEXT, ДатаРождения DATETIME,

 

CONSTRAINT МойИндекс UNIQUE (Имя, Фамилия, ДатаРождения));

 

В следующем примере создается новая таблица с двумя текстовыми полями и числовым полем. Поле SSN делается ключевым полем.

 

CREATE TABLE ТретьяТаблица (Имя TEXT, Фамилия TEXT, SSN INTEGER

 

CONSTRAINT МойИндекс PRIMARY KEY);

 

Удаляет существующую таблицу из базы данных или удаляет существующий индекс из таблицы. Ядро базы данных Microsoft Jet не поддерживает использование инструкции DROP или любой другой инструкции языка определения данных (DDL) не поддерживает использование инструкции DROP или любой другой инструкции языка определения данных (DDL) для баз данных, несовместимых со стандартом Microsoft Jet.  Применяйте вместо этих инструкций метод Delete объектов доступа к данным (DAO).

 

Синтаксис:

 

DROP {TABLE таблица | INDEX индекс ON таблица}

 

Таблица - имя таблицы, которую следует удалить или из которой следует удалить индекс.

 

индекс - имя индекса, удаляемого из таблицы.

 

Прежде чем удалить таблицу или удалить из нее индекс, необходимо ее закрыть. Кроме того, для удаления индекса из таблицы можно использовать инструкцию ALTER TABLE. Для создания таблицы можно использовать инструкцию CREATE TABLE, а для создания индекса инструкцию CREATE INDEX или ALTER TABLE.  Чтобы изменить таблицу, примените инструкцию ALTER TABLE.

 

В следующем примере индекс <МойИндекс> удаляется из таблицы <Сотрудники>:

 

DROP INDEX МойИндекс ON Сотрудники;

 

В следующем примере из базы данных удаляется таблица <Ученики>:

 

DROP TABLE Ученики;

 



Технология разработки программного обеспечения, использующего базы данных

При создании программного обеспечения принято использовать так называемую 3-х уровневую систему разработки.

 

 

 


При таком подходе обеспечивается автономная разработка каждого из трёх компонентов, т.е. их независимость друг от друга. Разработчик может свободно заменять каждый из них, не беспокоясь об их совместимости и о существенном изменении (если оно вообще понадобится) исходного кода приложения.

 

Во всех средах разработки программных приложений, взаимодействующих с базами данных, используется следующая схема:

 

База данных → Connection → Dataset → DataSource → Визуальные компоненты.

 

В некоторых программных оболочках эти компоненты могут быть скрыты в одном или, наоборот, разделены на несколько компонент в приложении, но общая структура остаётся той же.

 

Connection - объекты для подключения ко всей БД.

 

Dataset - объекты для временного хранения и манипулирования данными внутри программы.

 

DataSource - объекты, предназначенные для связывания визуальных элементов с Dataset.

 

Все данные, с которыми взаимодействует приложение, хранятся в Dataset. Существует несколько алгоритмов закачки данных в Dataset (например, в Access в Dataset может закачиваться вся таблица или только одна запись). В соответствии с этим существует 2 способа доступа к данным: реляционный и навигационный метод.

 

Навигационный способ - это способ, при котором вся таблица скачивается в Dataset. При этом скорость работы с данными велика, т.к. все данные доступны в оперативном режиме, однако это затрачивает значительные объемы памяти. В памяти между таблицами устанавливается связь. Перемещаясь по одной таблице от записи к записи, из 2-й таблицы отображаются только связанные записи.

 

Реляционный способ основан на скачивании из БД только той записи, к которой обращается пользователь. Преимущества и недостатки этого подхода противоположны преимуществам и недостаткам навигационного подхода: экономится память используемая приложением, однако происходят значительные временные затраты на работу с записями.

 

На настоящий момент наиболее оптимальным считается сочетание этих подходов.

 

ODBC ODBC (Open Database Connectivity) - это программная система, позволяющая обращаться к любой БД. Для того чтобы иметь возможность использовать механизм ODBC разработчик БД должен также разработать и драйверы для этой системы.

 

 

 


При взаимодействии БД, написанной на одном из приложений, поддерживающих ODBC, идёт преобразование внутреннего представления данных в виде такой БД, которую поддерживает выбранный язык программирования.

 

Регистрация БД ODBC происходит следующим образом: Панель управления Администрирование Источник данных ODBC.

 

 

В закладке Драйверы содержаться все типы БД, для которых имеется драйвер ODBC. Далее создаётся псевдоним (Alias) БД, по которому в дальнейшем идёт обращение к этой базе (в Connection).

 

Для подключения собственной БД к ODBC используется следующий путь: Панель управления Администрирование Источник данных ODBC Пользовательский DSN Добавить Выбор драйвера (выбирается поставщик драйвера пользовательской БД). Затем указывается путь к БД и псевдоним, по которому она будет зарегистрирована.

 


Доступ к данным в

Visual Basic 6.0

Для подключения к своему проекту БД необходимо, чтобы на панели инструментов

Toolbox были доступны компоненты: ADO Data Control, DataGrid, DataCombo и некоторые другие. В среде VB 6.0 основным компонентом для доступа к данным является ADODC: в него включено и Connection, и DataSet, и Datasource. Его основные свойства:

 

1.

      ConnectionString - строка для доступа к БД. При вызове мастера создания строки подключения пользователю предоставляется возможность выбора

 

a.

      Use Link FileUse ODBC Source - при этом выбирается один из псевдонимов БД, зарегистрированных на данном компьютере.

 

b.

     Use Connection String - для прямого подсоединения к БД. Для этого необходимо нажать на Build и выполнить все действия пошагово (для подключения БД MS Access  выбрать источник драйвера  MS Jet 4.0).

 

Данное свойство рекомендуется заполнять исключительно с помощью мастера, а не вручную.

2.

      RecourdSource - свойство, в которое записывается таблица, подключаемая к ADODC. Каждый источник данных ADODC подключается только к одной таблице. При этом выбирается тип источников данных для ADODC:

 

a.

      SQL запрос, возвращающий данные (необходимо написать текст запроса).

 

b.

     Таблица из БД.

 

c.

      Хранимая процедура (Stored Procedure)

 

Для отображения записей, содержащихся в

ADODC, используются некоторые стандартные компоненты:

 

1.

      Label. В нём отражается значение выбранного поля для активной записи. Свойства, используемые для подключения данных:

 

a.

      Data Source - имя компонента, к которому подключена БД (ADODC).

 

b.

     Data Field - имя поля из таблицы, которое будет отображаться в надписи.

 

2.

      Text. Позволяет выводить содержимое поля и редактировать это содержимое.

 

a.

      Data Source - имя компонента, к которому подключена БД (ADODC).

 

b.

     Data Field - имя поля из таблицы, которое будет отображаться в текстовом поле.

 

Данные поля хранятся в свойстве

Text.

 


Работа с записями

Перемещение по записям может осуществляться следующим образом:

1.

      С  помощью соответствующих кнопок на ADODC.

 

2.

      С помощью программной обработки нажатия пользовательских кнопок:
Me.Adodc1.RecordSet.MoveNext - перемещение на следующую запись.
Me.Adodc1.RecordSet.MovePreview - перемещение на предыдущую запись.
Me.Adodc1.RecordSet.MoveLast - перемещение на последнюю запись.
Me.Adodc1.RecordSet.MoveFirst - перемещение на первую запись.
Me.Adodc1.RecordSet.EOF -равен true,если текущая запись находится после последней.
Me.Adodc1.RecordSet.BOF - равен true,если текущая запись находится перед первой.

 

Добавление записи осуществляется командой Me.Adodc1.RecordSet.AddNew. При этом запись добавляется только в Dataset приложения, а не в саму БД. Для того чтобы обратиться к полю активной записи, необходимо ввести следующую конструкцию: Me.Adodc1.RecordSet.Fields("НазваниеПоля") = Значение;

 

Чтобы занести изменения в БД, необходимо выполнить следующие команды:

 

Me.Adodc1.RecordSet.Update - записывает во временную копию БД.

 

Me.Adodc1.RecordSet.UpdateBach - сохраняет значения в БД.

 

Me.Adodc1.RecordSet.Refresh - перечитывает БД.

 

Me.Adodc1.RecordSet.ReQuery - перезапрашивает данные, заново запускает запрос, если форма работает с запросом.

 

Для отображения записей из таблицы БД существует стандартный компонент DataGrid. Подключить его к ADODC можно с помощью свойства DataSource. Для настройки DataGrid удобнее использовать диалоговое окно Properties, которое вызывается из контекстного меню этого элемента. Редактирование колонок происходит на вкладке Columns, где можно установить заголовки столбцов и привязать к ним данные из таблицы. Для добавления или удаления колонок необходимо в контекстном меню выбрать Edit, а затем открыть контекстное меню ещё раз и нажать на кнопку Append( или Insert) для добавления новых столбцов, Delete - для их удаления.

 

Сортировка записей осуществляется в компоненте ADODC. Для организации стандартного интерфейса сортировки таблицы (при нажатии на заголовок столбца) необходимо использовать событие DataGrid HeadClick. В обработчике этого события необходимо прописать:

 

Me.Adodc1.RecordSet.Sort = "Название поля"

 

Часто в визуальных компонентах работы с БД используется поле со списком. В VB 6.0 этот компонент называется DataCombo при работе с ADO. Основные свойства этого компонента:

 

1.

      RowSource - источник данных для вывода на экран (ADODC).

 

2.

      ListField - имя поля из RowSource, которое будет отображаться на экране.

 

3.

      DataSource - источник данных, в который будет производиться запись (ADODC).

 

4.

      DataField - поле из DataSource, в которое будет записываться выбранное значение.

 

5.

      BoundColumn - поле из RowSource, которое будет записываться в DataSource.

 

Для фильтрации данных используется соответствующее свойство ADODC:

 

Me.Adodc1.RecordSet.Filter = "условие фильтра"

 


Отчёты в

VB 6.0

Для использования отчётов необходимо произвести следующие действия:

1.

      Подключить компонент DataEnvironment: Project Add DataEnvironment. Если этого пункта меню нет в списке, то нужно выбрать пункт Components, вкладка Designers и отметить компоненты DataEnvironment и DataReport. Если эти компоненты отсутствуют и здесь, то необходимо добавить их в пункте меню References. Затем необходимо добавить Connection (или использовать существующий) и подключить к нему БД с помощью диалогового окна Properties из контекстного меню. Затем в этот Connection добавляется элемент Command, к которому подключается таблица или запрос, на котором будет основан отчёт.

 

2.

      Подключить компонент DataReport, который представляет  собой непосредственно отчёт. В свойствах этого отчёта указывается DataSource (в нашем случае это DataEnvironment) и DataMember (это Command, созданный ранее). Основные поля отчёта:

 

a.

      Заголовок страницы,

 

b.

     Заголовок страницы,

 

c.

      Заголовок полей,

 

d.

     Содержание отчёта - область данных,

 

e.

     Примечания,

 

f.

       Имеется возможность добавить также заголовок группы, область данных группы, примечание группы при создании группировки.

 

Для добавления данных в поле данных используется компонент Text, в свойствах (DataField) которого указывается поле, которое будет в нём отображаться. Кроме того отчёты в VB 6 допускают вычисляемые поля, расположенные в примечаниях (компонент Function). В нём указывается поле (DataField), по которому производится вычисление, и вид агрегирования (свойство FunctionType). Для создания группировки необходимо в DataEnvironment Command  добавить Children Command, в котором содержаться данные группировки.

 


Доступ к данным в

C++ Builder

Для организации доступа к данным в

C++ Builder используется компонент DataModule - невидимая форма доступа к данным, на которой располагаются основные компоненты работы с БД. Её добавление в проект осуществляется следующим образом: File New DataModule. В C++ Builder имеется несколько вкладок с компонентами, предназначенными для работы с данными. Одной из них является Data Access, основные компоненты которой приведены ниже:

 

1.

      DataSource обеспечивает синхронность работы таблицы с визуальными компонентами. Этот компонент располагается на форме вместе с Grid.

 

2.

      ClientDataSet используется для работы с удалёнными БД. Его основные свойства: имя компьютера/программы-сервера и имя провайдера, поставщика данных. В данном случае обращение к программе осуществляется через IP-адрес компьютера и имя провайдера.

 

3.

      DataSetProvider - компонент на сервере, который обеспечивает доступ от реальных клиентских программ к БД.

 

4.

      XML Transformer - преобразует набор данных в XML текст.

 

На вкладке

ADO расположены основные компоненты, используемые для доступа к БД.

 

1.

      ADO Connection - предназначен для подключения к БД. Его необходимо располагать в Data Module. Основные свойства:

 

a.

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

 

b.

     Connected - позволяет подключать приложение к БД и отключать от неё.

 

c.

      LoginPrompt - запрашивать ли при подключении к БД логин и пароль пользователя.

 

2.

      ADO Command - используется для выполнения SQL команд для ADO. Выполняет запрос (управляющий), не возвращающий набора данных. Основные свойства:

 

a.

      Command Text - текст запроса.

 

 

b.     Connection - созданный ранее ADO Connection.

 

c.

      Connection String - строка для подключения вручную.

 

d.

     Parameters - параметры для запроса.

 

3.

      ADO DataSet - базовый компонент, который позволяет хранить любые данные.

 

4.

      ADO Table - таблица, Dataset которой хранит данные. Основные данные: Connection, TableName - имя таблицы.

 

При организации простого однопользовательского приложения на визуальной форме из всех вышеперечисленных компонентов размещается

DataSource. Все остальные размещаются на DataModule: ADO Connection, ADO Table.

 

Сортировки, как таковой, в C++ Builder нет. В нём создаются  индексированные поля по требуемым критериям:

 

DataModule->AdoTable->IndexFieldNames = "имяПоля".

 

Если в таблице уже есть индексы, то используется имя индекса:

 

DataModule->AdoTable->IndexName = "имяИндекса".

 

Для создания фильтра используется соответствующее свойство ADO Table:

 

DataModule->AdoTable->Filter ="условие фильтра".

 

DataModule->AdoTable->Filtered = true.

 

Условие фильтра аналогично условию в Access.

 

Визуальные компоненты для работы с БД содержаться на вкладке DataControl.

 

Поле со списком может быть добавлено в компонент ADO Table. Для этого необходимо выбрать Fields Editor из контекстного меню. В нём необходимо добавить все существующие поля. Затем добавить новое поле, в свойствах которого выбрать тип Lookup.

 

KeyField - поле, содержащее значение в основной таблице, куда будет производиться запись.

 

DataSet - это ADOTable, из которой данные будут выводится на экран.

 

Lookup Keys - ключевое поле из DataSet, которое записывается в KeyField.

 

Result Field - поле из DataSet, которое будет отображаться на экране.

 

Чтобы создать поле со списком, необходимо сделать таблицу неактивной (свойство Active = false). Если БД была подключена корректно, то на форме (в DBGrid) должны отразиться записи из таблицы.

 


Отчёты в

C++ Builder

Существует несколько компонент для создания отчётов в

C++ Builder. Наиболее простым в использовании является компонент QReport (Quick Report), который расположен на одноимённой вкладке (QReport - расположены все компоненты для работы с данным видом отчётов). Чтобы создать отчёт необходимо:

 

1.

      Создать форму.

 

2.

      Расположить на ней источник данных, который потребуется в отчёте.

 

3.

      Расположить на ней элемент QReport и подключить его к источнику данных. Для этого необходимо прописать соответствующие include директивы в заголовочном файле формы с отчётом.

 

Чтобы программно показать отчёт, нужно выполнить следующую команду:

 

Form->QuickReport1->Preview();

 

Для формирования отчёта необходимо на нём расположить полосы QRBand. Её тип по умолчанию (свойство BandType) - Title - заголовочная область отчёта. Для того чтобы сформировать другие области отчёта, необходимо расположить соответствующее количество полос и изменить их тип в соответствии с типом данных.

 

 

·     Title - заголовок отчёта.

 

 

·     Detail - данные отчёта.

 

 

·     GroupFooter - примечание группы.

 

 

·     Summary - примечания отчёта.

 

 

·     SubDetail - внутренняя группировка.

 

Для формирования отчёта на полосу Detail располагается компонент DBText, у которого устанавливается свойство DataSet (таблица или запрос, на основании которого строится отчёт), DataField (поле, которое будет отображаться в этом элементе). Для создания вычисляемых полей используется компонент QRExpress, у которого устанавливается свойство Expression. Чтобы данные в отчёте изменялись при изменении информации в БД, нужно каждый раз при загрузке отчёта перезагружать данные в его источнике (ADOTable или ADOQuery):

 

AdoTable->Open();

 

:

 

AdoTable->Close();

 

Для группировки данных в отчёте используется элемент QRGroup.

 


Создание многоуровневых приложений

Приложение клиент-сервер в отношении баз данных выглядит следующим образом:

 

 


Сервер приложения предназначен для создания и работы обрабатывающих программ.

 

Сервер БД - это программа, которая занимается хранением, автоматизацией поиска и формированием ответов на запросы для клиентской программы. Всё программное подключение, рассмотренное выше, разбивается на 2 части: серверную и клиентскую.

 

Существует 2 варианта их взаимодействия:

 

1.

      С подключенной БД;

 

2.

      С отключенной БД.

 

Для создания серверного приложения необходимо:

1.

      Добавить в проект компонент Remote Data Module (File New Other, вкладка Multitier).

 

2.

      Добавляются стандартные компоненты, как в однопользовательском приложении (ADOConnection, ADOTable).

 

3.

      В этот модуль добавить компонент DataSetProvider с вкладки DataAccess, который поставляет данные клиентским приложениям (на каждый ADOTable). Сервер должен быть зарегистрирован на компьютере. Для этого надо в меню Run Parameters в поле Parameters ввести /regserver.

 

4.

      Создать новое, клиентское приложение.

 

a.

      Добавить DataModule

 

b.

     На вкладке DataSnap добавить DCOMConnection, который устанавливает связь с любым сервером приложений, зарегистрированным по технологии COM на данном компьютере. Свойство ServerName - имя сервера для связи, Server GUID - № зарегистрированного сервера на компьютере.

 

c.

      Чтобы добраться до нужных данных, надо с вкладки DataAccess добавить компонент Client DataSet.

 

 

                                                               i.     Свойство Remote Server - выбрать Connection.

 

 

                                                             ii.     Свойство Provider Name - имя провайдера, который находится на сервере - таблица.

 

 

                                                            iii.     Для записи изменений в БД:
ClientDataSet->ApplyUpdates(количество ошибок);

 

Чтобы изменить тип доступа (через Интернет, удалённый доступ), вместо DCOMConnection надо использовать SocketConnection из той же вкладки. Файл с сервером сохраняется в Borland/Builder/bin/scklsrvr.exe. В результате появится иконка Borland Socket Server, которая позволяет создать доступ к серверу. Она запускается на сервере 1 раз.

 

Недостаток Socket Connection - отсутствие возможности кодирования, а основное преимущество - высокая скорость. Чтобы устранить этот недостаток, надо использовать компонент Web Connection, у которого можно указать свойство URL-адрес - localhost. В момент передачи можно запустить процедуру обработки, которая зашифрует текст и передаст его.

 

 

Fill

 


  Доступ к данным в C# (Visual Studio 2005)
 
 
 

 


Data Adapter является средством связи между Dataset и Connection. С Dataset он связан посредством команд  Fill - загрузить данные, Update - записать изменения. В момент записи создаётся список ошибок (Error Collection). Data Adapter работает с Connection с помощью реляционного метода. Команды взаимодействия с БД (Command) можно создавать как вручную, так и автоматически.

 

Для подключения к своему проекту БД необходимо:

 

1.      Добавить к своему проекту компонент DataSet.

2.      Связать его с помощью мастера с созданной ранее БД. Если все шаги были проделаны верно, то в этом компоненте должна появиться схема данных.

3.      На форму из вкладки Data панели Toolbox добавить компоненты: Dataset, BindingSource, DataGrid, BindingNavigator (два последних являются визуальными компонентами).

a.      При добавлении Dataset  в мастере необходимо выбрать пункт Types Dataset, недавно созданный прототип Dataset'а.

b.     В элементе BindingSource необходимо выбрать в свойстве Data Source именно тот Dataset, который расположен на одной форме с этим компонентом. В поле DataMember нужно выбрать имя таблицы, связанной с этим компонентом. Если всё сделано верно, то в списке невидимых компонентов должен появиться TableAdapter.

c.      В DataGrid нужно свойство Data Source установить BindingSource (появятся заголовки столбцов таблицы).  В компоненте BindingNavigator необходимо установить свойство BindingSource на соответствующий компонент формы.

Элемент TableAdapter предназначен для заполнения dataset формы с помощью команды Fill, а также для сохранения этого набора данных в БД (команда TablAdapter.Update(dataset1)). Кроме того с помощью этого компонента можно создавать команды для добавления записей (TablAdapter.Insert(:)) и их удаления (TablAdapter.Delete(:)).

 

Все операции над записями в программе происходят через BindingSource:

 

1.      Сортировка: BindingSource.Sort ="Поле таблицы" asc/desc - по возрастанию/убыванию.

2.      Фильтрация: BindingSource.Filter = "Условие фильтра".

3.      Получение текущей записи:
DataRowView row;
row = ((DatarowView)BindingSource.Current).Row;
row.Item("Название поля");

4.      Перемещение по записям: BindingSource.MoveNext, :

5.      Сохранить данные в БД:
BindingSource.EndEdit();
tableAdapter.Update(this.DataSet);

Для создания поля со списком в DataGrid необходимо зайти в режим мастера редактирования колонок (Edit Columns). Затем добавить новое, несвязанное поле, тип - поле со списком. Указать свойства на вкладке Data (у компонента ComboBox): DataProperty Name - поле, содержащее значение в основной таблице, куда будет производиться запись, Data Source - это BindingSource, из которого данные будут выводится на экран, Display Member - поле из Data Source, которое будет отображаться на экране,Value Member - ключевое поле из DataSet, которое записывается в Data Property Name.


Создание отчётов

1.      Добавить в проект новую форму.

2.      Разместить на ней компонент ReportViewer из вкладки Data.

3.      В режиме ReportViewer Tasks этого элемента выбрать "design a new report".

4.      В открывшемся окне редактирования отчёта (файл *.rdlc) добавить элемент Table для создания простого отчёта. К самому отчёту с помощью соответствующего свойства привязать одну из таблиц DataSet.

5.      Компонент Table состоит из трёх частей: заголовка (верхняя часть), области данных (средняя часть) и примечаний (нижняя часть). Для заполнения можно перетащить из окна DataSource поля соответствующей таблицы в ячейки средней полосы. В дальнейшем остаётся настроить отчёт на свой вкус и отредактировать оформление.



OLAP технологии. XML язык

OLAP (online analytical processing) - это технология, которая позволяет получать из БД аналитическую информацию для пользователей, не знакомых с принципами организации БД, в нужном разрезе для анализа. Необходимо создать системы, которые работают по OLAP-технологии. Если оглянуться в историю, то эти технологии были созданы в 93 г., и их суть заключалась в следующем:

1.      Предварительный отбор информации из БД.

2.      Проведение математической обработки и структуризации данных.

3.      Создание многомерных кубов из расчётных величин.

В соответствии с этим существует 3 этапа: обработка данных, сохранение данных в кубах, предоставление пользователям возможности работать с кубами. В настоящий момент существует концепция анализа корпоративных данных, которая включает в себя:

1.      Хранилище данных (ненормализованные склады данных).

2.      Оперативная и аналитическая обработка.

3.      Интеллектуальный анализ данных.

OLAP технологии выгодно использовать только на крупных БД, работающих, в основном, на клиент-серверных системах. Одной из систем, использующих эти технологии является MS SQL Server.

 

Склад  данных - это предметно-ориентированные, интегрированные, неизменчивые, поддерживающие хронологию наборы данных, организованные с целью поддержки управления и призванные выступить в роли единого и единственного источника данных, который обеспечивает менеджеров и аналитиков достоверной информацией, необходимой для принятия решений.

 

Предметно-ориентированная система - это система, в которой данные объединены в категории, причём они сохраняются в соответствии с областью, которую они описывают, а не приложением, которое их использует.

 

Привязка ко времени. Хранилище данных можно рассматривать как совокупность "исторических" данных, что позволяет восстановить их на любой момент времени.

 

Неизменность. Попав один раз в хранилище, данные не должны больше изменяться.

 

Преимущества использования хранилищ данных:

 

1.      Хранилища хранят информацию за весь требуемый интервал времени.

2.      В системах хранилищ несоответствие данных устраняется на этапе "погружения в единую БД". При этом организуется единые справочники, которые приводят всё к одним единицам измерения.

3.      Данные при занесении в хранилище проверяются по специальной технологии на соответствие ограничениям и технологии.

4.      Хранилища данных позволяют получать отчёты достаточно быстро за счёт следующего:

a.      Сервер хранилища данных не влияет на работу операционных систем.

b.     Хранилище данных помимо детальной информации хранит и заранее рассчитанные значения.

5.      Хранилище данных - это основа для создания OLAP систем.

Выделяют несколько OLAP систем:

1.      MOLAP - Multi Dimensional OLAP.

2.      ROLAP - основан на таблицах, для которых нарушена нормализация данных, но они являются двумерными. Они допускают связи между собой в виде звезды (но не сложнее). В результате происходит преобразование к кубу.

3.      HOLAP - гибридный OLAP - совмещение первых двух.

Клиент-серверные системы

Одной из наиболее доступных систем такого вида является SQL Server, который создаёт и хранит запросы на сервере и обращается к ним по имени с параметром.

 

Хранимая процедура - это именованный набор команд на языке Transact SQL,хранящийся непосредственно на сервере и представляющий собой самостоятельный объект БД.

 

Представление (View) - это виртуальная таблица, воспроизводящая данные из одной или нескольких реальных таблиц. Для создания View не разрешается использовать оператор Union. Для их создания используется специальный оператор Create View. Представления разрабатываются через клиентский компьютер с правами администратора.

 

Create View Имя

 

As Select :

 

Курсор - механизм, позволяющий обрабатывать данные для каждой возвращаемой строки отдельно, не используя некоторых операций SQL (другими словами, запрос, в котором можно перемещаться,  выбирать запись и изменять значение её полей).

 

Триггер (Trigger) - это хранимая процедура, которая выполняется в тех случаях, когда пользователь пытается добавить, изменить, удалить или модифицировать данные. Используется для реализации проверки целостности данных и бизнес-логики. Они всегда привязываются к таблице (подробнее см. ниже).

 

Rule - правило (условие), которые создаются в БД и привязываются к её определённому полю.

 

Транзакции - последовательный набор команд SQL, образующих логически завершённый блок, который выполняется как единое целое. В неё может быть включено от 1 до множества команд.  В общем она состоит из нескольких типовых операций: Begin Transaction, End Transaction, Commit, Rollback. Если во время выполнения транзакции произойдёт сбой, следующая запись программы начнётся с отката транзакций (Rollback).

 


SQL Server

Для создания новой базы: Действия New Database. Все таблицы и операции в нём хранятся на сервере, в том числе добавление и изменение записи. В этой системе широко используется Transact SQL, который совмещает в себя декларативный и императивный языки программирования.

 

Create Procedure a1 as

 

Select :

 

Для выполнения хранимых процедур необходимо перейти к программе Query Analyzer. Для запуска процедуры с клиентского компьютера:

 

Open :

 

Select select_list :- список полей из таблицы, представления.

 

IdentityCol - позволяет гарантировано включить в результат выборки столбце счётчик, даже не зная его имени.

 

RowGuidCol - запрос будет использовать универсальный идентификатор в качестве поля (он будет генерироваться к каждой строке таблицы).

 

Into new_table - для помещения результатов выборки в отдельную временную таблицу.

 

Batch - последовательность операторов TSQL, передаваемых на выполнение и выполняемых вместе, как единое целое.

 

Begin {SQL statement|block } End - определяет блок

 

GOTO label - безусловный переход к метке.

 

If : else - условный оператор.

 

Wait for - ожидание определённого события.

 

While - условный оператор с предусловием.

 

: break - выход из цикла.

 

: continue -  следующий шаг цикла.

 

/**/, -- - обозначение закомментированных частей текста.

 

Declare - объявление переменных.

 

Print - вывод значения на экран.

 

Создание курсора

 

Синтаксис:

 

Declare имя [Insensitive][Scroll] Cursor FOR

 

Select : FOR {Read Only} Update{of column}

 

Open имя_курсора - при этом данные скачиваются в память.

 

Выборка данных - перемещение по записям.

 

Fetch [[Next | Prior | First | Last | Absolute n | Relative n] from] Cursor имя [Into @var1, @var2]

 

Relative - получает n-ю запись относительно текущей. Чтобы использовать опции, необходимо поставить опцию Scroll. Переменной @@Fetch_Status возвращает результат последнего Fetch.

 

-1 - курсор окончился.

 

-2 - текущая строка не является членом множества.

 

Пример:

 

Declare @name (40)

 

Declare ct Cursor for Select Name From People

 

Open ct

 

While 1=1 Begin

 

Fetch next From ct Into @name

 

If @@Fetch_status=-1 break

 

Print @name

 

End

 

Allocate ct

 


Триггер

Триггер - разновидность хранимой процедуры, исполнение которой обусловлено наступлением определённых событий внутри реляционных БД.

1.      Каждый триггер привязывается  к конкретной таблице.

2.      Все проводимые триггером модификации данных рассматриваются как одна транзакция.

3.      Триггер создаётся только владельцем БД. У триггера есть понятие "кодирование триггера".

Синтаксис:

Create trigger имя_триггера

 

Before|After <триггерное событие> - до или после возникновения события

 

On <имя таблицы>

 

[Referencing <список старых или новых псевдонимов>]

 

[for each{row | statement}]

 

[when (условие триггера)]

 

<тело триггера>

 

Если возникает событие обновление строки, то можно указать имена полей, к которым применим этот триггер.

 

Выполнение действий, задающихся для каждой строки - For each Row - для каждой строки; Statement - только 1 раз при возникновении события.

 

Список старых и новых псевдонимов позволяет изменять псевдонимы (имена полей, используемых в программе): старый_псевдоним/новый_псевдоним.

 

(Полный синтаксис описания триггера для MySql другой)

 

With Encryption - с использованием кодирования.

 

В SQL Server существует 2 параметра:

 

1.      After - Триггер выполняется после успешного выполнения вызвавших его команд.

2.      Instead of - триггер вызывается вместо выполнения команд.

Существует 3 типа триггеров:

1.      Insert Trigger - запускается при попытке вставки с помощью Insert.

2.      Update Trigger - при попытке изменения данных командой Update.

3.      Delete Trigger - при попытке выполнения команды Delete.

Внутри триггера не допускаются операции, которые не могут быть восстановлены в случае отката транзакций:

1.      Создание, изменение и удаление БД.

2.      Восстановление резервной копии БД или журнала транзакций.


Программирование триггера

При  выполнении команд изменения, добавления, вставки сервер создаёт 2 специальные таблицы: inserted и deleted. Структура таблиц аналогична таблице, к которой прикреплён триггер. В зависимости от команды их содержимое изменяется:

1.      Команда Insert - таблица inserted содержит все строки, которые мы пытаемся добавить в таблицу (deleted - пустая).

2.      После завершения триггера записи в таблице inserted удаляются.

3.      Команда Delete - в таблице Deleted помещаются строки к удалению (inserted - пустая).

4.      Команда Update - в deleted - старые значения строк; в inserted - новые значения строк.

@@ROWCOUNT - определяет количество строк в таблице (Inserted и Deleted).

 

Пример на триггер на команду Insert:

 

Create Trigger Триггер <n>

 

On Сделка For Insert

 

As

 

If @@ROWCOUNT = 1

 

                Begin

 

                               If not Exist {Select * From Inserted Where Inserted.Количество <= ALL

 

(Select  * From Склад, Сделка Where Код1 = Код2)}

 

                               Begin

 

RollBack Throw

 

                                               Print "s"

 

                               End

 

                End

 

Триггер, в основном, используется

 

1.      Для сбора статистических данных.

2.      Для записи журнала сообщений.

3.      Для поддержки целостности данных с точки зрения логики программы.


XML

Язык SGML - средство, использующееся для описания языков разметки. Язык разметки описывает то, как располагаются данные, текст, показывает только внешний вид, только внешнее представление.

 

Одним из подмножеств этого языка является язык HTML - язык для размещения объектов на экране. На клиентский компьютер передаётсяЕЬД текст в виде HTML файла.

 

Язык XML - язык разметки - позволяет передавать структуры данных и сами данные. Он предоставляет возможность создавать кросс-платформенные системы. Для преобразования БД в XML используются специальные XML Parser, который проверяет правильность кода и выдаёт правильный текст. Так как XML представляет собой текстовый файл, то его достаточно легко кодировать.

 

Для преобразования Access базы необходимо выбрать: Файл Экспорт. Выбрать тип XML. Подобным образом (через Импорт) можно подключить XML базу.

 

Отличия XML от HTMLXML неограниченное количество тегов.

 

 

Добавьтe Ваш комментарий

Ваше имя (псевдоним):
Ваш адрес почты:
Заголовок:
Комментарий: