- •Оглавление
- •Введение
- •Лекция 1. Основные понятия баз данных и стстем управления базами данных
- •Лекция 2. Схема базы данных и модели данных
- •Лекция 3. Технология проектирования баз данных
- •Лекция 4. Предпроектное обследование (системный анализ) предметной области
- •7. Нужно ли обновлять технические средства? и если нужно, то каким образом?
- •Лекция 5. Инфологичфеское проектирование баз данных
- •Лекция 6. Реляционная модель данных
- •Лекция 7. Даталогическое проектирование (на примере реляционных баз данных)
- •Лекция 8. Технологии манипулирования данными в базах данных. Основы sql
- •Лекция 9. Физическое проектирование базы данных
- •Список рекомендуемой литературы
Лекция 8. Технологии манипулирования данными в базах данных. Основы sql
Стандартный язык запросов к реляционным СУБД - SQL. Формы SQL. Инструкции, предложения, термины (идентификаторы, константы, операторы, выражения) и объекты. Операторы SQL: 1) операторы определения данных (Data Definition Language, DDL); 2) операторы манипуляции данными (Data Manipulation Language, DML); 3) операторы определения доступа к данным (Data Control Language, DCL); 4) операторы управления транзакциями (Transaction Control Language, TCL). Преимущества и недостатки использования SQL. «Язык» QUERY-BY-EXAMPLE.
Восьмая лекция курса «Технологии манипулирования данными в базах данных. Основы SQL» посвящена знакомству с основами манипулирования данными в базах данных. В данной лекции рассматриваются основные конструкции языка SQL: 1) операторы определения данных (Data Definition Language, DDL); 2) операторы манипуляции данными (Data Manipulation Language, DML); 3) операторы определения доступа к данным (Data Control Language, DCL); 4) операторы управления транзакциями (Transaction Control Language, TCL).
SQL (англ. structured query language — «язык структурированных запросов») – формальный непроцедурный язык программирования, применяемый для описания, создания, модификации и извлечения данных в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных.
SQL можно назвать языком программирования, при этом он не является тьюринг-полным (т.е. на нем невозможно реализовать любую вычислимую функцию), но вместе с тем стандарт языка спецификацией SQL/PSM предусматривает возможность его процедурных расширений.
SQL основывается на исчислении кортежей. Исчисление кортежей – направление реляционного исчисления, где областями определения переменных являются тела отношений базы данных, то есть допустимым значением каждой переменной является кортеж тела некоторого отношения.
Для обеспечения возможности переносимости приложений с одной системы управления базами данных на другую в 1986 году был разработан стандарт языка SQL. В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже (SQL:2008).
Тем не менее, язык SQL может существенно различаться у различных производителей систем управления базами данных: производители данных систем часто предлагают свои собственные «расширения» языка и, часто, не поддерживают стандарт полностью.
При всех своих изменениях SQL остаётся единственным механизмом связи между прикладным программным обеспечением и базой данных. В то же время современные системы управления базами данных, а также информационные системы, использующие системы управления базами данных, предоставляют пользователю развитые средства визуального построения запросов.
Структурированный язык запросов SQL реализуется в следующих формах: 1) интерактивный SQL (позволяет конечному пользователю в интерактивном режиме выполнять SQL-операторы); 2) статический SQL (реализовывается как встроенный SQL или модульный SQL, операторы которого определены уже в момент компиляции программы); 3) динамический SQL (позволяет формировать операторы SQL во время выполнения программы); 4) встроенный SQL (позволяет включать операторы SQL в код программы на другом языке программирования (например, С#)).
Язык SQL представляет собой совокупность инструкций, предназначенных для работы с базами данных. Инструкции языка SQL содержат описание набора данных и состоит из нескольких частей, называемых предложениями (каждое предложение в инструкции SQL имеет свое назначение и необязательно может быть использована ).
Каждое предложение SQL состоит из терминов, которые можно сравнить с частями речи: идентификатор (имя, используемое для идентификации объекта базы данных), оператор (ключевое слово, которое представляет действие или изменяет его), константа (неизменяемое значение), выражение (сочетание идентификаторов, операторов, констант и функций, предназначенное для вычисления одного значения). Инструкция языка SQL начинается оператором и заканчивается точкой с запятой. Согласно общепринятому стилю программирования, операторы (и другие зарезервированные слова) в SQL обычно рекомендуется писать прописными буквами.
Оператор языка SQL – это ключевое слово, указывающее на действие, которое необходимо выполнить над одним или несколькими выражениями. Любой оператор реляционной алгебры может быть выражен подходящим оператором SQL. То есть язык SQL является реляционно полным.
Операторы SQL делятся на: 1) операторы определения данных (Data Definition Language, DDL); 2) операторы манипуляции данными (Data Manipulation Language, DML); 3) операторы определения доступа к данным (Data Control Language, DCL); 4) операторы управления транзакциями (Transaction Control Language, TCL).
Операторы языка определения данных используется для управления (создания, модификации и удаления) объектами базы данных.
В стандарте SQL различают следующие виды объектов: база данных (DATABASE); таблица (TABLE); столбец (COLUMN); индекс (INDEX); представление (VIEW); хранимая процедура. Для каждой конкретной системы управления базы данных существует свой набор объектов базы данных, который может значительно расширять набор объектов, предусмотренный стандартом.
Индекс (англ. index) – объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска.
Представление (англ. view, иногда используются названия «вид»») – виртуальная (логическая) таблица, представляющая собой поименованный запрос (синоним к запросу), который будет подставлен как подзапрос при использовании представления.
В отличие от обычных таблиц реляционных баз данных, представление не является самостоятельной частью набора данных, хранящегося в базе. Содержимое представления динамически вычисляется на основании данных, находящихся в реальных таблицах. Изменение данных в реальной таблице базы данных немедленно отражается в содержимом всех представлений, построенных на основании этой таблицы.
Хранимая процедура – объект базы данных, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на сервере. Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения. Хранимые процедуры должны быть вызваны с помощью оператора CALL или EXECUTE.
Триггер (англ. trigger) – это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением INSERT, удалением DELETE строки в заданной таблице, или изменением UPDATE данных в определенном столбце заданной таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики.
Язык SQL содержит следующие конструкции определения данных: CREATE, ALTER и DROP. Оператор «CREATE» используется для создания объекта базы данных, оператор «ALTER» используется для изменения существующего объекта базы данных или самой базы данных, оператор «DROP» используется для удаления существующего объекта базы данных или самой базы данных.
Операторы манипуляции данными используется для манипулирования (добавления, изменения, удаления и извлечения) данных внутри объектов реляционной базы данных.
Язык SQL содержит следующие конструкции: INSERT, UPDATE, DELETE и SELECT. Оператор «INSERT» используется для добавления строк в таблицу, оператор «UPDATE» используется для изменения значений полей в таблице, оператор «DELETE» удаление строк из таблицы, оператор «SELECT» используется извлечение данных из одной или нескольких таблиц.
Операторы определения доступа к данным предназначены для осуществления административных операций, присваивающих или отменяющих право (привилегию) использовать базу данных, таблицы и другие объекты базы данных, а также выполнять те или иные операторы SQL.
Язык SQL содержит следующие конструкции: GRANT, REVOKE. Оператор «GRANT» используется для присвоения привилегии, оператор «REVOKE» используется для отмены привилегии.
Операторы управления транзакциями предназначены для обработки транзакций.
Транзакция (англ. transaction) – группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Транзакции обрабатываются транзакционными системами, в процессе работы которых создаётся история транзакций.
Одним из наиболее распространённых наборов требований к транзакциям является набор ACID (Atomicity, Consistency, Isolation, Durability), т.е. атомарность, согласованность, изолированность, устойчивость.
Язык SQL содержит следующие конструкции: COMMIT, ROLLBACK, SAVEPOINT. Оператор «COMMIT» используется для применения транзакции, оператор «ROLLBACK» используется для отмены («отката») всех изменений, сделанных в контексте текущей транзакции, «SAVEPOINT» используется для деления транзакции на более мелкие участки.
К преимуществам использования SQL относят: независимость от конкретной системы управления базами данными, наличие стандартов, декларативность.
Независимость от конкретной системы управления базами данными. Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML, могут быть достаточно легко перенесены из одной системы управления базами данными в другую. Существуют системы, разработчики которых изначально ориентировались на применение по меньшей мере нескольких систем управления базами данными (например: система электронного документооборота Documentum может работать как с Oracle Database, так и с Microsoft SQL Server и DB2). Естественно, что при применении некоторых специфичных для реализации возможностей такой переносимости добиться уже очень трудно.
Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту только способствует «стабилизации» языка.
Декларативность. С помощью SQL программист описывает только то, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает система управления базами данных непосредственно при обработке SQL-запроса. Однако не стоит думать, что это полностью универсальный принцип — программист описывает набор данных для выборки или модификации, однако ему при этом полезно представлять, как система управления базами данными будет разбирать текст его запроса. Чем сложнее сконструирован запрос, тем больше он допускает вариантов написания, различных по скорости выполнения, но одинаковых по итоговому набору данных.
К недостаткам использования SQL относят: несоответствие реляционной модели данных, сложность, отступления от стандартов, сложность работы с иерархическими структурами.
Несоответствие реляционной модели данных. SQL не является истинно реляционным языком. В частности, указываются следующие дефекты SQL с точки зрения реляционной теории: SQL разрешает в таблицах строки-дубликаты, что в рамках реляционной модели данных невозможно и недопустимо; SQL поддерживает неопределённые значения (NULL) и многозначную логику; SQL использует порядок колонок и ссылки на колонки по номерам; SQL разрешает колонки без имени и дублирующиеся имена колонок.
Отступления от стандартов. Несмотря на наличие международного стандарта ANSI SQL-92, многие разработчики систем управления базами данных вносят изменения в язык SQL, применяемый в разрабатываемой системе управления базами данных, тем самым отступая от стандарта. Таким образом появляются специфичные для каждой конкретной системы управления базами данных диалекты языка SQL.
Сложность работы с иерархическими структурами. Ранее диалекты SQL большинства систем управления базами данных не предлагали способа манипуляции древовидными структурами. Некоторые поставщики систем управления базами данных предлагали свои решения (например, в Oracle Database используется выражение CONNECT BY). В настоящее время в ANSI стандартизована рекурсивная конструкция WITH из диалекта SQL DB2. В Microsoft SQL Server рекурсивные запросы (Recursive Common Table Expressions) появились лишь в версии 2005.
Сложность. Хотя SQL и задумывался как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.
Вследствие того, что синтаксис SQL сложен и недоступен конечному пользователю, был предложен способ создания запросов к базе данных с использованием образцов значений полей в виде текстовой строки, получивший название QBE (англ. Query by Example, запрос по образцу)
Пользователю выводится окно, в котором указаны все поля данных, встречающиеся в каждой записи данных; введение информации в конкретное поисковое поле ограничит поиск совпадением (полным или частичным, в зависимости от договорённости реализации) по данному полю. Проверка условий осуществляется только по заполненным условиям на поля, а поля, условия на которые указаны не будут, могут соответствовать чему угодно. Многие практические реализации QBE допускают также не только конъюнктивное соединение условий в заполненных полях, но и другие варианты соединения условий (например, дизъюнкцию, отрицание, существование или несуществование связанных записей и другие).
Реализации QBE преобразуют пользовательский ввод в формальный запрос к базе данных, что позволяет пользователю создавать сложные запросы без необходимости изучать более сложные языки запросов, такие как SQL.
Подробное изложение теоретических вопросов, затронутых в первой лекции, можно найти в литературе [1,3,5,6]. Практические аспекты этих вопросов можно отыскать в работах [2,4].
Знания следует самостоятельно проверить путем ответов на контрольные вопросы (список контрольных вопросов приведен в Методических рекомендациях по самостоятельному изучению дисциплины «Базы данных», которые являются неотъемлемой частью учебно-методического комплекса дисциплины «Базы данных»).
