В. И. Швецов Базы данных
Скачать 8.45 Mb.
|
ð+ 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 Литература
Лекция 13. Использование языка SQL в прикладных программах В лекции рассматриваются разные технологии формирования запросов на языке SQL в прикладных программах (статическое формирование запроса, динамическое формирование запроса, использование библиотек). Ключевые термины: язык SQL, встроенный SQL, статический SQL, динамический SQL, интерфейс программирования приложений, API, библиотеки для работы с СУБД. Цель лекции: показать основные возможности формирования запросов к базе данных из прикладных программ. 13.1. Программный (встроенный) SQL Основная работа с базой данных проводится с использованием прикладных программ, из которых и идут запросы к базам данных. В этом случае интерактивный режим работы не может быть использован, текст SQL- запроса должен быть либо включен в прикладную программу (если запрос полностью определен заранее), либо формироваться в процессе работы прикладной программы. Программный SQL предназначен для того, чтобы встраивать SQL-запросы в прикладную программу, написанную на одном из языков программирования. При этом возникают следующие вопросы:
Решение этих проблем частично описано в стандарте SQL. Рассмотрим алгоритм выполнения SQL-запросов в интерактивном режиме работы. Легко видеть, что пользователь вынужден ожидать результатов выполнения запроса в течение всего времени работы реализации SQL-запроса. Если через некоторое время пользователю снова нужно будет выполнить тот же самый запрос, СУБД вновь проделает те же самые действия, что и при предыдущем обращении. Налицо некоторое несовершенство механизма:
Решение подобных проблем очевидно – часть действий по обработке запроса необходимо выполнять один раз, сохранять результат в некотором виде, а потом использовать столько раз, сколько необходимо. Эта идея является одной из основных идей программного SQL. Таким образом, программный SQL позволяет:
На настоящий момент используются три варианта встраивания запросов на языке SQL в прикладную программу (программного SQL): статический SQL, динамический SQL и метод, основанный на различных интерфейсах программирования приложений (API). Рассмотрим соответствующие варианты. 13.2. Статический SQL Статический SQL – разновидность программного SQL, предназначенная для встраивания SQL-операторов в текст программы на языке программирования высокого уровня. Основная особенность статического SQL определяется его названием: встраиваемые запросы должны быть четко определены на стадии написания прикладной программы, так как именно конкретный текст запросов вставляется в прикладную программу. Рассмотрим два основных этапа, связанных с работой статического SQL, – компиляция программы и работа (выполнение) программы. Схема компиляции и сборки программы выглядит следующим образом (рис. 13.1):
Рис. 13.1. Схема компиляции программы с встроенными инструкциями статического SQL Схема выполнения программы выглядит следующим образом (рис. 13.2.): Программа запускается на выполнение обычным образом. При необходимости выполнить запрос программой осуществляется вызов специальной функции СУБД, которая отыскивает уже сформированный ранее план выполнения запроса. СУБД выполняет запрос в соответствии с выбранным планом. Результат выполнения запроса поступает в приложение. Рис. 49. Схема выполнения программы с встроенными инструкциями статического SQL Для реализации вышеуказанных схем статический SQL должен содержать дополнительные операторы (по сравнению с интерактивным SQL), позволяющие компилятору выделить в тексте программы SQL-запросы, объявлять используемые в этих запросах таблицы, объявлять переменные для обработки ошибок, как результатов реализации запросов и т. п. Основные команды статического SQL приводятся в следующей таблице. Таблица 13.1. Основные команды статического 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
Рассмотрим схему функционирования динамического SQL (рис.13.3). Схема предусматривает одноэтапное и двухэтапное выполнение инструкций. Одноэтапное выполнение инструкций осуществляется командой EXECUTE IMMEDIATE. Рис. 13.3.. Схема выполнения программы со встроенными инструкциями динамического SQL с применением одноэтапной схемы Схема выполнения инструкции подразумевает:
Основные проблемы одноэтапной схемы заключаются в том, что она не позволяет выполнять инструкции 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]:
Из имеющихся для реализации SQL-запросов интерфейсов API на настоящий момент выделилось несколько библиотек, «стандартных» в том смысле, что они активно применяются множеством разработчиков по всему миру. Данное пособие не является подробным руководством по всем этим библиотекам. Более того, для их профессионального освоения необходимо серьезное изучение соответствующей литературы. В рамках данного курса мы лишь приведем обзор этих библиотек, рассмотрим основные заложенные в них идеи. Подробно эти SQL API описаны, например в [1]. Протокол ODBC |