Sqlглава 1 реляционные базы данных и язык sql


Содержание
Илон Маск рекомендует:  Что такое код complex

SQL: универсальный язык для работы с базами данных

Введение в управление реляционными базами данных

sql часто называют языком эсперанто для систем управления базами данных (СУБД). Действительно, в мире нет другого языка для работы с базами данных (БД), который бы настолько широко использовался в программах. Первый стандарт sol появился в 1986 г. и к настоящему времени завоевал всеобщее признание. Его можно использовать даже при работе с нереляционными СУБД. В отличие от других программных средств, таких, как языки Си и Кобол, являющихся прерогативой программистов-профессионалов, sql применяется специалистами из самых разных областей. Программисты, администраторы СУБД, бизнес-аналитики — все они с успехом обрабатывают данные с помощью sql. Знание этого языка полезно всем, кому приходится иметь дело с БД.

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

Трудно ли изучить sql? Это зависит от того, насколько глубоко вы собираетесь вникать в суть. Для того чтобы стать профессионалом, придется изучить очень многое. Язык sql появился в 1974 г. как предмет небольшой исследовательской работы, состоявшей из 23 страниц, и с тех пор прошел долгий путь развития. Текст действующего ныне стандарта — официального документа «the international standard database language sql» (обычно называемого sql-92) — содержит свыше шести сотен страниц, однако в нем ничего не говорится о конкретных особенностях версий sol, реализованных в СУБД фирм microsoft, oracle, sybase и др. Язык настолько развит и разнообразен, что лишь простое перечисление его возможностей потребует нескольких журнальных статей, а если собрать все, что написано на тему sol, то получится многотомная библиотека.

Однако для обычного пользователя совсем не обязательно знать sql целиком и полностью. Как туристу, оказавшемуся в стране, где говорят на непонятном языке, достаточно выучить лишь несколько употребительных выражений и правил грамматики, так и в sql — зная немногое, можно получать множество полезных результатов. В этой статье мы рассмотрим основные команды sql, правила задания критериев для отбора данных и покажем, как получать результаты. В итоге вы сможете самостоятельно создавать таблицы и вводить в них информацию, составлять запросы и работать с отчетами. Эти знания могут стать базой для дальнейшего самостоятельного освоения sql.

Что такое sql?

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

В прикладном языке общего назначения обычно имеются средства для создания процедур, а в sql их нет. С его помощью нельзя указать, каким образом должна выполняться некоторая задача, а можно лишь определить, в чем именно она заключается. Другими словами, при работе с sql нас интересуют результаты, а не процедуры для их получения.

Наиболее существенным свойством sql является возможность доступа к реляционным БД. Многие даже считают, что выражения «БД, обрабатываемая средствами sql» и «реляционная БД» — синонимы. Однако скоро вы убедитесь, что между ними имеется разница. В стандарте sql-92 даже нет термина отношение (relation).

Что такое реляционная СУБД?

Если не вдаваться в подробности, то реляционная СУБД — это система, основанная на реляционной модели управления данными.

Понятие реляционной модели было впервые предложено в работе д-ра Е. Ф. Кодда, опубликованной в 1970 г. В ней был описан математический аппарат для структуризации данных и управления ими, а также предложена абстрактная модель для представления любой реальной информации. До этого при использовании БД требовалось учитывать конкретные особенности хранения в ней информации. Если внутренняя структура БД изменялась (например, с целью повышения быстродействия), приходилось перерабатывать прикладные программы, даже если на логическом уровне никаких изменений не происходило. Реляционная модель позволила отделить частные особенности хранения данных от уровня прикладной программы. В самом деле, модель никак не описывает способы хранения информации и доступа к ней. Учитывается лишь то, как эта информация воспринимается пользователем. Благодаря появлению реляционной модели качественно изменился подход к управлению данными: из искусства оно превратилось в науку, что привело к революционному развитию отрасли.

Основные понятия реляционной модели

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

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

Давайте рассмотрим пример. Пусть имеется домен ДниНедели, содержащий значения от Понедельник до Воскресенье. Если отношение имеет атрибут ДеньНедели, соответствующий этому домену, то в любом кортеже отношения в столбце ДеньНедели должно присутствовать одно из перечисленных значений. Появление значений Январь или Кошка не допускается.

Обратите внимание: атрибут обязательно должен иметь одно из допустимых значений. Задание сразу нескольких значений запрещено. Таким образом, помимо требования принадлежности значений атрибута некоторому домену, должно соблюдаться условие его атомарности. Это означает, что для этих значений недопустима декомпозиция, т. е. нельзя разбить их на более мелкие части, не потеряв основного смысла. Например, если бы значение атрибута одновременно содержало Понедельник и Вторник, то можно было бы выделить две части, сохранив первоначальный смысл — ДеньНедели; следовательно, это значение атрибута не является атомарным. Однако если попробовать разбить значение «Понедельник» на части, то получится набор из отдельных букв — от «П» до «К»; исходный смысл утерян, поэтому значение «Понедельник» является атомарным.

Отношения обладают и другими свойствами. Наиболее значимое из них — математическое свойство замкнутости операций. Это означает, что в результате выполнения любой операции над отношением должно появляться новое отношение. Это свойство позволяет при выполнении математических операций над отношениями получать предсказуемые результаты. Кроме того, появляется возможность представлять операции в виде абстрактных выражений с разными уровнями вложенности.

В своей исходной работе д-р Кодд определил набор из восьми операторов, получивший название реляционной алгебры. Четыре оператора — объединение, логическое умножение, разность и Декартово произведение — были перенесены из традиционной теории множеств; остальные операторы были созданы специально для обработки отношений. В последующих работах д-ра Кодда, Криса Дейта и других исследователей были предложены дополнительные операторы. Далее в этой статье будут рассмотрены три реляционных оператора — продукция (project), ограничения (select, или restrict) и слияние (join).

sql и реляционная модель

Теперь, когда вы познакомились с реляционной моделью, давайте забудем о ней. Конечно, не навсегда, а лишь для того, чтобы объяснить следующее: хотя именно предложенная д-ром Коддом реляционная модель была использована при разработке sql, между ними нет полного или буквального соответствия (это одна из причин, почему в стандарте sql-92 отсутствует термин отношение). Например, понятия таблица sql и отношение не являются равнозначными, потому что в таблицах может быть сразу несколько одинаковых строк, тогда как в отношениях появление идентичных кортежей не разрешено. К тому же в sql не предусмотрено использование реляционных доменов, хотя в некоторой степени их роль играют типы данных (некоторые влиятельные сторонники реляционной модели предпринимают сейчас попытку добиться включения в будущий стандарт sql реляционных доменов).

К сожалению, несоответствие между sql и реляционной моделью породило множество недоразумений и споров за прошедшие годы. Но так как основная тема статьи — изучение sql, а не реляционной модели, эти проблемы здесь не рассматриваются. Просто следует запомнить, что между терминами, применяемыми в sql и в реляционной модели, имеются различия. Далее в статье будут использоваться только термины, принятые в sql. Вместо отношений, атрибутов и кортежей будем применять их sql-аналоги: таблицы, столбцы и строки.

Статический и динамический sql

Возможно, вам уже знакомы такие термины, как статический и динамический sql. sql-запрос является статическим, если он компилируется и оптимизируется на стадии, предшествующей выполнению программы. Мы уже упоминали одну из форм статического sql, когда говорили о встраивании sql-команд в программы на Си или Коболе (для таких выражений существует еще другое название — встроенный sql). Как вы, наверное, догадываетесь, динамический sql-запрос компилируется и оптимизируется в ходе исполнения программы. Как правило, обычные пользователи применяют именно динамический sql, позволяющий создавать запросы в соответствии с сиюминутными нуждами. Один из вариантов изпользования динамических sql-запросов — их интерактивный или непосредственный вызов (существует даже специальный термин — directsql), когда отправляемые на обработку запросы вводятся в интерактивном режиме с терминала. Между статическим и динамическим sql имеются определенные различия в синтаксисе применяемых конструкций и особенностях исполнения, однако эти вопросы выходят за рамки статьи. Отметим лишь, что для ясности понимания примеры даются в форме direct sql-запросов, поскольку это позволяет научиться использовать sql не только программистам, но и большинству конечных пользователей.

Как изучать sql

Теперь вы готовы к написанию своих первых sql-запросов. Если у вас имеется доступ к БД через sql и вы захотите воспользоваться нашими примерами на практике, то учтите следующее: вы должны входить в систему как пользователь с неограниченными полномочиями и вам потребуются программные средства интерактивной обработки sql-запросов (если речь идет о сетевой БД, следует переговорить с администратором БД о предоставлении вам соответствующих прав). Если доступа к БД через sql нет — не огорчайтесь: все примеры очень простые и в них можно разобраться «всухую», без выхода на машину.

Для того чтобы выполнить какие-либо действия в sql, следует выполнить выражение на языке sql. Встречается несколько типов выражений, однако среди них можно выделить три основные группы: ddl-команды (data definition language — язык описания данных), dml-команды (data manipulation language — язык манипуляций с данными) и средства контроля за данными. Таким образом, в sql в каком-то смысле объединены три различных языка.

Команды языка описания данных

Начнем с одной из основных ddl-команд — create table (Создать таблицу). В sql бывают таблицы нескольких типов, основными являются два типа: базовые (base) и выборочные (views). Базовыми являются таблицы, относящиеся к реально существующим данным; выборочные — это «виртуальные» таблицы, которые создаются на основе информации, получаемой из базовых таблиц; но для пользователей формы выглядят как обычные таблицы. Команда create table предназначена для создания базовых таблиц.

В команде create table следует задать название таблицы, указать список столбцов и типы содержащихся в них данных. В качестве параметров могут присутствовать также другие необязательные элементы, однако сначала давайте рассмотрим только основные параметры. Покажем простейшую синтаксическую форму для этой команды:

create и table — это ключевые слова sql; ИмяТаблицы, Столбец и ТипДанных — это формальные параметры, вместо которых пользователь каждый раз вводит фактические значения. Параметры Столбец и ТипДанных заключены в круглые скобки. В sql круглые скобки обычно используются для группировки отдельных элементов. В данном случае они позволяют объединить определения для столбца. Стоящий в конце знак «точка с запятой» является разделителем команд. Он должен завершать любое выражение на языке sql.

Рассмотрим пример. Пусть нужно создать таблицу для хранения данных обо всех встречах (appointments). Для этого в sql следует ввести команду:

После выполнения этой команды будет создана таблица с именем appointments, где имеется один столбец appointment_date, в котором могут записываться данные типа date. Поскольку на текущий момент данные еще не вводились, количество строк в таблице равно нулю (с помощью команды create table только дается определение таблицы; реальные значения вводятся командой insert, которая рассматривается далее).

Параметры appointments и appointment_date называются идентификаторами, поскольку они задают имена для конкретных объектов БД, в данном случае — имена для таблицы и столбца соответственно. В sql встречаются идентификаторы двух типов: обычные (regular) и выделенные (delimited). Выделенные идентификаторы заключаются в двойные кавычки, и в них учитывается регистр используемых символов. Обычные идентификаторы не выделяются никакими ограниченными символами, в их написании регистр не учитывается. В этой статье применяются только обычные идентификаторы.

Символы, используемые для построения идентификаторов, должны удовлетворять определенным правилам. В обычных идентификаторах могут использоваться только буквы (не обязательно латинские, но и других алфавитов), цифры и символ подчеркивания. Идентификатор не должен содержать знаков пунктуации, пробелов или специальных символов (#, @, % или !); кроме того, он не может начинаться с цифры или знака подчеркивания. Для идентификаторов можно использовать отдельные ключевые слова sql, но делать это не рекомендуется. Идентификатор предназначен для обозначения некоторого объекта, поэтому у него должно быть уникальное (в рамках определенного контекста) имя: нельзя создать таблицу с именем, которое уже встречается в БД; в одной таблице нельзя иметь столбцы с одинаковыми именами. Кстати, имейте в виду, что appointments и appointments — это одинаковые имена для sql. Одним лишь изменением регистра букв создать новый идентификатор нельзя.

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

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

Таблицы, содержащие только один столбец, типа нашей appointments, на практике встречаются редко. Давайте рассмотрим другой, более полезный пример.

Данная команда создает таблицу appointments2 (новая таблица должна иметь иное имя, так как таблица appointments уже присутствует в БД). Как и в первой таблице, в ней имеется столбец appointment_date для записи даты встреч; кроме того, появился столбец appointment_time для записи времени этих встреч. Параметр description (описание) является текстовой строкой, где может содержаться до 256 символов. Для этого параметра указан тип varchar (сокращение от character varying), поскольку заранее не известно, сколько места потребуется для записи, но ясно, что описание займет не более 256 символов. При описании параметро в типа символьная строка (и некоторых других типов) указывается длина параметра. Ее значение задается в круглых скобках справа от названия типа.

Возможно, вы обратили внимание, что в двух рассмотренных примерах запись команды оформлена по-разному. Если в первом случае команда полностью размещена в одной строке, то во втором после первой открытой круглой скобки запись продолжена с новой строки, и определение каждого следующего столбца начинается с новой строки. В sql нет специальных требований к оформлению записи. Разбиение записи на строки делает ее чтение удобнее. Язык sql позволяет при написании команд не только разбивать команду по строкам, но и вставлять отступы в начале строк и пробелы между элементами записи.

Теперь, когда вы знаете основные правила, давайте рассмотрим более сложный пример создания таблицы с несколькими столбцами. В начале статьи была показана таблица employees (Сотрудники). В ней содержатся следующие столбцы: фамилия, имя, дата приема на работу, подразделение, категория и зарплата за год. Для определения этой таблицы используется следующая команда sql:

В команде встречаются несколько новых элементов. Прежде всего, это выражение not null, стоящее в конце определения столбцов last_name и first_name. С помощью подобных конструкций задаются требования, подлежащие обязательному соблюдению. В данном случае указано, что поля last_name и first_name должны обязательно заполняться при вводе; оставлять эти столбцы пустыми нельзя (это вполне логично: как можно идентифицировать сотрудника, не зная его имени?).

Кроме того, в примере присутствуют три новых типа данных: character, smallint и decimal. До сих пор мы почти не говорили о типах. Хотя в sql нет реляционных доменов, однако имеется набор основных типов данных. Эта информация используется при выделении памяти и сравнении величин; в определенной степени сужает список возможных значений при вводе, однако контроль типов в sql менее строгий, чем в других языках.

Все имеющиеся в sql типы данных можно разбить на шесть групп: символьные строки, точные числовые значения, приближенные числовые значения, битовые строки, датовремя и интервалы. Мы перечислили все разновидности, однако в этой статье подробно будут рассматриваться лишь отдельные из них (битовые строки, например, не представляют особого интереса для обычных пользователей).

Кстати, если вы подумали, что датовремя — это опечатка, то ошиблись. К данной группе (datetime) относится большинство используемых в sql типов данных, связанных со временем (такие параметры, как временные интервалы, выделены в отдельную группу). В предыдущем примере уже встречались два типа данных из группы датовремя — date и time.

Следующий тип данных, с которым вы уже знакомы, — character varying (или просто varchar); он относится к группе символьных строк. Если varchar служит для хранения строк переменной длины, то встретившийся в третьем примере тип char предназначен для записи строк, имеющих фиксированное число символов. Например, в столбце last_name будут записываться строки из 13 символов вне зависимости от реально вводимых фамилий, будь то poe или penworth-chickering (в случае с poe оставшиеся 10 символов заполнятся пробелами).

С точки зрения пользователя, varchar и char имеют одинаковый смысл. Зачем нужно было вводить два типа? Дело в том, что на практике обычно приходится искать компромисс между быстродействием и экономией пространства на диске. Как правило, применение строк с фиксированной длиной дает некоторый выигрыш в скорости доступа, однако при слишком большой длине строк пространство на диске расходуется неэкономно. Если в appointments2 для каждой строки комментария резервировать по 256 символов, то это может оказаться нерационально; чаще всего строки будут значительно короче. С другой стороны, фамилии также имеют разную длину, но для них, как правило, требуется около 13 символов; в этом случае потери будут минимальными. Существует хорошее правило: если известно, что длина строки меняется незначительно либо она сравнительно невелика, то используйте char; в остальных случаях — varchar.

Следующие два новых типа данных — smallint и decimal — относятся к группе точных числовых значений. smallint — это сокращенное название от small integer (малое целое). В sql также предусмотрен тип данных integer. Наличие двух схожих типов и в этом случае объясняется соображением экономии пространства. В нашем примере значения параметра grade_level могут быть представлены с помощью двузначного числа, поэтому использован тип smallint; однако на практике не всегда известно, какие максимальные значения могут быть у параметров. Если такой информации нет, то применяйте integer. Реальный объем, выделяемый для хранения параметров типа smallint и integer, и соответствующий диапазон значений для этих параметров индивидуальны для каждой платформы.

Тип данных decimal, обычно используемый для учета финансовых показателей, позволяет задать шаблон с требуемым числом десятичных знаков. Поскольку этот тип служит для точной числовой записи, он гарантирует точность при выполнении математических операций над десятичными данными. Если для десятичных значений использовать типы данных из группы приближенной числовой записи, например float (floating point number — число с плавающей точкой), это приведет к погрешностям округления, поэтому для финансовых расчетов этот вариант не подходит. Для определения параметров типа decimal используется следующая форма записи:

где p — это число десятичных знаков, d — количество разрядов после запятой. Вместо p следует записывать общее число значащих цифр в используемых значениях, а вместо d — количество цифр после запятой.

Во врезке «Создание таблицы» показан полный вариант обобщенной записи команды create table. В нем присутствуют новые элементы и показан формат для всех рассмотренных типов данных (В принципе встречаются и другие типы данных, но пока мы их не рассматриваем).

На первых порах может показаться, что синтаксис sql-команд слишком сложен. Но вы легко в нем разберетесь, если внимательно изучили приведенные выше примеры. На схеме появился дополнительный элемент — вертикальная черта; он служит для разграничения альтернативных конструкций. Другими словами, при определении каждого столбца нужно выбрать подходящий тип данных (как вы помните, в квадратные скобки заключаются необязательные параметры, а в фигурные скобки — конструкции, которые могут повторяться многократно; в реальных sql-командах эти специальные символы не пишутся). В первой части схемы приведены полные названия для типов данных, во второй — их сокращенные названия; на практике можно использовать любые из них.

Первая часть статьи завершена. Вторая будет посвящена изучению dml-команд insert, select, update и delete. Также будут рассмотрены условия выборки данных, операторы сравнения и логические операторы, использование null-значений и троичная логика.

Создание таблицы. Синтаксис команды create table: в квадратных скобках указаны необязательные параметры, в фигурных — повторяющиеся конструкции.

Секрет названия sql

В начале 1970-х гг. в ibm приступили к практическому воплощению модели реляционных БД, предложенной д-ром Коддом. Дональд Чамберлин и группа других сотрудников подразделения перспективных исследований создали прототип языка, получивший название structured english query language (язык структурированных англоязычных запросов), или просто sequel. В дальнейшем он был расширен и подвергнут доработке. Новый вариант, предложенный ibm, получил название sequel/2. Его использовали как программный интерфейс (api) для проектирования первой реляционной системы БД фирмы ibm — system/r. Из соображений, связанных с правовыми нюансами, в ibm решили изменить название: вместо sequel/2 использовать sql (structured query language). Эту аббревиатуру часто произносят как «си-ку-эл».

Между ранними прототипами sequel и признанным ныне в различных организациях стандартом sql имеются существенные различия. Джим Мелтон, занимавшийся подготовкой стандарта sql-92, даже заявил, что многие ошибаются, считая, будто слово «структурированные» правильно отражает специфику этого языка (jim melton and alan r. simon «understanding the new sql: a complete guide». san francisco: morgan kaufmann, 1993. isbn: 1-55860-245-3). Поэтому фактически sql — это просто название, последовательность букв s-q-l и ничего более.

ТЕМА 7. РЕЛЯЦИОННЫЙ СПОСОБ ДОСТУПА К БАЗЕ ДАННЫХ. ОСНОВНЫЕ СВЕДЕНИЯ О ЯЗЫКЕ SQL

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

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

Появление теории реляционных баз данных и предложенного Коддом Э.Ф. языка запросов “alpha”, основанного на реляционном исчислении, инициировало разработку ряда языков запросов, которые можно отнести к двум классам:

1. Алгебраические языки запросов – языки, позволяющие выражать запросы средствами специализированных операторов, применяемых к отношениям (JOIN – соединить, INTERSECT – пересечь, SUBTRACT – вычесть и т.д.).

2. Языки исчисления предикатов – набор правил для записи выражения, определяющего новое отношение из заданной совокупности существующих отношений.

Из всех этих языков полностью сохранились и развиваются QBE (Query By Example) и SQL (Structured Query Language), а из остальных взяты в расширение внутренних языков СУБД только наиболее интересные конструкции. В начале 1980-х годов SQL “победил” другие языки запросов и стал фактическим стандартом таких языков для профессиональных реляционных СУБД

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

Недавно принятый стандарт ANSI SQL-92 расширяет возможности встроенных SQL-операторов и позволяет включить динамический SQL. И в интерактивной и во встроенной формах SQL имеются многочисленные части, или субподразделения. К сожалению, эти термины не используются повсеместно во всех реализациях. Они подчеркиваются ANSI и полезны на концептуальном уровне, но большинство SQL программ практически не обрабатывают их отдельно, так что они, по существу, становятся функциональными категориями команд SQL. DDL (Data Definition Language – язык определения данных) – так называемый язык описания схемы в стандарте ANSI, состоит из команд, которые создают объекты (таблицы, индексы, просмотры и т.д.) в базе данных. DML (Data Manipulation Language – язык манипулирования данными) – это набор команд, которые определяют, какие значения представлены в таблицах в любой момент времени. DCL (Data Control Language – язык управления данными) – комплекс средств, которые определяют, разрешить ли пользователю выполнять определенные действия или нет.

Реализация в SQL концепции операций, ориентированных на табличное представление данных, позволило создать компактный язык с небольшим (менее 30) набором предложений. Как в интерактивном, так и в встроенном SQL существуют следующие предложения:

  • предложения определения данных (определение баз данных, а также определение и уничтожение таблиц и индексов);
  • запросы на выбор данных (предложение SELECT);
  • предложения модификации данных (добавление, удаление и изменение данных);
  • предложения управления данными (предоставление и отмена привилегий на доступ к данным, управление транзакциями и другие).

Кроме того, SQL предоставляет возможность выполнять в этих предложениях следующее:

  • арифметические вычисления (включая разнообразные функциональные преобразования), обработку текстовых строк и выполнение операций сравнения значений арифметических выражений и текстов;
  • упорядочение строк и (или) столбцов при выводе содержимого таблиц на печать или экран дисплея;
  • создание представлений (виртуальных таблиц), позволяющих пользователям иметь свой взгляд на данные без увеличения их объема в базе данных;
  • запоминание выводимого по запросу содержимого таблицы, нескольких таблиц или представления в другой таблице (реляционная операция присваивания).
  • агрегирование данных: группирование данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум, число элементов и т.п.

Основные типы данных SQL – используемые языком SQL основные типы данных, форматы которых могут несколько различаться для разных СУБД: целое число; десятичное число; вещественное число; символьная строка фиксированной или переменной длины; дата в формате (по умолчанию mm/dd/yy); время в формате (по умолчанию hh.mm.ss); деньги в формате, определяющем символ денежной единицы и его расположение (суффикс или префикс) и др.

Таблицы создаются командой CREATE TABLE. Эта команда создает структуру таблицы. Значения вводятся с помощью DML команды INSERT (см. далее). Команда CREATE TABLE в основном определяет имя таблицы в виде описания набора имен столбцов, указанных в определенном порядке. Она также определяет типы данных и размеры столбцов. Cинтаксис команды CREATE TABLE будет следующим:

CREATE TABLE базовая_таблица (столбец тип_данных [,столбец тип_данных] . );

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

Предложение для создания следующее:

CREATE INDEX ON (имя_столбца[,] . );

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

Представления (View) – это таблицы, чье содержание выбирается или получается из других таблиц. Они работают в запросах и операторах DML точно так же, как и базовые таблицы, но не содержат никаких собственных данных. Представление создается командой CREATE VIEW. Она состоит из слов CREATE VIEW (создать представление), имени представления, которое нужно создать, слова AS (как) и, далее, запроса.

Синтаксис предложения CREATE VIEW имеет вид:

CREATE VIEW имя_представления

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

Предложение SELECT выглядит следующим образом:

Критерий отбора строк формируется из одного или нескольких условий, соединенных логическими операторами:

  • AND – когда должны удовлетворяться оба разделяемых с помощью AND условия;
  • OR – когда должно удовлетворяться одно из разделяемых с помощью OR условий;
  • AND NOT – когда должно удовлетворяться первое условие и не должно – второе;
  • OR NOT – когда или должно удовлетворяться первое условие, или не должно удовлетворяться второе.

Операторы языка манипулирования данными DML управляют значениями, представляемыми в таблицах. Значения могут быть помещены и удалены из полей тремя операторами языка DML: INSERT (вставить), UPDATE (модифицировать), DELETE (удалить).

В языке SQL также имеется возможность изменения таблицы после того, как она была создана. Команда ALTER TABLE используется, чтобы изменить определение существующей таблицы. Обычно она добавляет столбцы к таблице. Иногда она может удалять столбцы или добавлять в (удалять из) определение таблицы новые (существующие) ограничения. Типичный синтаксис, чтобы добавить столбец к таблице:

ALTER TABLE имя_таблицы

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Как то на паре, один преподаватель сказал, когда лекция заканчивалась — это был конец пары: «Что-то тут концом пахнет». 8378 — | 8008 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Язык SQL для работы с реляционными базами данных.

SQL (обычно произносимый как «СИКВЭЛ» или “ЭСКЮЭЛЬ”) символизирует собой Структурированный Язык Запросов. Это — язык, который дает Вам возможность создавать и работать в реляционных базах данных, являющихся наборами связанной информации, сохраняемой в таблицах.

Информационное пространство становится более унифицированным. Это привело к необходимости создания стандартного языка, который мог бы использоваться в большом количестве различных видов компьютерных сред. Стандартный язык позволит пользователям, знающим один набор команд, использовать их для создания, нахождения, изменения и передачи информации — независимо от того, работают ли они на персональном компьютере, сетевой рабочей станции, или на универсальной ЭВМ.

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

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

Стандарт SQL определяетсяANSI (Американским Национальным Институтом Стандартов) и в данное время также принимается ISO (Международной Организацией по Стандартизации). Однако, большинство коммерческих программ баз данных расширяют SQL без уведомления ANSI, добавляя различные особенности в этот язык, которые, как они считают, будут весьма полезны. Иногда они несколько нарушают стандарт языка, хотя хорошие идеи имеют тенденцию развиваться и вскоре становиться стандартами «рынка» сами по себе в силу полезности своих качеств.

На данном уроке мы будем, в основном, следовать стандарту ANSI, но одновременно иногда будет показывать и некоторые наиболее общие отклонения от его стандарта.

Точное описание особенностей языка приводится в документации на СУБД, которую Вы используете. SQL системы InterBase 4.0 соответствует стандарту ANSI-92 и частично стандарту ANSI-III.

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

Поэтому, в язык SQL в качестве составных частей входят:

  • язык манипулирования данными (Data Manipulation Language, DML)
  • язык определения данных (Data Definition Language, DDL)
  • язык управления данными (Data Control Language, DCL).

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

Язык манипулирования данными используется, как это следует из его названия, для манипулирования данными в таблицах баз данных. Он состоит из 4 основных команд:

SELECT (выбрать)

INSERT (вставить)

UPDATE (обновить)

DELETE (удалить).

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

CREATE DATABASE (создать базу данных)

CREATE TABLE(создать таблицу)

CREATE VIEW(создать виртуальную таблицу)

CREATE INDEX(создать индекс)

CREATE TRIGGER(создать триггер)

CREATE PROCEDURE(создать сохраненную процедуру)

ALTER DATABASE(модифицировать базу данных)

ALTER TABLE(модифицировать таблицу)

ALTER VIEW(модифицировать виртуальную таблицу)

ALTER INDEX(модифицировать индекс)

ALTER TRIGGER(модифицировать триггер)

ALTER PROCEDURE(модифицировать сохраненную процедуру)

DROP DATABASE(удалить базу данных)

DROP TABLE(удалить таблицу)

DROP VIEW(удалить виртуальную таблицу)

DROP INDEX(удалить индекс)

DROP TRIGGER(удалить триггер)


DROP PROCEDURE(удалить сохраненную процедуру).

Язык управления данными используется для управления правами доступа к данным и выполнением процедур в многопользовательской среде. Более точно его можно назвать “язык управления доступом”. Он состоит из двух основных команд:

GRANT (дать права)

REVOKE (забрать права).

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

  • интерактивный SQL
  • встроенный SQL.

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

Последнее изменение этой страницы: 2020-12-16; Нарушение авторского права страницы

Записки инженера

Доступным языком заметки по IT технологиям

Теоретические азы БД (введение в SQL)

Начинать изучать SQL лучше всего с азов реляционных баз данных. Я дам пояснение что такое реляционная база данных, что такое отношение и какие операции над ними можно производить.

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

Поехали …

Что такое SQL?

SQL (Structured Query Language) – структурированный язык запросов, универсальный компьютерный язык, применяемый для создания, модификации и управление данными в реляционных базах данных

Что такое реляционная база данных?

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

Что такое отношения?

Отношение это некое множество картежей

Что такое кортеж?

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

Продемонстрирую кортеж из двух элементов с помощью графа:

Вершины графа это элементы их некоторого множества, в данном случае, это элемент а1 из множества А и элемент b1 из множества B. Ребро между вершинами обозначает связь между элементами или как говорят элемент а1 находится в отношение с b1.

Продемонстрирую этот же кортеж с помощью таблицы:

Номер 1 у а1 и b1, был выбран произвольно.

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

Как я сказал, отношение это множество кортежей, причем ограниченное (если отойти от теории). Представить отношения можно в виде матрицы, графа, таблицы.

Продемонстрирую, как представить отношение в виде графа:

На графике видно, что есть несколько кортежей, причем какой кортеж первый, а какой второй и третий не важно, это просто множество кортежей. В множестве нет такого понятия «первый», «второй» и «третий», это всё сразу и очередность не важна.

Продемонстрирую, как представить отношение в виде таблицы:

Последовательность строк или кортежей в таблице не важна, из графа я их взял в произвольном порядке.

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

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

Итак, с логической цепочкой мы разобрались: SQL, реляционная БД, отношения, кортеж..Теперь мы затронем язык SQL, т.е. тему манипулирования с отношениями, важно разобраться какие операции мы можем проводить над отношениями.

Все операции продемонстрировать не возможно, в связи с их большим количеством, приведу только базовые:

1. Селекция (другие имена операции — выборка, ограничение)

Операция «селекция» или «выборка» выполняется над одним отношением, смысл его заключается в том, что по заданному условию осуществляется выборка подмножества кортежей. Результат операции – отношение отличающиеся от исходного меньшим числом кортежей. Пример:

Пусть есть отношение, назовем его «исходная таблица №1»:

Результат «выборки» из исходной таблицу №1, при условии что А=а3

синтаксис — SELECT * FROM имя_таблицы WHERE имя_столбца=значение

реализация для данного случая — SELECT * FROM исходная_таблица WHERE А=a3

2. Проекция

Операция «проекция» выполняется над одним отношением, в результате неё формируется новое отношение с указанными столбцами таблицы.

Например, есть отношение, назовем ее «исходная таблица №2»:

Произведем над данным отношением операцию «проекция» по атрибутам А и С, результат:

В результате мы получили два одинаковых картежа, в отношение такого быть не может, поэтому сократим их (в СУБД сокращения происходят автоматически):

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

синтаксис — SELECT список_столбцов FROM имя_таблицы

реализация для данного случая — SELECT А,С FROM исходная_таблица_№2

3. Естественное соединение

Операция «естественное соединение» выполняется над двумя логическими связанными отношениями, в результате неё формируется новое отношение со столбцами первого и второго отношения и с кортежами, которые получаются в результате соединения каждого кортежа первого и второго отношения. На примере должно быть более понятно, пусть есть два отношения, назовем их исходная таблица №3.1 и исходная таблица №3.2:

Исходная таблица №3_1

Исходная таблица №3_2

Проведем операцию «соединения» первого и второго отношения, результат:

Интересно заметить, что мы получили исходное отношение из раздела «2. Проекция», последовательность столбцов в отношение значения не имеет.

реализация для данного случая — SELECT исходная_таблица_№3_1.*, исходная таблица №3_2.В FROM исходная_таблица_№3_1, исходная таблица №3_2 WHERE исходная таблица №3_1.A= исходная таблица №3_2.A

P.S. Дальше пойдут операции над отношениями, которые родом из теории множеств, они более просты и примитивны. С помощью них можно выразить выше сказанные операции: селекция, проекция, естественное объединение.

4. Объединение

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

Пример, пусть есть два отношения:

Исходная таблица №4_1

Исходная таблица №4_2

Произведем операцию «объединения» отношения №4.1 и отношения №4.2 , результат:

синтаксис — SELECT список_столбцов_таблицы1 FROM таблица1 UNION SELECT список_столбцов_таблицы2 FROM таблица2

реализация для данного случая — SELECT А,В FROM исходная_таблица_№4_1 UNION SELECT А,В FROM исходная_таблица_№4_2

5. Пересечение

Операция «пересечение» выполняется над двумя отношениями имеющими одинаковый набор столбцов и тип данных в этих столбцах, результат операции новое отношение, которое включает в себя одинаковые кортежи «первого» и «второго» отношения.

Пример, пусть есть два отношения:

Исходная таблица №5_1

Исходная таблица №5_2

Произведем операцию «пересечения» с данными отношениями, результат:

Т.е. в результирующее отношение, попали повторяющиеся кортежи из «первого» и «второго» отношения.

синтаксис — SELECT одна_из_таблиц.столбец1, одна_из_таблиц.столбец2, … FROM таблица1,таблица2 WHERE таблица1.столбец1=таблица2.столбец1 AND таблица1.столбец2= таблица2.столбец2 AND …

реализация для данного случая –

SELECT исходная_таблица_№5_1.А, исходная_таблица_№5_1.В FROM исходная_таблица_№5_1, исходная_таблица_№5_2 WHERE исходная_таблица_№5_1.А = исходная_таблица_№5_2.А AND исходная_таблица_№5_1.В = исходная_таблица_№5_2.В

6. Вычитание (разность)

Операция «вычитание» выполняется над двумя отношениями имеющими одинаковый набор столбцов и тип данных в этих столбцах, результат операции новое отношение, которое включает в себя кортежи «первого» отношения отличные от кортежей «второго» отношения, на примере думаю должно быть более понятно.

Илон Маск рекомендует:  Что такое код imap_header

Пример, пусть есть два отношения:

Исходная таблица №6_1

Исходная таблица №6_2

Произведем операцию «разность», т.е. от исходной таблицы №6_1 отнимем исходную таблицу №6_2, результат:

Т.е. результирующее отношение, это «первое» отношение без повторяющихся кортежей «второго» отношения.

реализация для данного случая – SELECT исходная_таблица_№6_1.А, исходная_таблица_№6_1.В FROM исходная_таблица_№6_1 WHERE NOT EXISTS (SELECT исходная_таблица_№6_2.А, исходная_таблица_№6_2.В FROM исходная_таблица_№6_2
WHERE исходная_таблица_№6_2.А= исходная_таблица_№6_1.А AND исходная_таблица_№6_2.В= исходная_таблица_№6_1.В)

7. Декартово произведение

Декартово произведение выполняется над двумя произвольными отношениями, результат операции новое отношение с количество столбцов равному сумме количества столбцов «первого» и «второго» отношения, а количество строк равному произведение количеству строк «первого» и «второго» отношения. Кортежи результирующего отношение, если говорить по-простому, получаются путем комбинации каждого кортежа «первого» отношения с кортежами «второго» отношения.

Пример, пусть есть два произвольных отношения:

Исходная таблица №7_1

Исходная таблица №7_2

Произведем «декартово произведение» данных двух отношений, результат:

реализация для данного случая – SELECT исходная_таблица_№7_1.А, исходная_таблица_№7_1.В, исходная_таблица_№7_2.А, исходная_таблица_№7_2.В FROM исходная_таблица_№7_1, исходная_таблица_№7_2

Мы разобрались с основными операции над отношениями и напоследок теоретической части поста разберемся что такое ключ.

Что такое ключ?

Ключ – это один или не сколько столбцов таблицы, которые однозначно определяют запись (строку). Пример, пусть есть отношение представленное в виде таблицы:

Ключом данного отношения может быть столбец А. Т.к. значения только данного столбца однозначно определяет запись в отношение, например: а3 определяет запись «а3 b1 d3», a2 определят запись «a2 b2 d3», a1 определяет запись «a1 b2 d1». Другие столбцы данную функцию нести не могут.

Если ключ состоит из одного столбца, то его называют простым, если из нескольких его называют составным. В данной таблице, помимо простого ключа, есть еще один – составной, состоящий из столбцов B и D. Значения этих столбцов однозначной определят запись (строки), пример: b1 и d3 однозначно определяет запись «a3 b1 d3», b2 и d3 однозначной определяет запись «a2 b2 d3», b2 и d1 однозначно определяет запись «a1 b2 d1».

На практике обычно выбирают один ключ, причем самый простой, в данном случае это столбец А. Такой ключ также называют «первичный ключ».

Вам будет интересно:

Буду признателен если вы поделитесь данным постом

Sqlглава 1 реляционные базы данных и язык sql

Язык для взаимодействия с БД SQL появился в середине 70-х и был разработан в рамках проекта экспериментальной реляционной СУБД System R. Исходное название языка SEQUEL (Structered English Query Language) только частично отражает суть этого языка. Конечно, язык был ориентирован главным образом на удобную и понятную пользователям формулировку запросов к реляционной БД, но на самом деле уже являлся полным языком БД, содержащим помимо операторов формулирования запросов и манипулирования БД средства определения и манипулирования схемой БД; определения ограничений целостности и триггеров; представлений БД; возможности определения структур физического уровня, поддерживающих эффективное выполнение запросов; авторизации доступа к отношениям и их полям; точек сохранения транзакции и откатов. В языке отсутствовали средства синхронизации доступа к объектам БД со стороны параллельно выполняемых транзакций: с самого начала предполагалось, что необходимую синхронизацию неявно выполняет СУБД.

Рассмотрим эти свойства языка немного более подробно.

13.1.1. Запросы и операторы манипулирования данными

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

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

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

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

Еще одним отличием SQL является необязательное удаление кортежей-дубликатов в окончательном или промежуточных отношениях-результатах. Строго говоря, результатом оператора выборки в языке SQL является не отношение, а мультимножество кортежей. В тех случаях, когда семантика запроса требует наличия отношения, уничтожение дубликатов производится неявно.

Самый общий вид запроса на языке SQL представляет теоретико-множественное алгебраическое выражение, составленное из элементарных запросов. В SQL System R допускались все базовые теретико-множественные операции (UNION, INTERSECT и MINUS).

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

Операторы манипулирования данными UPDATE и DELETE построены на тех же принципах, что и оператор выборки данных SELECT. Набор кортежей указанного отношения, подлежащих модификации или удалению, определяется входящим в соответствующий оператор логическим выражением, которое может включать сложные предикаты, в том числе и с вложенными подзапросами.

В операторе вставки кортежа(ей) в указанное отношение заносимый кортеж может задаваться как в литеральной форме, так и с помощью внутреннего подоператора выборки.

13.1.2. Операторы определения и манипулирования схемой БД

В число операторов определения схемы БД SQL System R входили операторы создания и уничтожения постоянных и временных хранимых отношений (CREATE TABLE и DROP TABLE) и создания и уничтожения представляемых отношений (CREATE VIEW и DROP VIEW). В языке и в реализации System R не запрещалось использовать операторы определения схемы в пределах транзакции, содержащей операторы выборки и манипулирования данными. Допускалось, например, использование операторов выборки и манипулирования данными, в которых указываются отношения, не существующие в БД к моменту компиляции оператора. Конечно, эта возможность существенно усложняла реализацию и требовалась по существу очень редко.

Оператор манипулирования схемой БД ALTER TABLE позволял добавлять указываемые поля к существующим отношениям. В описании языка определялось, что выполнение этого оператора не должно приводить к недействительности ранее откомпилированных операторов над отношением, схема которого изменяется, и что значения вновь определенных полей в существующих кортежах отношения становятся неопределенными.

13.1.3. Определения ограничений целостности и триггеров

Язык SQL System R включал очень мощные средства контроля и поддержания целостности БД. Средства контроля базировались на аппарате ограничений целостности (ASSERTIONS). Фактически, ограничение целостности — это логическое выражение, вычисляемое над текущим состоянием БД, ложность которого соответствует нецелостному состоянию БД. Логическое выражение ограничения целостности могло содержать любой допустимый в языке предикат.

Более точно, ограничения целостности делились на два класса: проверяемые после выполнения оператора манипулирования данными и проверяемые при завершении транзакции или при выполнении специального оператора INFORCE INTEGRITY. Типы предикатов, которые можно использовать в операторах определения ограничений целостности разных классов, различаются. В операторах первого класса проверяется, фактически, текущий кортеж, с которым производится манипулирование. Во втором случае проверяются указанные в ограничении целостности отношения, т.е. все их кортежи. Различается и определяемая в языке реакция системы на нарушения ограничений целостности разных классов. В первом случае нарушение ограничения целостности приводит к откату транзакции в точку, непосредственно предшествующую операции манипулирования данными, выполнение которого вызвало нарушение ограничения целостности. Во втором случае ограничение приводит к полному откату транзакции к ее началу.

Очень важным механизмом, определенным в языке SQL System R, является механизм триггеров. В контексте System R этот механизм рассматривался главным образом как средство автоматического поддержания целостности БД. При определении триггера указывалось условие проверки его применимости (имя отношения и тип операции манипулирования данными), условие применимости триггера (логическое выражение, построенное по правилам, близким к правилам для ограничений целостности первого класса) и действие, которое должно быть выполнено над БД в случае истинности условия применимости. Такое действие могло быть выражено с помощью произвольного оператора манипулирования данными. Во время выполнения действия могли срабатывать другие триггеры и т.д.

Механизмы ограничений целостности и триггеров System R являлись очень мощными и общими, но реализация их очень трудна и накладна (как уже отмечалось, триггеры так и не были реализованы в System R). Дополнительную сложность в реализации создавал тот факт, что допускалось (по крайней мере не запрещалось языком) определение ограничений целостности и триггеров в пределах той же транзакции, в которой выполняются операторы манипулирования данными. При наиболее полной реализации требовалось бы большое число дополнительных действий во время выполнения транзакции. Кроме того, в ряде случаев отсутствие зафиксированной семантики соответствующих конструкций языка приводило к неоднозначному пониманию выполнения транзакций.

13.1.4. Представления базы данных

В языке допускалось использование хранимых отношений БД и представляемых отношений. Наиболее удачным решением было использование для определения представлений общего аппарата операторов выборки. Любой оператор выборки может быть использован для определения представления.

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

Массу проблем, исследований и предложений породила потенциальная возможность выполнения операторов манипулирования данными над представлениями. Понятно, что эта возможность легко реализуема для простых представлений, но в более сложных случаях не только реализация, но и семантика операций становится нетривиальной. Кстати, в System R операторы манипулирования данными допускались только над простыми представлениями.

13.1.5. Определение управляющих структур

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

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

С помощью оператора определения индекса можно было выразить два дополнительных утверждения, касающихся логической схемы отношения и физической структуры его хранения. Использование при определении индекса ключевого слова UNIQUE означало, что ключ этого индекса является возможным ключом соответствующего отношения. Фактически это означает наличие дополнительного механизма определения ограничения целостности отношения. Один из индексов для данного отношения мог быть определен с ключевым словом CLUSTERING. Это означает требование физической кластеризации во внешней памяти кортежей отношения с равными или близкими значениями ключа индекса.

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

13.1.6. Авторизация доступа к отношениям и их полям

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


После создания нового отношения все привилегии, связанные с этим отношением и всеми его столбцами, принадлежат только пользователю-создателю отношения. В число привилегий входит привилегия передачи всех или части привилегий другому пользователю, включая привилегию на передачу привилегий. Технически передача привилегий осуществляется при выполнении оператора SQL GRANT. Существует также привилегия изъятия всех или части привилегий у пользователя, которому они ранее были переданы. Эта привилегия также может передаваться. Технически изъятие привилегий происходит при выполнении оператора SQL REVOKE.

Проверка полномочности доступа к данным происходит на основе информации о полномочиях, существующих во время компиляции соответствующего оператора SQL. Подобно тому, что мы отмечали в связи с ограничениями целостности и триггерами, в SQL System R отсутствовали какие-либо ограничения по поводу использования операторов GRANT и REVOKE. Это приводило к существенным техническим затруднениям в реализации, а иногда к неоднозначному пониманию поведения.

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

13.1.7. Точки сохранения и откаты транзакции

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

Прямолинейная реализация этого механизма не вызывает особых технических затруднений, но и не очень полезна, потому что после выполнения частичного отката транзакции для успешного продолжения работы прикладной программы потребовалось бы и восстановить ее состояние в соответствующей точке, а это никак не поддерживается. Понятно, что при более тщательной проработке должны быть увязаны механизмы точек сохранения и контроля целостности. Например, было бы естественно, чтобы при выполнении оператора ENFORCE INTEGRITY, если какие-либо ограничения целостности нарушаются, происходил автоматический откат транзакции к ближайшей точки сохранения, в которой нарушения целостности БД не было. Это значительно усложнило бы реализацию, но было бы очень полезно. Аналогично, можно было бы использовать механизм точек сохранения при автоматических откатах транзакций по причине возникновения синхронизационных тупиков.

Отметим еще два важных свойства языка SQL System R, которые в разных видах присутствуют во всех развитых последующих вариантах языка.

13.1.8. Встроенный SQL

В SQL System R присутствуют специальные операторы, поддерживающие встраивание операторов SQL в традиционные языки программирования (в System R основным таким языком был PL/1).

Основная проблема встраивания SQL в язык программирования состояла в том, что SQL — реляционный язык, т.е. его операторы большей частью работают со множествами, в то время как в языках программирования основными являются скалярные операции. Решение SQL состоит в том, что в язык дополнительно включаются операторы, обеспечивающие покортежный доступ к результату запроса к БД.

Для этого в язык вводится понятие курсора, с которым связывается оператор выборки. Над определенным курсором можно выполнять оператор OPEN, означающий материализацию отношения-результата запроса, оператор FETCH, позволяющий выбрать очередной кортеж результирующего отношения в память программы, и оператор CLOSE, означающий конец работы с данным курсором.

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

13.1.9. Динамический SQL

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

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

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

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

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

Язык реляционных баз данных SQL

Определение целей и возможностей системы анализа и управления реляционными базами данных Microsoft SQL Server. Анализ особенностей структуры языка программирования SQL. Рассмотрение назначений основных операторов и других зарезервированных слов в SQL.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 10.11.2014
Размер файла 46,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Содержание

1. Предметная область SQL

2. Структура языка SQL

Список использованных источников

Введение

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

Базовым требованием к реляционным СУБД является наличие мощного и в тоже время простого языка, позволяющего выполнять все необходимые пользователям операции. В последние годы таким повсеместно принятым языком стал язык реляционных БД SQL — Structured Query Language.

Команды в SQL могут работать со всеми группами таблиц как с единым объектом и могут обрабатывать любое количество информации, извлеченной или полученной из их, в виде единого модуля. Формат записи операторов SQL свободный, набор ключевых слов зарезервирован, кампилятор языка не различает с большой или маленькой буквы пишутся операторы.

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

Основная часть

1. Предметная область SQL

Microsoft SQL Server — это система анализа и управления реляционными базами данных в решениях электронной коммерции, производственных отраслей и хранилищ данных.

В начале 1970-х годов в исследовательской лабораторий компании IBM была разработана экспериментальная реляционная СУБД IBM System R, для которой затем был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. Аббревиатура SEQUEL расшифровывалась как Structured English Query Language — «структурированный английский язык запросов». Позже по юридическим соображениям язык SEQUEL был переименован в SQL.

Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования. Первыми СУБД, поддерживающими новый язык, стали в 1979 году Oracle V2 для машин VAX от компании Relational Software Inc.

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

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

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

Осознавая неполноту стандарта SQL-89, на фоне завершения разработки этого стандарта специалисты различных фирм начали работу над стандартом SQL2. Эта работа также длилась несколько лет, было выпущено несколько проектов стандарта, пока, наконец, в марте 1992 г. не был выработан окончательный проект стандарта (после чего стандарт и соответствующий язык стали называть SQL-92). Этот стандарт существенно более полный и охватывает практически все необходимые для реализации аспекты: манипулирование схемой БД, управление транзакциями и сессиями (сессия — это последовательность транзакций, в пределах которой сохраняются временные отношения), подключение к БД, динамический SQL. Наконец стандартизованы отношения-каталоги БД, что вообще-то не связано с языком непосредственно, но очень сильно влияет на реализацию. Заметим, что в стандарте представлены три уровня языка — базовый, промежуточный и полный. В течение нескольких лет после принятия стандарта производители СУБД, утверждавшие совместимость своих продуктов со стандартом, на самом деле в лучшем случае поддерживали промежуточный уровень языка SQL-92 (естественно, с собственными расширениями). Только в последних выпусках СУБД ведущих производителей обеспечивается совместимость с полным вариантом языка. В 1996 году к SQL-92 присоединен еще один компонент — SQL/PSM. Главной задачей этой спецификации состояла в стандартизации методов определения и применения хранимых процедур, особым образом написанных программ, состоящих из операторов SQL, находящихся в самой базе данных и способных вызываться приложениями, а затем выполняться внутри СУБД.

В 1999 году принимаются пять основных элементов стандарта SQL 1999. Первый элемент (SQL/Framework) посвящен пояснению концептуальной структуры стандарта. Второй элемент (SQL/Fundation) формирует основу стандарта. Внедряется система типов языка, формулируется порядок установления функциональных зависимостей и вероятных ключей, обуславливаются синтаксис и семантика главных операторов SQL:

· операторы установления типа БД и управления ей,

· операторы управления данными,

· операторы управления транзакциями,

· операторы управления соединениями с базой данных и т.д.

В третьей части находятся более подробная, чем в SQL/92 спецификация SQL/CLI.

Четвертая часть посвящена спецификации SQL/PSM, синтаксису и семантике языка идентификации хранимых процедур. В пятой части (SQL/Dindings) — описан порядок связывания SQL для стандартных версий языков программирования Cobol, Fortran, PL/1, Pascal, Ada, C, MUMPS. Наконец, одновременно с завершением работ по определению стандарта SQL-92 была начата разработка стандарта SQL3. В конце 2003 г. был принят и опубликован новый вариант международного стандарта SQL:2003. Немалое количество экспертов было уверено, что в данном варианте стандарта будут только исправлены неточности SQL 1999. Однако, в SQL: 2003 добавлен ряд новых и значительных качеств.

В стандарте SQL1 был описан лишь минимальный набор типов данных, которые можно использовать для представления информации в реляционной базе данных. Они поддерживаются во всех коммерческих СУБД. Стандарт SQL2 добавил в этот список строки переменной длины, значения даты и времени и др.

Современные СУБД позволяют обрабатывать данные самых разнообразных типов, среди которых наиболее распространенными являются:

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

Десятичные числа. В столбцах данного типа хранятся числа, имеющие дробную часть, но которые необходимо вычислять точно, например курсы валют и проценты. Кроме того, в таких столбцах часто хранятся денежные величины.

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

Строки символов постоянной длины. В столбцах, имеющих этот тип данных, обычно хранятся имена людей и компаний, адреса и т.п.

Строки символов переменной длины. Столбцы этого типа позволяют хранить строки символов, длина которых изменяется в некотором диапазоне. В стандарте SQL1 были определены только строки постоянной длины, которые проще обрабатывать, но они требуют больше места для хранения.

Денежные величины. Во многих СУБД поддерживается тип данных MONEY или CURRENCY, который обычно хранится в виде десятичного числа или числа с плавающей запятой. Наличие отдельного типа данных для представления денежных величин позволяет правильно форматировать их при выводе на экран.

Дата и время. Поддержка значений даты/времени также широко распространена в различных СУБД, хотя способы ее реализации довольно сильно отличаются друг от друга. Как правило, над значениями этого типа данных можно выполнять различные операции. Стандарт SQL2 включает определение типов данных DATE, TIME, TIMESTAMP и INTERVAL, а также поддержку часовых поясов и возможность указания точности представления времени (например, десятые или сотые доли секунды).

Булевы величины. Некоторые СУБД, например Informix Universal Server, явным образом поддерживают логические значения (TRUE или FALSE), а другие СУБД разрешают выполнять в инструкциях SQL логические операции (сравнение, логическое И/ИЛИ и др.) над данными.

Длинный текст. Многие СУБД поддерживают столбцы, в которых хранятся длинные текстовые строки (обычно длиной до 32000 или 65000 символов, а в некоторых случаях и больше). Это позволяет хранить в базе данных целые документы. Как правило, СУБД запрещает использовать эти столбцы в интерактивных запросах.

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

К примеру, тип данных IMAGE в SQL Server позволяет хранить потоки данных размером до 2 миллиардов байтов.

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

Microsoft SQL Server поддерживает большинство типов данных SQL 2003. Также SQL Server поддерживает дополнительные типы данных, используемые для однозначной идентификации строк данных в таблице и на многих серверах, например UNIQUEIDENTIFIER, что соответствует аппаратной философии «роста в ширину», исповедуемой Microsoft (т. е. внедрение базы на множестве серверов на платформах Intel), вместо «роста в высоту» (т. е. внедрение на одном огромном мощном UNIX-сервере или Windows Data Center Server).

Типы данных, используемые в SQL Server:

* BIGINT (тип данных SQL2003: B1GINT)

Хранит целые числа со знаком и без знака в диапазоне от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Занимает 8 байт.

* BINARY(тип данных SQL2003: BLOB)

Хранит двоичное значение фиксированной длины от 1 до 8000 байт. Значение типа BINARY занимает п + 4 байта.

* BIT (тип данных SQL2003: BOOLEAN)

Хранит значения 1, 0 или NULL, которое обозначает «unknown». В одном байте может храниться до 8 значений из столбцов типа BIT таблицы. В еще одном байте можно разместить дополнительные 8 значений типа BIT Столбцы типа BIT нельзя индексировать.

* CHAR, CHARACTER(тип данных SQL2003: CHARACTER)

Хранит символьные данные фиксированной длины от 1 до 8000 символов. Все неиспользованное место по умолчанию заполняется пробелами. (Автоматическое заполнение пробелами можно отключить.) Тип занимает n байт.

* CURSOR (тип данных SQL2003: отсутствует)

Специальный тип данных, используемый для описания курсора в форме переменной или параметра хранимой процедуры OUTPUT. Тип нельзя использовать в инструкции CREATE TABLE. Тип CURSOR может принимать значение NULL.

* DATETIME (тип данных SQL2003: TIMESTAMP)

Хранит значение даты и времени в диапазоне с 01-01-1753 00:00:00 до 31-12-9999 23:59:59. Для хранения требуется 8 байт.

* DECIMAL, DEC , NUMERIC (тип данных SQL2003: DECIMAL , NUMERIC )

Хранит десятичные дроби длиной до 38 цифр. Масштаб по умолчанию равен 0. Занимаемое значением место определяется используемой точностью.

При точности 1-9 используется 5 байт.

При точности 10-19 используется 9 байт.

При точности 20-28 используется 13 байт.

При точности 29-39 используется 17 байт.

* FLOAT(тип данных SQL2003: FLOAT, FLOAT (n))

Хранит значения с плавающей точкой в диапазоне от-1.79Е + 308 до 1.79Е + 308. Точность, определяемая параметром и, может изменяться в пределах от 1 до 53. Для хранения 7 цифр (n — от 1 до 24) требуется 4 байта. Значения, превышающие 7 цифр, занимают 8 байт.

* IMAGE (тип данных SQL2003: BLOB)

Хранит двоичное значение переменной длины до 2 147 483 647 байт. Этот тип данных часто используется для хранения графики, звука и файлов, таких, как документы MS Word и электронные таблицы MS Excel. Значениями типа IMAGE нельзя свободно манипулировать. Столбцы типа IMAGE и TEXT имеют множество ограничений на способы использования.

* INT [IDENTITY [(seed, increment)] (тип данных SQL2003: INTEGER)

Хранит целые числа со знаком или без знака в диапазоне от -2 147 483 648 до 2 147 483 647. Занимает 4 байта. Все целочисленные типы данных, а также типы, хранящие десятичные дроби, поддерживают свойство IDENTITY, identity — это автоматически инкрементируемый идентификатор строки.

* MONEY (тип данных SQL2003: отсутствует)

Хранит денежные значения в диапазоне от -922337203685477.5808 до 922337203685477.5807. Значение занимает 8 байт.

* NCHAR(n), NATIONAL CHAR(n), NATIONAL CHARACTER(n) (тип данных SQL2003: NATIONAL СНАRACTER(n))

Хранит данные формата UNICODE фиксированной длины до 4000 символов. Для хранения требуется n*2 байт.

* NTEXT, NATIONAL TEXT (тип данных SQL2003: NCLOB)

Хранит фрагменты текста в формате UNICODE длиной до 1 073 741 823 символа. См. описание типа TEXT, где приведен список команд и функций, которые применимы и к типу NTEXT

* NUMERIC (p, s) (тип данных SQL2003: DECIMAL (p, s))

Синоним типа DECIMAL.

* NVARCHAR (n), NATIONAL CHAR VARYING(n), NATIONAL CHARACTER VARYING(n) (тип данных SQL2003: NATIONAL CHARACTER VARYING(n))

Хранит UNICODE-данные переменной длины до 4000 символов.

Занимаемое место вычисляется как удвоенное значение длины всех символов, вставленных в поле (число символов * 2).

В SQL Server системный параметр SET ANSI_PADDINGX для полей NCHAR и NVARCHAR всегда установлен (ON).

* REAL, FLOAT(24) (тип данных SQL2003: REAL)

Хранит значения с плавающей точкой в диапазоне -3.40Е+38 до 3.40Е+38. Занимает 4 байта. Тип REAL функционально эквивалентен типу FLOAT(24).

* ROWVERSION (тип данных SQL2003: отсутствует)

Уникальное число, хранимое в базе данных, которое обновляется всякий раз, когда обновляется строка, В более ранних версиях называется TIMESTAMP.

* SMALLDATETIME (тип данных SQL2003: отсутствует)

Хранит дату и время в диапазоне от ’01-01-1900 00:00? до ’06-06-2079 23:59 с точностью до минуты. (Минуты округляются до меньшего значения, если значе-ние секунд 29.998 и менее, в противном случае они округляются до большего значения.) Значение занимает 4 байта.

* SMALLINT (тип данных SQL2003: SMALLINT)

Хранит целые числа со знаком или без знака в диапазоне от -32 768 до 32 767. Занимает 2 байта. См. описание типа INT, где приведены правила, относящиеся к свойству IDENTITY, которые также применимы и к этому типу.

* SMALLMONEY (тип данных SQL2003: отсутствует)

Хранит денежные значения в диапазоне от 214748.3648 до -214748.3647. Значе-ния занимают 4 байта.

* SQLVARIANT (тип данных SQL2003: отсутствует)

Хранит значения, относящиеся к другим поддерживаемым SQL Server типам данных, за исключением типов TEXT, NTEXT, ROWVERSION и других значений типа SQL VARIANT. Может хранить до 8016 байт данных, поддерживаются значения NULL и DEFAULT. Тип SQL VARIANT используется в столбцах, параметрах, переменных и возвращаемых функциями и хранимыми процедур, ми значениях.

* TABLE (тип данных SQL2003: отсутствует)

Специальный тип, хранящий получившийся в результате работы последнего процесса набор данных. Используется исключительно для процедурной обработки и не может применяться в инструкциях CREATE TABLE. Этот тип данных уменьшает необходимость создания временных таблиц во многих приложениях. Может уменьшить необходимость перекомпиляций процедур, ускоряя, таким образом, выполнение хранимых процедур и пользовательских функций.

* TEXT (тип данных SQL2003: CLOB)

Хранит очень большие фрагменты текста длиной до 2 147 483 647 символов. Значениями типа ТЕХТн IMAGE часто гораздо труднее манипулировать, чем, скажем, значениями типа VARCHAR. Например, нельзя создавать индекс по столбцу типа TEXT или IMAGE. Значениями типа TEXT можно манипулировать при помощи функций DATALENGTH, PATINDEX, SUBSTRING, TEXTPTR и ТЕХTVALID, а также команд READTEXT,SET TEXTSIZE, UPDATETEXT и WRITETEXT.

* TIMESTAMP (тип данных SQL2003: TIMESTAMP)

Хранит автоматически генерируемое двоичное число, обеспечивающее уникальность в текущей базе данных и, следовательно, отличающееся от типа данных TIMESTAMP стандарта ANSI. Тип TIMESTAMP занимает 8 байт. В настоящее время вместо TIMESTAMP для однозначной идентификации строк лучше применять значения типа ROWVERSION.

Хранит целые числа без знака в диапазоне от 0 до 255 и занимает 1 байт. См. описание типа INT, где приведены правила, относящиеся к свойству IDENTITY, которые также применимы и к этому типу.

* UNIQUEIDENTIFIER (тип данных SQL2003: отсутствует)

Представляет собой значение, уникальное для всех баз данных и всех серверов. Представлено в виде хххххххх-хххх-хххх-хххх-хххххххххххх, в котором каждый «х» представляет собой шестнадцатеричное число в диапазоне 0-9 или а — f. Единственными операциями, которые можно производить над значениями этого типа, являются сравнение и проверка на NULL. В столбцах этого типа можно использовать ограничения и свойства, за исключением свойства IDENTITY.

* VARBINARY[(n)] (тип данных SQL2003: BLOB)

Представляет собой двоичное значение переменной длины, до 8000 байт. Занимаемое место соответствует размеру вставленных данных плюс 4 байта.

* VARCHARf(n)], CHAR VARYING [(n)], CHARACTER VARYING [(n)] (тип данных SQL2003: CHARACTER VARYING (n))

Хранит символьные данные фиксированной длины размером от 1 до 8000 символов. Занимаемое место равно реальному размеру введенного значения в байтах, а не значению n.

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

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

В настоящее время ход процесса стандартизации языка SQL отображает текущее состояние технологии SQL — ориентированных БД. Основные поставщики IBM, Oracle, Microsoft стремятся достаточно быстро подстраиваться под потребности и конъюнктуру рынка и совершенствуют свою продукцию новыми возможностями.

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

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


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

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

— Чтение данных. Пользователь имеет возможность читать информацию содержащуюся в базе данных и пользоваться ею.

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

— Управление доступом. С помощью SQL можно ограничить возможности пользователя по чтению и изменению данных и защитить их от несанкционированного доступа.

— Совместное использование данных. SQL координирует совместное использование данных пользователями, работающими параллельно, чтоб они не мешали друг другу.

— Целостность данных. SQL позволяет обеспечить целостность базы данных, защищая ее от разрушения из-за несогласованных изменений или отказа системы.

SQL- это не полноценный компьютерный язык типа COBOL, FORTRAN или C. В SQL нет оператора IF для проверки условий, нет оператора GOTO для организации переходов, отсутствуют операторы DO или FOR для создания циклов. SQL является подъязыком баз данных, в который входит около тридцати операторов, предназначенных для управления базами данных. Операторы SQL встраиваются в базовый язык COBOL, FORTRAN или C, и дают возможность получать доступ к базам данных. Кроме того, из такого языка, как С, операторы SQL могут посылать СУБД в явном виде, используя интерфейс вызовов функций. Ко всему прочему SQL- это слабо структурированный язык, по сравнению с C или Pascal. В SQL почти нет нелогичностей, к тому же имеется ряд специальных правил, предотвращающих создание операторов в SQL, которые выглядят как абсолютно правильные, но не имеют смысла.

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

SQL- интерактивный язык запросов. Каждое предложение SQL — это либо запрос данных из базы, либо обращение к базе данных, которое приводит к изменению данных в базе. В соответствии с тем, какие изменения происходят в базе данных, различают следующие типы запросов:

* запросы на создание или изменение в базе данных новых или существующих объектов (при этом в запросе описывается тип и структура создаваемого или изменяемого объекта);

* запросы на получение данных;

* запросы на добавление новых данных (записей);

* запросы на удаление данных;

* обращения к СУБД.

Основным объектом хранения реляционной базы данных является таблица, поэтому все SQL-запросы — это операции над таблицами. В соответствии с этим, запросы делятся на:

* запросы, оперирующие самими таблицами (создание и изменение таблиц);

* запросы, оперирующие с отдельными записями (или строками таблиц) или наборами записей.

Каждая таблица описывается в виде перечисления своих полей (столбцов таблицы) с указанием

* типа хранимых в каждом поле значений;

* связей между таблицами (задание первичных и вторичных ключей);

* информации, необходимой для построения индексов.

Запросы первого типа в свою очередь делятся на запросы, предназначенные для создания в базе данных новых таблиц, и на запросы, предназначенные для изменения уже существующих таблиц. Запросы второго типа оперируют со строками, и их можно разделить на запросы следующего вида:

* вставка новой строки;

* изменение значений полей строки или набора строк;

* удаление строки или набора строк.

Самый главный вид запроса — это запрос, возвращающий (пользователю) некоторый набор строк, с которым можно осуществить одну из трёх операций:

* просмотреть полученный набор;

* изменить все записи набора;

* удалить все записи набора.

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

2 . Структура языка SQL

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

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

Язык SQL представляет собой совокупность:

* и вычисляемых функций.

Согласно общепринятому стилю программирования, операторы (и другие зарезервированные слова) в SQL всегда следует писать прописными буквами.

Операторы SQL делятся на:

* операторы определения данных (Data Definition Language, DDL):

* CREATE SCHEMA — создать схему базы данных

* DROP SHEMA — удалить схему базы данных

* CREATE TABLE — создать таблицу

* ALTER TABLE — изменить таблицу

* DROP TABLE — удалить таблицу

* CREATE DOMAIN — создать домен

* ALTER DOMAIN — изменить домен

* DROP DOMAIN — удалить домен

* CREATE COLLATION — создать последовательность

* DROP COLLATION — удалить последовательность

* CREATE VIEW — создать представление

* DROP VIEW — удалить представление

Не многие программисты создают базу данных программным путём, большинство из нас для этого используют некую визуальную среду наподобие MS Access для построения файла MDB. Но иногда нам всё таки приходится создавать и удалять базу данных, а так же объекты базы данных программным путём. Для этого используется наиболее распространённая на сегодняшний день технология Structured Query Language Data Definition Language (SQL DDL). Выражения языка определения данных (DDL) — это SQL выражения, которые поддерживают определения или объявления объектов базы данных (например, CREATE TABLE, DROP TABLE, CREATE INDEX либо подобные им). В этом подразделении SQL рассматривается создание, изменение и удаление таблиц это относится к самим таблицам, а не к данным, которые в них содержатся. Таблицы создаются командой CREATE TABLE. Эта команда создает пустую таблицу — таблицу без строк. Значения вводятся с помощью DML команды INSERT

Команда ALTER TABLE не часть стандарта ANSI; но это — широко доступная, и довольно содержательная форма, хотя ее возможности несколько ограничены. Она используется, чтобы изменить определение существующей таблицы. Обычно, она добавляет столбцы к таблице. Иногда она может удалять столбцы или изменять их размеры, а также в некоторых программах добавлять или удалять ограничения. Типичный синтаксис чтобы добавить столбец к таблице:

Синтаксис для удаления таблицы, если конечно она является пустой, следующая:

];> | WHERE CURRENT OF

Если предложение WHERE отсутствует, ВСЕ строки таблицы удаляются. Если предложение WHERE использует предикат

, строки, которые удовлетворяют условию этого предиката

удаляются. Если предложение WHERE имеет аргумент CURRENT OF (ТЕКУЩИЙ) в имени курсора , строка из таблицы

на которую в данный момент имеется ссылка с помощью имени курсора будет удалена. Форма WHERE CURRENT может использоваться только во вложенном SQL, и только с модифицируемыми курсорами.

операторы манипуляции данными (Data Manipulation Language, DML):

* SELECT — отобрать строки из таблиц

* INSERT — добавить строки в таблицу

* UPDATE — изменить строки в таблице

* DELETE — удалить строки в таблице

* COMMIT — зафиксировать внесенные изменения

* ROLLBACK — откатить внесенные изменения

Язык манипулирования данными — командный язык, обеспечивающий выполнение основных операций по работе с данными: ввод, модификацию и выборку данных по запросам.

К базовым средствам манипулирования данными языка SQL относятся «поисковые» варианты операторов UPDATE и DELETE. Эти варианты называются поисковыми, потому что при задании соответствующей операции задается логическое условие, налагаемое на строки адресуемой оператором таблицы, которые должны быть подвергнуты модификации или удалению. Кроме того, в такую категорию языковых средств входит оператор

Запрос — команда, которую вы даете вашей программе базы данных, и которая сообщает ей, чтобы она вывела определенную информацию из таблиц в память. Эта информация обычно посылается непосредственно на экран компьютера или терминала, которым вы пользуетесь, хотя, в большинстве случаев, ее можно также послать принтеру, сохранить в файле (как объект в памяти компьютера), или представить как вводную информацию для другой команды или процесса.

Все запросы в SQL состоят из одиночной команды. Эта команда называется — SELECT (ВЫБОР).

[INTO (*embedded only*)] .

[ORDER BY [ASC | DESC]..];

Применяются следующие правила:

Если ни ALL, ни DISTINCT — не указаны, принимается — ALL.

Ссылаемая таблица

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

Значения могут быть помещены и удалены из полей, тремя командами языка DML (Язык Манипулирования Данными):

INSERT создает одну или больше новых строк в таблице с именем

.

Если используется предложение VALUES, их значения вставляются в таблицу с именем

. Если запрос указан, каждая строка вывода будет вставлена втаблицу с именем
. Если список столбцов отсутствует, все столбцы таблицы
, принимаются в упорядоченном виде.

язык база sql реляционный

UPDATE изменяет значения в каждом столбце с именем на соответствующее значение . Если предложение WHERE использует предикат

, то только строки таблиц чьи текущие значения делают тот предикат

верным, могут быть изменены. Если WHERE использует предложение CURRENT OF, то значения в строке таблицы с именем

находящиеся в курсоре с именем меняются. WHERE CURRENT OF пригодно для использования только во вложенном SQL, и только с модифицируемыми курсорами.

При отсутствия предложения WHERE — все строки меняются.

* операторы определения доступа к данным (Data Control Language, DCL):

* GRANT предоставляет пользователю (группе) разрешения на определенные операции с объектом,

* REVOKE отзывает ранее выданные разрешения,

* DENY задает запрет, имеющий приоритет над разрешением;

Язык баз данных для осуществления административных функций, присваивающих или отменяющих право (привилегию) использовать базу данных, таблицы в базе данных, а также выполнять те или иные операторы SQL. Выдавать и забирать права доступа к таблице может владелец таблицы. Администратор базы данных (имеющий DBA права), а так же пользователь, которому было выдано право выдавать права (операторам GRANT WITH GRANT OPTIONS)

REVOKE ALL ON customer FROM PUBLIC

GRANT ALL ON customer TO morozova, shumskiy WITH GRANT OPTION

GRANT UPDATE(fname, iname, company, sity), SELECT

ON customer TO PUBLIC

REVOKE CONNECT FROM dubcova, root

REVOKE DBA FROM morozova

Отобрать права DBA может только другой DBA. На время транзакции все изменения строки автоматически блокируются системой от изменения (но не от просмотра). Ко всему прочему можно блокировать таблицу целиком не только от изменений, но и от просмотра.

LOCK TABLE kadry

LOCK TABLE kadry EXCLUSIVE

Можно установить для программы режим «ждать разблокирования строк»

SET LOCK MODE TO WAIT

* операторы управления транзакциями (Transaction Control Language, TCL):

* COMMIT применяет транзакцию,

* ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции,

* SAVEPOINT делит транзакцию на более мелкие участки.

В базе данных, не имеющих системного журнала невозможно выполнение транзакций и восстановления до текущей контрольной точки. Поскольку за все хорошее приходится платить, наличие системного журнала у базы данных вызывает заметный рост накладных расходов и замедления работы запросов. К тому же при активной работе с базой системный журнал быстро «распухает». За ним необходимо следить и периодически чистить.

В случае потери базы данных или разрушения, можно восстановить ее из резервной копии. Восстановление базы данных должно происходить на той же версии OpenEdge, на которой создавалась резервная копия.

Есть несколько важных правил, которых стоит придерживаться при выполнении процедуры восстановления:

* Если восстановление происходит в уже существующую базу, необходимо проверить копии перед началом восстановления. В случае, если существующая базы находится в единственном экземпляре, перед восстановлением сформировать копию этой базы.

* Восстанавливают копию на той же версией OpenEdge, на которой копия была сформирована.

* Восстановление инкрементальной копии возможно только на уже восстановленную ранее базу данных.

* Создают пустую базу данных перед началом восстановления.

* Восстанавливают базу данных в той же последовательности, в какой формировали копию. Т.е сначала восстанавливайте полную копию, потом первую инкрементальную, затем вторую и т.д. При попытке восстановления базы в неправильной последовательности, вы получите ошибку восстановления.

* Если вторая инкрементальная копия была потеряна и был использован фактор перекрытия 1, то третья копия будет успешно восстановлена, т.к. содержит потерянные данные второй.

* После восстановления полной копии, не используйте базу данных, если вы собираетесь продолжить восстановление из инкрементальных копий. Если база данных будет изменена до окончания восстановления всех копий, все последующий инкрементальные копии, которые не были восстановлены восстановиться не смогут, и придется повторять всю процедуру восстановления заново, начиная с полной копии.

* Если в момент выполнения восстановления произошла системная ошибка, то запустите процедуру восстановления заново начиная с той копии, которая восстанавливалась на момент системной ошибки.

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

Для получения описания областей хранения необходимых для восстановления копии, используйте утилиту PROREST с параметром -list. Синтаксис следующий:

prorest db-name device-name -list

OpenEdge Release 10.1B as of Fri MAR 7 02:56:17 EST 2014

Area Name: Schema Area

Size: 7680, Records/Block: 32, Area Number: 6, Cluster Size: 1

Area Name: Info Area

Size: 1024, Records/Block: 32, Area Number: 7, Cluster Size: 1

Area Name: Customer/Order Area

Size: 2560, Records/Block: 32, Area Number: 8, Cluster Size: 8

Area Name: Primary Index Area

Size: 32, Records/Block: 1, Area Number: 9, Cluster Size: 8

Area Name: Customer Index Area

Size: 256, Records/Block: 1, Area Number: 10, Cluster Size 64

Area Name: Order Index Area

Size: 8192, Records/Block: 32, Area Number: 11, Cluster Size 64

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

Восстановления баз данных OpenEdge и транзакций, в случаях системных или дисковых сбоев.


OpenEdge RDBMS имеет три механизма восстановления:

* Crash recovery — использует данные BI

* Roll-forward recovery — использует резервные копии и After-image для восстановления после дисковых сбоев

* Two-phase commit — гарантирует завершении транзакция между несколькими базами данных

В зависимости от требований, можно использовать не все три механизма. Каждый механизм использует описание изменений, для записи в файл и последующей записи в базу данных.

Crash recover работает в автоматическом режиме. Он использует информацию из primary recovery log (BI), для восстановления после системных сбоев. BI файл является активной частью базы данных. Он рассматривается как неотъемлемая часть базы данных. Когда происходит копирование и восстановление базы данных, вместе с базой копируется и восстанавливается BI файл. Никогда не удаляйте файлы BI в ручную.

Когда база данных работает, информация о транзакциях базы хранится в трех местах:

* В базе данных на диске

* В буфере памяти

* В BI файлах на диске

Когда изменяется запись в базе данных, сначала изменения происходят в памяти. Когда транзакция завершена, изменения записываются в BI файл. Со временем, движок базы данных вносит изменения в базу данных на диске. Если происходит системный сбой, информация, находящаяся в буфере памяти, теряется. Движок базы данных выполняет восстановление, используя информацию из BI файла, для восстановления потерянных транзакций, а транзакции, которые не были завершены к момент сбоя — отменяются.

Перед изменением базы данных, движок базы делает копию текущих данных и записывает ее в файл BI. Это происходит по завершению операции изменения. Если происходит системный сбой во время транзакции, движок базы восстанавливает из BI файла базу данных в предшествующее состояние. Движок использует информацию BI файла, также, и при нормальной работе, для отката транзакций.

Например, допустим, выполняется следующая программа на языке ABL (Advanced Business Language):

FOR EACH customer:

UPDATE name max-credit.

Мы изменили записи о клиенте 1 и 2, и пока меняли данные о клиенте 3, произошел системный сбой. При перезагрузке базы данных (.lg), в логе базы данных появятся следующие сообщения:

11:13:54 Single-user session begin for marshall on /dev/pts/25 (451)

11:13:54 Begin Physical Redo Phase at 256 . (5326)

11:13:56 Physical Redo Phase Completed at blk 800 of 8165 and 31829 (7161)

11:13:56 Begin Physical Undo 1 transactions at blk 800 offset 8189 (7163)

11:14:38 Physical Undo Phase Completed at 1020 . (5331)

11:14:38 Begin Logical Undo Phase, 1 incomplete transactions are being backed out. (7162)

11:14:38 Logical Undo Phase Complete. (5329)

11:14:46 Single-user session end. (334)

В сообщении указаны фазы crash recovery, которые выполняет движок базы данных для приведения базы в состояние до системного сбоя. Движок выполняет crash recovery каждый раз, когда вы открываете базу данных, но не все фазы восстановления отображаются в логе базы.

Если после этого перезапустить программу, то мы обнаружим, что клиенты 1 и 2 были изменены, а клиент 3 остался без изменений, так как на основании BI файла движок вернул его информацию в первоначальное состояние.

Crash recovery защищает базу от системных сбоев, но не сможет защитить ее от ошибок носителей. В случае ошибок носителя или его полной потери, восстановление базы возможно только из резервной копии, при этом необходимо вручную провести все транзакции заново до момента сбоя, либо использовать механизм roll-forward recovery, если он был активирован на базе до сбоя.

Roll-forward recovery совместно использует after-imaging и резервную копию базы, позволяя восстанавливать ее после ошибок или после потери носителя. Используйте последнюю резервную копию, а затем roll-forward recovery для восстановления базы в состояние до возникновения ошибки или до потери носителя. Этот механизм использует информацию из AI файлов для последовательного наката транзакций, совершенных после формирования последней резервной копии, до возникновения сбоя.

Для использования механизма roll-forward recovery, необходимо:

* Постоянно выполнять резервные копии, т.к. они являются основой для работы механизма.

* Активировать на базе данных механизм After-imaging

* Постоянно делать резервные копии сформированных AI — файлов.

* Храните AI-файлы на другом диске, отличном от того на котором находятся база данных и BI-файлы.

При активированном After — imaging, информация об изменениях записывается движком базы в AI-файлы. Если ai-файлы будут храниться на том же диске, что и база данных или BI — файлы, то в случае повреждения диска, вы будете не в состоянии восстановить базу данных.

Следующий пример, показывает как AI — файлы используются для восстановления базы данных. Допустим, что выполняется следующая программа ABL:

FOR EACH customer:

UPDATE name max-credit.

Вы изменяете клиентов 1 и 2, но в момент изменения данных о клиенте 3, происходит повреждение диска, на котором хранится база данных. Вы не можете использовать BI -файл для восстановления транзакций, т.к. база данных находится в поврежденном состоянии или полностью потеряна.

Тем не менее, если after-imaging был активирован, для восстановления базы можно использовать механизм roll-forward recovery. Иначе, мы потеряли бы все внесенные изменения в базу данных с момента формирования последней резервной копии.

Перед изменением базы данных, движок помечает изменения как текущие и сохраняет их в BI и AI файлы. AI-файлы содержат копии всех завершенных транзакций с момента последней резервной копии. Восстановите последнюю копию базы данных, и запустите механизм roll-forward recovery, для воспроизведения всех завершенных транзакций, таким образом, мы получим полноценную базу данных до момента сбоя.

Two-phase commit гарантирует, что транзакция между несколькими базами данных последовательно пройдет через все используемые базы. Two-phase commit не нужен для транзакций, работающих с одной базой данных.

Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML, могут быть достаточно легко перенесены из одной СУБД в другую. Существуют системы, разработчики которых изначально ориентировались на применение по меньшей мере нескольких СУБД (например: система электронного документооборота Documentum может работать как с Oracle Database, так и с Microsoft SQL Server и DB2). Естественно, что при применении некоторых специфичных для реализации возможностей такой переносимости добиться уже очень трудно.

Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту только способствует «стабилизации» языка. Правда, стоит обратить внимание, что сам по себе стандарт местами чересчур формализован и раздут в размерах (например, базовая часть стандарта SQL:2003 состоит из более 1300 страниц текста).С помощью SQL программист описывает только то, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обработке SQL-запроса. Однако не стоит думать, что это полностью универсальный принцип — программист описывает набор данных для выборки или модификации, однако ему при этом полезно представлять, как СУБД будет разбирать текст его запроса. Чем сложнее сконструирован запрос, тем больше он допускает вариантов написания, различных по скорости выполнения, но одинаковых по итоговому набору данных.

Доступ к SQL Server предусмотрен из большого числа средств разработки клиентских приложений, настольных баз данных и офисных продуктов. Изначально SQL адаптирован под взаимодействие с другими серверами BackOffice, что благоприятствует прямо охватить решение комплексных задач хранения и обработки информации, электронного документооборота, создания интернет-приложений и т.д. SQL используется как в стандартных клиент-серверных платформах, так и в многоуровневых средах. Microsoft Transaction Server является одним из главных инструментов при создании распределенных приложений.

В последних стандартах языка SQL содержатся:

· генераторы типов массивов и мультимножеств, элементами которых могут быть значения предопределенных типов, типов коллекций, анонимных строчных типов строк и типов, определенных пользователями;

· генератор анонимных строчных типов, в которых типом элемента строки может быть любой предопределенный тип, тип коллекции, анонимный строчный тип и тип, определенный пользователями;

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

· сформированный набор готовых типов, включая ряд параметризуемых типов.

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

Создатели реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности, они указывают на следующие проблемы SQL:

· неопределённые значения (nulls);

· явное указание порядка колонок слева направо;

· колонки без имени и дублирующиеся имена колонок;

· отсутствие поддержки свойства «=»;

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

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

SQL- язык администрирования баз данных. Администратор базы данных, использует SQL для определения структуры базы данных и управления доступом к данным.

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

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

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

SQLite, MySQL и PostgreSQL: сравниваем популярные реляционные СУБД

Реляционные базы данных используются уже очень давно. Они стали популярными благодаря успешным реализациям реляционных моделей в системах управления, оказавшимся весьма удобными для работы с данными. В этой статье мы сравним три самые популярные реляционные системы управления базами данных (РСУБД): SQLite, MySQL и PostgreSQL.

Системы управления базами данных

Базы данных — это логически смоделированные хранилища любых типов данных. Каждая база данных, не являющаяся бессхемной, следует модели, которая задаёт определённую структуру обработки данных. СУБД — это приложения (или библиотеки), управляющие базами данных различных форм, размеров и типов.

Чтобы лучше разобраться в СУБД, ознакомьтесь с этой статьёй.

Реляционные системы управления базами данных

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

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

Отношения и типы данных

Отношения можно определить как математические множества, содержащие наборы атрибутов, отображающие хранящуюся информацию.

Level.Travel, Москва, до 200 000 ₽

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

Такого рода ограничения обычны для реляционных баз данных. Фактически, они и формируют суть отношений.

Популярные РСУБД

В этой статье мы расскажем о 3 наиболее популярных РСУБД:

  • SQLite: очень мощная встраиваемая РСУБД.
  • MySQL: самая популярная и часто используемая РСУБД.
  • PostgreSQL: самая продвинутая и гибкая РСУБД.

SQLite

SQLite — это изумительная библиотека, встраиваемая в приложение, которое её использует. Будучи файловой БД, она предоставляет отличный набор инструментов для более простой (в сравнении с серверными БД) обработки любых видов данных.

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

Поддерживаемые типы данных

  • NULL: NULL-значение.
  • INTEGER: целое со знаком, хранящееся в 1, 2, 3, 4, 6, или 8 байтах.
  • REAL: число с плавающей запятой, хранящееся в 8-байтовом формате IEEE.
  • TEXT: текстовая строка с кодировкойUTF-8, UTF-16BE или UTF-16LE.
  • BLOB: тип данных, хранящийся точно в таком же виде, в каком и был получен.

Note: для получения более подробной информации ознакомьтесь с документацией.

Преимущества

  • Файловая: вся база данных хранится в одном файле, что облегчает перемещение.
  • Стандартизированная: SQLite использует SQL; некоторые функции опущены ( RIGHT OUTER JOIN или FOR EACH STATEMENT ), однако, есть и некоторые новые.
  • Отлично подходит для разработки и даже тестирования: во время этапа разработки большинству требуется масштабируемое решение. SQLite, со своим богатым набором функций, может предоставить более чем достаточный функционал, при этом будучи достаточно простой для работы с одним файлом и связанной сишной библиотекой.

Недостатки

  • Отсутствие пользовательского управления: продвинутые БД предоставляют пользователям возможность управлять связями в таблицах в соответствии с привилегиями, но у SQLite такой функции нет.
  • Невозможность дополнительной настройки: опять-таки, SQLite нельзя сделать более производительной, поковырявшись в настройках — так уж она устроена.

Когда стоит использовать SQLite

  • Встроенные приложения: все портируемые не предназначенные для масштабирования приложения — например, локальные однопользовательские приложения, мобильные приложения или игры.
  • Система доступа к дисковой памяти: в большинстве случаев приложения, часто производящие прямые операции чтения/записи на диск, можно перевести на SQLite для повышения производительности.
  • Тестирование: отлично подойдёт для большинства приложений, частью функционала которых является тестирование бизнес-логики.

Когда не стоит использовать SQLite

  • Многопользовательские приложения: если вы работаете над приложением, доступом к БД в котором будут одновременно пользоваться несколько человек, лучше выбрать полнофункциональную РСУБД — например, MySQL.
  • Приложения, записывающие большие объёмы данных: одним из ограничений SQLite являются операции записи. Эта РСУБД допускает единовременное исполнение лишь одной операции записи.

MySQL

MySQL — это самая популярная из всех крупных серверных БД. Разобраться в ней очень просто, да и в сети о ней можно найти большое количество информации. Хотя MySQL и не пытается полностью реализовать SQL-стандарты, она предлагает широкий функционал. Приложения общаются с базой данных через процесс-демон.

Поддерживаемые типы данных

  • TINYINT: очень маленькое целое.
  • SMALLINT: маленькое целое.
  • MEDIUMINT: целое среднего размера.
  • INT или INTEGER: целое нормального размера.
  • BIGINT: большое целое.
  • FLOAT: знаковое число с плавающей запятой одинарной точности.
  • DOUBLE, DOUBLE PRECISION, REAL: знаковое число с плавающей запятой двойной точности.
  • DECIMAL, NUMERIC: знаковое число с плавающей запятой.
  • DATE: дата.
  • DATETIME: комбинация даты и времени.
  • TIMESTAMP: отметка времени.
  • TIME: время.
  • YEAR: год в формате YY или YYYY.
  • CHAR: строка фиксированного размера, дополняемая справа пробелами до максимальной длины.
  • VARCHAR: строка переменной длины.
  • TINYBLOB, TINYTEXT: BLOB- или TEXT-столбец длиной максимум 255 (2^8 – 1) символов.
  • BLOB, TEXT: BLOB- или TEXT-столбец длиной максимум 65535 (2^16 – 1) символов.
  • MEDIUMBLOB, MEDIUMTEXT: BLOB- или TEXT-столбец длиной максимум 16777215 (2^24 – 1) символов.
  • LONGBLOB, LONGTEXT: BLOB- или TEXT-столбец длиной максимум 4294967295 (2^32 – 1) символов.
  • ENUM: перечисление.
  • SET: множества.

Преимущества

  • Простота: MySQL легко устанавливается. Существует много сторонних инструментов, включая визуальные, облегчающих начало работы с БД.
  • Много функций: MySQL поддерживает большую часть функционала SQL.
  • Безопасность: в MySQL встроено много функций безопасности.
  • Мощность и масштабируемость: MySQL может работать с действительно большими объёмами данных, и неплохо походит для масштабируемых приложений.
  • Скорость: пренебрежение некоторыми стандартами позволяет MySQL работать производительнее, местами срезая на поворотах.

Недостатки

  • Известные ограничения: по определению, MySQL не может сделать всё, что угодно, и в ней присутствуют определённые ограничения функциональности.
  • Вопросы надёжности: некоторые операции реализованы менее надёжно, чем в других РСУБД.
  • Застой в разработке: хотя MySQL и является open-source продуктом, работа над ней сильно заторможена. Тем не менее, существует несколько БД, полностью основанных на MySQL (например, MariaDB). Кстати, подробнее о родстве MariaDB и MySQL можно из нашего интервью с создателем обеих РСУБД — Джеймсом Боттомли.

Когда стоит использовать MySQL

  • Распределённые операции: когда вам нужен функционал бо́льший, чем может предоставить SQLite, стоит использовать MySQL.
  • Высокая безопасность: функции безопасности MySQL предоставляют надёжную защиту доступа и использования данных.
  • Веб-сайты и приложения: большая часть веб-ресурсов вполне может работать с MySQL, несмотря на ограничения. Этот инструмент весьма гибок и прост в обращении, что только на руку в длительной перспективе.
  • Кастомные решения: если вы работаете над очень специфичным продуктом, MySQL подстроится под ваши потребности благодаря широкому спектру настроек и режимов работы.

Когда не стоит использовать MySQL

  • SQL-совместимость: поскольку MySQL не пытается полностью реализовать стандарты SQL, она не является полностью совместимой с SQL. Из-за этого могут возникнуть проблемы при интеграции с другими РСУБД.
  • Конкурентность: хотя MySQL неплохо справляется с операциями чтения, одновременные операции чтения-записи могут вызвать проблемы.
  • Недостаток функций: в зависимости от выбора движка MySQL может недоставать некоторых функций.

PostgreSQL

PostgreSQL — это самая продвинутая РСУБД, ориентирующаяся в первую очередь на полное соответствие стандартам и расширяемость. PostgreSQL, или Postgres, пытается полностью соответствовать SQL-стандартам ANSI/ISO.

PostgreSQL отличается от других РСУБД тем, что обладает объектно-ориентированным функционалом, в том числе полной поддержкой концепта ACID (Atomicity, Consistency, Isolation, Durability).

Будучи основанным на мощной технологии Postgres отлично справляется с одновременной обработкой нескольких заданий. Поддержка конкурентности реализована с использованием MVCC (Multiversion Concurrency Control), что также обеспечивает совместимость с ACID.

Хотя эта РСУБД не так популярна, как MySQL, существует много сторонних инструментов и библиотек для облегчения работы с PostgreSQL.

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

SQL (Structured Query Language)

SQL
Парадигма Мультипарадигмальный
Спроектировано Дональд Чемберлин
Рэймонд Бойс
Разработчики ISO/IEC
Первый появившийся 1974
Стабильная версия SQL:2008 / 2008
Печать дисциплины Статическая, строгая
OS Кроссплатформенный
Расширение файла .sql
Главная реализация
Много
Диалект
SQL-86, SQL-89, SQL-92, SQL:1999, SQL:2003, SQL:2008
Под влиянием
Datalog
Влияние
Agena, CQL, LINQ, Windows PowerShell [1]
SQL (Structured Query Language)
Разработчик ISO/IEC
Начальная версия 1986
Последний релиз
Тип формата Базы данных
Стандарт ISO/IEC 9075
Открытый формат? Да

SQL — (Structured Query Language, произносится ˈstrʌkʧəd ˈkwɪəri ˈlæŋgwɪʤ) — язык программирования специального назначения, разработанный для управления данными в реляционных СУБД. В круг ответственности SQL входит добавлене данных, извлечение по запросу, обновление и их удаление, а также создание и изменение схемы реляционной БД, контроль прав доступа к данным. Несмотря на то, что в основном SQL описывают как декларативный язык, в него включены и процедурные элементы. Все крупнейшие реляционные СУБД поддерживают SQL в той или иной форме. В дополнение к этому, все программы, написанные на SQL, портируются между всеми реализациями SQL, подчиняющимися стандарту, либо с изменениями на любые другие реализации.

Содержание

История

Первые разработки

В начале 1970-х годов в одной из исследовательских лабораторий компании IBM была разработана экспериментальная реляционная СУБД IBM System R, для которой затем был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. Аббревиатура SEQUEL расшифровывалась как Structured English QUEry Language — «структурированный английский язык запросов». Позже по юридическим соображениям [2] язык SEQUEL был переименован в SQL. Когда в 1986 году первый стандарт языка SQL был принят ANSI, официальным произношением стало [,es kju:’ el] — эс-кью-эл. Несмотря на это, даже англоязычные специалисты зачастую продолжают читать SQL как сиквел (по-русски часто говорят «эс-ку-эль»).

C одной стороны, SQL был ориентирован на удобную и понятную пользователям формулировку запросов к реляционным БД. С другой стороны, практически с самого начала он был так называемым «полным языком БД». Это означает, что SQL включал:

  • средства определения и манипулирования схемой БД;
  • средства определения ограничений целостности и триггеров;
  • средства определения представлений БД;
  • средства определения структур физического уровня, поддерживающих эффективное выполнение запросов;
  • средства авторизации доступа к отношениям и их полям;
  • средства определения точек сохранения транзакции и выполнения фиксации и откатов транзакций.

Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования. Собственно разработкой языка запросов занимались Дональд Чэмбэрлин и Рэй Бойс (|Ray Boyce). Пэт Селинджер (Pat Selinger) занималась разработкой стоимостного оптимизатора (Шаблон:Lang-en2), Рэймонд Лори (Raymond Lorie) занимался компилятором запросов.

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

Первыми СУБД, поддерживающими новый язык, стали в 1979 году Oracle V2 для машин VAX от компании Relational Software Inc. (впоследствии ставшей компанией Oracle) и System/38 от IBM, основанная на System/R.

Стандартизация

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

В 1983 году Международная организация по стандартизации (ISO) и Американский национальный институт стандартов (ANSI) приступили к разработке стандарта языка SQL. По прошествии множества консультаций и отклонения нескольких предварительных вариантов, в 1986 году ANSI представил свою первую версию стандарта, описанную в документе ANSI X3.135-1986 под названием «Database Language SQL» (Язык баз данных SQL). Неофициально этот стандарт SQL-86 получил название SQL1. Год спустя была завершена работа над версией стандарта ISO 9075-1987 под тем же названием. Разработка этого стандарта велась под патронажем Технического Комитета TC97 (Technical Committee TC97), областью деятельности которого являлись процессы вычисления и обработки информации (Computing and Information Processing). Именно его подразделение, именуемое как Подкомитет SC21 (Subcommittee SC21), курировало разработку стандарта, что стало залогом идентичности стандартов ISO и ANSI для SQL1 (SQL-86).

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

Со временем к стандарту накопилось несколько замечаний и пожеланий, особенно с точки зрения обеспечения целостности и корректности данных, в результате чего в 1989 году данный стандарт был расширен, получив название SQL89. В частности, в него была добавлена концепция первичного и внешнего ключей. ISO-версия документа получила название ISO 9075:1989 «Database Language SQL with Integrity Enhancements» (Язык баз данных SQL с добавлением контроля целостности). Параллельно была закончена и ANSI-версия.

Сразу после завершения работы над стандартом SQL1 в 1987 году была начата работа над новой версией стандарта, который должен был заменить стандарт SQL89, получив название SQL2, поскольку дата принятия документа на тот момент была неизвестна. Таким образом, фактически SQL89 и SQL2 разрабатывались параллельно. Новая версия стандарта была принята в 1992 году, заменив стандарт SQL89. Новый стандарт, озаглавленный как SQL92, представлял собой по сути расширение стандарта SQL1, включив в себя множество дополнений, имевшихся в предыдущих версиях инструкций.

Как и SQL1, SQL92 также был разделён на несколько уровней, однако, во-первых, число уровней было увеличено с двух до трёх, а во-вторых, они получили названия вместо порядковых цифр: начальный (entry), средний (intermediate), полный (full). Уровень «полный», как и Уровень 2 в SQL1 подразумевал весь стандарт целиком. Уровень «начальный» представлял собой подмножество уровня «средний», в свою очередь, представлявшего собой подмножество уровня «полный». Уровень «начальный» был сравним с Уровнем 2 стандарта SQL1, но спецификации этого уровня были несколько расширены. Таким образом, цепочка включений уровней стандартов выглядела примерно следующим образом: SQL1 Уровень 1 → SQL1 Уровень 2 → SQL92 «Начальный» → SQL92 «Средний» → SQL92 «Полный».

После принятия стандарта SQL92 к нему были добавлены ещё несколько документов, расширявших функциональность языка. Так, в 1995 году был принят стандарт SQL/CLI (Call Level Interface, интерфейс уровня вызовов), впоследствии переименованный в CLI95. На следующий год был принят стандарт SQL/PSM (Persistent Stored Modules, постоянно хранимые модули), получивший название PSM-96. [3]

Следующим стандартом стал SQL:1999 (SQL3). В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже (SQL:2008). История версий стандарта:

Год Название Иное название Изменения
1986 SQL-86 SQL-87 Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году.
1989 SQL-89 FIPS 127-1 Немного доработанный вариант предыдущего стандарта.
1992 SQL-92 SQL2, FIPS 127-2 Значительные изменения (ISO 9075); уровень Entry Level стандарта SQL-92 был принят как стандарт FIPS 127-2.
1999 SQL:1999 SQL3 Добавлена поддержка регулярных выражений, рекурсивных запросов, поддержка триггеров, базовые процедурные расширения, нескалярные типы данных и некоторые объектно-ориентированные возможности.
2003 SQL:2003 Введены расширения для работы с XML-данными, оконные функции (применяемые для работы с OLAP-базами данных), генераторы последовательностей и основанные на них типы данных.
2006 SQL:2006 Функциональность работы с XML-данными значительно расширена. Появилась возможность совместно использовать в запросах SQL и XQuery.
2008 SQL:2008 Улучшены возможности оконных функций, устранены некоторые неоднозначности стандарта SQL:2003 [4]

Для поставщиков СУБД стандарт — это путеводная звезда, которая гарантирует правильное направление работ. А вот эффективность реализации стандарта — это гарантия успеха. SQL нельзя в полной мере отнести к традиционным языкам программирования, он не содержит традиционные операторы, управляющие ходом выполнения программы, операторы описания типов и многое другое, он содержит только набор стандартных операторов доступа к данным, хранящимся в базе данных. Операторы SQL встраиваются в базовый язык программирования, которым может быть любой стандартный язык типа C++, PL, COBOL и т. д. Кроме того, операторы SQL могут выполняться непосредственно в интерактивном режиме.

Альтернатива

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

  • .QL: Объектно-ориентированный Datalog
  • 4D Query Language (4D QL)
  • BQL: Надмножество, которое сводится к SQL
  • Datalog: Критики предполагают, что Datalog имеет два преимущества перед SQL: он имеет более понятную семантику, что облегчает понимание и обслуживание программ, и это более выразительно, в частности, для рекурсивных запросов.
  • HTSQL: Метод запросов на основе URL
  • IBM Business System 12 (IBM BS12): Одна из первых полностью реляционных систем управления базами данных, введенная в 1982 году
  • ISBL
  • jOOQ: SQL, реализованный на Java как внутренний язык, специфичный для домена
  • Java Persistence Query Language (JPQL): Язык запросов, используемый API Java Persistence и библиотеку персистентности вспящем режиме
  • LINQ: Запускает операторы SQL, написанные как языковые конструкции, для запроса коллекций непосредственно изнутри кода .Net.
  • Object Query Language
  • QBE (Query By Example), созданный Moshè Zloof, IBM в 1977
  • Quel Введенный в 1974 U.C. Berkeley.
  • Tutorial D
  • XQuery

Структура

SQL отошёл от своего теоретического основания, реляционной модели и исчисления кортежей. В SQL таблица — не набор кортежей, а список строк: в таблице возможны строки-дубликаты, неопределённые значения, порядок колонок определён и нумеруем, а сами колонки могут иметь одинаковые имена или не иметь имён вовсе. SQL — язык специального назначения, его цель — предоставить интерфейс к реляционной БД, а SQL программа — не что иное, как инструкция для СУБД.

SQL включает в себя выражения, решающие широкий круг задач:

  • Запросы к БД.
  • Вставка, обновление, удаление строк из таблиц.
  • Создание, замена, изменение и удаление таблиц и других объектов.
  • Управление доступом пользователей к объектам и услугам СУБД.
  • Средства гарантии целостности реляционной БД.

Команды языка SQL чатсо разделяют на наиболее крупные сегменты:

  • Data Definition Language — синтаксис объявления схем реляционных баз данных.
  • Data Manipulation Language — синтаксис запросов, команд добавления, изменения и удаления.
  • Data Control Language — команды управления доступом к данным и операциям над ними различных учётных записей.

Синтаксис

Структура программы

Программа на языке SQL — набор запросов и высказываний. Запросы в декларативной форме извлекают из базы данных необходимую информацию. Высказывания обычно имеют долгосрочный эффект на данные или на саму схему БД, а также управляют осуществлением транзакций, сессиями, диагностикой, соединением.

Data definition language

Data Definition Language используется для модификации схемы реляционной базы данных. Этот раздел языка состоит из четырёх типов утверждений: CREATE, ALTER, DROP, RENAME.

Create

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

ALTER

Команда ALTER используется для модификации уже существующего в БД объекта.

Команда DROP уничтожает существующий объект (будь то база данных, таблица или иной объект).

RENAME

Команда RENAME используется для переименования таблицы.

Data manipulation language

Data Manipulation Language используется для составления запросов к СУБД или модификации её содержимого. Раздел языка состоит из четырёх типов утверждений: SELECT, INSERT, UPDATE и DELETE.

SELECT

SELECT извлекает 0 или более строк из различных таблиц или отображений.

Декларативное утверждение SELECT формулирует запрос с помощью условий FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER_BY, DISTINCT и др. Возможны вложенные запросы, хотя их производительность обычно уступает классическому подходу с применением JOIN. Вложенный запрос также называют подзапросом.

INSERT

INSERT используется для добавления новых строк в таблицу.

UPDATE

UPDATE используется для модификации уже существующей строки.

DELETE

DELETE удаляет заданный условием набор строк.

MERGE

MERGE объединяет элементы нескольких таблиц.

Data control language

Синтаксис Data Control Language используется для ограничения прав пользователей базы данных. Содержит два основных утверждения: GRANT и REVOKE.

GRANT

GRANT предоставляет привилегии пользователю. Все команды SQL выполняются от имени определённого пользователя.

REVOKE

REVOKE снимает привилегии с пользователя. Для полного снятия привилегии необходимо её снятие с понижаемого в полномочиях пользователя всеми пользователями, её давшими.

Управление транзакциями

START TRANSACTION, COMMIT, SAVE TRANSACTION, ROLLBACK — набор команд, использующихся для организации транзакций и обеспечивающих надёжность и целостность реляционной БД.

Преимущества и недостатки

Преимущества

Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML, могут быть достаточно легко перенесены из одной СУБД в другую. Существуют системы, разработчики которых изначально ориентировались на применение по меньшей мере нескольких СУБД (например: система электронного документооборота Documentum может работать как с Oracle Database, так и с Microsoft SQL Server и DB2). Естественно, что при применении некоторых специфичных для реализации возможностей такой переносимости добиться уже очень трудно.

Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту только способствует «стабилизации» языка. Правда, стоит обратить внимание, что сам по себе стандарт местами чересчур формализован и раздут в размерах (например, базовая часть стандарта SQL:2003 состоит из более чем 1300 страниц текста).

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

Недостатки

Создатели реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности, они указывают на следующие дефекты SQL с точки зрения реляционной теории [5] :

  • SQL разрешает в таблицах строки-дубликаты, что в рамках реляционной модели данных невозможно и недопустимо;
  • SQL поддерживает неопределённые значения (NULL) и многозначную логику;
  • SQL использует порядок колонок и ссылки на колонки по номерам;
  • SQL разрешает колонки без имени и дублирующиеся имена колонок.

В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем манифесте [6] они излагают принципы СУБД следующего поколения и предлагают язык Tutorial D, который является подлинно реляционным.

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

Отступления от стандартов

Несмотря на наличие международного стандарта ANSI SQL-92, многие разработчики СУБД вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом появляются специфичные для каждой конкретной СУБД диалекты языка SQL.

Сложность работы с иерархическими структурами

Ранее диалекты SQL большинства СУБД не предлагали способа манипуляции древовидными структурами. Некоторые поставщики СУБД предлагали свои решения (например, в Oracle Database используется выражение CONNECT BY). В настоящее время в ANSI стандартизована рекурсивная конструкция WITH из диалекта SQL DB2. В Microsoft SQL Server рекурсивные запросы (Recursive Common Table Expressions) появились лишь в версии 2005.

Распределенная обработка SQL

Архитектура распределенной реляционной базы данных (DRDA) была разработана рабочей группой в IBM в период с 1988 по 1994 год. DRDA позволяет связанным с сетью реляционным базам данных взаимодействовать для выполнения запросов SQL. Интерактивный пользователь или программа может выдавать SQL-запросы локальному RDB и получать таблицы данных и индикаторы состояния в ответ от удаленных RDB. Операторы SQL также могут быть скомпилированы и сохранены в удаленных RDB как пакеты, а затем вызваны именем этого пакета. Это важно для эффективной работы прикладных программ, которые вызывают сложные высокочастотные запросы. Это особенно важно, когда доступ к таблицам находится в удаленных системах. Сообщения, протоколы и структурные компоненты DRDA определяются архитектурой распределенного управления данными.

SQL – Язык программирования БД

Главное меню » Базы данных » SQL – Язык программирования БД

SQL (Structured Query Language — Структурированный язык запросов) — язык управления базами данных для реляционных баз данных. Сам по для себя SQL не считается Тьюринг-полным языком программирования, но его стереотип позволяет делать для него процедурные расширения, которые расширяют его работоспособность до полновесного языка программирования.

Язык был сотворен в 1970х годах под заглавием “SEQUEL” для системы управления базами данных (СУБД) System R. Позже он был переименован в “SQL” во избежание инцендента торговых марок. В 1979 году SQL был в первый раз размещен в облике платного продукта Oracle V2.

1-ый официальный стереотип языка был принят ANSI в 1986 году и ISO — в 1987. С тех времен были сделаны ещё некоторое количество версий эталона, кое-какие из их повторяли прошлые с малозначительными вариантами, иные воспринимали свежие немаловажные черты.

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

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

SQL произведено из четырех отдельных частей:

  • язык определения данных (DDL) применяется для определения структур данных, хранящихся в основе данных. Операторы DDL дают возможность делать, менять и удалять отдельные объекты в БД. Допускаемые типы объектов находятся в зависимости от применяемой СУБД и как правило включают базы данных, юзеров, таблицы и ряд больше маленьких запасных объектов, к примеру, роли и индексы.
  • язык манипуляции данными (DML) применяется для извлечения и конфигурации данных в БД. Операторы DML дают возможность извлекать, вставлять, менять и удалять данные в таблицах. Временами операторы select извлечения данных не рассматриваются как часть DML, потому что они не изменяют положение данных. Все операторы DML одевают декларативный нрав.
  • язык определения доступа к сведениям (DCL) применяется для контроля доступа к сведениям в БД. Операторы DCL используются к привилегиям и дают возможность выдавать и отнимать права на использование конкретных операторов DDL и DML к конкретным объектам БД.
  • язык управления транзакциями (TCL) применяется для контроля обработки транзакций в БД. Как правило операторы TCL включают commit для доказательства перемен, изготовленных в ходе транзакции, rollback для их отмены и savepoint для разбиения транзакции на некоторое количество наименьших частей.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Язык запросов SQL

Одно из обязательных умений современного программиста — это умение работать с языком запросов SQL. Язык SQL (читается «эс-ку-эль») — это фактический стандарт для обращения к базам данных (БД).

Общая идея языка SQL состоит в том, чтобы программист мог обращаться к любым базам данным на одном универсальном языке. В настоящее время все реляционные СУБД поддерживают язык SQL. А самые популярные СУБД MySQL и SQLite даже содержат SQL в своем названии.

1. Описание SQL

Язык SQL говоря упрощенно — это набор операторов к базе данных. Эти операторы позволяют

  • Создать в базе данных новую таблицу;
  • Добавить в таблицу новые записи;
  • Изменить записи;
  • Удалить записи;
  • Сделать выборку.

Давайте сделаем простой пример. Для этого надо запустить менеджер БД SQLiteStudio, который есть в сборке «Си-экспресс». Затем выполнить команду меню «Базы данных — Добавить базу данных».

Назовем базу данных db1 (от database). Далее выполняем команду «Структура — Создать таблицу». Даем название таблицы «Книги» и нажатием Ins добавляем два поля «Автор» и «Название».

Далее нажимаем на вкладку DDL и видим SQL-запрос, которым на самом деле мы и сделали эту таблицу.

Удобство использования менеджера БД в том, что не надо запоминать команды языка SQL. Можно визуально создавать таблицы и поля и потом смотреть SQL-запросы. Что мы видим в этом запросе?

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL