Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009

.pdf
Скачиваний:
4975
Добавлен:
14.05.2016
Размер:
14.64 Mб
Скачать

3. Реляционная модель данных

93

Пример 10. Использование блока условий.

Шаблон запроса вывода фамилий сотрудников, чья зарплата составляет от 2000 до 2500, но не равна 2300, будет выглядеть так:

ЕМР

ФИО

ЗАРПЛАТА

 

P. Jon

>2000

 

Jon

<2500

 

Jon

->2300

Используя блок условий с явным заданием операции AND (символ &), этот же запрос можно сформулировать проще:

ЕМР

ФИО

ЗАРПЛАТА

Р.s

CONDITIONS

s_= (>2000 & <2500 & -.2300)

Шаблон запроса вывода фамилий сотрудников, чья зарплата составляет 2000, 2300 или 2600, можно сформировать так:

ЕМР

ФИО

ЗАРПЛАТА

 

P. Jon

2000

 

Р. Мак

2300

 

P. Nik

2600

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

ЕМР

ФИО

ЗАРПЛАТА

Р.s

CONDITIONS

s_= (2000 | 2300 | 2600)

При записи логических выражений на языке QBE могут применяться встроенные функции, такие как: CNT. (счетчик или количество), SUM. (сумма), AVG. (среднее), MIN. (минимум), МАХ. (максимум), UN. (уникальный)

94 Часть 1. Основы построения баз данных

и ALL. (все значения, в том числе повторяющиеся). Первые пять из них являются статистическими, а последние две определяют характер выборки: включать или не включать в выборку повторяющиеся значения.

Функцию UN. можно присоединять к функциям CNT., SUM. и AVG.. Так, запись CNT.UN. означает количество только различающихся значений. В противоположность этому, запись CNT.ALL. будет означать количество всех значений. Очевидно, функции MAX.UN. и MAX.ALL. дадут одинаковый результат.

Пример 11. Использование функций.

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

ЕМР

ФИО

ОТДЕЛ

 

ALL.Emplovee

P. Toy

CONDITIONS

 

CNT.ALL. Employee > 2

 

Конструкция Toy означает операцию группирования

(group-by), фун-

кция ALL.Employee формирует множество (точнее мультимножество, так как допускает дублирования) всех имен по каждому из отделов, а запись CNT.ALL.Employee > 2 обеспечивает проверку логического условия. Здесь встретилась новая операция формирования группы, которая записывается с помощью выделенного жирным шрифтом элемента примера (в оригинале — двойное подчеркивание элемента примера).

Результирующая таблица имеет вид:

ЕМР ОТДЕЛ игрушки косметика

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

SALES

ОТДЕЛ

ТОВАР

 

P. Toy

ALL.Ink

TYPE

ТОВАР

ЦВЕТ

 

ALLink

зеленый

Ответная таблица для данного запроса будет пустой.

3. Реляционная модель данных

95

Вычисления в запросах

С помощью запросов можно выбирать данные из таблиц и производить вычисления. Вид вычисления задается с помощью выражения в шаблоне. В выражениях, помимо обычных арифметических операций (+, - , * , / ) и скобок, могут использоваться встроенные функции: AVG., CNT., MAX.,

M I N . h S U M . .

Примеры 12. Шаблоны с вычислениями.

Пусть имеется таблица ЕМР1 с полями имени (ФИО), размером зарплаты (ЗАРПЛАТА) и размером премиальных (ПРЕМИЯ) . Необходимо по каждому из сотрудников вывести имя и общую сумму зарплаты и премиальных. Для этого сформируем шаблон новой таблицы O U T P U T (заполнив строку имени таблицы и имен ее полей) и укажем в ней вид вычислений. Свяжем этот шаблон с шаблоном запроса к таблице ЕМР1.

OUTPUT

ФИО

СУММА

 

 

P. Employee

Р. (£1+32)

 

ЕМР1

ФИО

ЗАРПЛАТА

ПРЕМИЯ

 

Employee

s i

§2

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

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

ЕМР1

ФИО

ОТДЕЛ

 

Р .CNT .ALL. Em

 

Элемент примера Em здесь можно опустить.

Если требуется подсчитать число сотрудников в отделе игрушек, следует подготовить шаблон запроса вида:

ЕМР1

ФИО

ОТДЕЛ

 

Р .CNT .ALL. Em

игрушки

Чтобы подсчитать число сотрудников в каждом из отделов (с выводом названий отделов), подготовим шаблон запроса вида:

ЕМР1

ФИО

ОТДЕЛ

 

Р .CNT .ALL. Em

P. Pep

96

 

Часть 1. Основы построения баз данных

В этом случае получим следующий результат:

ЕМР1

ФИО

ОТДЕЛ

 

2

хозтовары

 

3

игрушки

 

3

косметика

2канцтовары

Вшаблоне запроса мы применили операцию группирования (см. Пример 11).

Операции вставки, удаления и модификации

В отличие от рассмотренных операций, операции вставки, удаления и модификации приводят к изменению исходной таблицы. Вид операции (вставка — I., удаление — D., модификация — U.) записывается в шаблоне под именем таблицы, а константы и условные выражения указываются по тем же правилам, что и в операциях выборки.

Примеры 13. Операции вставки, удаления, модификации.

Для вставки в таблицу ЕМР нового сотрудника отдела игрушек с фамилией Деревянко Н.В., зарплатой 2000 и руководителем Белкиным Б.Н. нужно сформировать шаблон вида:

ЕМР

ФИО

ЗАРПЛАТА

РУКОВОДИТЕЛЬ

ОТДЕЛ

I.

Деревянко Н.В.

2000

Белкин Б.Н.

игрушки

Пусть необходимо удалить всю информацию о сотрудниках отдела игру-

шек. Шаблон соответствующего запроса будет выглядеть так:

 

ЕМР

ФИО

ЗАРПЛАТА РУКОВОДИТЕЛЬ

ОТДЕЛ

D.

 

 

игрушки

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

ЕМР

ФИО

ЗАРПЛАТА РУКОВОДИТЕЛЬ

ОТДЕЛ

и.

Белкин Б.Н.

2100

 

Пустое поле означает, что оно не подлежит изменению. Если требуется изменить некоторое значение на «пустое», используется ключевое слово NULL.

3. Реляционная модель данных

97

Чтобы повысить зарплату сотрудникам отдела игрушек на 10%, можно сформировать шаблон запроса на модификацию следующего вида:

ЕМР

ФИО

ЗАРПЛАТА РУКОВОДИТЕЛЬ

ОТДЕЛ

и.

 

1.1*£1

 

 

 

s i

игрушки

Реализация этого запроса происходит в два этапа: сначала выбираются все записи со значением «игрушки» в поле ОТДЕЛ, а затем происходит изменение поля ЗАРПЛАТА отобранных записей на новое значение.

Характеристика языков QBE современных СУБД

Основные отличия языков QBE современных СУБД отяЗыка, предложенного Злуффом М.М., как правило, сводятся к незначительным изменениям в интерпретации отдельных реляционных операций, введению дополнительных операций и изменению формы представления языка.

Например, в системе Paradox for Windows вместо операции печати Р. применен метод отметки выбираемых в запросной форме (шаблоне) полей. Для этого в начале каждого из полей запросной формы располагаются флажки для выбора поля. Отмечая поля, пользователь может указать последовательность сортировки в ответной таблице. Для связывания нескольких запросных форм в один многотабличный запрос, а также в логических выражениях условий отбора записей применяются элементы примера.

Наглядными являются запросные формы в Microsoft Access. Диалоговое окно (рис. 3.9) при подготовке запросных форм состоит из двух частей: в верхней части располагается модель взаимосвязи исходных таблиц, а в нижней — остальная информация о запросе по каждому из полей (необходимость вывода значений, вид сортировки, условие отбора и т. д.). >

Подготовка шаблона запроса выполняется пользователем с помощью мыши. Так, связывание таблиц в запросе производится не элементами примеров, а «буксировкой» поля одной таблицы к полю другой таблицы. Если таблицы имели связь между собой, то система автоматически связызает все находящиеся в запросной форме таблицы. При этом каждая из связей помечается в соответствии с ее типом (на рис. 3.9 между таблицами Поставщики и Товары по полю Код Поставщика образована связь вида 1:М).

Анализ современных СУБД позволяет предположить следующие направления развития языка QBE:

Повышение наглядности и удобства.

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

Использование новых типов данных (графических, аудио-, видео- и др.).

4 Зак. 541

98

Часть

1. Основы

построения баз

данных

% Борей - [examl : запрос на выборку]

 

 

шшш

 

 

 

 

Файл, Правка Вид

Вставка*

 

:

J g ]

X

у

 

 

 

 

о

а

 

Все

 

Поставщики |

КодПоставщика Щ

s Название

т •

ОбращатьсяК

 

: Должность

d

 

ШЁ Ш Ш Ш Н в в Ш Ш Щ !

Тз в а р ы :

ik

- ж

КодТовара

 

Марка

— 1

КодПоставщика

 

КодТипа

 

ЕдиницаИзмерения л ]

1LJ

/ ^

\

 

 

. Поле: КодПоставщика

Выражение!: [Toe

Ймя таблицы: Поставщики

 

.

Сортировка:

 

Вывод на экран:

 

Условие отбора:

 

Готово

мшшшшт

 

 

Рис. 3.9. Вид запросной формы в Microsoft Access

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

^формулировки запросов.

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

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

3.9. Структурированный язык запросов SQL

Структурированный язык запросов SQL основан на реляционном исчислении с переменными кортежами. Язык имеет несколько стандартов, наиболее распространенными из которых являются SQL-89 и SQL-92 (подраздел 9.3).

3. Реляционная модель данных

99

Общая характеристика

языка

Язык SQL предназначен для выполнения операций над таблицами (создание, удаление, изменение структуры) и над данными таблиц (выборка, изменение, добавление и удаление), а также некоторых сопутствующих операций. SQL является непроцедурным языком и не содержит операторов управления, организации подпрограмм, ввода-вывода и т. п. В связи с этим SQL автономно не используется, обычно он погружен в среду встроенного языка программирования СУБД (например, FoxPro СУБД Visual FoxPro, ObjectPAL СУБД Paradox, Visual Basic for Applications СУБД Access).

В современных СУБД с интерактивным интерфейсом можно создавать запросы, используя другие средства, например QBE. Однако применение SQL зачастую позволяет повысить эффективность обработки данных в базе. Например, при подготовке запроса в среде Access можно перейти из окна Конструктора запросов (формулировки запроса по образцу на языке QBE) в окно с эквивалентным оператором SQL. Подготовку нового запроса путем редактирования уже имеющегося в ряде случае проще выполнить путем изменения оператора SQL. В различных СУБД состав операторов SQL может несколько отличаться.

Язык SQL пе обладает функциями полноценного языка разработки, а ориентирован на доступ к данным, поэтому его включают в состав средств разработки программ. В этом случае его называют встроенным SQL. Стандарт языка SQL поддерживают современные реализации следующих языков программирования: PL/1, Ada, С, COBOL, Fortran, M U M P S и Pascal.

В специализированных системах разработки приложений типа клиент-сер- вер среда программирования, кроме того, обычно дополнена коммуникационными средствами (установление и разъединение соединений с

серверами БД, обнаружение

и обработка возникающих

в сети ошибок

и т. д.), средствами разработки

пользовательских интерфейсов, средствами

проектирования и отладки.

 

 

Различают два основных метода использования встроенного SQL: стати-

ческий и динамический.

 

 

При статическом использовании языка (статическийSQL)

в тексте про-

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

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

100 Часть 1. Основы построения баз данных

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

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

Для удобства работы с представлениями в язык SQL введено понятие курсора. Курсор представляет собой своеобразный указатель, используемый для перемещения по наборам записей при их обработке.

Описание и использование курсора в языке SQL выполняется следующим образом. В описательной части программы выполняют связывание переменной типа курсор (CURSOR) с оператором SQL (обычно с оператором SELECT). В выполняемой части программы производится открытие курсора (OPEN <имя курсора>), перемещение курсора по записям (FETCH <имя курсора>...), сопровождаемое соответствующей обработкой, и, наконец, закрытие курсора (CLOSE <имя курсора>).

Основные операторы языка

Опишем минимальное подмножество языка SQL, опираясь на его реализацию в стандартном интерфейсе ODBC (Open Database Connectivity — совместимость открытых баз данных) фирмы Microsoft.

Операторы языка SQL можно условно разделить на два подъязыка: язык определения данных (Data Definition Language — DDL) и язык манипулирования данными (Data Manipulation Language — DML). Основные операторы языка SQL представлены в табл. 3.3.

Рассмотрим формат и основные возможности важнейших операторов, за исключением специфических операторов, отмеченных в таблице символом «*». Несущественные операнды и элементы синтаксиса (например, принятое во многих системах программирования правило ставить «;» в конце оператора) будем опускать.

1. Оператор создания таблицы имеет формат вида:

CREATE TABLE <имя таблицы>

(<имя столбца> <тип данных> [NOT NULL] [,<имя столбца> <тип данных> [NOT NULL]]... )

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

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

3. Реляционная модель данных

101

 

 

Т а б л и ц а 3 . 3

 

Операторы языка SQL

Вид

Название

Назначение

 

CREATE TABLE

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

 

DROP TABLE

удаление таблицы

 

ALTER TABLE

изменение структуры таблицы

 

CREATE INDEX

создание индекса

DDL

DROP INDEX

удаление индекса

 

CREATE VIEW

создание представления

 

DROP VIEW

удаление представления

 

GRAND*

назначение привилегий

 

REVOKE*

удаление привилегий

 

SELECT

выборка записей

DML

UPDATE

изменение записей

INSERT

вставка новых записей

 

 

DELETE

удаление записей

В общем случае в разных СУБД могут использоваться различные типы данных (см. подраздел 2.7). В интерфейсе ODBC поддерживаются свои стандартные типы данных, например, символьные (SQL _ CHAR, SQL_VARCHAR, SQL LONGVARCHAR) и др. При работе с БД некоторой СУБД посредством интерфейса ODBC выполняется автоматическое преобразование стандартных типов данных, поддерживаемых интерфейсом, в типы данных источников и обратно. При необходимости обмен данными между программой и источником данных может вестись без преобразования — во внутреннем формате данных источника.

Пример 1. Создание таблицы.

Пусть требуется создать таблицу goods описания товаров, имеющую поля: type — вид товара, comp_id — идентификатор компании-производителя, паше — название товара и price — цена товара. Оператор определения таблицы может иметь следующий вид:

CREATE TABLE goods (type SQL_CHAR(8) NOT NULL,

comp_id SQLCHAR(IO) NOT NULL, name SQL_VARCHAR(20), price SQL_DECIMAL(8,2)).

2. Оператор изменения структуры таблицы имеет формат вида:

ALTER TABLE <имя таблицы>

( {ADD, MODIFY, DROP} <имя столбца> [<тип данных>] [NOT NULL]

[,{ADD, MODIFY, DROP} <имя столбца> [<тип данных>] [NOT NULL]]...)

102 Часть 1. Основы построения баз данных

Изменение структуры таблицы может состоять в добавлении (ADD), изменении (MODIFY) или удалении (DROP) одного или нескольких столбцов таблицы. Правила записи оператора ALTER TABLE такие же, как и оператора CREATE TABLE. При удалении столбца указывать <тип данных> не нужно.

Пример 2. Добавление поля таблицы.

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

ALTER TABLE goods (ADD number SQLINTEGER) .

3. Оператор удаления таблицы имеет формат вида: DROP TABLE <имя таблицы>

Оператор позволяет удалить имеющуюся таблицу. Например, для удаления таблицы с именем items достаточно записать оператор вида:

DROP TABLE items.

4. Оператор создания индекса имеет формат вида:

CREATE [UNIQUE] INDEX <имя индекса> ON <имя таблицы>

(<имя столбца> [ ASC | DESC ] [,<имя столбца> [ ASC | DESC ]... )

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

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

При создании индекса можно задать порядок автоматической сортировки значений в столбцах — в порядке возрастания ASC (по умолчанию), или в порядке убывания DESC. Для разных столбцов можно задавать различный порядок сортировки.

Пример 3. Создание индекса.

Пусть для таблицы ЕМР, имеющей поля: NAME (имя), SAL (зарплата), MGR (руководитель) и DEPT (отдел), нужно создать индекс main_indx для сортировки имен в алфавитном порядке и убыванию размеров зарплаты. Оператор создания индекса может иметь вид:

CREATE INDEX main_indx

ON emp (name, sal DESC).

5. Оператор удаления индекса имеет формат вида:

DROP INDEX <имя индекса>