Главная страница

В. И. Швецов Базы данных


Скачать 8.45 Mb.
НазваниеВ. И. Швецов Базы данных
АнкорV_I_Shvetsov_Bazy_dannykh.doc
Дата20.12.2017
Размер8.45 Mb.
Формат файлаdoc
Имя файлаV_I_Shvetsov_Bazy_dannykh.doc
ТипУчебное пособие
#12252
страница20 из 24
1   ...   16   17   18   19   20   21   22   23   24

ð+ FROM

ð WHERE

ð ORDER BY

ð GROUP BY

ð HAVING

Вариант 2.

Какие служебные слова могут отсутствовать в операторе SELECT?

ð FROM

ð+ WHERE

ð+ ORDER BY

ð+ GROUP BY

ð+ HAVING

Вариант 3.

После каких служебных слов указывается список атрибутов в операторе SELECT?
ð FROM

ð WHERE

ð+ ORDER BY

ð+ GROUP BY

ð HAVING
Задача 3. Как формируется условие выборки записей?
Вариант 1.

Какие служебные слова определяют условие выборки записей?
ð FROM

ð+ WHERE

ð ORDER BY

ð GROUP BY

ð HAVING

ð SELECT

Вариант 2.

Какие служебные слова не определяют условие выборки записей?
ð+ FROM

ð WHERE

ð+ ORDER BY

ð+ GROUP BY

ð+ HAVING

ð+ SELECT

Вариант 3.

Какие операторы и операнды могут использоваться при формировании условия выборки записей?
ð названия таблиц

ð+ имена атрибутов

ð+ имена атрибутов с указанием имен соответствующих таблиц

ð+ арифметические операторы сравнения

ð+ логические операторы

ð+ числовые константы

ð+ символьные константы
Задача 4.
Вариант 1.

Какие элементы таблицы выбираются оператором SELECT?
ð только строки

ð только столбцы

ð+ строки и столбцы

ð вся таблица

Вариант 2.

После какого служебного слова в операторе SELECT указывается выбор столбцов?
ð FROM

ð WHERE

ð ORDER BY

ð GROUP BY

ð HAVING

ð+ SELECT

Вариант 3.

После какого служебного слова в операторе SELECT указывается выбор строк?
ð FROM

ð+ WHERE

ð ORDER BY

ð GROUP BY

ð HAVING

ð SELECT
Задача 5. Как осуществляется выборка информации из нескольких таблиц?
Вариант 1.

В каких предложениях оператора SELECT необходимо использовать имена таблиц при выборке информации из нескольких таблиц?
ð+ FROM

ð+ WHERE

ð ORDER BY

ð GROUP BY

ð HAVING

ð+ SELECT

Вариант 2.

Какие предложения оператора SELECT используются для установления связи между строками таблиц при выборке информации из нескольких таблиц?
ð FROM

ð+ WHERE

ð ORDER BY

ð GROUP BY

ð HAVING

ð SELECT

Вариант 3.

Как указываются имена атрибутов в операторе SELECT при выборке информации из нескольких таблиц?
ð указываются только имена атрибутов через запятую

ð указываются имена атрибутов через запятую и имена таблиц через запятую

ð указываются имена таблиц через запятую и имена атрибутов через запятую

ð+ указывается имя таблицы и через точку имя атрибута и т. д.
Задача 6. Характеристика оператора INSERT.
Вариант 1.

Что делает оператор INSERT?
ð вставляет строку с заданными значениями элементов в таблицу

ð вставляет столбец с заданными значениями элементов в таблицу

ð+ вставляет строку с заданными значениями элементов и значениями по умолчанию в таблицу

ð вставляет столбец с заданными значениями элементов и значениями по умолчанию в таблицу

Вариант 2.

В каких предложениях оператора INSERT указываются вставляемые в таблицу значения?
ð INSERT

ð+ VALUES

ð FROM

ð WHERE

Вариант 3.

Какие служебные слова могут использоваться в операторе INSERT?
ð FROM

ð WHERE

ð+ VALUES

ð GROUP BY
Задача 7. Характеристика оператора DELETE.
Вариант 1.

Какие служебные слова могут использоваться в операторе DELETE?
ð+ FROM

ð+ WHERE

ð VALUES

ð GROUP BY

Вариант 2.

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

ð удаляемая строка ссылается на строку другой таблицы

ð+ на удаляемую строку имеется ссылка из другой таблицы

ð+ нарушаются условия целостности

Вариант 3.

С помощью какого предложения оператора DELETE может указываться удаляемая строка?
ð FROM

ð+ WHERE

ð DELETE

ð SET
Задача 8. Как связаны операторы языка SQL с операциями реляционной алгебры?
Вариант 1.

Какой оператор языка (или служебное слово языка) реализует операцию проекции реляционной алгебры?
ð INSERT

ð+ SELECT

ð ORDER BY

ð GROUP BY

ð HAVING

Вариант 2.

Какой оператор языка (или служебное слово языка) реализует операцию селекции реляционной алгебры?
ð INSERT

ð+ SELECT

ð ORDER BY

ð GROUP BY

ð HAVING

Вариант 3.

Какой оператор языка (или служебное слово языка) используются при представлении операции естественного соединения реляционной алгебры?
ð+ FROM

ð+ WHERE

ð ORDER BY

ð GROUP BY

ð HAVING

ð+ SELECT


Литература


  1. Горев А., Ахаян Р., Макашарипов С. Эффективная работа с СУБД. СПб.: Питер, 1997. – 700 с.

  2. Грабер М. SQL. Справочное руководство. – М: Лори, 1997. – 291с.

  3. Грофф Дж., Вайнберг П. Энциклопедия SQL. 3-е изд. СПб.: Питер, 2003.

  4. Грофф Дж., Вайнберг П. SQL: полное руководство: Пер. с англ. – К.: Издательская группа BHV, 2000. – 608 с.

  5. Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. Базы данных: Учебник для вузов. – СПб.: КОРОНА принт, 2000. – 416 с.

  6. Реализация баз данных Microsoft SQL Server 7.0 Учебный курс: официальное пособие Microsoft для самостоятельной подготовки. М.: Издательско-торговый дом «Русская редакция», 2000.

  7. Карпова Т. Базы данных. Модели, разработка, реализация. – СПб.: Питер, 2001. – 304 с.


Лекция 13. Использование языка SQL в прикладных программах

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

Ключевые термины: язык SQL, встроенный SQL, статический SQL, динамический SQL, интерфейс программирования приложений, API, библиотеки для работы с СУБД.

Цель лекции: показать основные возможности формирования запросов к базе данных из прикладных программ.
13.1. Программный (встроенный) SQL

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

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

  • компилятор с алгоритмического языка должен иметь возможность выделения в тексте прикладной программы последовательность операторов SQL.

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

Решение этих проблем частично описано в стандарте SQL.

Рассмотрим алгоритм выполнения SQL-запросов в интерактивном режиме работы. Легко видеть, что пользователь вынужден ожидать результатов выполнения запроса в течение всего времени работы реализации SQL-запроса. Если через некоторое время пользователю снова нужно будет выполнить тот же самый запрос, СУБД вновь проделает те же самые действия, что и при предыдущем обращении. Налицо некоторое несовершенство механизма:

  • одни и те же этапы выполняются каждый раз заново для одинаковых запросов;

  • СУБД не может обрабатывать интерактивные запросы с опережением.

Решение подобных проблем очевидно – часть действий по обработке запроса необходимо выполнять один раз, сохранять результат в некотором виде, а потом использовать столько раз, сколько необходимо. Эта идея является одной из основных идей программного SQL. Таким образом, программный SQL позволяет:

  • использовать операторы интерактивного SQL в тексте программы на языке программирования высокого уровня;

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

  • для передачи параметров в запрос использовать в тексте запроса переменные, объявленные в программе;

  • для возврата в программу результатов запроса использовать специальные конструкции, отсутствующие в интерактивном SQL;

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

На настоящий момент используются три варианта встраивания запросов на языке SQL в прикладную программу (программного SQL): статический SQL, динамический SQL и метод, основанный на различных интерфейсах программирования приложений (API). Рассмотрим соответствующие варианты.
13.2. Статический SQL

Статический SQL – разновидность программного SQL, предназначенная для встраивания SQL-операторов в текст программы на языке программирования высокого уровня.

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

Рассмотрим два основных этапа, связанных с работой статического SQL, – компиляция программы и работа (выполнение) программы.

Схема компиляции и сборки программы выглядит следующим образом (рис. 13.1):

  • Программа, включающая операторы языка программирования высокого уровня (ЯПВУ) вместе с операторами SQL, подается на вход специального препроцессора, который выделяет из нее части, связанные с SQL.

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

  • Сами инструкции SQL препроцессор выделяет в отдельный файл.

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

  • Наряду с этими операциями происходит работа с файлом, содержащим SQL-инструкции. В литературе этот модуль часто носит название «модуль запросов к базе данных» (Database Request Module, DBRM) [1]. Обработку этого модуля осуществляет специальная утилита, которая обычно носит название BIND. Для каждой инструкции SQL утилита выполняет следующие действия:

  • осуществляет синтаксический анализ запроса (проверяет, является ли запрос корректным);

  • проверяет, существуют ли в базе данных те объекты, на которые ссылается запрос;

  • выбирает, каким образом осуществлять выполнение запроса – план выполнения запроса;

  • Все планы выполнения запросов сохраняются в СУБД для последующего использования.


Рис. 13.1. Схема компиляции программы с встроенными инструкциями
статического SQL
Схема выполнения программы выглядит следующим образом (рис. 13.2.):

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

Рис. 49. Схема выполнения программы с встроенными инструкциями
статического SQL
Для реализации вышеуказанных схем статический SQL должен содержать дополнительные операторы (по сравнению с интерактивным SQL), позволяющие компилятору выделить в тексте программы SQL-запросы, объявлять используемые в этих запросах таблицы, объявлять переменные для обработки ошибок, как результатов реализации запросов и т. п. Основные команды статического SQL приводятся в следующей таблице.

Таблица 13.1.

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


EXEC SQL

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

;

В языке C – признак окончания инструкции встроенного SQL

DECLARE TABLE

Объявляет таблицу, которая потом будет использоваться в инструкциях встроенного SQL

SQLCODE

Переменная для обработки ошибок

SQLSTATE

Переменная для обработки ошибок

GET DIAGNOSTICS

Инструкция для обработки ошибок

WHENEVER

SQLERROR

SQLWARNING

NOT FOUND

GOTO

CONTINUE

Набор совместно используемых инструкций для упрощения обработки ошибок

BEGIN DECLARE SECTION

END DECLARE SECTION

Инструкции для определения области, в которой будут объявлены переменные, впоследствии используемые в запросах SQL

INTO

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

DECLARE CURSOR

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

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

OPEN

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

FETCH

Команда, перемещающая указатель текущей строки (курсор) на следующую строку. В некоторых СУБД и стандарте SQL-92 реализованы разные формы команды FETCH, перемещающие курсор на произвольную строку результатов запроса

CLOSE

Закрывает курсор и прекращает доступ к результатам запроса

Использование описанной выше схемы компиляции/сборки/выпол­нения программы позволяет:

  • использовать SQL совместно с программой на языке программирования высокого уровня;

  • заранее осуществлять проверку синтаксиса запросов и оптимизацию их выполнения (выбор плана). Понятно, что проверка синтаксиса выполняется быстро, но выбор плана выполнения – весьма трудоемкая процедура. Тот факт, что она выполняется один раз на этапе компиляции, позволяет говорить о существенном уменьшении накладных расходов.

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

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

История возникновения динамического SQL во многом связана с компанией IBM, внедрившей этот мощный инструмент в свою СУБД DB2. Стандарты SQL, в частности SQL-1, не поддерживали динамического SQL. Лишь в 1992 году в стандарт SQL-2 были включены спецификации динамического SQL. Основной концепцией динамического SQL является следующее утверждение: встроенная инструкция SQL не записывается в исходный текст программы, вместо этого программа формирует текст инструкции во время выполнения в одной из своих областей данных, а затем передает сформированную инструкцию в СУБД для динамического выполнения [1].

Напомним, что при использовании статического SQL: схема реализазации подразумевала два этапа – компиляцию программы и выполнение программы. При этом на этап компиляции ложилась основная нагрузка. Именно здесь решались вопросы проверки, разбора и оптимизации запросов, поскольку запрос был заранее известен. Совершенно очевидно, что подобную двухэтапную схему нельзя реализовать для динамического SQL, так как на этапе компиляции программы запрос неизвестен. Поэтому проверку, разборку и оптимизацию запросов здесь приходится выполнять непосредственно во время работы программы. Таким образом, если эти операции в статическом SQL выполнялись во время компиляции один раз, то в динамическом SQL они будут выполняться столько раз для одного запроса, сколько раз он будет сформирован в процессе работы прикладной программы. Это определяет существенный недостаток динамического SQL– низкую производительность по сравнению со статическим. Достоинство динамического SQL в том, что он позволяет формировать запрос к базе данных во время работы программы, реагируя на те или иные произошедшие события. Такая возможность является жизненно важной для клиент-серверной и трехзвенной архитектур, в которых структура базы данных и деловые правила имеют тенденцию к изменению, что требует определенной гибкости при организации процесса обработки данных.

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

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

Таблица 13.2.

Основные команды динамического SQL

EXECUTE IMMEDIATE

Немедленное выполнение инструкции

PREPARE

Подготовка инструкции к выполнению

EXECUTE

Выполнение подготовленной ранее инст­рукции

DESCRIBE

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

DECLARE CURSOR

Разновидность инструкции DECLARE CURSOR, применявшейся ранее в рамках статического SQL, содержащая вместо запроса его имя (связанное с запросом при помощи инструкции PREPARE)

OPEN
FETCH
CLOSE

Разновидности инструкций для работы с курсором в динамическом SQL


Рассмотрим схему функционирования динамического SQL (рис.13.3). Схема предусматривает одноэтапное и двухэтапное выполнение инструкций.

Одноэтапное выполнение инструкций осуществляется командой EXECUTE IMMEDIATE.


Рис. 13.3.. Схема выполнения программы со встроенными инструкциями
динамического SQL с применением одноэтапной схемы
Схема выполнения инструкции подразумевает:

  • динамическое формирование команды SQL в строковом виде во время работы программы;

  • передачу строкового вида инструкции в СУБД при помощи команды EXECUTE IMMEDIATE;

  • выполнение инструкции системой управления БД, включающее синтаксический анализ, проверку параметров, оптимизацию (выбор плана) и выполнение этого плана.

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

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



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

На этапе выполнения СУБД подставляет значения параметров (полученные из программы) и использует сформированный ранее план выполнения для достижения результата.

При этом реализуется идея однократного выполнения тех действий, которые можно выполнить один раз. Так, подготовленная один раз инструкция может быть выполнена десятки раз с разными параметрами.
13.4. Интерфейсы программирования приложений (API).
DB-Library, ODBC, OCI, JDBC

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

Наряду с описанным выше механизмом существует и активно применяется еще один подход, связанный с наличием специальных интерфейсов – API (applicationprogramminginterface – интерфейс программирования приложений). Эти API представляют собой библиотеки функций, разработанные для обеспечения связи прикладной программы с СУБД посредством выполнения SQL-запросов. Прикладная программа вызывает специальные функции библиотеки для передачи в СУБД SQL-запроса в текстовом виде и для получения результатов выполнения запросов, а также различной служебной информации.

Применение подобного подхода приводит к тому, что программистам более не требуется изучать специальные наборы инструкций SQL, а необходимо лишь изучить специальную библиотеку функций. С учетом того, что механизм использования API является широко используемым и стандартным подходом (чего только стоит использование мощного аппарата Windows API), для специалистов нет ничего нового в изучении еще одной библиотеки, в данном случае – для общения с СУБД.

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

В данном разделе рассматривается подход, основанный на интерфейсе программирования приложений.

Посмотрим, как работают прикладные программы, использующие различные API. Принципы работы разных библиотек аналогичны. Схема работы приложения совместно с SQL API выглядит следующим образом [1]:

  • программа получает доступ к базе данных путем вызова одной или нескольких API-функций, подключающих программу к СУБД и к конкретной базе данных;

  • для пересылки инструкций SQL в СУБД программа формирует инструкцию в виде текстовой строки и затем передает эту строку в качестве параметра при вызове API-функции;

  • программа вызывает выполнение API-функции для проверки состояния переданной в СУБД инструкции и обработки ошибок;

  • если инструкция SQL представляет собой запрос на выборку, то, вызывая API-функции, программа записывает результаты запроса в свои переменные; обычно за один вызов возвращается одна строка или столбец данных;

  • свое обращение к базе данных программа заканчивает вызовом API-функции, отключающей ее от СУБД.

Из имеющихся для реализации SQL-запросов интерфейсов API на настоящий момент выделилось несколько библиотек, «стандартных» в том смысле, что они активно применяются множеством разработчиков по всему миру. Данное пособие не является подробным руководством по всем этим библиотекам. Более того, для их профессионального освоения необходимо серьезное изучение соответствующей литературы. В рамках данного курса мы лишь приведем обзор этих библиотек, рассмотрим основные заложенные в них идеи. Подробно эти SQL API описаны, например в [1].

 Протокол ODBC
1   ...   16   17   18   19   20   21   22   23   24


написать администратору сайта