
- •Введение
- •Содержание
- •1. Файловые системы
- •История развития
- •Файловые системы, принципы построения
- •Работа с типизированным файлом
- •Недостатки файловых систем
- •Задание
- •Реляционная таблица
- •Определение домена
- •Создание таблиц в среде Microsoft Access
- •Задание
- •Реляционные ключи
- •Связь между таблицами
- •Обеспечение целостности данных
- •Построение схемы данных средствами Microsoft Access
- •Мастер подстановок
- •Задание
- •Концепция ER-модели
- •Задание
- •Первая нормальная форма (1NF)
- •Вторая нормальная форма (2NF)
- •Третья нормальная форма (3NF)
- •Нормальная форма Бойса-Кодда (BCNF)
- •Четвёртая нормальная форма (4NF)
- •Пятая нормальная форма (5NF)
- •Задание
- •Выборка значений из таблиц – SELECT
- •Порядок сортировки – ORDER BY
- •Ограничение набора данных – WHERE
- •Предикат существования EXISTS
- •Агрегатные функции
- •Группировка данных – Group By
- •Псевдонимы столбцов
- •Псевдонимы таблиц
- •Объединение нескольких таблиц
- •Построение запросов в среде Microsoft Access
- •Задание
- •Вставка новой записи – INSERT
- •Редактирование данных – UPDATE
- •Удаление записей – DELETE
- •Задание
- •Основные типы данных SQL-92
- •Язык определения данных – DDL
- •Задание
- •Подготовка отчёта в среде Access
- •Задание
- •3-х уровневая архитектура ANSI-SPARC
- •Создание форм для ввода данных в Microsoft Access
- •Задание
- •Строка соединения ADO
- •Соединение с хранилищем данных, компонент TADOConnection
- •Установка соединения
- •Пример соединения без регистрации пользователя
- •Информирование о БД
- •Задание
- •Базовый класс доступа к данным TDataSet
- •Открытие и закрытие набора данных
- •Обновление набора данных
- •Перемещение по набору данных
- •Создание закладок и переход к закладке
- •Редактирование записей в наборе
- •Фильтрация набора данных
- •Организация поиска данных
- •Взаимодействие с элементами управления данными
- •Задание
- •Поле таблицы – класс TField
- •Классификация полей по функциональному назначению
- •Классификация полей по типу обслуживаемых данных
- •Обращение к отдельному объекту-полю
- •Задание
- •Поля подстановки
- •Вычисляемые поля
- •Организация отношения главная-подчинённая таблица
- •Задание
- •Поля BLOB
- •Задание
- •Источник данных – компонент TDataSource
- •Общие черты компонентов отображения данных
- •Сетка базы данных – компонент TDBGrid
- •Статический текст – компонент TDBText
- •Строка ввода БД – компонент TDBEdit
- •Многострочный текстовый редактор БД – TDBMemo
- •Изображение БД – компонент TDBImage
- •Список БД – TDBListBox
- •Комбинированный список БД – TDBComboBox
- •Флажок БД – TDBCheckBox
- •Радиогруппа БД – TDBRadioGroup
- •Компонент – TDBCtrlGrid
- •Навигатор – TDBNavigator
- •Задание
- •Создание базы данных
- •Удаление базы данных
- •Создание таблиц
- •Пример создания таблиц средствами Transact SQL
- •Создание представлений
- •Задание
- •Определение и использование переменных
- •Операторы управления Transact-SQL
- •Базовые функции Transact-SQL
- •Хранимые процедуры
- •Триггеры
- •Задание
- •Запрос TADOQuery
- •Хранимая процедура TADOStoredProc
- •Транзакции и их изоляция
- •Управление транзакциями и компонент TADOConnection
- •Задание
- •Построение простейшего документа XML
- •Атрибуты
- •Определение документа DTD
- •Задание

41
Псевдонимы таблиц
Вместо того, чтобы в запросе SQL указывать полное имя таблицы при каждой ссылке на неё в команде SELECT можно определить для неё сокращённое название и далее пользоваться этим псевдонимом.
SELECT W.Surname, B.Book FROM Book B, Writer W WHERE W.Wrt_Key=B.Wrt_Key
Псевдоним указывается в конструкции FROM сразу за полным именем таблицы. В приведённом выше примере для таблицы Book назначен псевдоним B, а для Writer – W.
Объединение нескольких таблиц
Вывод данных из одной таблицы представляет собой частный случай. Значительно чаще возникает задача объединения данных из различных таблиц. Для этого используют ряд синтаксических структур, позволяющих соединять таблицы. Простейшим способом объединения двух и более таблиц является использование предиката WHERE с определением полей, применяемых для соединения таблиц. Кроме того, для выполнения объединения после ключевого слова FROM необходимо через запятую перечислить имена объединяемых таблиц. Например, мы хотим соединить таблицы писателей (Writer) и таблицу книг (Book). Данные таблицы объединяются полями Wrt_Key обеих таблиц.
SELECT Surname, FName, LName, Book FROM Writer, Book
WHERE Book.Wrt_Key=Writer.Wrt_Key
Результат запроса будет выглядеть следующим образом:
Сразу разберёмся в терминологии. При объединении таблиц зачастую оперируют терминами внутренняя и внешняя таблица. Таблица, описанная слева от знака равенства, называется внешней, справа – внутренняя. Кроме того, эти таблицы ещё называют левой и правой. Тип представленного ранее объединения называют внутренним. Это один из наиболее распространенных способов объединения в реляционных базах данных.
Большее распространение для организации объединения двух и более таблиц получил синтаксис ANSI с использованием оператора JOIN. При этом различают пять типов соединений: внутренне, левое, правое, полное и перекрёстное.
|
Основные типы соединений. Таблица 6.2 |
Тип соединения |
Синтаксис |
|
таблица1 CROSS JOIN таблица2 |
CROSS |
|
Перекрёстное |
Это прямое декартово произведение, обеспечивающее все воз- |
|
|
|
можные объединения строк из каждой таблиц |
|
таблица1 [NATURAL] [тип соединения] JOIN таб- |
NATURAL |
|
Естественное |
лица2 |
|
Соединение внешнего ключа со связанным с ним родительским |
|
ключом. |
|
таблица1 UNION JOIN таблица2 |
UNION |
|
Объединение |
Соединение, в которое входят те строки каждой из таблиц, для |
|
|
|
которых совпадения не были установлены. |
|
таблица1 [тип соединения] JOIN таблица2 ON |
ON |
Ставропольский государственный университет, кафедра КБ

|
|
|
|
|
|
|
|
|
|
|
42 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Объединение |
посред- |
предикат |
| |
LEFT |
| |
RIGHT |
| |
FULL |
| |
|
|
ством предиката |
|
где тип соединения {INNER |
||||||||
|
|
|
|
OUTER} |
|
|
|
|
|
|
|
|
|
|
таблица1 [тип соединения] JOIN таблица2 USING |
||||||||
|
{INNER | LEFT |
| |
|||||||||
|
RIGHT | |
FULL |
| |
(имя столбца .,…) |
| |
LEFT |
| |
RIGHT |
| |
FULL |
| |
|
OUTER} |
|
|
где тип соединения {INNER |
|||||||
|
USING |
|
|
OUTER} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Объединение |
посред- |
|
|
|
|
|
|
|
|
|
|
ством имён столбцов |
|
|
|
|
|
|
|
|
|
Аналог объединения WHERE на синтаксисе ANSI обязательно содержит оператор JOIN и выглядит примерно так:
SELECT Writer.Surname, Writer.FName, Writer.LName, Book.Book FROM Writer
INNER JOIN Book ON Writer.Wrt_Key=Book.Wrt_Key
Такое объединение называют внутренним.
Коренное отличие применения оператора JOIN от оператора WHERE в операциях объединения таблиц заключается в том, что после слова FROM нет необходимости указывать перечень всех таблиц.
Для того, чтобы осуществить левое объединение таблиц (другими словами заставить вывести все записи из левой таблицы вне зависимости от того есть ли у них подчинённые записи в правой таблице) конструкция незначительно изменится:
SELECT Writer.Surname, Writer.FName, Writer.LName, Book.Book FROM Writer
LEFT JOIN Book ON Writer.Wrt_Key=Book.Wrt_Key
Для создания правого объединения замените в предыдущем примере ключевое сло-
во LEFT на RIGHT.
SELECT Writer.Surname, Writer.FName, Writer.LName, Book.Book FROM Writer
RIGHT JOIN Book ON Writer.Wrt_Key=Book.Wrt_Key
Теперь запрос возвратит все записи из правой таблицы (Book) и соответствующие ей записи левой таблицы. Так как в правой таблице не указаны книги Достоевского, то в результирующей таблице опять Вы не увидите записей с его фамилией.
Полное объединение требует использования ключевого слова FULL.
SELECT Writer.Surname, Writer.FName, Writer.LName, Book.Book FROM Writer
FULL JOIN Book ON Writer.Wrt_Key=Book.Wrt_Key
Такое объединение позволит вернуть все записи как из левой, так и из правой таблиц. Если бы, например, в таблице книг оказалась ещё одна запись о книге без автора (другими словами ключ автора Wrt_Key был установлен в Null).
Редко используемый тип перекрёстного объединения CROSS заставит запрос возвратить все возможные комбинации строк из объединяемых таблиц.
SELECT Writer.Surname, Writer.FName, Writer.LName, Book.Book FROM Writer
CROSS JOIN Book
Ценность, сформированной таким образом, выходной таблицы весьма условна, но, тем не менее, если такая возможность существует, то о ней надо помнить.
Ставропольский государственный университет, кафедра КБ

43
Далее приведён пример запроса SQL формирующий единую результирующую таблицу из четырёх.
SELECT Writer.Surname, Writer.FName, Writer.LName, Writer.Born, Publisher.Publisher, Book.Book
FROM Base
LEFT JOIN Publisher ON Publisher.Pbl_Key=Base.Pbl_Key LEFT JOIN Book ON Book.Bk_Key=Base.Bk_Key
RIGHT JOIN Writer ON Writer.Wrt_Key=Book.Wrt_Key
Порядок соединения нескольких таблиц имеет критическое значение. Если таблицы соединяются в правильном порядке, то общее число обрабатываемых строк будет меньше. Описывая запрос, следует выполнять сначала максимально ограничивающий поиск, чтобы отфильтровать как можно большее число строк на ранних фазах выполнения запроса с соединениями.
Построение запросов в среде Microsoft Access
Среда Microsoft Access значительно упрощает процесс создания запросов на выборку данных. Для этих целей в ней существует два режима (см. рис. 6.1):
1.Создание запроса в режиме конструктора.
2.Создание запроса с помощью мастера.
Рисунок 6.1. – Окно объектов БД Access с активной страницей “Запросы”
Однако в своей практической деятельности мы постараемся отстраниться от помощников, и ограничится услугами обычного редактора. Для этого необходимо сделать следующие шаги:
1.Дважды щелкните левой кнопкой мышки по строке “Создание запроса в режиме конструктора”.
2.Нажав кнопку “Закрыть” откажитесь от услуг окна “Добавление таблицы”.
3.На панели инструментов найдите кнопку “SQL”, вызовите её меню и выберите пункт “Режим SQL” (см. рис. 6.2).
Ставропольский государственный университет, кафедра КБ

44
Рисунок 6.2. – Переход в режим SQL
В результате этих действий перед нами окажется окно редактора, в котором мы и станем записывать команды на языке SQL. Для выполнения инструкции воспользуйтесь пунктом главного меню: “Запрос – Запуск”.
Задание
С помощью оператора SELECT разработайте группу запросов к своей базе данных. В результате работы у вас должны быть созданы запросы позволяющие:
1.сортировать данные во всех отдельных таблицах БД;
2.отбирать данные из отдельных таблиц;
3.объединяющие все пары таблиц, состоящие в отношении “один ко многим”;
4.объединяющие все таблицы, состоящие в отношении “многие ко многим”;
5.суммарный запрос, отображающий все данные из всех таблиц БД.
Ставропольский государственный университет, кафедра КБ