Меню
Главная
УСЛУГИ
Авторизация/Регистрация
Реклама на сайте
 
Главная arrow Информатика arrow Базы данных
< Предыдущая   СОДЕРЖАНИЕ   Следующая >

Многопользовательский режим

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

Команда или группа команд SQL могут быть выполнены или полностью проигнорированы с помощью транзакций. Транзакция начинается всякий раз, когда начинается сеанс с SQL. Все команды, которые введены, будут частью этой транзакции, пока они не завершатся вводом команды COMMIT WORK или команды ROLLBACK WORK. COMMIT может сделать все изменения постоянными с помощью транзакции, a ROLLBACK может откатить их обратно или отменить. Новая транзакция начинается после каждой команды COMMIT или ROLLBACK.

Синтаксис команд соответственно COMMIT WORK; или ROLLBACK WORK;

В большинстве реализаций можно установить параметр, называемый AUTOCOMMIT. Он автоматически запоминает все действия, которые выполняются. Действия, которые приведут к ошибке, всегда будут автоматически "прокручены" обратно. Для фиксации всех действий можно использовать команду:

SET AUTOCOMMIT ON;

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

SET AUTOCOMMIT OFF;

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

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

SQL имеет средства управления параллелизмом для точного указания места получения результата: ни одна команда не должна быть выдана, пока предыдущая не будет завершена (включая команды COMMIT или ROLLBACK).

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

Существует несколько базовых типов блокировок: распределяемые, специальные и общие блокировки.

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

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

Общие блокировки используются для запросов. Насколько они продолжительны – зависит фактически от уровня изоляции (сколько таблиц будет блокировано).

Использование БД

Обновление данных. К командам обновления относят INSERT, DELETE, рассмотренные при заполнении БД данными, и UPDATE, изменяющей некоторые или все значения в существующей строке. В команде названо имя используемой таблицы и предложение SET, указывающее на изменение, которое нужно сделать для определенного столбца. Например, чтобы изменить оценки всех заказчиков на 200, можно ввести

UPDATE Заказчики SET рейтинг = 200;

UPDATE, наподобие DELETE, может работать с предикатами. Например, можно выполнить изменение, одинаковое для всех заказчиков продавца Строкова (имеющего "пном" = 1001):

UPDATE Заказчики

SET рейтинг = 200

WHERE пном = 1001;

Можно изменить и несколько столбцов. Допустим, продавец Аврорин уволился, и надо переназначить его номер новому продавцу:

UPDATE Продавцы

SET лимя = 'Суворов', город = 'Клин', комм = .10

WHERE пном = 1004;

Команда REFERENCES может изменять значения в уже вставленных строках.

Запрос – команда, которая с помощью программы базы данных выводит определенную информацию из таблиц в память. Эта информация обычно посылается непосредственно на экран компьютера или терминал.

Запрос формируется командой SELECT (выражение (5.4)).

В самой простой форме команда SELECT просто извлекает информацию из таблицы. Например, вывод всей таблицы "Продавцы" (см. табл. 5.3)

SELECT пном, пимя, город, комм

FROM Продавцы; (5.6)

Точка с запятой (;) используется во всех интерактивных командах SQL, чтобы сообщать базе данных, что команда закончена и готова выполниться. Звездочка (*) в команде может применяться для вывода полного списка столбцов и предыдущая процедура может выполняться командой:

SELECT *

FROM Продавцы;

Имеется большое число вариантов команды SELECT [26], из которых, в силу ограниченного объема данной работы, рассмотрим основные.

В выражении (5.6) можно задать не все поля или переупорядочить поля.

Предложение WHERE команды SELECT позволяет устанавливать предикаты, условие которых может быть или верным или неверным для любой строки таблицы. Команда извлекает только те строки из таблицы, для которых такое утверждение верно:

SELECT пимя, город

FROM Продавцы

WHERE город = 'Москва';

В предложении WHERE используются не только сравнения вида <, >, О, =, ≤, ≥, но и области (множества), определяемые выражениями IN, BETWEEN, LIKE, IS (NOT) NULL.

К агрегатным функциям относят COUNT (количество строк в таблице), SUM (арифметическую сумму всех выбранных значений данного поля), AVG (среднее всех выбранных значений данного поля), МАХ или MIN (наибольшее или наименьшее из всех выбранных значений данного поля).

Вывод агрегатных функций (вычисляемых полей) имеет такой вид:

SELECT SUM (сумпр)

FROM Заказы;

Он определяет в данном случае сумму всех покупок в таблице "Заказы". Аналогична команда для остальных функций.

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

SELECT пном, МАХ (сумпр)

FROM Заказы

GROUP BY пном;

Получим

пном

1001 767.19

1002 1713.23

1003 75.75

1014 1309.95

1007 1098.16

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

Предложение HAVING определяет критерии, необходимые для удаления определенных групп из вывода. Тогда команда имеет вид

SELECT пном, датпр, МАХ ((сумпр))

FROM Заказы

GROUP BY пном, датпр

HAVING МАХ ((сумпр)) > 3000.00;

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

Если надо выполнить простые числовые вычисления данных (вычисляемые выражения) и затем поместить их в форму, более соответствующую потребностям, то SQL позволяет это сделать. Например, если ввести команду

SELECT пном, пимя, город, комм *100

FROM Продавцы;

то в поле "комм" появятся значения в процентах.

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

SELECT *

FROM ЗАКАЗЫ

ORDER BY зном DESC, сумпр DESC;

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

SELECT пимя, комм FROM Продавцы

GROUP BY 2 DESC;

пном комм

Строков 0.17

Кирюшин 0.13

Удалов 0.15

До сих пор речь шла о работе с одной таблицей, однако возможна работа и с несколькими таблицами. Формат команд меняется мало, при этом можно использовать практически все, что применялось для одиночных таблиц.

Создание объединения чаще всего осуществляется командой вида

SELECT Заказчики.зимя, Продавцы.пимя,

Продавцы.город

FROM Продавцы, Заказчики

WHERE Продавцы.город = Заказчики.город;

Здесь после SELECT указываются через точку имя таблицы и файла:

зимя

пимя

город

Иванов

Строков

Москва

Иванов

Строков

Москва

Ковров

Кирюшин

Пермь

Конкин

Кирюшин

Пермь

Иванов

Аврорин

Москва

Крабов

Аврорин

Москва

В указании полей могут использоваться и другие условия, например,

SELECT пимя, зимя

FROM Продавцы, Заказчики

WHERE пимя < зимя

AND рейтинг < 200;

пимя зимя

Строков Красин

Аврорин Красин

Козлов Иванов

Козлов Крабов

Козлов Красин

Аналогично выглядит и команда соединения трех и более таблиц.

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

SELECT перв.зимя, втор.зимя, перв.рейтинг

FROM Заказчики перв, Заказчики втор

WHERE перв.рейтинг = перв.рейтинг;

Петров Петров 200

Петров Ковров 200

Ковров Петров 200

Ковров Ковров 200

Квакин Квакин 300

Квакин Конкин 300

Крабов Иванов 100

Крабов Крабов 100

Крабов Красин 100

Конкин Квакин 300

Конкин Конкин 300

Красин Иванов 100

Красин Крабов 100

Красин Красин 100

В вышеупомянутой команде SQL ведет себя так, как если бы он соединял две таблицы, называемые "первая" и "вторая". Обе они – фактически таблицы "Заказчики", но псевдонимы разрешают им быть обработанными независимо. Псевдонимы "первый" и "второй" были установлены в предложении FROM запроса, сразу после имени копии таблицы. Псевдонимы могут использоваться в предложении SELECT, даже если они не определены в предложении FROM.

Следующая команда будет определять любые ошибки в заполнении:

SELECT перв.прном, втор.зном, перв.пном,

втор.прном, втор.зном, втор.пном

FROM Заказчики перв, Заказчики втор

WHERE перв.зном = втор.зном

AND перв.пном < > втор.пном;

Если заполнение таблицы проведено верно, то вывод будет пустым.

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

Пусть известно имя продавца (Аврорин), но значение его поля "пном" неизвестно и надо извлечь все заказы из таблицы "Заказы". Тогда:

SELECT *

FROM Заказы

WHERE пном =

(SELECT пном

FROM Продавцы

WHERE пимя = 'Москва');

Чтобы оценить внешний (основной) запрос, SQL сначала должен оцепить внутренний запрос (подзапрос) предложения WHERE. Ответ: "пном" = 1004. Однако SQL, не просто выдает это значение, а помешает его в предикат основного запроса вместо самого подзапроса, так чтобы предикат прочитал

WHERE пном = 1004.

Для работы с несколькими таблицами может использоваться и операция объединения (UNION). Например, для получения всех продавцов и заказчиков, размешенных в Москве можно использовать команду:

SELECT пном, пимя

FROM Продавцы

WHERE город = 'Москва'

UNION

SELECT зном, зимя

FROM Заказчики

WHERE город = 'Москва';

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

Возможны и запросы с командами обновления, рассмотренными ранее.

Можно выполнить и так называемый перекрестный запрос, результатом которого является таблица, аналогичная таблице в приложении Excel. Команда TRANSFORM служит для выполнения такого запроса.

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

SELECT пном, пимя

FROM Продавцы

WHERE город = :город;

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

♦ ВСТРОЕННЫЙ ЯЗЫК SQL

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

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

Отметим некоторые ограничения SQL.

Логические конструкции типа if... then (если ... то), for... do (для ... выполнить) и while ... repeat (пока ... повторять), используемые для структур большинства компьютерных программ, здесь отсутствуют.

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

Строго говоря, следует выделить вложенный и встроенный язык SQL.

В первом случае основным является язык SQL, в который вводятся операторы циклов и условных переходов. Здесь нет резкого разделения на интерфейсный и вложенный языки. Обычно операторы выборки (SELECT), обновления (DELETE, UPDATE, INSERT), перекрестного запроса (TRANSFORM) относят к интерактивному языку SQL. В то же время операторы CREATE, ALTER, DROP,

GRANT, REVOKE считаются принадлежащими к вложенному языку SQL. В качестве объектов выступают таблицы, поля, ограничения, индексы, домены, виды, генераторы, триггеры, хранимые процедуры. Присутствие "алгоритмических составляющих" языка лучше всего видно в СУБД InterBase в триггерах и хранимых процедурах.

Во втором случае операторы языка SQL "встраиваются" в алгоритмические языки. Часто им является язык Pascal. Для этого команды SQL помещаются в исходный текст главной программы, которой предшествует фраза EXEC SQL (EXECute SQL). Далее обсуждаются некоторые команды, являющиеся специальными для вложенной формы SQL.

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

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

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

SQL и части базового языка программ будут связываться друг с другом с помощью значений переменных. Разные языки распознают различные типы данных для переменных и ANSI определяет эквиваленты SQL базового языка Паскаль.

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

Главные переменные должны:

• быть объявленными в SQL DECLARE SESSION (раздел объявлений);

• иметь совместимый тип данных с их функциями в команде SQL;

• быть назначенными значению во время их использования в команде SQL, если команда SQL самостоятельно не может сделать назначение;

• предшествовать двоеточию (:), когда они упоминаются в команде SQL.

Пусть в программе имеются четыре переменных с именами idnum, salesperson, 1ос и comm. Они содержат значения, которые нужно вставить в таблицу "Продавцы". Можно вложить следующую команду SQL в программу

EXEC SQL INSERT INTO Продавцы

VALUES (:id_num, salesperson, :loc, tcomm)

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

Команду можно включить в цикл:

while not end-of-file (input) do

begin

readln (id_num, salesperson, loc, comm);

EXEC SOL INSERT INTO Salespeople

VALUES (:id_num, salesperson, :loc, :comm);

end;

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

Все переменные, на которые имеется ссылка в предложениях SQL, должны сначала быть объявлены в SQL DECLARE SECTION (раздел объявлений), использующем обычный синтаксис главного языка. Раздел объявлений должен начинаться и кончаться встроенными командами SQL – BEGIN DECLARE SECTION (начало раздела объявлений) и END DECLARE SECTION (конец раздела объявлений), которым предшествует, как обычно EXEC SQL (выполнить).

Чтобы объявить переменные предыдущего примера, можно ввести:

EXEC SQL BEGIN DECLARE SECTION;

Var

id-num: integer;

Salesperson: packed array (1 .. 10) of char;

loc: packed array (1 .. 10) of char;

comm: real;

EXEC SQL END DECLARE SECTION;

где Var – заголовок, который предшествует ряду объявляемых переменных и упакованным (или распакованным) массивам.

Переместим строку Строков из таблицы "Продавцы" в переменные главного языка:

EXEC SQL SELECT snum, sname, city, comm INTO :id_num, salesperson, :loc, :comm

FROM Salespeople

WHERE snum = 1001;

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

Заметим, что язык SQL может использоваться как для построения, так и для запросов, в то время как язык QBE применяется только для обновления и, в основном, для запросов.

Другим вариантом встроенного языка программирования SQL служит язык, используемый, например, при применении СУБД InterBase в среде Delphi: так называемый формируемый запрос, в котором SQL-операторы встраиваются в язык Object Pascal с помощью команды Queryl.SQL.Add('...'), где в скобках указывается SQL-оператор.

Язык QBE

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

1) через меню и экранные формы;

2) с помощью языка Query By Example – QBE (запрос по примеру). Первый способ зависит от варианта разработки СУБД, второй способ, предложенный М.М. Злудом и базирующийся на исчислении доменов, является универсальным и не требует знания программирования. В связи с этим рассмотрим подробнее идею построения языка.

С помощью этого способа на экран вызывается одна или несколько таблиц. В первом столбце каждой из них указывается имя таблицы (файла). В столбцах, под именами полей, могут быть указаны условия запроса. Переход от одной таблицы к другой осуществляется с помощью указания в соответствующих полях одинаковых подчеркнутых переменных, написанных большими буквами. Выводимые на печать поля указываются символом Р (print), точкой и подчеркнутой переменной (например, Р.А)•

Приведем два примера запросов, базирующихся на примере 4.1.

Пример 5.2. Получить фамилии студентов 4 курса кафедры ИиУС, имеющих балл не менее 4 (рис. 5.3).

Запрос фамилии по одной таблице

Рис. 5.3. Запрос фамилии по одной таблице

Пример 5.3. Получить фамилии студентов, руководителем которых является профессор кафедры ИиУС (рис. 5.4).

Запрос фамилии по нескольким таблицам

Рис. 5.4. Запрос фамилии по нескольким таблицам

Могут быть использованы (в первом столбце запроса) агрегатные функции (SUM, AVG, MAX, MIN, CNT-счетчик). Возможно создавать виды (View).

QBE поддерживает справочник таблиц [4], процедуры обновления.

Реализация языка программирования QBE может иметь несколько вариантов. Один из них для СУБД Access рассмотрен в гл. 5.

 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
< Предыдущая   СОДЕРЖАНИЕ   Следующая >
 
Предметы
Агропромышленность
Банковское дело
БЖД
Бухучет и аудит
География
Документоведение
Журналистика
Инвестирование
Информатика
История
Культурология
Литература
Логика
Логистика
Маркетинг
Медицина
Менеджмент
Недвижимость
Педагогика
Политология
Политэкономия
Право
Психология
Религиоведение
Риторика
Социология
Статистика
Страховое дело
Техника
Товароведение
Туризм
Философия
Финансы
Экология
Экономика
Этика и эстетика