Что такое sql язык программирования какого уровня
Перейти к содержимому

Что такое sql язык программирования какого уровня

  • автор:

История языков программирования: SQL- стандартизация длиною в жизнь

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

Ведь СУБД – MySQL, PostgreSQL и Microsoft SQL Server – распространены повсеместно: в крупном и малом бизнесе, в больницах, банках, университетах и так далее. В принципе, SQL не ограничивается только настольными девайсами: СУБД SQLite с успехом заняла свое место на Android-смартфонах и мобильных устройствах Apple. Соответственно, такие приложения, как Skype и Dropbox, постоянно к ней обращаются.

Однако были времена, когда не было смартфонов, а этот язык уже существовал. История SQL – это не годы, но десятилетия. Поверили в него не сразу.

System R и IBM

Первые упоминания об этом языке датируются 1974 годом. SQL создавался в рамках проекта экспериментальной реляционной СУБД System R. Занималась этим проектом компания IBM.

Первоначально язык назывался SEQUEL (Structured English Query Language), но потом слово «English» пропало из этого словосочетания, а аббревиатура приобрела тот вид, к которому мы давно уже привыкли. С одной стороны, SQL был ориентирован на удобную и понятную пользователям формулировку запросов к реляционным БД. С другой стороны, практически с самого начала он был так называемым «полным языком БД». Это означает, что SQL включал:

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

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

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

Разработкой языка запросов занимались Дональд Чэмбэрлин (Donald D. Chamberlin) и Рэй Бойс (Ray Boyce).

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

Коммерческий успех

Поэтому путь к коммерческой реализации SQL, который прошла IBM, называют движением «сверху вниз».

Oracle, Informix и Sybase пошли по другому пути – «снизу вверх»: в первых версиях этих систем, выпущенных на рынок, использовалось существенно ограниченное подмножество SQL System R. А далее они начали постепенно расширяться. Однако в первой коммерческой реализации SQL в СУБД Oracle в операторах выборки не допускалось использование вложенных подзапросов и отсутствовала возможность формулировки запросов с соединениями нескольких отношений.


Распеределение рыночных долей по состоянию на 2011 год

Растущая заинтересованность рынка в скорейшем переходе к реляционным системам управления базами данных позволила разработчикам перечисленных выше компаний добиться коммерческого успеха. Это произошло, скорее, вопреки тому, что СУБД были тогда очень далеки от совершенства. Ну а теперь Oracle, Informix, Sybase и Microsoft SQL Server поддерживают достаточно мощные диалекты SQL.

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

Появление многочисленных диалектов SQL и их разрастание должно было привести к проблемам совместимости и прочим противоречиям.

Однако деятельность по стандартизации языка SQL началась очень вовремя – практически одновременно с появлением его первых коммерческих реализаций. В 1982 году комитету по базам данных Американского национального института стандартов (ANSI) было поручено разработать спецификацию стандартного языка реляционных баз данных.

После отклонения ряда неудачных версий стандарта в 1986 году эксперты пришли к единому знаменателю. А в 1987 году стандарт SQL/86 был одобрен Международной организацией по стандартизации (ISO).

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

Стандарт SQL1

К 1989 году стандарт SQL/86 был несколько расширен, после чего появился следующий стандарт, получивший название ANSI/ISO SQL/89.

SQL/89 стал первым всемирно принятым стандартом языка SQL. У этого языка имеется масса недостатков: многие важные понятия не определены, много отдано на откуп реализациям. В этом стандарте полностью отсутствуют такие важные разделы, как манипулирование схемой БД и динамический SQL.

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

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

В стандарте определяются два уровня языка и отдельное средство поддержания целостности. Уровень 2 — это полный язык баз данных SQL, не включающий средство поддержания целостности. Уровень 1 — это специфицированное подмножество уровня 2.

Средство поддержания целостности включает возможности определения:

• требуемых ограничений на ссылки между таблицами;
• проверочных ограничений на строки таблицы;
• значений столбца по умолчанию при занесении строки в таблицу.

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


Возможности операции Join в разных стандартах

Стандарт SQL2 и его дополнения

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

В 1995 году стандарт был дополнен спецификацией интерфейса уровня вызова (Call-Level Interface – SQL/CLI). SQL/CLI представляет собой набор спецификаций интерфейсов процедур, вызовы которых позволяют выполнять динамически задаваемые операторы SQL. По сути дела, SQL/CLI представляет собой альтернативу динамическому SQL.

Стандарт SQL/CLI послужил основой для создания повсеместно распространенных сегодня интерфейсов ODBC (Open Database Connectivity) и JDBC (Java Database Connectivity).

В 1996 году к стандарту SQL/92 был добавлен еще один компонент – SQL/PSM (Persistent Stored Modules). Основная цель этой спецификации – стандартизировать способы определения и использования хранимых процедур, то есть специальным образом оформленных программ, включающих операторы SQL, которые сохраняются в базе данных, могут вызываться приложениями и выполняются внутри СУБД.

Oracle является одной из наиболее популярных СУБД. Более того, именно там впервые была реализована совместимость со стандартом SQL/92.

Oracle поддерживает ряд различных платформ, включая Windows, Linux, Max OS X и Sun Solaris.

Процедурное расширение SQL, разработанное Oracle, называется PL/SQL (Procedural Language/Structured Query Language) и основано на синтаксисе языков Ada и Pascal. Третьим ключевым языком, использующийся в СУБД Oracle наравне с SQL и PL/SQL, является Java.

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

Стандарт SQL3

Самые первые проекты SQL3 занимали около 1500 страниц.

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

В 1999 году были приняты пять частей стандарта SQL:1999.

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

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

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

Третью часть занимает уточненная по сравнению с SQL/92 спецификация SQL/CLI. В четвертой части специфицируется SQL/PSM – синтаксис и семантика языка определения хранимых процедур. Наконец, в пятой части – SQL/Bindings – определяются правила связывания SQL для стандартных версий языков программирования.

В стандарт SQL:1999 должны были войти еще несколько частей. Среди них спецификации следующих средств:

• управление распределенными транзакциями (SQL/Transaction);
• поддержка темпоральных свойств данных (SQL/Temporal);
• управление внешними данными (SQL/MED);
• связывание с объектно-ориентированными языками программирования (SQL/OLB);
• поддержка оперативной аналитической обработки (SQL/OLAP).

SQL в XXI веке

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

Наиболее серьезные изменения языка SQL, специфицированные в части 2 стандарта SQL:2003, касаются следующих аспектов:

• типы данных;
• подпрограммы, вызываемые из SQL;
• расширенные возможности оператора CREATE TABLE;
• новый объект схемы – генератор последовательностей;
• новые виды столбцов – идентифицирующие столбцы (identity column) и генерируемые столбцы (generated column);
• новый оператор MERGE;

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

• 9075-1, SQL/Framework;
• 9075-2, SQL/Foundation;
• 9075-3, SQL/CLI;
• 9075-4, SQL/PSM;
• 9075-9, SQL/MED;
• 9075-10, SQL/OLB;
• 9075-11, SQL/Schemata;
• 9075-13, SQL/JRT;
• 9075-14, SQL/XML.

Части 1-4 и 9-10 с необходимыми изменениями остались такими же, как и в SQL:1999. Часть 5 (SQL/Bindings) перестала существовать; соответствующие спецификации включены в часть 2.

Раздел части 2 SQL:1999, посвященный информационной схеме, выделен в отдельную часть 11. Появились две новые части – 13 и 14.

Часть 13 полностью называется «SQL Routines and Types Using the Java Programming Language» («Использование подпрограмм и типов SQL в языке программирования Java»). Появление такой части стандарта оправдано повышенным вниманием к языку Java со стороны ведущих производителей SQL-ориентированных СУБД.

Наконец, последняя часть SQL:2003 посвящена спецификациям языковых средств, позволяющих работать с XML-документами в среде SQL.

Несмотря на старания разработчиков, процесс стандартизации явно не поспевает за происходящими изменениями.


Основные моменты в истории SQL

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

Язык SQL

Аббревиатура SQL означает Structured Query Language, то есть «структурированный язык запросов». Рекомендуемое чтение названия [эс-кью-эл]. Встречается прочтение [сиквел]. Дело в том, что одним из предшественников SQL был язык SEQUEL [сиквел], и поэтому есть своего рода профессиональный признак —те, кто занимается давно и в хорошем коллективе, часто произносят сиквел. Это нечто похожее на то, как Пафнутия Львовича, по-моему в Москве называли Чебышев, а в Петербурге Чебыпгов и по этому произношению сразу видно — мы московские или ближе к питерским.

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

  • UNION — объединение.
  • INTERSECT — пересечение;
  • MINUS — разность.
8.2.1 Стандарты SQL

Стандарт языка SQL1, принятый ANSI в 1986 г., описывал только запросы. С ним вы можете поработать в WinRDBI. В настоящее время SQL1 не используется.

Промышленные СУБД основаны на следующих версиях:

  • SQL2 (SQL-92) принят в 1992 г. ;
  • SQL3 (SQL-99) от 1999 года;
  • SQL-2003.

Набор последних расширений языка представляют как SQL-2006 и SQL-2008.

Мы будем ориентироваться на версию SQL2, но рассмотрим несколько расширений языка вне этой версии. Очевидно, изучение формальных основ языка важно, но недостаточно получить в результате только ремесленную основу — «делай раз, делай два». Важно понять, почему язык так устроен. Понимая внутреннюю структуру объекта или суть явления, вы всегда будете готовы воспринять их изменения.

Выделяются три уровня SQL—прямой, встроенный и динамический. Первый уровень обеспечивает непосредственное взаимодействие пользователя с СУБД. Встроенный SQL определяет его конструкции, вкладываемые в другие языки. В COS текст встроенного SQL помещается внутрь скобок &sql(текст_SQL). Подробности в разделе 8.9. Наконец, динамический SQL позволяет образовывать конструкции прямого SQL «на ходу» и исполнять их.

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

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

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

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

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

8.2.2 Подъязыки SQL

В SQL определены следующие подъязыки:

  • Язык определения данных (ЯОД). Он же Data Definition Language (DDL). Определяет структуру базы, задает хранимые объекты и привилегии доступа к ним.
  • Язык манипулирования данными (ЯМД). Он же Data Manipulation Language (DML). Вставляет, обновляет и удаляет данные и выполняет запросы к ним.
  • Язык управления данными/транзакциями (ЯУД). Data Control Language (DCL). Управляет транзакциями.

Одно замечание по поводу ЯОД. Мы уже обращали внимание на необходимость работы с пользователями, когда говорили о важности учёта того, кто задаёт вопросы о содержимом базы и при каких условиях это возможно. Так вот, права пользователя СУБД определяются привилегиями. Например, привилегия CREATE SESSION позволяет пользователю подключаться к базе, привилегия ALTER TABLE даёт возможность изменять таблицы и т. д.

Вообще, с пользователями обращаются по-разному в различных СУБД. Например, Oracle требует, чтобы все права созданного пользователя были прописаны полностью. То есть, если я создал пользователя, у которого есть имя и пароль, то он даже открыть сессию, то есть подключиться к СУБД, не может. Голенький, как Буратино перед тем как у него появился колпачок с кисточкой. Все привилегии нужно предоставить пользователю явно. Конечно, можно выделить собрания привилегий — роли — и использовать их, можно определить пользователя public, права которого есть у всех пользователей и т. д.

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

О языке управления транзакциями мы с вами уже говорили в разделе 6.2. Помните — начало транзакции BEGIN TRANSACTION, завершение транзакции —это COMMIT или ROLLBACK. В действительности есть ещё другие инструкции, но они менее распространены.

8.2.3 Используемая терминология

И несколько замечаний о терминологии. Первое, собственно, связано не с SQL, а с тем, что в реализациях используется табличная терминология, то есть говорят не отношение, а «таблица», не «кортеж», а «строка». Атрибут называется, в зависимости от того, что вам нравится, либо столбец, либо колонка (таблица 8.1).

Язык SQL

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

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

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

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

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

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

Сам язык 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 позволяют обеспечить переносимость баз данных между разными СУБД. На самом деле это весьма условно. Разные СУБД используют свои диалекты SQL. Например, SQLite не понимает ряд типов данных.

В разных СУБД есть свои расширения для придания SQL «процедурности». Это хранимые процедуры (stored procedures) и процедурные языки-надстройки. Так в Oracle Database используется PL/SQL, в PostgreSQL – PL/pgSQL.

Несмотря на наличие диалектов, запросы, содержащие только DDL и DML, обычно переносимы между разными СУБД.

Язык SQL. Полное руководство.

Эта книга расскажет вам, как работать с командами и инструкциями SQL, создавать и настраивать реляционные базы данных, загружать и модифицировать объекты баз данных, выполнять мощные запросы, повышать производительность и выстраивать систему безопасности. Вы узнаете, как использовать инструкции DDL и применять API, интегрировать XML и сценарии Java, использовать объекты SQL, создавать веб-серверы, работать с удаленным доступом и выполнять распределенные транзакции.

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *