Oracle Database
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
ЛЕКЦИЯ № 4
Оглавление
2.5.4. Oracle Database...................................................1
2.6. Правила синтаксиса и основные запросы SQL.......7
2.7. Имена объектов в SQL. Константы, отсутствующие данные 13
2.8. Типы данных.............................................................15
2.9. Выражения................................................................26
2.5.4. Oracle Database
Наряду с MS SQL Server, одной из ведущих коммерческих SQLориентированных СУБД является Oracle.
Oracle Database 11g – СУБД, ориентированная на применение в
корпоративных сетях распределенной обработки данных (Enterprise Grid), –
позволяет сократить расходы на информационные технологии благодаря
автоматизации
управления,
использованию
недорогих
модульных
компонентов и кластеризации серверов в целях эффективного использования
ресурсов.
Архитектура СУБД Oracle рассчитана на работу с огромными объемами
данных и большим (десятки и сотни тысяч) числом пользователей; она
демонстрирует широкие возможности обеспечения высокой готовности,
производительности, масштабируемости, информационной безопасности и
самоуправляемости. СУБД Oracle может быть развернута на любой
платформе, начиная от небольших серверов-лезвий и заканчивая
симметричными многопроцессорными компьютерами и мэйнфреймами.
Уникальная способность СУБД Oracle работать со всеми типами данных – от
традиционных таблиц до XML-документов и картографических данных
позволяет рассматривать ее в качестве оптимального выбора для работы с
приложениями оперативной обработки транзакций, поддержки принятия
решений и управления коллективной работой с информацией.
Oracle Database 11g поставляется в нескольких редакциях [25].
Oracle Enterprise Edition – флагманская СУБД. Ориентирована на
крупномасштабные проекты, нуждающиеся в полном наборе средств Oracle.
Только Enterprise Edition поддерживает такие развитые механизмы
обеспечения безопасности, как виртуальная частная база данных (Virtual
Private Database, VPD), детальный аудит (Fine_Grained Auditing) и другие
опции, включая Database Vault, Advanced Security и Label Security. Лишь в
Enterprise Edition хранилища данных поддерживают сжатие повторяющихся
значений, кроссплатформенные переносимые табличные пространства,
управление жизненным циклом информации (Information Lifecycle
Management, ILM), перезапись запросов с материализованными
представлениями, а также секционирование (Partitioning), OLAP и добычу
1
данных (Data Mining). К числу механизмов обеспечения высокой
доступности, включенных в Enterprise Edition, относятся Data Guard,
ретроспективные
(flashback)
базы,
ретроспективные
таблицы
и
ретроспективные транзакции. В Oracle Database 11g добавлена опция сжатия
Advanced Compression Option для любой рабочей нагрузки, в том числе для
обработки транзакций, хранения больших объектов (Large Object, LOB) и
резервных копий; подсистема тестирования базы данных, которая называется
Real Application Testing Option и включает в себя программы Database Replay
и SQL Performance Analyzer, а также опция Total Recall Option,
обеспечивающая режим архивации ретроспективных данных Flashback Data
Archive, который сохраняет данные, необходимые для выполнения
хронологических запросов (запросов с конструкцией AS OF, где задается
дата в прошлом).
Oracle Standard Edition – ориентирована на реализацию баз данных
малого и среднего размера. Ее можно развернуть в серверной конфигурации,
имеющей до 4 ЦП, на одном компьютере или на кластере с использованием
подсистемы Real Application Clusters (RAC).
Oracle Standard Edition One – ориентирована на небольшие проекты,
поддерживает до двух ЦП и не поддерживает RAC. В остальном набор
возможностей схож с реализованным в редакции Oracle Standard Edition.
Oracle Personal Edition – используется разработчиками-одиночками для
создания кода, который будет выполняться в многопользовательской СУБД.
В отличие от Express Edition требует лицензии, но обладает всей
функциональностью Enterprise Edition.
Oracle Express Edition - СУБД начального уровня, доступная для Windows
и Linux бесплатно. Может использовать не более 1 Гбайт памяти и 4 Гбайт
дискового
пространства.
Предоставляет
часть
функциональности,
включенной в редакцию Standard Edition One. Отсутствуют такие функции,
как виртуальная Java-машина, управляемое сервером резервное копирование
и восстановление, а также подсистема Automatic Storage Management. Oracle
Enterprise Manager (продукт для комплексного управления промышленной
средой обработки данных) не умеет управлять этой СУБД, однако ее можно
развернуть так, что она будет доступна из административного интерфейса
Oracle Application Express (бывший HTML_DB), позволяющего управлять
несколькими пользователями.
Обычно Oracle выпускает новые версии своей флагманской СУБД каждые
три-четыре года. Новые версии, как правило, посвящены какой-то одной теме
и включают целый ряд новых функций. В последних версиях тема
обозначалась в названии версии продукта. Так, в 1998 году Oracle
анонсировала версию Oracle8i, где буква i обозначала поддержку
развертывания для работы в Интернет. Версия Oracle9i продолжила эту тему.
В 2003 году вышла версия Oracle Database 10g, где g означает
сконцентрированность на моделях развертывания с поддержкой gridвычислений. Oracle продолжает эту тему и в версии Oracle Database 11g.
Между основными версиями Oracle выпускает промежуточные. В них тоже
2
добавляются новые возможности, но основное внимание все же уделено
совершенствованию уже реализованных средств.
С 1983 года подразделение Oracle Development ведет разработку на основе
модели единого набора исходных кодов для всего семейства продуктов,
связанных с базами данных. Хотя в реализации каждой СУБД на самых
нижних уровнях встречается системно-зависимый код, необходимый для
лучшего учета особенностей конкретной платформы, интерфейсы,
раскрываемые
пользователям,
разработчикам
и
администраторам,
одинаковы. Поскольку поведение функций не зависит от платформы, любая
организация может безболезненно переносить СУБД Oracle и приложения
для них с одной аппаратной платформы или операционной системы на
другую. Такая стратегия позволяет Oracle реализовывать новые функции
только раз для каждого набора продуктов.
Рассмотрим основные модули и компоненты СУБД Oracle Database 11g.
Модуль InterMedia обеспечивает поддержку всех типов данных, в том
числе выполнение операций поиска по большим текстовым документам
различных форматов.
Компонент Oracle Enterprise Manager представляет собой универсальное
средство администрирования баз данных, снабженное удобным графическим
интерфейсом и позволяющее администратору баз данных выполнять
широкий спектр операций над множеством баз данных Oracle, включая
создание, модификацию и удаление любых объектов внутри каждой из них.
Модуль Distribution Option позволяет эффективно работать с
распределенными базами данных и обеспечивает двухфазную фиксацию
транзакций к нескольким базам данных.
Модуль Advanced Replication Option позволяет выполнять репликацию
данных в широком диапазоне возможностей, включая синхронную,
асинхронную, каскадную и другие типы репликации.
Начиная с версии 8, СУБД Oracle является объектно-реляционной
системой. Модуль Objects Option поддерживает объектно-ориентированные
возможности: объектные типы, коллекции, массивы, вложенные таблицы,
ссылки на объекты и большие бинарные объекты (BLOB). За счет включения
в сервер Oracle модуля 64 Bit Option Oracle Database работает не только на
32-разрядных, но и на 64-разрядных компьютерах, что существенно
расширяет возможности как по скорости обработки данных, так и по
объемам обрабатываемых данных.
Oracle Advanced Queuing (AQ) – встроенный в Oracle Database механизм
хранения и обработки очередей сообщений. Компонент AQ относится к
классу MOM (Message Oriented Middleware). Наличие такого компонента
позволяет построить на базе сервера полнофункциональную инфраструктуру
для обработки сообщений и исключает необходимость приобретения для
этой цели дополнительных средств третьих фирм (таких, как IBM MQ Series),
обеспечивая в то же время связь с ними в неоднородных средах за счет
продукта Oracle Messaging Gateway.
3
Начиная с версии Oracle8i, в состав сервера (во все редакции) включена
виртуальная Java-машина (JServer Enterprise Edition).
Oracle Database снабжен всеми необходимыми средствами для
подключения клиентских рабочих мест по протоколу Net8 (модуль
Networking Kit), для обеспечения работы клиентов по технологии OLE
(модуль Objects for OLE), набором ODBC-драйверов (ODBC Driver) и
библиотеками для разработки программ на языках третьего уровня,
использующих для доступа к базе данных Oracle Call Level Interface (OCI).
Oracle Call Interface поддерживает разработку программ с применением
вызовов низкоуровневых функций для доступа к базам данных. Это
позволяет создавать эффективные программы, требующие минимальных
ресурсов. Возможность разработки оптимизированных по скорости и
используемой памяти приложений достигается за счет использования
вызовов функций, которые предоставляют полный контроль за выполнением
операторов SQL и PL/SQL.
Компонент Oracle Obects for OLE предоставляет возможность доступа к
базам данных Oracle-приложений, разработанных на C++, Microsoft Visual
Basic, OLE 2.0. Полная поддержка языка макроопределений в Visual Basic
позволяет получать данные из баз данных Oracle непосредственно в
электронных таблицах Microsoft Excel.
Oracle Workflow – это средство для автоматизации стандартных бизнеспроцедур организации, ориентированное на разработчиков корпоративных
приложений, основанных на технологиях Oracle. Oracle Workflow предлагает
инфраструктуру и средство проектирования (Workflow Builder) для
автоматизации
прохождения
информации
произвольного
типа,
формализации сложных бизнес-правил и включения пользователя в процесс
принятия решения.
Рассмотрим опции, доступные в редакции Enterprise Edition.
Опция
Real
Application
Clusters
(RAC)
позволяет
строить
отказоустойчивые и хорошо масштабируемые серверы баз данных на основе
объединения нескольких вычислительных систем.
В архитектуре RAC экземпляры СУБД Oracle одновременно выполняются
на нескольких объединенных в кластер системах, производя совместное
управление общей базой данных. По существу, с точки зрения приложения –
это единая СУБД. Такой подход позволяет достичь исключительно высокой
готовности и масштабируемости любых приложений. Гибкость и
эффективность планирования ресурсов позволяют наращивать мощности до
любого уровня по требованию, по мере изменения потребностей бизнеса.
Опция Partitioning позволяет строить секционированные таблицы и
индексы и предназначена для функционального расширения Enterprise
Edition по управлению большими базами данных. Секционированные
таблицы и индексы применяются для разделения больших таблиц и индексов
на части, управлять которыми можно независимо друг от друга, вместо того,
чтобы управлять всей таблицей или индексом как единым объектом. При
секционировании уменьшается время, требующееся для выполнения
4
большинства административных операций. Это уменьшение можно
объяснить применением этих операций к меньшим «единицам хранения» и
увеличением производительности вследствие их параллельного выполнения.
Опция Oracle OLAP предназначена для построения аналитических систем,
основанных на принципах многомерного анализа и технологии OLAP. Этот
компонент позволяет хранить и обрабатывать в одной и той же базе данных
не только реляционную, но и многомерную информацию.
Опция Oracle Data Mining (ODM) предназначена для анализа данных
методами, относящимися к технологии извлечения знаний или «data mining».
Основная задача этой технологии состоит в выявлении в больших наборах
данных скрытых закономерностей, зависимостей и взаимосвязей, полезных
при принятии решений на различных уровнях управления. Такие
закономерности представляются в виде моделей различного типа,
позволяющих проводить классификацию ситуаций или объектов,
прогнозировать их поведение, выявлять группы сходных объектов и тому
подобное. Существенно, что модели строятся автоматически на основе
анализа имеющихся данных об объектах, наблюдениях и ситуациях с
помощью специальных алгоритмов.
Объектно-реляционные СУБД, помимо стандартных средств обработки
данных, предоставляют новые механизмы для хранения и обработки данных
в мультимедийных и геоинформационных системах. Две важные задачи
должны быть разрешены для соответствия требованиям этих систем:
возможность адекватного представления данных и контекстный поиск
мультимедиа и пространственных данных. Встроенный модуль Oracle
Locator и опция Oracle Spatial решают эти задачи, предоставляя объектный
тип данных (SDO_GEOMETRY), возможность индексирования и
функции/операторы для манипуляции с этим типом. Эти механизмы
позволяют хранить, запрашивать, быстро и эффективно анализировать
пространственные данные внутри одной базы данных Oracle. Это даёт
возможность разработчикам приложений сохранять всю пространственную
информацию в стандартной промышленной базе данных без необходимости
построения дополнительных внешних индексов и процедур для получения
необходимой функциональности.
Опция Oracle Advanced Security (OAS) обеспечивает секретность и
конфиденциальность информации, передаваемой по сети, предотвращая
«прослушивание» и разнообразные виды атак. Шифрование трафика и
гарантия обеспечения целостности данных необходимы в том случае, когда
клиент или сервер приложений располагается вне демилитаризованной зоны
сети. Все соединения СУБД Oracle могут быть зашифрованы с помощью
OAS.
Опция Oracle Label Security (OLS) представляет собой технологическое
решение для организаций, которым необходим низкоуровневый, построчный
контроль доступа для защиты конфиденциальной информации. Основанная
на многоуровневой технологии безопасности OLS позволяет сохранять в
одной базе данных информацию с разной степенью конфиденциальности,
5
при этом доступ к данным ограничивается категориями допуска. Построчный
контроль доступа дополняет безопасность, основанную на правах доступа к
объектам, позволяя реализовать низкоуровневую модель привилегий.
База данных Oracle состоит из физических файлов трех основных типов
[25]:
• файлы данных (datafiles);
• управляющие файлы (control files);
• журнальные файлы, или журналы (redo log files).
Любые данные, хранящиеся в базе Oracle, должны находиться в каком-то
табличном пространстве. Табличное пространство (tablespace) – это
логическая структура, состоящая из физических структур, называемых
файлами данных (datafiles). В одном табличном пространстве может быть
один или несколько файлов данных, тогда как каждый файл данных
принадлежит ровно одному табличному пространству.
Расширение файлов данных Oracle – dbf, расширение файлов данных
резервной копии Oracle (экспорт) – dmp.
В управляющих файлах хранится информация о местонахождении других
физических файлов, составляющих базу данных, – файлов данных и
журналов. Там же хранится важнейшая информация о содержимом и
состоянии базы данных:
• имя базы данных;
• время создания базы данных;
• имена и местонахождение файлов данных и журнальных файлов;
• информация о табличных пространствах;
• информация о файлах данных в автономном режиме;
• история журналов и информация о порядковом номере текущего
журнала;
• информация об архивных журналах;
• информация о наборах и фрагментах резервных копий, файлах данных и
журналах;
• информация о копиях файлов данных;
• информация о контрольных точках.
Управляющие файлы не только содержат важную информацию,
необходимую при запуске экземпляра, они полезны и при удалении базы
данных.
В распоряжении разработчиков имеется множество инструментов
администрирования баз данных Oracle.
Программа Oracle Enterprise Manager (EM) включена в большинство
редакций СУБД. EM предоставляет инфраструктуру для создания
инструментов администрирования базы данных и HTML-интерфейс для
управления пользователями, экземплярами и различными подсистемами. С
помощью EM можно также администрировать Oracle Application Server,
Oracle Applications, операционную систему Linux и программные продукты
других поставщиков. На консоль базы данных в текущей версии Oracle
6
выводится информация о состоянии базы данных, доступности, схеме,
конфигурации средств перемещения данных и сопровождении ПО.
Из сторонних графических средств администрирования Oracle популярна
DbForge Studio for Oracle. DbForge Studio for Oracle – бесплатная мощная
среда разработки и администрирования баз данных Oracle. Позволяет
составлять и выполнять запросы, просматривать план выполнения запросов,
редактировать
объекты
БД,
редактировать
данные,
управлять
пользователями, разрабатывать SQL-скрипты и хранимые объекты PL/SQL,
отлаживать PL/SQL код и скрипты, осуществлять экспорт и импорт данных,
создавать проекты БД и многое другое.
В настоящем учебнике используется бесплатная версия Oracle Database
Express Edition 11g Release 2, а в качестве графического инструмента DbForge Studio for Oracle.
2.6. ПРАВИЛА СИНТАКСИСА И ОСНОВНЫЕ ЗАПРОСЫ SQL
При описании языка SQL будут использоваться синтаксические
обозначения, представленные в табл. 2.3 [39].
Таблица 2.3. Специальные синтаксические обозначения
Обозна
Описание
чение
::=
Равно по определению
SELEC Прописные латинские буквы и символы
T
используются для написания конструкций
языка SQL и должны (если специально не
оговорено) записываться в точности так, как
показано
<услов Строчные буквы, заключенные в скобки < >,
ие>
используются для сокращенного обозначения
конструкций, которые при дальнейшем
описании синтаксиса будут раскрываться
уровень за уровнем для получения полной
детализации (для определенности отдельные
слова этих конструкций связываются между
собой символом подчеркивания)
[]
Конструкции, заключенные в квадратные
скобки, являются необязательными (могут
быть опущены)
{}
Фигурные скобки предполагают обязательный
выбор некоторой конструкции из списка
7
|
Прямая черта означает наличие выбора из
двух или более взаимоисключающих
элементов (ИЛИ). Например, обозначение
ASC|DESC указывает, что можно выбрать
один из терминов ASC или DESC; когда же
один из элементов выбора заключен в
квадратные скобки, то это означает, что он
выбирается по умолчанию (так, [ASC]|DESC
означает, что отсутствие всей этой
конструкции будет восприниматься как выбор
ASC)
*
Используется для обозначения «все».
Употребляется в обычном для
программирования смысле, т. е. «все случаи,
удовлетворяющие определению»
;
Точка с запятой – завершающий элемент SQLзапросов (терминатор)
…
Используется для указания того, что текущий
элемент является повторяемым
Пробе Может вводиться для повышения наглядности
л
между любыми синтаксическими
конструкциями предложений SQL
Следует учесть, что при дальнейшем описании конструкции базовая
таблица, представление и столбец будут подразумевать соответственно имя
базовой таблицы, имя представления и имя столбца. Конструкция <таблица>
будет использоваться для обобщения таких видов таблиц, как базовая
таблица, представление и производная таблица. В тех случаях, когда
потребуется явно обозначить вид таблицы в синтаксисе, будут указываться
<базовая_таблица>, <представление> или <производная_таблица>.
БД любой реляционной СУБД создается и управляется запросами языка
SQL.
Запросы языка SQL можно разделить на 6 основных категорий.
1. Язык определения данных (Data Definition Language – DDL) позволяет
создавать и изменять структуру объектов БД, например создавать и удалять
таблицы.
2. Язык манипулирования данными (Data Manipulation Language – DML)
используется для манипулирования данными внутри объектов реляционной
БД, например добавляет строки в таблицы.
3. Язык выборки данных (Data Query Language –DQL) включает один запрос
SELECT, который вместе со своими многочисленными секциями и опциями
используется для формирования запросов к реляционной БД на выборку
информации.
4. Язык управления доступом к данным (Data Control Language – DCL)
позволяет управлять доступом к информации, находящейся внутри БД. Как
правило, этот язык используется для создания объектов, связанных
8
с доступом к данным, а также служит для контроля над распределением
привилегий между пользователями.
5. Язык обработки транзакций (Transaction Processing Language – TPL).
6. Язык администрирования данных, с помощью команд которого
пользователь контролирует выполняемые действия и анализирует операции
БД. Он также используется при анализе производительности системы. Не
следует путать администрирование данных с администрированием БД,
которое представляет собой общее управление БД и подразумевает
использование запросов всех уровней.
Отдельно следует отметить процедурный язык, который используется при
написании хранимых процедур и триггеров. В каждой конкретной СУБД
реализация и название процедурного языка различаются: в Oracle Database –
это PL/SQL (Procedural Language/SQL), в MS SQL Server – Transact-SQL, в
Firebird – PSQL (Procedural SQL) и т.д. В настоящем учебнике при описании
конструкций, доступных для использования только в процедурном языке,
будет применяться термин оператор.
Основные категории запросов языка SQL предназначены для выполнения
различных функций, включая построение объектов БД и манипулирование
ими, начальную загрузку данных в таблицы, обновление и удаление
существующей информации, выполнение запросов к БД, управление
доступом к ней и ее общее администрирование.
Независимые структуры БД – таблицы, индексы и представления –
создаются DDL-запросами. Объекты БД, созданные DDL-запросами,
называются метаданными (metadata). На физическом уровне метаданные
представляют собой системную БД. Такая БД содержит «данные о данных»,
т. е. определение других объектов системы. Метаданные хранятся в виде
системных таблиц, которые автоматически создаются и изменяются СУБД.
Процесс определения данных – это процесс создания, изменения и
удаления метаданных.
Запросы DML, DQL, DCL оперируют с существующими данными,
хранящимися в структурах БД, определенных запросами DDL.
Запросы SQL сообщают СУБД о необходимости выполнить определенное
действие. Запросы SQL позволяют:
создать структуру объектов БД;
читать данные;
получать итоговые данные;
добавлять данные и удалять данные;
обновлять (изменять) данные;
защищать данные.
Для успешного изучения языка SQL необходимо привести краткое
описание структуры SQL-запросов и нотации, которые используются для
определения формата различных конструкций языка. Запрос SQL состоит из
зарезервированных слов и слов, определяемых пользователем. На рис. 2.5
приведен примерный формат SQL-запроса.
9
Рис. 2.5. Формат SQL-запроса
В SQL существуют ключевые слова и зарезервированные слова [40].
Ключевые слова – это все слова, входящие в лексику (словарь) языка SQL.
Ключевые слова являются постоянной частью языка SQL и имеют
фиксированное значение. Их следует записывать в точности так, как это
установлено, нельзя разбивать на части, например для переноса с одной строки
на другую, и сокращать. Ключевые слова можно (но не рекомендуется)
использовать в качестве имён, идентификаторов объектов базы данных,
внутренних переменных и параметров. Зарезервированные слова – это те
ключевые слова, которые нельзя использовать в качестве имён объектов базы
данных, переменных или параметров. Например, FROM и WHERE – это
ключевые и зарезервированные слова, а AFTER и EXCEPTION – это просто
ключевые слова.
Все ключевые слова SQL можно, в свою очередь, разделить на следующие
категории.
•
Команды. Представляют собой глаголы, определяющие действие,
которое следует выполнить. Например, SELECT, CREATE И ALTER.
•
Условия, или квалификаторы (qualifiers). Ограничивают диапазон
значений элементов, входящих в запрос, например WHERE.
Квалификатор – это элемент команды оператора, команды программы или
спецификации файла, уточняющий действие команды или спецификации.
•
Модификаторы, или секции (clauses). Модифицируют выполнение
инструкции, например ORDER BY.
• Предикаты (predicates). Представляют собой выражения, такие как IN,
ALL, ANY, SOME, LIKE и UNIQUE. Предикаты могут возвращать в качестве
результата значения TRUE, FALSE и в некоторых случаях NULL
(неизвестный результат). Эти три значения являются ключевыми словами
SQL.
• Операторы. Такие операторы, как =, < или >, сравнивают значения и
применяются для создания объединений в синтаксисе секции WHERE или
JOIN. Операторы также называют предикатами сравнения.
• Статистические функции (также называемые агрегатными). Возвращают
одно результирующее
значение,
вычисленное
на
основании
набора данных, например COUNT(), МАХ() и MIN().
• Функции преобразования типа данных. Изменяют тип данных значения
с одного на другой. Наиболее часто используемые функции преобразования –
это CAST() и CONVERT() .
• Другие ключевые слова (или зарезервированные слова), изменяющие
действие команд или управляющие курсором (указателем текущей записи в
наборе результатов запроса), с помощью которого выбираются отдельные
10
строки запроса. Например, модификатор FOR
XML
языка T-SQL
возвращает XML документ вместо традиционного набора данных.
Модификатор FOR XML не включен в ANSI SQL.
Слова, определяемые пользователем, задаются им самим (в соответствии с
синтаксическими правилами) и представляют собой идентификаторы или
имена различных объектов БД. Слова в запросе размещаются также в
соответствии с установленными синтаксическими правилами.
Каждый запрос начинается с глагола, т. е. ключевого слова,
описывающего выполняемое действие, и заканчивается терминатором
(признаком конца), в качестве которого используется точка с запятой (;).
Типичными глаголами являются SELECT (выбрать), CREATE (создать),
INSERT (добавить), UPDATE (изменить), DELETE (удалить), COMMIT
(завершить).
Каждый запрос представляется секциями. Секция описывает некую
законченную конструкцию в запросе. После глагола (первой секции) следует
одна или несколько секций. Они описывают данные, с которыми работает
запрос, или содержат уточняющую информацию о действии, выполняемом
запросом. Каждая секция начинается с ключевого слова, например WHERE
(где), FROM (откуда), INTO (куда) и HAVING (имеющий). Одни секции в
запросе могут изменяться, а другие – нет, одни секции являются
обязательными, другие – необязательными. При этом конкретная структура и
содержимое секции также могут изменяться. Многие секции содержат имена
таблиц или столбцов; некоторые из них могут содержать дополнительные
ключевые слова, константы и выражения.
При дальнейшем описании глаголы, с которых начинаются запросы,
и ключевые слова (слова, которые в SQL зарезервированы для специального
использования и являются частью его синтаксиса) будут записываться
заглавными буквами, чтобы отличать их от пользовательских слов. Но в
общем случае синтаксис SQL-запросов не чувствителен к расположению
текста по строкам и к регистру символов. В табл. 2.4 приведены основные
запросы и операторы SQL СУБД Firebird. Такие же запросы и операторы, за
исключением CREATE OR ALTER, RECREATE и SET TERM, используются
в SQL СУБД Oracle и MS SQL Server.
Таблица 2.4. Основные запросы и операторы SQL
Запрос,
Описание
оператор
Язык определения данных (DDL)
CREATE
Определяет новый объект БД
DROP
Удаляет существующий объект БД
RECREATE
Переопределяет объект БД (при
отсутствии создает, иначе – удаляет
и создает)
ALTER
Изменяет определение
существующего объекта БД
11
Запрос,
оператор
CREATE OR
ALTER
Описание
Создает или изменяет объект БД в
зависимости от того, существует он
или нет
Язык манипулирования данными (DML)
INSERT
Добавляет новые строки в таблицы
БД
DELETE
Удаляет строки из таблиц БД
UPDATE
Обновляет данные, существующие
в таблицах БД
MERGE
Добавляет, удаляет либо обновляет
данные в таблицах БД в
зависимости от заданных условий
Язык выборки данных (DQL)
SELECT
Считывает данные из таблиц БД
Язык управления доступом к данным (DCL)
GRANT
Предоставляет права доступа
REVOKE
Отменяет права доступа
Язык обработки транзакций (TPL)
COMMIT
Завершает текущую транзакцию
ROLLBACK
Отменяет текущую транзакцию
SAVEPOINT
Назначает контрольную точку
внутри транзакции
Процедурный язык (PSQL)
DECLARE
Объявляет переменные и курсоры
EXECUTE
Выполняет запросы и операторы
статического и динамического SQL
FOR
Организует цикл
IF, WHILE
Проверяют условие
SET TERM
Объявляет терминатор
Язык администрирования БД
CREATE
Физически создает БД
DATABASE
CONNECT
Подключает к существующей БД
При выполнении каждый SQL-запрос проходит несколько фаз обработки
[41]:
синтаксический разбор, который включает проверку синтаксиса запроса,
проверку имен таблиц и столбцов в БД, а также подготовку исходных
данных для оптимизатора;
12
проверка привилегий пользователя, проверка действительности имен
системных каталогов, таблиц и названий столбцов;
генерация плана доступа к ресурсам (план доступа – это двоичное
представление выполнимого кода по отношению к данным, сохраняемым
в БД);
оптимизация
плана
доступа,
которая
включает
подстановку
действительных имен таблиц и колонок БД в представление,
идентификацию возможных вариантов выполнения запроса, определение
«стоимости» выполнения каждого варианта, выбор наилучшего варианта
на основе внутренней статистики;
выполнение запроса.
В настоящее время оптимизатор является составной частью любой
промышленной реализации SQL. Работа оптимизатора основана на сборе
статистики о выполняемых запросах и выполнении эквивалентных
алгебраических преобразований с отношениями БД. Такая статистика
сохраняется в системном каталоге БД. Системный каталог является словарем
данных для каждой БД и содержит информацию о таблицах, представлениях,
индексах, колонках, пользователях и их привилегиях доступа. Каждая БД
имеет свой системный каталог, который представляет совокупность
предопределенных таблиц БД.
2.7. ИМЕНА ОБЪЕКТОВ В SQL. КОНСТАНТЫ, ОТСУТСТВУЮЩИЕ ДАННЫЕ
У каждого объекта в БД есть свое уникальное имя (идентификатор).
Имена используются в SQL-запросах для указания объектов БД, над
которыми запрос должен выполнить действие. Имена имеются у баз данных,
таблиц, столбцов, представлений, курсоров, хранимых процедур, триггеров и
пользователей. Часто в SQL поддерживаются также именованные триггеры,
хранимые процедуры, именованные отношения «первичный ключ – внешний
ключ» и формы для ввода данных. В SQL имена должны содержать от 1 до
31 символа [прописные и/или строчные буквы латинского алфавита, цифры,
символ подчеркивания (_), знак доллара ($)], начинаться с буквы и не
содержать пробелы или специальные символы пунктуации:
<идентификатор>::= буква { буква | цифра | _ | $ } …
В СУБД Oracle имена могут содержать только 30 символов.
Идентификатор не может быть ключевым словом, но любые
зарезервированные слова можно встраивать внутрь идентификатора как
часть слова. СУБД Firebird в БД диалекта 3 поддерживает соглашение ANSI
SQL об идентификаторах с разделителями [29].
Большинство компонентов языка не чувствительны к регистру. Поскольку
у языка SQL свободный формат, отдельные SQL-запросы и их
последовательности будут иметь более читаемый вид при использовании
отступов и выравнивания.
13
Для использования зарезервированных слов, символов, чувствительных к
регистру, или пробелов в имени объекта следует заключить это имя в
двойные кавычки. Такой идентификатор – идентификатор с разделителем.
Данные идентификаторы должны быть представлены с двойными кавычками
во всех типах запросов SQL. Существуют определенные схожесть и отличие
обычных имен и имен с разделителями. Например, такие имена, как
"ABONENT" (с разделителями) и ABONENT (обычное), являются
одинаковыми, а имена "Abonent" и ABONENT (так же как, например, и
AboNent) отличаются. Идентификаторы с разделителями были введены для
совместимости со стандартами, но если нет серьезных оснований их
использовать, то рекомендуется использовать обычные идентификаторы.
Если в запросе указано имя таблицы, предполагается, что происходит
обращение к одной из таблиц подключенной БД. К конкретной таблице БД
можно обращаться, только будучи ее владельцем или имея соответствующее
разрешение, данное владельцем. Владельцем БД или какой-то ее таблицы
считается пользователь, который создает ее.
Если в запросе задается имя столбца, SQL сам определяет, в какой из
указанных в этом же операторе таблиц содержится данный столбец. Однако
если в запрос требуется включить 2 столбца из различных таблиц, но
с одинаковыми именами, необходимо указать полные имена столбцов.
Полное имя столбца состоит из имени таблицы, содержащей столбец, и
имени столбца (простого имени), разделенных точкой. Например, полное имя
столбца AccountCD (номер лицевого счета абонента) из таблицы Abonent
имеет следующий вид: Abonent.AccountCD.
В SQL-запросе можно конкретно указывать значения чисел, строк или
даты. В стандарте ANSI/ISO определен формат числовых и строковых
констант, или литералов, которые представляют конкретные значения
данных. Этот формат используется в большинстве СУБД.
Целые и десятичные константы в SQL-запросе представляются в виде
обычных десятичных чисел с необязательным знаком плюс (+) или минус
(–) перед ними.
Константы с плавающей запятой определяются с помощью символа E
и имеют такой же формат, как и в большинстве языков программирования.
Строковые константы заключаются в одинарные кавычки, например
'FIREBIRD'. Если необходимо включить в строковую константу
одинарную кавычку, то следует ввести 2 одинарные кавычки (например,
'IT''S MY LIFE', в таблицу БД это будет помещено как IT'S MY LIFE) либо
использовать альтернативный строковый литерал [40, 42, 43].
Альтернативные строковые литералы были введены в версии Firebird 3.0
для упрощения использования кавычек внутри строковых констант. Такие
литералы задаются в следующем формате:
<альтернативный_строковый_литерал> ::=
{ q | Q } '<альтернативный_стартовый_символ> [<строка>]
<альтернативный_конечный_символ>'.
14
Как <альтернативный_стартовый_символ> может выступать любой
символ. При этом, если <альтернативный_стартовый_символ>::={ ( |{ | [ |
< }, то соответственно <альтернативный_конечный_символ> ::= { ) | } | ] |
> }. В других случаях <альтернативный_конечный_символ> ::=
<альтернативный_стартовый_символ>.
Для альтернативного строкового литерала внутри строки одинарные
кавычки могут использоваться в обычном виде. Например, обычную
строковую константу 'IT''S MY LIFE' можно записать в виде q'!IT'S MY
LIFE!'.
Следует отметить, что не все СУБД поддерживают формат представления
строковых констант по ANSI/ISO. Например, для Oracle характерно
стандартное представление – вместо одинарных кавычек используются
двойные, что усложняет перенос данных из одних баз в другие.
Календарные даты в стандарте представляются в виде строковых констант.
Однако, например, в Oracle константы типа даты имеют специфичный
формат представления. Как и строковые литералы, даты при их явном
представлении берутся в парные одинарные кавычки, однако запись дат
отличается от их записи в других СУБД: 'ДД-MON-ГГ'. В качестве
символов разделителей здесь используются дефисы, месяц указывается
тремя первыми буквами английского названия месяца (например, Mar,
Jan), год же представляется двумя последними десятичными разрядами.
В БД некоторые данные могут отсутствовать из-за того, что они
неизвестны на данный момент или не существуют по своей природе. Если не
вводить эти данные, то в БД будут неопределенные значения, что
недопустимо. Поэтому SQL поддерживает обработку отсутствующих данных
с помощью понятия «отсутствующее значение» – UNKNOWN. Оно
показывает, что в конкретной строке определенный элемент данных
отсутствует или столбец вообще не подходит для этой строки. Говорят, что
значение такого элемента данных установлено в NULL. Однако NULL не
является значением данных, как 0, или 457, или 'Поставщик', и оно не ведет
себя, как какое-то из этих значений. NULL в языке SQL – это состояние,
указывающее, что значение элемента неизвестно или не существует. Во
многих ситуациях состояние NULL требует от СУБД отдельной обработки.
2.8. ТИПЫ ДАННЫХ
В SQL используются основные типы данных, форматы которых могут
несколько различаться для разных СУБД.
Тип данных описывает характеристики информации, хранящейся в
столбце таблицы, и может налагать ограничения на операции, применимые к
данному столбцу. Типы данных определяют столбцы таблицы БД:
при определении (создании) таблицы запросом CREATE TABLE;
определении домена запросом CREATE DOMAIN;
добавлении нового столбца запросом ALTER TABLE.
15
Также типы данных используются при объявлении переменных в
процедурном языке.
В каждой конкретной СУБД возможны свои варианты реализации
отдельных типов данных, однако везде можно выделить определенные
категории типов данных: числовые, символьные, типы дата/время и прочие.
Рассмотрим типы данных, реализованные в СУБД Firebird, MS SQL Server
и Oracle.
Общий вид определения типа данных в Firebird выглядит так:
<тип_данных>::=
{ {SMALLINT | INTEGER | BIGINT | FLOAT | DOUBLE PRECISION}
| {DECIMAL | NUMERIC} [( PRECISION [, SCALE])]
| {DATE | TIME | TIMESTAMP}
| {CHAR | VARCHAR} | BLOB
| {BOOLEAN} }.
В табл. 2.5 приведено описание типов данных SQL, используемых в СУБД
Firebird [29, 40, 42].
Числовые типы данных представлены типами SMALLINT, INTEGER
и BIGINT, NUMERIC и DECIMAL, DOUBLE PRECISION и FLOAT.
Целые числовые типы – это SMALLINT, INTEGER, BIGINT. Они
представляют собой соответственно 16-, 32- и 64-битовый тип со знаком.
Если величина SMALLINT (5 значащих цифр) должна быть меньше или
равна величине INTEGER (10 значащих цифр), то величина BIGINT (19
значащих цифр) должна быть больше или равна величине INTEGER.
Десятичными числовыми типами с фиксированной точкой являются типы
NUMERIC и DECIMAL. При определении типа NUMERIC или DECIMAL
Firebird производит преобразование типов тремя способами:
1) определенные без p и s – всегда сохраняются как INTEGER;
2) определенные с p, но без s – в зависимости от спецификации p,
сохраняются как SMALLINT, INTEGER или BIGINT;
3) определенные с p и s – в зависимости от спецификации p, сохраняются
как SMALLINT, INTEGER или BIGINT.
В табл. 2.6 содержатся сведения о том, как Firebird сохраняет десятичные
типы данных NUMERIC (или DECIMAL). Например, если определить
десятичный тип с p£9 и s£3, то тип NUMERIC(9,3) будет преобразован в
INTEGER, а приняв определение для p³10 и s³4, получим тип BIGINT.
Числовыми типами с плавающей точкой являются типы DOUBLE
PRECISION и FLOAT. В этих типах положение десятичной точки не
зафиксировано. Столбцы с типом DOUBLE PRECISION или FLOAT следует
определять, когда нужно хранить числа с изменяющимся масштабом.
Таблица 2.5. Типы данных SQL, используемые в СУБД Firebird
Тип
Размер Диапазон/Точно
Описание
данных
сть
SMALLI 16 бит От –32768 до
Знаковые целые
NT
32767
числа (короткие)
16
INTEGER 32 бита От –2147483648 Знаковые целые
до 2147483647 числа
BIGINT 64 бита От –
Знаковые целые
922337203685477 числа (большие)
5808
до
922337203685477
5807
(от -2^63 до
2^63-1)
NUMERI Меняет p=1 до 18; s=1 до Масштабируемые
C(p,s)
ся
18
десятичные числа;
p - точность; s число знаков после
запятой (масштаб);
p³s
DECIMA
То же, что и
L(p,s)
NUMERIC(p,s)
DOUBLE 64 бита Положительные Числа с
PRECISI
от 2.225*10^-308 плавающей
ON
до 1.797*10^308 запятой высокой
Отрицательные точности; 15
от -1.797*10^308 разрядов после
запятой
FLOAT 32 бита От 1.175*10^-38 Числа с
до 3.402*10^38 плавающей
От -3.402*10^38 запятой; 7
разрядов
после запятой
CHAR(n) n
От 1 до 32767
Строки символов
символ байт
постоянной длины
ов
0 < n <= 32767
VARCHA n
От 1 до 32765
Строки символов
R(n)
символ байт
переменной длины
ов
0 < n <= 32765
BOOLEA 8 бит True, False
Логический тип
N
данных,
принимающий
только два
возможных
значения
17
DATE
32 бита От 1 января 1 г.
до 31 декабря
9999 г.
TIME
32 бита От 00:00:00.0000
до 23:59:59.9999
TIMESTA 64 бита Дата от 1 января
MP
1 г.
до 31 декабря
9999 г. и
время от
00:00:00.0000
до 23:59:59.9999
BLOB
Меняет Нет
ся
Календарная дата
Время дня
Календарная дата
и время
Динамически
изменяемый;
для хранения
больших объемов
данных
Таблица 2.6. Неявное преобразование типов данных
Определяемый
тип
Тип,
сохраняемы
й Firebird
NUMERIC
INTEGER
NUMERIC(4)
SMALLINT
NUMERIC(9)
INTEGER
NUMERIC(10)
BIGINT
NUMERIC(4,2) SMALLINT
NUMERIC(9,3) INTEGER
NUMERIC(10,4) BIGINT
DECIMAL
INTEGER
DECIMAL(4)
INTEGER
DECIMAL(9)
INTEGER
DECIMAL(10)
BIGINT
DECIMAL(4,2) INTEGER
DECIMAL(9,3) INTEGER
DECIMAL(10,4) BIGINT
Символьные типы данных представлены типами CHAR и VARCHAR.
18
Тип CHAR определяет строки фиксированной длины. Если при вводе
строка символов меньше объявленного значения длины n, то недостающие
символы заполняются пробелами, а в случае превышения – усекаются.
Тип VARCHAR представляет строки переменной длины. В отличие от
типа CHAR при сохранении в БД недостающие символы не заполняются
пробелами. При чтении считываются только введенные символы, а затем
дополняются пробелами.
Символьные типы фиксированной длины не могут превышать 32767 байт
абсолютной длины; для типов переменной длины этот предел уменьшается
на 2 байта, которые при сохранении строки содержат счетчик символов [29].
Логический тип данных представлен типом BOOLEAN, реализованным,
начиная с версии Firebird 3.0. Данный тип данных принимает значения TRUE
или FALSE, также поддерживает значение UNKNOWN, аналогичное
значению NULL. Проверка на то или иное значение осуществляется с
помощью оператора IS в виде
<выражение> IS {TRUE | FALSE}
или без явного использования TRUE и FALSE в виде
{ <выражение> | NOT <выражение> }.
Значения типа BOOLEAN могут быть преобразованы в строковое
значение с помощью функции преобразования типов CAST, в другие типы
данных не конвертируются.
Типы данных даты и времени представлены типами DATE, TIME
и TIMESTAMP.
Формат типа DATE задается в виде 'ДД.MM.ГГГГ' или 'ГГГГ.MM.ДД',
'MM/ДД/ГГГГ' или 'ГГГГ/ММ/ДД', 'ГГГГ-ММ-ДД' ('ДД-МON-ГГГГ',
'ДД,МON,ГГГГ', 'ДД МON ГГГГ', 'ДДМONГГГГ') или 'ММ-ДД-ГГГГ',
'MM:ДД:ГГГГ' или 'ГГГГ:ММ:ДД'. При этом ММ – 2 цифры месяца (MON –
первые 3 буквы в английском названии месяца), ДД – 2 цифры дня, ГГГГ – 4
цифры года.
Для формата 'ДД-MON-ГГГГ' в качестве MON употребляются первые
3 буквы латинского названия месяца (табл. 2.7).
Таблица 2.7. Сокращения названий месяцев
Название
Используемое
месяца
обозначение
Январь
JAN
Февраль
FEB
Март
MAR
Апрель
APR
Май
MAY
Июнь
JUN
Июль
JUL
Август
AUG
Сентябрь
SEP
19
Октябрь
Ноябрь
Декабрь
OCT
NOV
DEC
Например, дату 17 декабря 2011 г. можно записать как один из следующих
вариантов: '17.12.2015', '2015.12.17', '12/17/2015', '2015/12/17', '2015-12-17',
'17-DEC-2015', '17,DEC,2015', '17 DEC 2015', '17DEC2015', '12-17-2015',
'12:17:2015', '2015:12:17'.
Тип данных TIME включает время. Чтобы задать время, необходимо
использовать описание 'ЧЧ/МН/СК' или 'ЧЧ:МН:СК'. При этом ЧЧ – 2 цифры
часов, МН – 2 цифры минут, СК – 2 цифры секунд.
Чтобы задать дату и время вместе, необходимо использовать тип
TIMESTAMP с описанием 'MM/ДД/ГГГГ/ЧЧ/МН/СК' или 'ДД.ММ.ГГГГ
ЧЧ:МН:СК'.
В Firebird существует четыре предварительно определенные константы
даты [29]:
1) 'NOW' типа TIMESTAMP возвращает текущую дату и текущее время;
2) 'TODAY' типа DATE возвращает текущую дату;
3) 'TOMORROW' типа DATE возвращает завтрашнюю дату;
4) 'YESTERDAY' типа DATE возвращает вчерашнюю дату.
Эти константы при использовании необходимо преобразовывать к
соответствующему типу, например так:
DATE 'YESTERDAY'.
Существуют контекстные переменные даты и времени:
CURRENT_TIMESTAMP типа TIMESTAMP – возвращает текущую
дату, время и часовой пояс;
CURRENT_DATE типа DATE – возвращает текущую дату и время;
CURRENT_TIME типа TIME возвращает текущее время.
Кроме этого, существуют контекстные переменные текущего соединения:
CURRENT_USER типа VARCHAR (128) возвращает имя пользователя,
подключенного к БД;
CURRENT_ROLE типа VARCHAR (31) возвращает имя роли
подключенного пользователя;
CURRENT_CONNECTION возвращает номер текущего подключения
к БД.
Большие двоичные объекты (Binary Large Object, BLOB) в Firebird
представлены типом BLOB. Это тип данных с динамически изменяемым
размером для хранения больших данных, таких как графика, тексты,
оцифрованные звуки. Типы BLOB могут хранить содержимое файлов,
сгенерированных другими приложениями, такими как текстовые процессоры,
программное обеспечение CAD или редакторы XML. Столбцы BLOB не
могут быть проиндексированы.
Если в олной или в нескольких таблицах БД присутствуют столбцы,
обладающие одними и теми же характеристиками, можно описать тип такого
столбца и его поведение через домен, а затем поставить в соответствие
20
каждому из одинаковых столбцов имя домена. Домен определяет все
потенциальные значения, которые могут быть присвоены атрибуту.
Получить список всех типов данных можно из системной таблицы
RDB$TYPES с помощью запроса
SELECT * FROM RDB$TYPES;.
Типы данных в Oracle, как и в других СУБД, можно разбить на несколько
больших категорий [25].
Символьные типы. Символьные типы данных служат для хранения
строковых значений, в том числе представлений числовых значений в виде
строк.
Тип CHAR позволяет хранить символьные значения фиксированной
длины от 1 до 2000 символов. Если длина явно не указана, она
предполагается равной 1. Если длина присваиваемого значения меньше
указанной в определении типа CHAR, то Oracle автоматически дополнит его
пробелами.
Тип VARCHAR2 предназначен для хранения символьных строк
переменной длины. В определении этого типа можно указать длину, но она
интерпретируется как максимальная. Значения, присваиваемые столбцу или
переменной типа VARCHAR2, не дополняются пробелами. Максимальная
возможная длина типа VARCHAR2 – 4000 символов. Для хранения данных
типа VARCHAR2 обычно требуется меньше места, чем для данных типа
CHAR, поскольку сохраняются только значимые символы, записанные в
столбец.
Типы NCHAR и NVARCHAR2 содержат символьные данные
соответственно фиксированной или переменной длины, представленные в
кодировке, отличной от используемой в остальных частях базы данных.
Кодировка задается при создании базы. Можно также указать
дополнительную кодировку [эту возможность обеспечивает подсистема
National Language Set (NLS)]. Эта дополнительная кодировка и используется
для столбцов типа NCHAR и NVARCHAR2. Например, могут быть поля,
содержащие японские символы, в то время как вся остальная информация БД
хранится в английской кодировке. Тогда при создании БД необходимо в
качестве дополнительной указать кодировку, поддерживающую японские
символы, а указанным столбцам назначить тип NCHAR или NVARCHAR2.
Начиная с версии Oracle9i, можно указать, что размер столбцов типа
NCHAR и NVARCHAR2 должен измеряться в символах, а не в байтах. Таким
образом, если задать размер столбца равным семи символам, то при условии,
что для хранения символа отведено два байта, он будет автоматически
преобразован в 14 байт.
Тип LONG содержит символьные данные размером до 2 Гбайт. Тип
LONG унаследован из ранних версий СУБД Oracle. Сейчас для хранения
символьных данных большого объема Oracle рекомендует применять типы
CLOB и NCLOB. На использование типа LONG в таблицах и запросах
накладывается много ограничений, например, нельзя использовать его в
конструкциях WHERE, GROUP BY, ORDER BY и CONNECT BY, а также в
21
командах SQL с квалификатором DISTINCT. По столбцу типа LONG также
нельзя создать индекс.
Типы CLOB и NCLOB до версии Oracle Database 10g предназначались для
хранения символьных данных размером до 4 Гбайт. А в этой версии объем
может достигать 128 Тбайт в зависимости от размера блока базы данных. Тип
NCLOB позволяет хранить данные в кодировках, поддерживаемых NLS.
Начиная с версии Oracle Database 10g, между типами CLOB и NCLOB
производится неявное преобразование.
Числовые типы. В СУБД Oracle числа хранятся в стандартном
внутреннем формате переменной длины, обеспечивающем точность до 38
разрядов.
Единственный числовой тип данных, поддерживаемый Oracle, – это
NUMBER. Тип NUMBER, заданный для столбца или переменной,
автоматически обеспечивает точность в 38 разрядов. Объявление типа
NUMBER может содержать два квалификатора:
столбец NUMBER(разрядность, масштаб)
Разрядность показывает общее количество значащих разрядов в
представлении числа и может принимать целые значения вплоть до 38. Если
разрядность явно не указана, по умолчанию подразумевается значение 38.
Масштаб представляет собой количество цифр справа от десятичной точки;
по умолчанию принимается равным 0. Если масштаб отрицателен, Oracle
округляет число до указанного разряда слева от десятичной точки.
Для хранения числовых данных в Oracle используется только тип
NUMBER. Все определенные в стандарте ANSI типы данных:
DECIMAL/DEC, NUMBER, INTEGER/INT, SMALLINT, DOUBLE
PRECISION и REAL представлены в базе данных типом NUMBER. В языке
или продукте, который используется для доступа к данным в БД Oracle, эти
типы могут поддерживаться, но хранятся они все равно в столбцах типа
NUMBER [25].
В версии Oracle Database 10g добавлены типы BINARY_FLOAT и
BINARY_DOUBLE, поддерживающие разрядность, определенную в
стандарте IEEE 754_1985. В версии Oracle Database 11g введена поддержка
типа SIMPLE_INTEGER.
Тип Date. Как и в случае типа NUMBER, дата и время хранятся во
внутреннем формате. При вводе дат подразумевается формат DD_MON_YY
HH:MI:SS, где DD – двузначный день месяца, MON – трехзначное
сокращенное название месяца, YY – двузначный номер года, а HH, MI и SS –
двузначное представление часа, минуты и секунды соответственно. Если
время не указано, по умолчанию подразумеваются нули.
Изменить формат ввода даты для конкретного экземпляра позволяет
параметр NLS_DATE_FORMAT. Можно сделать это и для одного сеанса с
помощью SQL_команды ALTER SESSION или в конкретном запросе,
воспользовавшись встроенной функцией TO_DATE.
В Oracle SQL поддерживаются арифметические операции над датами, в
которых целая часть представляет дни, а дробная – часы, минуты и секунды.
22
Например, если добавить .5 к значению даты, то результатом будет значение
даты и времени, на 12 часов превышающее начальное значение. Приведем
несколько примеров арифметических операций с датами:
12_DEC_07 + 10 = 22_DEC_07
31_DEC_07:23:59:59 + .25 = 1_JAN_2008:5:59:59
Начиная с версии Oracle9i, поддерживаются два интервальных типа
данных: INTERVAL YEAR TO MONTH и INTERVAL DAY TO SECOND для
хранения промежутков времени. Значения этого типа можно применять в
арифметических операциях с датами.
Поддерживаются контекстные переменные даты и времени, например
наиболее часто употребимые переменная SYSDATE, которая возвращает
текущую дату со временем, переменная SYSTIMESTAMP, возвращающая
текущую системную дату и время (в том числе доли секунды и часового
пояса), и другие.
Прочие типы данных. Помимо основных типов, предназначенных для
хранения символов, чисел и дат, Oracle поддерживает ряд
специализированных типов данных.
Типы RAW и LONG RAW. Обычно сервер БД Oracle не только хранит, но
и интерпретирует данные. Когда данные запрашиваются или экспортируются
из базы, может потребоваться то или иное преобразование. Например, при
выводе данных из столбца типа NUMBER в файл записываются внешние
представления чисел, а не значения во внутреннем формате.
Типы данных RAW и LONG RAW позволяют предотвратить
интерпретацию со стороны Oracle. Если указывается один из таких типов, то
Oracle сохраняет данные в виде именно той последовательности битов,
которая была ему предъявлена. Типы RAW обычно применяются для
хранения объектов в характерном для них внутреннем формате, например
растровых изображений. Тип RAW позволяет сохранить до 2 Кбайт, а тип
LONG RAW – до 2 Гбайт.
Тип ROWID. Это специальный тип столбца, называемый псевдостолбцом
(pseudocolumn). К псевдостолбцу ROWID можно обращаться так же, как к
обычному столбцу, в SQL-запросе SELECT. Псевдостолбец ROWID есть в
каждой строке БД Oracle и представляет собой адрес этой конкретной строки.
Псевдостолбец ROWID имеет тип ROWID.
ROWID устанавливает связь с конкретным местоположением на диске,
следовательно, это самый быстрый способ выборки отдельной строки.
Однако ROWID для строки может измениться в результате записи дампа
базы данных или ее перезагрузки. Поэтому рекомендуем использовать
значение ROWID только в пределах одной транзакции. Например, не стоит
сохранять ROWID строки, закончив работу с ней в приложении.
Задать значение ROWID с помощью SQL-запроса невозможно.
В версии Oracle8 формат псевдостолбца ROWID изменился. Теперь он
включает не только имя файла данных, номер блока и строки, но также
идентификатор объекта в базе данных. Чтобы понять, как физически
23
хранятся строки в базе данных, можно разобрать значение, полученное из
псевдостолбца ROWID.
Разрешается определить столбец или переменную типа ROWID, но Oracle
не гарантирует, что значение, помещенное в такую переменную или столбец,
будет корректным идентификатором ROWID.
Тип ORA_ROWSCN. Начиная с версии Oracle Database 10g,
поддерживается псевдостолбец ORA_ROWSCN, где хранится системный
номер изменения (SCN), соответствующий последней транзакции, в которой
строка была изменена. Этот псевдостолбец позволяет легко проверить, была
ли строка модифицирована с момента начала транзакции.
Тип LOB. Тип данных больших объектов (LOB) позволяет хранить
данные объемом до 4 Гбайт. Есть три разновидности типа LOB:
• CLOB для хранения символьных данных;
• NCLOB для хранения символьных данных в национальной кодировке;
• BLOB для хранения двоичных данных.
Можно указать, должны ли данные типа LOB храниться в самой базе или
во внешнем файле, на который указывает значение в столбце.
Данные типа LOB могут участвовать в транзакциях. При выборке таких
данных Oracle возвращает указатель. Для манипуляции самими данными,
хранящимися в столбце типа LOB, можно воспользоваться встроенным
PL/SQL_пакетом DBMS_LOB или интерфейсом уровня вызовов OCI.
Для преобразования данных типа LONG в LOB в версию Oracle9i
поддержка LOB включена в большинство функций, предназначенных для
работы с типом LONG. Кроме того, в команду ALTER TABLE добавлена
возможность автоматического преобразования типа LONG в LOB.
Тип BFILE. Тип данных BFILE – это указатель на файл, хранящийся вне
базы данных Oracle. Поэтому столбцы и переменные типа BFILE не
участвуют в транзакциях, а хранящиеся в них данные доступны только для
чтения. Объем данных, которые можно сохранить в столбце типа BFILE,
определяется ограничением операционной системы на размер файла.
Тип XMLType. В рамках поддержки XML в версии Oracle9i появился тип
данных XMLType. В столбце такого типа можно хранить XML-документ как
большой символьный объект. Соответствующие встроенные функции
позволяют извлекать из документа отдельные узлы. Кроме того, по любому
узлу документа типа XMLType можно строить индексы.
Типы данных, определяемые пользователем
Начиная с версии Oracle8, пользователи могут создавать собственные
составные типы данных, комбинируя описанные выше стандартные типы
Oracle. Кроме того, разрешается создавать объекты, состоящие из
стандартных и пользовательских типов данных.
Типы AnyType, AnyData, AnyDataSet. В версию Oracle9i включены три
новых типа данных, позволяющие явно определять структуры, которые
невозможно представить ни одним из существующих типов. Эти типы
должны быть определены в программных модулях, обучающих Oracle
обрабатывать данные соответствующего типа.
24
MS SQL Server реализует "классические" типы данных (числовые,
строковые, дату и время), а также нестандартные пространственные типы,
типы XML [23]. Некоторые типы данных с целью совместимости со
стандартом SQL имеют синонимы.
Приведенная классификация типов данных MS SQL Server в основном
соответствует тому, что указано в документации по SQL Server.
Числовые типы данных можно разделить на две подгруппы: точные
числа, или
числа с фиксированной точностью (Exact Numerics), и
приближенные числа, или числа с плавающей точкой (Approximate Numerics,
Float). В первую подгруппу включены типы данных: BIT, TINYINT,
SMALLINT, INT, BIGINT, NUMERIC, DECIMAL, SMALLMONEY, MONEY.
Вторая подгруппа включает типы данных FLOAT и REAL.
Тип BIT служит для представления целочисленных данных со
значениями только 1 или 0. Фактически служит для реализации логического
типа данных, для представления значений True и False, Yes и No. Тип BIT –
это аналог типа BOOLEAN СУБД Firebird.
Тип TINYINT служит для представления целых чисел в интервале 0-255.
В СУБД Firebird нет эквивалентного типа.
В СУБД MS SQL Server, в отличие от Firebird, отдельно выделены типы
данных для представления финансовых данных. Типы SMALLMONEY и
MONEY служат для представления положительных и отрицательных
денежных сумм: MONEY представляет суммы из интервала от минус
922337203685477.5808 до 922337203685477.5807, а SMALLMONEY – от
минус 214748.3648 до 214748.3647. Как было отмечено ранее в п. 1.2, в
учебной БД Firebird, ввиду отсутствия специального типа данных для
хранения денежных сумм, определен домен Money, основанный на типе
NUMERIC.
Символьные данные включают две подгруппы: обычные символьные
строки (Character Strings) и символьные строки в Юникоде (Unicode Character
Strings). В первую подгруппу включены следующие типы данных: CHAR,
VARCHAR, TEXT. Во вторую подгруппу входят типы данных: NCHAR,
NVARCHAR, NTEXT.
Тип TEXT представляет данные из ASCII-символов, размер которых
может превышать 8 Кбайт. Тип фактически является аналогом типа BLOB с
подтипом SUB_TYPE TEXT в Firebird.
Типы дата и время (Date and Time) содержат следующие типы данных:
DATETIME, SMALLDATETIME, DATE, TIME, DATETIMEOFFSET,
DATETIME2.
Как и в других СУБД, поддерживаются контекстные переменные даты и
времени. Среди них такие переменные, как CURRENT_TIMESTAMP и
GETDATE(), возвращающие текущие дату и время, GETUTCDATE(),
возвращающая текущие дату и время в формате UTC (YYYY-MM-DD
HH:MM:SS).
Двоичные строки (Binary Strings) включают следующие типы данных:
BINARY, VARBINARY, IMAGE.
25
В MS SQL Server реализованы пространственные типы данных (Spatial
Data Types). К ним относятся следующие типы данных: GEOMETRY и
GEOGRAPHY. Тип данных GEOMETRY работает исключительно с данными
в плановой (прямоугольной) системе координат, а тип данных GEOGRAPHY
понимает
географическую
систему
координат
долгота/широта,
представленную в градусах.
Также SQL Server содержит прочие типы данных (Other Data Types), куда
включены типы данных, не очень подходящие для других категорий:
SQL_VARIANT, TIMESTAMP, UNIQUEIDENTIFIER, HIERARCHYID,
CURSOR, TABLE, XML.
Помимо использования системных типов данных, MS SQL Server
позволяет создавать и затем использовать пользовательские типы данных.
Пользовательские типы данных MS SQL Server фактически являются
аналогом доменов Firebird.
Язык SQL обеспечивает возможность использования в различных
операциях не только значений тех типов, для которых предопределена
операция, но и значений типов, неявным или явным образом приводимых к
требуемому типу. Кроме неявного преобразования типов данных (например,
преобразования десятичных типов в Firebird, см. табл. 2.6), существуют
универсальные функции преобразования, с помощью которых значения
одного типа явно преобразовываются в значения другого типа, если такие
изменения вообще возможны. В большинстве СУБД функция
преобразования типов представлена функцией CAST.
Функция используется в виде
CAST (<выражение> AS <тип данных>).
Множество типов, разрешенных для преобразования функцией CAST,
определяется реализацией СУБД. Так, в Firebird можно преобразовать
практически любые системные типы данных, а в Oracle, кроме
преобразования встроенных типов, можно преобразовывать выборки со
множеством записей в массивы.
Например, преобразовать значение типа BOOLEAN (значение столбца
Executed из таблицы Request учебной БД) в строковое значение можно
следующим образом:
CAST (EXECUTED AS VARCHAR(1)).
Многие СУБД, помимо функции CAST, предоставляют также
дополнительные функции преобразования типов данных. Подробно функция
CAST, а также некоторые дополнительные функции преобразования типов
будут рассмотрены далее в п. 3.2.3.2.
2.9. ВЫРАЖЕНИЯ
Выражения представляют собой комбинацию идентификаторов,
функций, операций, констант и других объектов. Выражение может быть
использовано в качестве аргумента в хранимых процедурах или запросах.
Выражение состоит из операндов (собственно данных) и операций и
служит для вычисления единого агрегированного значения. В качестве
26
операндов могут выступать константы, переменные, имена столбцов,
функции, подзапросы.
Операции – это определенный вид действий над элементами данных,
после выполнения которых получается в качестве результата новое значение.
Элементы данных, используемые при выполнении операций, называются
операндами или аргументами. Операции представляются в виде
специальных символов или ключевых слов.
В Firebird предусмотрено несколько категорий операций (табл. 2.8),
большинство из которых определены стандартом и применимы и в других
СУБД [39]. Исключение составляют некоторые специальные предикаты и
операция конкатенации, которая, например в MS SQL Server, может
обозначаться не двойной вертикальной чертой ||, а знаком плюса +.
Таблица 2.8. Категории операций
Категория
Описание
операции
Унарная
Выполняется лишь над одним
выражением любого типа данных из
категории числовых типов данных
Строковая
Операция конкатенации (||), которая
соединяет строки, являющиеся ее
операндами
Арифметиче +, -, *, /
ские
Логические Проверяют истинность условий AND,
OR, NOT
Предикаты
Сравнивают значение с другим
сравнения
значением или выражением (=, <>, !=,
<, >, <=, !<, >=, !>)
Выбор
Возвращает различные результаты в
зависимости от определенных условий
(CASE)
Специальны Расширяют возможности операций
е предикаты сравнения (BETWEEN,
CONTAINING, IS [NOT] DISTINCT
FROM, EXIST, IN, IS NULL, LIKE,
SIMILAR, SINGULAR, STARTING
WITH)
Кванторы
Расширяют возможности предикатов
сравнения (ANY, ALL)
В SQL определено понятие скалярного выражения [21]. Скалярное
выражение – это выражение, вырабатывающее результат некоторого типа,
специфицированного в стандарте. Скалярные выражения являются основой
языка SQL, поскольку, хотя это реляционный язык, все условия, элементы
27
списков выборки и т. д. базируются именно на скалярных выражениях.
В стандарте SQL имеется несколько разновидностей скалярных выражений.
К числу наиболее важных разновидностей относятся численные выражения
(числовой тип данных); строковые выражения (символьные строки);
выражения со значениями «даты-времени»; логические выражения.
Основой логического выражения являются предикаты. Предикат – это
простое выражение, утверждающее некоторый факт. Значение предиката,
принимающего один или более аргументов, может быть истинным (TRUE),
ложным (FALSE) и неопределённым (UNKNOWN). В SQL ложный и
неопределённый результаты трактуются как ложь. Решения принимаются
в соответствии с результатом вычисления предиката – истина или ложь.
Можно сказать, что предикат – это логическая функция, принимающая
значения
«истина»
или
«ложь».
Синтаксическими
элементами,
проверяющими истинность, являются:
в языке DDL: CHECK для проверки условий достоверности данных;
в языке DQL: WHERE (для условий поиска), HAVING (для условий
выбора групп), ON (для условий соединения) и случаи проверки
множества условий: CASE, COALESCE, NULLIF, IIF;
в языке PSQL: IF (универсальная проверка истина/ложь), WHILE (для
проверки условий цикла) и WHEN (для проверки кодов исключения).
Часто условия являются не простыми предикатами, а группой нескольких
предикатов (связанных логическими операциями AND или OR), каждый
из которых при вычислении делает вклад в вычисление общей истинности.
Для построения всех этих видов выражений могут использоваться
константы, переменные, имена столбцов, функции и подзапросы,
возвращающие результат соответствующего типа в зависимости от
разновидности скалярного выражения. Во все эти виды выражений могут
входить CASE-выражения (выражения с переключателем), которые
представляют собой либо операцию CASE, либо функции выбора вариантов.
Более подробно CASE-выражения будут рассмотрены в разд. 3.2.3.5.
Простым примером численного выражения является 22. Следующее
выражение является более сложным и использует функцию и строковую
операцию (||):
'Год подачи ремонтной заявки' || EXTRACT (YEAR FROM IncomingDate).
Следует
отметить
определенные
особенности
использования
арифметических операций в некоторых СУБД [29]. В Firebird при сложении и
вычитании количество дробных знаков результата равно максимальному
количеству дробных знаков у операндов. При умножении и делении
результат имеет количество дробных знаков, равное сумме дробных знаков
обоих операндов. Так при вычислении частного от деления целого числа на
целое результат округляется до ближайшего меньшего целого. Например,
результатом деления целого числа 1 на целое число 3 будет ноль, что может
оказаться неожиданным. Для того чтобы получить дробное число нужной
точности, необходимо делимое или делитель или оба представить в виде
28
соответствующего дробного числа, например 1.00/3 или 1/3.0. В
определенных случаях эта операция, примененная к значениям столбцов
таблиц, может быть полезной для приведения к нужной точности и
получения корректного результата вычисления сложного выражения.
СУБД Oracle при выполнении арифметических операций дает более
предсказуемый результат. Результатом деления целого числа 1 на целое
число 3 будет вещественное число 0.333… с высокой точностью. Точность
результата не зависит от точности операндов, а зависит от фактического
результата вычисления.
MS SQL Server, как и Firebird, обладет некоторыми особенностями при
выполнении арифметических операций. Тип результата арифметического
оператора зависит от типов входных значений. Если операнды имеют
различные типы, то при необходимости они будут приведены к общему
базовому типу в соответствии с иерархией типов. Если обе операции имеют
различные числовые базовые типы, то проводится преобразование типов.
Например, при сложении двух значений, одно из которых имеет тип
DECIMAL, а второе — тип DOUBLE, сначала производится приведение
десятичного значения к типу DOUBLE. Затем выполняется операция
сложения, в результате которой получается значение типа DOUBLE.
Нетипизированные элементарные значения приводятся к базовому
числовому типу второго операнда или к типу DOUBLE, если оба операнда не
типизированы. Так, результатом деления целого числа 1 на целое число 3
будет ноль. Операция деления / обозначает целочисленное деление (а
именно, дает в результате неполное частное), если операнды являются
целыми числами. Если необходимо получить десятичное число, то нужно
привести хотя бы один операнд к вещественному типу. При этом результат
деления может иметь большую точность, чем сумма дробных знаков обоих
операндов. При умножении, однако, результат имеет количество дробных
знаков, равное сумме дробных знаков обоих операндов. Выполнить
приведение к нужной точности в большинстве СУБД можно и с помощью
функции CAST, используемой для преобразования типов данных в языке
SQL.
При использовании арифметических и строковых выражений также
следует обратить внимание на то, что в случае, если значение одного из
операндов выражения установлено в NULL, то и окончательный результат
будет NULL. В Oracle неопределенное значение в выражениях, образованных
путем конкатенации, рассматривается как пустая строка. Поэтому, как уже
было сказано, во многих ситуациях состояние NULL требует отдельной
обработки.
Если сложное выражение содержит несколько категорий операций,
порядок выполнения этих операций определяется их приоритетом. Уровни
приоритета операций SQL показаны в табл. 2.9.
Таблица 2.9. Приоритеты операций SQL
29
Урове
нь
1
Операции
Унарные арифметические операции +, -,
операция PRIOR
2
Арифметические операции *, /
3
Бинарные арифметические операции +, -,
символьная операция | |
4
Все операции сравнения
5
Логическая операция NOT
6
Логическая операция AND
7
Логическая операция OR
Чтобы
изменить
последовательность
выполнения
операций,
предписываемую приоритетом, в выражениях можно использовать круглые
скобки. Выражения, заключенные в скобки, вычисляются в первую очередь.
Без скобок операции с одинаковым приоритетом выполняются слева направо.
Порядок выполнения операций в выражении оказывает существенное
влияние на результирующее значение.
30