Язык SQL. Элементы, структура, история языка SQL
1. История возникновения и стандарты языка SQL
Язык SQL (Structured Query Language) – Структурированный Язык Запросов – предназначен для работы с реляционными базами данных. Он дает возможность выполнять операции над таблицами (создание, удаление, изменение структуры) и над данными таблиц (выборка, изменение, добавление, удаление).
История возникновения языка SQL начинается в 1970 году, когда доктор Э.Ф. Кодд предложил реляционную модель в качестве новой модели базы данных. Для доказательства жизнеспособности новой модели данных в компании IBM был создан мощный исследовательский проект, получивший название System/R. Проект включал разработку собственно реляционной СУБД и специального языка запросов к базе данных.
Первоначально язык получил название SEQUEL (Structured English Query Language) – структурированный английский язык запросов и произносился как «сиквэл». Позже по юридическим соображениям («SEQUEL» был товарной маркой британской авиастроительной группы компаний «Hawker Siddeley») язык SEQUEL был переименован в язык SQL (Structured Query Language) и официальное произношение стало побуквенным «эс-кью-эль».
В дальнейшем этот язык применялся во многих коммерческих СУБД и в силу своего широкого распространения постепенно стал стандартом “де-факто” для языков манипулирования данными в реляционных СУБД.
С момента создания и до наших дней язык SQL претерпел массу изменений, но идеология осталась неизменной.
Совершенно очевидно, что язык SQL никогда не получил бы мирового признания, если бы на него не было никаких стандартов. Стандартизация – важная часть технологических процессов конца XX века. Именно наличие разработанных и официально признанных стандартов позволило утвердиться многим современным технологиям (не только в индустрии разработки программного обеспечения, но и во многих других сферах человеческой деятельности).
В результате выработки общих требований к средствам обработки данных в 1989 г. появился стандарт SQL-89. Иногда этот стандарт называют стандартом ANSI/ISO (ANSI — Американский Национальный Институт Стандартов, ISO — Международная Организация по Стандартизации). Подавляющее большинство СУБД поддерживают этот стандарт полностью. Однако развитие информационных технологий, связанных с базами данных, и необходимость реализации переносимых приложений потребовали доработки и расширения первого стандарта.
В 1992 году появилась версия стандарта SQL-92, который часто называется SQL2. В настоящий момент большинство производителей СУБД внесли изменения в свои продукты с тем, чтобы они в большей степени удовлетворяли стандарту SQL-92.
Следующим стандартом стал SQL:1999 (SQL3), в котором добавлена поддержка регулярных выражений, рекурсивных запросов, поддержка триггеров, базовые процедурные расширения, нескалярные типы данных и некоторые объектно-ориентированные возможности. В 2003 году был принят стандарт SQL:2003.
В него были введены расширения для работы с XML-данными, оконные функции. Позднее в него были внесены некоторые модификации, например, функциональность работы с XMLданными значительно расширена. Так появился стандарт SQL:2006. В стандарте SQL:2008 улучшены возможности оконных функций, устранены некоторые неоднозначности стандарта SQL:2003.
В стандарте SQL:2011 реализована поддержка хронологических баз данных, а также поддержка конструкции FETCH. В стандарт SQL:2016 добавлена защита на уровне строк, включены полиморфные табличные функции и текстовый формат обмена данными, основанный на JavaScript.
Элегантность и независимость от специфики компьютерных технологий, а также его поддержка лидерами промышленности в области технологии реляционных баз данных, сделало SQL основным стандартным языком. По этой причине, любой, кто хочет работать с базами данных, должен знать SQL.
Язык SQL является непроцедурным языком, с помощью которого программист определяет только требуемый результат, не указывая алгоритм его достижения. Поэтому первоначально он не содержал команды управления ходом вычислительного процесса, организации подпрограмм, ввода-вывода, описания типов и многое другое, что присуще традиционным языкам программирования. В связи с этим язык SQL автономно не используется. Обычно команды SQL встраиваются в язык программирования СУБД. Кроме того, команды SQL могут выполняться непосредственно в интерактивном режиме.
В архитектуре «клиент-сервер» язык SQL занимает очень важное место. Именно он используется как язык общения клиентского программного обеспечения с серверной СУБД, расположенной на удаленном компьютере. Так, клиент посылает серверу запрос на языке SQL, а сервер разбирает его, интерпретирует, выбирает план выполнения, выполняет запрос и отсылает клиенту результат.
Несмотря на то, что стандарты обозначают некоторое общее понимание того, каким должен быть язык взаимодействия с базой данных, различные производители реализуют его в своих программных продуктах (СУБД) по-разному. Связано это с тем, что для расширения функциональных возможностей и повышения эффективности разработчики конкретной СУБД добавляют к стандартному языку SQL дополнительные команды и функции, исходя из собственного понимания их необходимости, сохраняя при этом некоторые особенности предыдущих версий. Поскольку сферы интересов пользователей различных СУБД отличаются друг от друга, различаются и создаваемые расширения. Таким образом, существует несколько диалектов языка SQL.
Далее речь пойдет о языке Transact-SQL, который используется в СУБД компании Microsoft.
2. Элементы языкаTransact-SQL
Несмотря на наличие стандартов, практически в каждой СУБД применяется свой диалект языка. Для Microsoft SQL Server таким языком является Transact SQL.
Подобно всем другим языкам программирования Transact-SQL представляет собой набор элементов, все множество которых можно разбить на следующие группы:
- алфавит;
- идентификаторы;
- комментарии;
- операторы;
- типы данных;
- функции.
2.1. Алфавит языкаTransact-SQL
В Transact-SQL используются символы латинского алфавита, цифры, символы подчеркивания (_), процента (%), звездочка (*), вопросительный (?) и восклицательный знаки (!), подстановочный знак (#), знаки арифметических операций. В качестве разделителей используется двойная кавычка (“), апостроф (‘), запятая (,), точка (.), точка с запятой (;), двоеточие (:), квадратные и круглые скобки.
Практически во всех современных системах программирования в настоящее время допускается применение символов кириллицы.
Запятые используются для разделения элементов списка, например, имен столбцов таблицы: ИМЯ, АДРЕС, ГОРОД.
Квадратные скобки используются для задания имен столбцов, которые содержат недопустимые символы, включая пробелы и разделители. Часто имя столбца таблицы может быть образовано из нескольких слов [Название компании].
Если в запрос включены поля нескольких таблиц, то для разделения имени таблицы и имени поля используется точка, например: Фирма.Адрес.
Символы и строки символов заключаются в одинарные кавычки, например, ‘К’, ‘Петров И.П.’.
2.2. Идентификаторы
Идентификаторы используются для ссылки на объекты баз данных. Построение идентификаторов выполняется на основе следующих правил:
- число символов не более 128, причем в качестве первого может использоваться только буква, символ подчеркивания и знаки @, #, далее могут следовать буквы, цифры или символы #, @, $ и символ подчеркивания;
- идентификатор, начинающийся с символа @, указывает на локальную переменную; два первых символа @@ говорят о том, что идентификатор указывает на глобальную переменную; символ # в начале идентификатора указывает на то, что идентификатор, является именем временной таблицы или процедуры;
- в идентификаторе объектов не могут встречаться пробелы.
Хотя пробелы в идентификаторах запрещены, это ограничение можно обойти, заключив идентификатор в квадратные скобки.
Любую таблицу можно уникально идентифицировать следующим составным именем:
имя БД . имя владельца . имя таблицы или представления.
К любому столбцу любой таблицы можно обратиться, используя составное имя:
имя БД . имя владельца . имя таблицы (представления) . имя столбца
Каждый идентификатор в составном имени отделяется от предыдущего точкой.
Имя владельца может быть опущено, если это не приводит к конфликтам имен.
2.3. Комментарии
Обязательной составляющей любой программы является ее документирование, одним из компонентов которого служат комментарии.
Комментарий – это текстовая строка, которая игнорируется при выполнении программы и служит для пояснения выполняемых действий.
Комментарии можно определить двумя способами:
- с помощью символов /* (начало комментария) и */ (конец комментария), между которыми можно разместить любое количество строк комментария;
- с помощью двух символов —, за которыми можно разместить одну строку комментария.
2.4. Операторы
Оператор – это символ, обозначающий действие, выполняемое над одним или несколькими выражениями.
Операторы Transact-SQL делятся на следующие категории:
- Арифметические операторы.
- Операторы присваивания.
- Операторы сравнения.
- Логические операторы.
- Оператор для слияния строк.
Арифметические операторы применимы только к числовым значениям и должны иметь два числовых операнда. Исключение составляет знак минус (-), изменяющий знак операнда. В этом случае минус называется унарным минусом. В табл. 1 приведены арифметические операторы.
Таблица 1. Арифметические операторы
Оператор | Описание |
+ | Суммирование двух операндов |
— | Определение разности двух операндов |
— | Изменение знака операнда |
* | Перемножение двух операндов |
/ | Деление первого операнда на второй операнд |
% | Определение остатка целочисленного деления. Например, 14 % 4 возвращает 2 |
Оператор присваивания (=) присваивает значение переменной. Ключевое слово AS служит оператором для присваивания псевдонимов (alias) таблицам или заголовкам столбцов.
Операторы сравнения используются для сравнения символов, чисел, дат и возвращают значение TRUE (истина) или FALSE (ложь) в зависимости от результатов сравнения (табл. 2). Исключением является случай, когда один из операндов имеет значение NULL. В этом случае любое сравнение возвращает значение NULL.
Таблица 2. Операторы сравнения
Оператор | Описание | Пример | Результат |
< | Меньше | 10 < 55 | TRUE |
10 < NULL | NULL | ||
<= | Меньше или равно | 4 <= 9 | TRUE |
= | Равно | 2 = 3 | FALSE |
>= | Больше или равно | 2 >= 3 | FALSE |
> | Больше | 33 > 12 | TRUE |
<> | Не равно | 2 <> 5 | TRUE |
Логические операторы применяются в командах языка SQL для проверки истинности какого-либо условия. Логические операторы возвращают булево значение TRUE или FALSE. В табл. 3 приведены операторы сравнения.
Таблица 3. Логические операторы.
Логический оператор | Действие |
ALL | TRUE, если весь набор сравнений дает результат TRUE |
AND | TRUE, если оба булевых выражения дают результат TRUE |
ANY | TRUE, если хотя бы одно сравнение из набора дает результат TRUE |
BETWEEN | TRUE, если операнд находится внутри диапазона |
EXISTS | TRUE, если подзапрос возвращает хотя бы одну строку |
IN | TRUE, если операнд равен одному выражению из списка |
LIKE | TRUE, если операнд совпадает с шаблоном |
NOT | Обращает значение любого другого булева оператора |
OR | TRUE, если любое булево выражение равно TRUE |
SOME | TRUE, если несколько сравнений из набора дают результат TRUE |
Оператор слияния строк (конкатенация) объединяет две строки символов в единую строку. Например, ‘FDS’ + ‘ASD’ дает строку ‘FDSASD’.
Приоритет операторов
Если в выражении присутствует несколько операторов, то порядок их выполнения определяется приоритетом операторов. Ниже перечислены уровни приоритета операторов (от самого высокого к самому низкому).
- () – выражения в скобках.
- — – унарные операторы.
- *, /, % – арифметические операторы умножения и деления.
- +, — – арифметические операторы сложения и вычитания.
- =, >, <, >=, <=, <> – операторы сравнения.
- NOT.
- AND.
- ALL, ANY, BETWEEN, IN, LIKE, OR, SOME.
- = – присваивание значения переменной.
Если операторы имеют одинаковый приоритет, вычисления производятся слева направо. Для изменения порядка выполнения операторов используются круглые скобки. Выражения в скобках вычисляются первыми. Если применяются вложенные скобки, то первыми вычисляются выражения в наиболее глубоко вложенных скобках.
2.5. Типы данных
Тип данных – это характеристика, которая задается для столбца таблицы или переменной. При этом определяется тип хранящейся в них информации. Например: целые числа, числовые данные с плавающей запятой, данные денежного типа, дата, время, текст, двоичные данные и так далее. У каждого столбца, выражения, переменной или параметра есть определенный тип данных. Понятие типа данных в языке MS SQL Server полностью адекватно понятию типа данных в современных языках программирования. СУБД MS SQL Server имеет большое различных типов данных, описание которых приведено в приложении 1.
В Microsoft SQL Server в случаях, когда оператор объединяет два выражения с разными типами данных, происходит неявное преобразование типов. Если такое преобразование не поддерживается, SQL сервер будет выдавать ошибку. Чтобы определять какой тип данных из выражений преобразовывать, SQL Server применяет правила приоритета типов данных.
Для выполнения явных преобразований SQL Server предлагает универсальные функции CONVERT и CAST, с помощью которых значения одного типа преобразовываются в значения другого типа (если такие изменения возможны). CONVERT и CAST примерно одинаковы и могут быть взаимозаменяемыми:
CONVERT (тип_данных[(длина)], выражение) CAST (выражение AS тип_данных).
2.6. Функции
Функция очень похожа на операцию, но вместо выполнения одного действия, функция может состоять из множества операций.
В Transact-SQL функции могут использоваться в самых различных случаях: в столбцах со значениями по умолчанию, в вычисляемых столбцах в таблицах или представлениях, в условии отбора в предложении WHERE и т. д.
В СУБД MS SQL Server имеется возможность создания своих собственных функций, которые называются пользовательскими функциями.
Transact-SQL также предоставляет большое количество встроенных функций, описание которых приведено в приложении 2.
Встроенные функции языка Transact-SQL могут быть агрегатными или скалярными.
Агрегатные функции выполняют вычисления над группой значений столбца и всегда возвращают одно значение результата этих вычислений.
Скалярные функции Transact-SQL используются в создании скалярных выражений. Скалярная функция выполняет вычисления над одним значением или списком значений, тогда как агрегатная функция выполняет вычисления над группой значений из нескольких строк. Скалярные функции можно разбить на следующие категории:
строковые функции; математические функции; функции для работы с датами.
3. Структура языка SQL
Основу языка SQL составляют команды, которые должны предоставлять пользователям следующие возможности:
- создавать базу данных и таблицы с полным описанием их структуры;
- выполнять основные операции манипулирования данными (добавление, изменение, удаление данных);
- выполнять запросы, осуществляющие преобразование данных в необходимую информацию.
Поэтому, в язык SQL в качестве составных частей входят:
- язык определения данных (Data Definition Language, DDL);
- язык манипулирования данными (Data Manipulation Language, DML);
- язык управления данными (Data Control Language, DCL);
- команды управления транзакциями (Transaction Control Language, TCL).
Подчеркнем, что это не отдельные языки, а различные команды одного языка. Такое деление проведено только лишь с точки зрения различного функционального назначения этих команд.
Каждая команда языка SQL состоит из имени команды и одной или нескольких фраз, начинающихся с ключевого слова и содержащих различные языковые конструкции. Ключевое слово первой фразы является именем всей команды.
Язык определения данных (DDL) используется для создания и изменения структуры базы данных и ее составных частей – таблиц, индексов, представлений (виртуальных таблиц), а также триггеров и хранимых процедур. Основными его командами являются:
- 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 (удалить хранимую процедуру).
Язык манипулирования данными (DML) позволяет получать доступ и манипулировать данными в существующих объектах базы данных (таблицах и представлениях). Он состоит из четырех команд:
Язык управления данными (DCL) используется для управления правами доступа к данным и выполнением процедур в многопользовательской среде. Более точно его можно назвать “язык управления доступом”. Он состоит из двух основных команд:
- GRANT (дать права на ряд действий над некоторым объектом БД);
- REVOKE (забрать права).
Команды управления транзакциями (TCL) позволяют управлять изменениями, сделанными в результате DML-запросов. Пользователь группирует DML-запросы (один или несколько) в логическую единицу, называемую транзакцией, которая является атомарной, т.е. выполняется целиком или не выполняется вовсе. Благодаря этим командам можно осуществлять следующие действия:
- BEGIN TRANSACTION (начать транзакцию);
- COMMIT TRANSACTION (завершить транзакцию);
- ROLLBACK TRANSACTION (откатить транзакцию);
- SAVEPOINT TRANSACTION (сохранить промежуточную точку выполнения транзакции).
Заметим, что в базовом языке SQL отсутствуют управляющие операторы: переходы, циклы и т. п. – вследствие чего SQL не является языком программирования. Связано это с первоначальной идеологией реляционных баз данных, когда предполагалось, что при работе с базой данных конечный пользователь будет непосредственно вводить команды SQL в консольном режиме.
Однако усложнение структуры баз данных привело к необходимости программной поддержки SQL. В современных СУБД она обеспечивается как с помощью процедурных расширений языка, так и посредством использования реализующих команды SQL библиотек для стандартных языков программирования.