- •3. Детализация реляционной модели данных
- •3.1. Определение и элементы реляционной модели
- •3.2 Связывание таблиц
- •3.2.1 Назначение и основные виды связывания таблиц
- •3.2.2 Межтабличная связь вида 1:1
- •3.2.3 Межтабличные связи вида 1:м и вида м:1
- •Межтабличная связь вида м:м
- •3.3 Контроль целостности связей
- •3.4 Теоретические языки запросов
- •3.5 Основы реляционной алгебры
- •3.5.1 Общая характеристика реляционной алгебры
- •3.5.2 Базовые теоретико-множественные операции реляционной алгебры Кодда
- •3.5.3 Специальные реляционные операции реляционной алгебры Кодда
- •3.5.4 Дополнительные операции реляционной алгебры
- •3.5.5Основные правила записи выраженийреляционной алгебры
- •3.6. Основы реляционного исчисления
- •3.6.1 Сущность реляционного исчисления и его соотношение с реляционной алгеброй
- •3.6.2 Реляционное исчисление, основанное на кортежах
- •3.6.3 Реляционное исчисление, основанное на доменах
- •3.7 Структурированный язык запросовSql
- •3.7.1 Общая характеристика и основные операторы языкаSql
- •3.7.2 Оператор создания таблицы
- •3.7.3 Оператор изменения структуры таблиц
- •3.7.4 Оператор удаления таблицы
- •3.7.5 Оператор создания индекса
- •3.7.6 Оператор удаления индекса
- •3.7.7Оператор создания представления
- •3.7.8 Оператор удаления представления
- •3.7.9 Оператор выборки записей
- •3.7.10 Оператор изменения записей
- •3.7.11 Оператор вставки новых записей
- •3.7.12 Оператор удаления записей
- •3.7.13 Некоторые важные функции sql
- •3.7.14 Триггеры, ограничения, правила и хранимые процедуры
- •3.7.14.1 Определения
- •3.7.14.2 Создание триггеров
- •3.7.14.3 Создание хранимых процедур
- •3.7.14.4 Создание правил и ограничений
3.6.3 Реляционное исчисление, основанное на доменах
Вариант реляционного исчисления, основанного на доменах (исчисление доменов), предложен Лакроиксом и Пиротте (Lacroix and Pirotte), которые также разработали на его основе соответствующий язык ILL. Другими языками, основанными на исчислении доменов, являются: FQL, DEDUCE, a также QBE с некоторыми оговорками.
По утверждению Дейта, язык QBE включает элементы исчисления кортежей и исчисления доменов, но более близок ко второму. Он не являетсяреляционно полным, так как не поддерживает операцию отрицания квантора существования (NOT EXISTS). Несмотря на этот недостаток, язык QBE получил широкое распространение в современных СУБД. Тем более, что реализации этого языка, как правило, шире исходного языка.
Исчисление доменов имеет много сходства с исчислением кортежей. В отличие от исчисления кортежей, в исчислении доменов основой любого выражения запроса выступают переменные доменов.Переменная домена — это скалярнаяпеременная, значения которой охватывают элементы некоторого домена.
Большая часть различий рассматриваемых исчислений заключается в том, что исчисление доменов поддерживает дополнительную форму условия, называемую условием принадлежности. В общем виде условие принадлежности записывается в виде:
R( A1:υ1 , A2:υ2,...),
где Аi — атрибут отношения R, а υi — переменная домена или литерал. Проверяемое условие истинно, если и только если существует кортеж в отношенииR, имеющий атрибуты А, равные заданным в выражении соответствующим значениям υ.
Например, выражение SP (П# : 'S1', Д# : 'Р1') истинно, если в отношении SP существует хотя бы один кортеж со значением 'S1' атрибута П# и значением 'Р1'атрибута Д#. Аналогично, выражениеSP(П# :SX, Д# : РХ) истинно, если в отношенииSPсуществует кортеж, в котором значение атрибутаП# эквивалентно текущему значению переменной домена SX, а значение атрибута Д# эквивалентно текущему значению переменной домена РХ.
В следующих примерах будем подразумевать существование (объявленное каким-либо образом, подобно оператору RANGE исчисления кортежей) следующих переменных доменов:SX(домен П#), РХ (домен Д#),NAMEX(домен Имя).
Пример 5. Выражения исчисления доменов.
(SX) WHERE S (П# : SX)
(SX) WHERE S (П# : SX, Город_П : 'Москва')
NAMEX WHERE EXISTS SX ( S (П# : SX, Имя : NAMEX)
AND FORALL PX ( IF P (Д# : РХ )
THEN SP (II#: SX, Д# : PX) ) )
Первое выражение означает множество всех номеров поставщиков отношения S, второе — множество номеров поставщиков из Москвы. Третье выражение соответствует запросу на получение имен поставщиков, производящих все детали.
3.7 Структурированный язык запросовSql
3.7.1 Общая характеристика и основные операторы языкаSql
Структурированный язык запросов SQL основан на реляционном исчислении с переменными кортежами. Язык имеет несколько стандартов, наиболее распространенными из которых являются SQL-89 и SQL-92 (подраздел 9.3).
Язык 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, MUMPS и Pascal).
В специализированных системах разработки приложений типа клиент-сервер среда программирования, кроме того, обычно дополнена коммуникационными средствами (установление и разъединение соединений с серверами БД, обнаружение и обработка возникающих в сети ошибок и т. д.), средствами разработки пользовательских интерфейсов, средствами проектирования и отладки.
Различают два основных метода использования встроенного SQL; статический и динамический.
При статическом использовании языка (статический SQL) в тексте программы имеются вызовы функций языка SQL, которые жестко включаются в выполняемый модуль после компиляции. Изменения в вызываемых функциях могут быть на уровне отдельных параметров вызовов с помощью переменных языка программирования.
При динамическом использовании языка (динамический SQL} предполагается динамическое построение вызовов SQL-функций и интерпретация этих вызовов, например, обращение к данным удаленной базы, в ходе выполнения программы. Динамический метод обычно применяется в случаях, когда в приложении заранее неизвестен вид SQL-вызова и он строится в диалоге с пользователем.
Основным назначением языка SQL (как и других языков для работы с базами данных) является подготовка и выполнение запросов. Запрос на выбор записей из таблицы,пожалуй, наиболее сложная и емкая операция. При выборе записей имеется две возможности: поместить выбираемые записи в так называемыекурсорыили отобразить их черезпредставления. И курсоры, и представления суть временные таблицы.
Представление по существу является таблицей, формируемой в результате выполнения запроса. Можно сказать, что оно является разновидностью хранимого запроса. По одним и тем же таблицам можно построить несколько представлений. Само представление описывается путем указания идентификатора представления и запроса, который должен быть выполнен для его получения. Представление может быть получено в результате выборки данных из одной или нескольких таблиц.Представление – это визуально отображаемая таблица, причем модификация данных в представлении приводит к их изменению в оригинале.
Для удобства работы с представлениями в язык SQL введено понятие курсора. Курсор представляет собой своеобразный указатель (типа копии области данных), используемый для перемещения по наборам записей при их обработке. Особенность курсора в том, что это временная таблица, создаваемая в оперативной памяти. С курсором можно выполнять самые разнообразные действия по обработке информации, но поскольку содержимое курсора не связано с содержимым таблицы-оригинала, постольку изменение информации в курсоре не сказывается на таблице-оригинале.
Описание и использование курсора в языке SQL выполняется следующим образом. В описательной части программы выполняют связывание переменной типа курсор (CURSOR) с оператором SQL (обычно с оператором SELECT). В выполняемой части программы производится открытие курсора (OPEN <имя курсора>), перемещение курсора по записям (FETCH <имя курсорах...), сопровождаемое соответствующей обработкой, и, наконец, закрытие курсора (CLOSE <имя курсора>).
Наиболее сложный момент при выборке данных связан с указанием условий выборки. При работе в сети имеется возможность выполнять предвыборку записей и отменять результаты операций, если они привели к неправильным результатам.
Опишем минимальное подмножество языка SQL, опираясь на его реализацию в стандартном интерфейсе ODBC (Open Database Connectivity — совместимость открытых баз данных) фирмы Microsoft.
Операторы языка SQLможно условно разделить на два подъязыка (п.1.2.2): язык определения данныхDDL(DataDefinitionLanguage) и язык манипулирования даннымиDML(DataManipulationLanguage). Основные операторы языка SQL представлены в табл. 3.3.
Рассмотрим формат и основные возможности важнейших операторов, за исключением специфических операторов, отмеченных в таблице символом «*». Несущественные операнды и элементы синтаксиса (например, принятое во многих системах программирования правило ставить «;» в конце оператора) будем опускать.