Язык структурированных запросов sql определение операторы языка

Язык структурированных запросов sql определение операторы языка

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

Дата добавления: 2015-01-16

Размер файла: 12.1 KB

Работу скачали: 23 чел.

Поделитесь работой в социальных сетях

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

Структурированный язык запросов – SQL: история, стандарты,

основные операторы языка.

Структурированный язык запросов SQL основан на реляционном исчислении с переменными кортежами. Язык имеет несколько стандартов. Язык SQL предназначен для выполнения операций над таблицами (создание, удаление, изменение структуры) и над данными таблиц (выборка, изменение, добавление и удаление), а также некоторых сопутствующих операций. SQL является непроцедурным языком и не содержит операторов управления, организации подпрограмм, ввода- вывода и т.п. В связи с этим SQL автономно не используется, обычно он погружен в среду встроенного языка программирования СУБД (например, FoxPro СУБД Visual FoxPro, ObjectPAL СУБД Paradox, Visual Basic for Applications СУБД Access).

В современных СУБД с интерактивным интерфейсом можно создавать запросы, используя другие средства, например QBE. Однако применение SQL зачастую позволяет повысить эффективность обработки данных в базе. Например, при подготовке запроса в среде Access можно перейти из окна Конструктора запросов (формулировки запроса по образцу на языке QBE) в окно с эквивалентным оператором SQL. Подготовку нового запроса путем редактирования уже имеющегося в ряде случае проще выполнить путем изменения оператора SQL. В различных СУБД состав операторов SQL может несколько отличаться. Язык SQL не обладает функциями полноценного языка разработки, а ориентирован на доступ к данным, поэтому его включают в состав средств разработки программ. В этом случае его называют встроенным SQL. Стандарт языка SQL поддерживают современные реализации следующих языков программирования: PL/1, Ada, С, COBOL, Fortran, MUMPS и Pascal.

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

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

Для удобства работы с представлениями в язык SQL введено понятие курсора. Курсор представляет собой своеобразный указатель, используемый для перемещения по наборам записей при их обработке. Описание и использование курсора в языке SQL выполняется следующим образом. В описательной части программы выполняют связывание переменной типа курсор (CURSOR) с оператором SQL (обычно с оператором SELECT). В выполняемой части программы производится открытие курсора (OPEN ), перемещение курсора по записям (FETCH . ), сопровождаемое соответствующей обработкой, и, наконец, закрытие курсора (CLOSE ).

Основные операторы языка

Опишем минимальное подмножество языка SQL, опираясь на его реализацию в стандартном интерфейсе ODBC (Open Database Connectivity – совместимость открытых баз данных) фирмы Microsoft. Операторы языка SQL можно условно разделить на два подъязыка: язык определения данных (Data Definition Language – DDL) и язык манипулирования данными (Data Manipulation Language-DML).Основные операторы языка SQL представлены в таблице.

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

1. Оператор создания таблицы имеет формат вида:

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

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

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

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

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

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

 запросы на выбор данных (предложение SELECT);

 предложения модификации данных (добавление, удаление и изменение данных);

 предложения управления данными (предоставление и отмена привилегий

на доступ к данным, управление транзакциями и другие). Кроме того, он предоставляет возможность выполнять в этих предложениях:

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

 упорядочение строк и (или) столбцов при выводе содержимого таблиц на печать или экран дисплея;

 создание представлений (виртуальных таблиц), позволяющих пользователям иметь свой взгляд на данные без увеличения их объема в базе данных;

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

 агрегатирование данных: группирование данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум, число элементов и т.п.

В SQL используются следующие основные типы данных, форматы которых могут несколько различаться для разных СУБД:

INTEGER — целое число (обычно до 10 значащих цифр и знак); SMALLINT — "короткое целое" (обычно до 5 значащих цифр и знак); DECIMAL(p,q) — десятичное число, имеющее p цифр (0 0 и разное в разных СУБД, но не меньше 4096);

DATE — дата в формате, определяемом специальной командой (по умолчанию mm/dd/yy); поля даты могут содержать только реальные даты, начинающиеся за несколько тысячелетий до н.э. и ограниченные пятым-десятым тысячелетием н.э.;

TIME — время в формате, определяемом специальной командой, (по умолчанию hh.mm.ss);

DATETIME — комбинация даты и времени;

MONEY — деньги в формате, определяющем символ денежной единицы ($, руб,

. ) и его расположение (суффикс или префикс), точность дробной части и условие для показа денежного значения.

Читайте также:  Как открыть css файл

В некоторых СУБД еще существует тип данных LOGICAL, DOUBLE и ряд других. Тем не менее, в целях обеспечения переносимости баз данных между различными в том числе и вычислительными платформами, целесообразно использовать ограниченный набор так называемых «канонических» типов данных. В данном лабораторном курсе мы будем ограничивать этот набор типами INTEGER, VARCHAR, DATE и FLOAT.

Ориентированный на работу с таблицами SQL не имеет достаточных средств для создания сложных прикладных программ. Поэтому в разных СУБД он либо используется вместе с языками программирования высокого уровня (например, такими как Си или Паскаль), либо включен в состав команд специально разработанного языка СУБД (язык систем dBASE, R:BASE и т.п.). Унификация полных языков современных профессиональных СУБД достигается за счет внедрения объектно-ориентированного языка четвертого поколения 4GL. Последний позволяет организовывать циклы, условные предложения, меню, экранные формы, сложные запросы к базам данных с интерфейсом, ориентированным как на алфавитно-цифровые терминалы, так и на оконный графический интерфейс (X-Windows, MS-Windows).

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

Предложение SELECT может использоваться как:

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

 элемент WHEREили HAVING-условия (сокращенный вариант предложения, называемый "вложенный запрос");

 фраза выбора в командах CREAT VIEW, DECLARE CURSOR или INSERT;

 средство присвоения глобальным переменным значений из строк сформированной таблицы (INTO-фраза).

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

 звездочка (*) для обозначения "все" — употребляется в обычном для программирования смысле, то есть "все случаи, удовлетворяющие определению";

 квадратные скобки ([]) – означают, что конструкции, заключенные в эти скобки, являются необязательными (т.е. могут быть опущены);

 фигурные скобки (<>) – означают, что конструкции, заключенные в эти скобки, должны рассматриваться как целые синтаксические единицы, т.е. они позволяют уточнить порядок разбора синтаксических конструкций, заменяя обычные скобки, используемые в синтаксисе SQL;

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

 прямая черта (|) – означает наличие выбора из двух или более возможностей. Например обозначение ASC|DESC указывает, можно выбрать один из терминов ASC или DESC; когда же один из элементов выбора заключен в квадратные скобки, то это означает, что он выбирается по умолчанию (так, [ASC]|DESC означает, что отсутствие всей этой конструкции будет восприниматься как выбор ASC);

 точка с запятой (;) – завершающий элемент предложений SQL;

 запятая (,) – используется для разделения элементов списков;

 пробелы ( ) – могут вводиться для повышения наглядности между любыми синтаксическими конструкциями предложений SQL;

 прописные жирные латинские буквы и символы – используются для написания конструкций языка SQL и должны (если это специально не оговорено) записываться в точности так, как показано;

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

 термины таблица, столбец, . – заменяют (с целью сокращения текста синтаксических конструкций) термины имя_таблицы, имя_столбца, . соответственно;

 термин таблица – используется для обобщения таких видов таблиц, как

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

Предложение SELECT имеет следующий формат:

SELECT [DISTINCT | ALL]<*

[HAVING ] ] [ORDER BY ]

Рассмотрим вышеприведенный формат подробнее.

SELECT – ключевое слово, обозначающее начало запроса языка SQL. Следом за ключевым словом SELECT должен быть приведен список столбцов

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

DISTINCT – ключевое слово, позволяющее исключить попадание в выборку результатов-дубликатов.

* — ключевой элемент показывающий что в выборку попадут все столбцы таблицы или таблиц.

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

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

WHERE – позволяет наложить условие по которому будет произведена выборка

необходимых данных. Условие представляет собой предикат имеющий значение true. В данное выражение может входить любое число различных условий для этого необходимо использовать ключевые слова AND, OR, NOT и другие. GROUP BY – ключевое слово после которого следует выражение на основе которого будет производиться группировка результатов выполнения запроса. Используется вместе с агрегатными функциями.

HAVING – позволяет наложить условия на результат выполнения агрегатных функций.

ORDER BY – осуществляет упорядочивание результатов выборки на основе последующего списка столбцов.

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

Получить все записи таблицы students:

SELECT * FROM students

Получить все записи таблицы groups:

SELECT * FROM groups

Получить список всех фамилий студентов:

SELECT lastname FROM students

Получить список всех студентов отсортированный по фамилии:

SELECT lastname, firstname, secondname FROM students ORDER BY lastname ASC

Здесь ключевое слово ASC обозначает сортировку по возрастанию, если необходим обратный порядок сортировки, используйте DESC.

Получить список преподавателей с именем Александр

SELECT * FROM prepods WHERE firstname=’Александр’

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

Получить список студентов фамилия которых начинается на букву «А»:

SELECT * FROM students WHERE lastname LIKE ‘А%’

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

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

SELECT students.lastname, students.firstname, groups.number FROM students, groups WHERE students.group_id = groups.id

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

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

SELECT s.lastname AS ‘Фамилия’, s.firstname AS ‘Имя’ FROM students s WHERE s.firstname LIKE ‘О%’

Результатом данной выборки будет таблица с двумя столбцами: «Фамилия» и «Имя», строками таблицы будут студенты имя которых начинается с буквы «О».

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

 COUNT — число значений в столбце,

 SUM — сумма значений в столбце,

 AVG — среднее значение в столбце,

 MAX — самое большое значение в столбце,

 MIN — самое малое значение в столбце.

Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения.

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

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

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

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

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

Читайте также:  Телевизор самсунг lt32e310ex характеристики

Фраза GROUP BY (группировать по) инициирует перекомпоновку указанной во FROM таблицы по группам, каждая из которых имеет одинаковые значения в столбце, указанном в GROUP BY.

Таким образом строки таблицы группируются так, что в одной группе содержатся все строки для определенного значения в столбце по которому производится группировка. Далее к каждой группе применяется фраза SELECT. Каждое выражение в этой фразе должно принимать единственное значение для группы, т.е. оно может быть либо значением столбца, указанного в GROUP BY, либо арифметическим выражением, включающим это значение, либо константой, либо одной из SQL-функций, которая оперирует всеми значениями столбца в группе и сводит эти значения к единственному значению (например, к сумме).

Фраза HAVING играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, а выражение в HAVING должно принимать единственное значение для группы.

SQL ( ˈɛsˈkjuˈɛl ; англ. structured query language — «язык структурированных запросов») — декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.

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

Изначально SQL был основным способом работы пользователя с базой данных и позволял выполнять следующий набор операций:

  • создание в базе данных новой таблицы;
  • добавление в таблицу новых записей;
  • изменение записей;
  • удаление записей;
  • выборка записей из одной или нескольких таблиц (в соответствии с заданным условием);
  • изменение структур таблиц.

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

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

Содержание

История [ править | править код ]

Первые разработки [ править | править код ]

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

Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования [5] . Собственно разработкой языка запросов занимались Дональд Чэмбэрлин ( Donald D. Chamberlin ) и Рэй Бойс ( Ray Boyce ). Пэт Селинджер ( Pat Selinger ) занималась разработкой стоимостного оптимизатора ( cost-based optimizer ), Рэймонд Лори ( Raymond Lorie ) занимался компилятором запросов.

SEQUEL был не единственным языком подобного назначения. В Калифорнийском Университете Беркли была разработана некоммерческая СУБД Ingres (являвшаяся дальним прародителем популярной сейчас некоммерческой СУБД PostgreSQL), которая являлась реляционной СУБД, но использовала свой собственный язык QUEL, который, не выдержал конкуренции по количеству поддерживающих его СУБД по сравнению с языком SQL. В качестве альтернативного подхода для обеспечения пользовательского доступа к базам данных также рассматривался появившийся в 1970-е годы метод QBE, впоследствии в видоизменённой форме появившийся в ряде интегрированных сред управления данными, но так и не заменивший, а лишь дополнивший 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. [6]

Следующим стандартом стал 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 [7]
2011 SQL:2011 Реализована поддержка хронологических баз данных (PERIOD FOR), поддержка конструкции FETCH [8] .
2016 SQL:2016 Защита на уровне строк, полиморфные табличные функции, JSON.
Читайте также:  Как узнать кто звонил с неопределенного номера

Вопросы совместимости [ править | править код ]

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

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

Впервые понятие «уровня соответствия» было предложено в стандарте SQL-92. А именно, ANSI и NIST определяли четыре уровня соответствия реализации этому стандарту:

  1. Entry (базовый)
  2. Transitional (переходный) — проверку на соответствие этому уровню проводил только NIST
  3. Intermediate (промежуточный)
  4. Full (полный)

Легко можно понять, что каждый последующий уровень соответствия заведомо подразумевал соответствие предыдущему уровню. Далее, согласно данной «лесенке» стандартов любая СУБД, которая соответствовала уровню Entry, могла заявлять себя как «SQL-92 compliant» («совместимая с SQL-92»), хотя на самом деле переносимость и соответствие стандарту ограничивалось набором возможностей, входящих в этот уровень.

Положение изменилось с введением стандарта SQL:1999. Отныне стандарт приобрёл модульную структуру — основная часть стандарта была вынесена в раздел «SQL/Foundation», все остальные были выведены в отдельные модули. Соответственно, остался только один уровень совместимости — Core, что означало поддержку этой основной части. Поддержка остальных возможностей оставлена на усмотрение производителей СУБД. Аналогичное положение имело место и с последующими версиями стандарта.

NoSQL [ править | править код ]

Движение NoSQL второй половины 2000-х годов, зафиксировавшее в своём названии «отрицание SQL», было вызвано не столько отказом от языка как такового, а объединило СУБД, отказавшиеся от реляционной модели и принципов строгой согласованности ради горизонтальной масштабируемости и ряда других качеств. При этом в ранних NoSQL-системах поддержка SQL действительно отсутствовала, со временем некоторые из таких СУБД обзавелись специфическими SQL-подобными языками запросов (CQL, N1QL, AQL [en] и другими). В 2010-е годы ряд СУБД отнесли себя к категории NewSQL, в них при сохранении свойств масштабируемости NoSQL-систем реализована и поддержка SQL, в разных системах — разной степени совместимости со стандартами. Кроме того, поддержка SQL в 2010-е годы появилась не только в СУБД, но и для экосистемы Hadoop (Spark SQL, Phoenix [en] , Impala), а также в связующем программном обеспечении (брокер сообщений Kafka, система потоковой обработки Flink), таким образом, язык постепенно становится фактическим стандартом доступа к любым обрабатываемым данным, не только реляционной природы.

Элементы [ править | править код ]

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

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

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

  • операторы определения данных (Data Definition Language, DDL):
  • CREATE создаёт объект базы данных (саму базу, таблицу, представление, пользователя и так далее),
  • ALTER изменяет объект,
  • DROP удаляет объект;
  • операторы манипуляции данными (Data Manipulation Language, DML):
    • SELECT выбирает данные, удовлетворяющие заданным условиям,
    • INSERT добавляет новые данные,
    • UPDATE изменяет существующие данные,
    • DELETE удаляет данные;
    • операторы определения доступа к данным (Data Control Language, DCL):
      • GRANT предоставляет пользователю (группе) разрешения на определённые операции с объектом,
      • REVOKE отзывает ранее выданные разрешения,
      • DENY задаёт запрет, имеющий приоритет над разрешением;
      • операторы управления транзакциями (Transaction Control Language, TCL):
        • COMMIT применяет транзакцию,
        • ROLLBACK откатывает все изменения, сделанные в контексте текущей транзакции,
        • SAVEPOINT делит транзакцию на более мелкие участки.
        • Преимущества и недостатки [ править | править код ]

          Преимущества [ править | править код ]

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

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

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

          Недостатки [ править | править код ]

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

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

          В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем манифесте [11] они излагают принципы СУБД следующего поколения и предлагают язык 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 [12] .

          Процедурные расширения [ править | править код ]

          Поскольку SQL не является привычным процедурным языком программирования (то есть не предоставляет средств для построения циклов, ветвлений и так далее), вводимые разными производителями расширения касались в первую очередь процедурных расширений. Это хранимые процедуры ( stored procedures ) и процедурные языки-«надстройки». Практически в каждой СУБД применяется свой процедурный язык, в частности, в Oracle Database используется PL/SQL (поддерживается также в DB2 и Timesten [en] ), в Interbase и Firebird — PSQL, в DB2 — SQL PL [en] , в Microsoft SQL Server и Adaptive Server Enterprise — Transact-SQL, в PostgreSQL — PL/pgSQL.

          Ссылка на основную публикацию
          Adblock detector