SQL
Материал из Википедии — свободной энциклопедии
|
SQL (ˈɛsˈkjuˈɛl или ˈsiːkwəl; англ. Structured Query Language — язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных.
Вопреки существующим заблуждениям, SQL в его чистом (базовом) виде является информационно-логическим языком, а не языком программирования. Вместе с тем стандарт языка спецификацией SQL/PSM предусматривает возможность его процедурных расширений, с учётом которых язык уже вполне может рассматриваться в качестве языка программирования.
SQL основывается на реляционной алгебре.
Язык SQL делится на четыре части:
- операторы определения данных (англ. Data Definition Language, DDL)
- операторы манипуляции данными (англ. Data Manipulation Language, DML)
- операторы определения доступа к данным (англ. Data Control Language, DCL)
- операторы управления транзакциями (англ. Transaction Control Language, TCL)
[править] История
В начале 1970-х годов в одной из исследовательских лабораторий компании IBM была разработана экспериментальная реляционная СУБД IBM System R, для которой затем был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. Аббревиатура SEQUEL расшифровывалась как англ. Structured English QUEry Language — «структурированный английский язык запросов». Позже по юридическим соображениям[1] язык SEQUEL был переименован в SQL. Когда в 1986 году первый стандарт языка SQL был принят ANSI (American National Standards Institute), официальным произношением стало [,es kju:' el] — эс-кью-эл. Несмотря на это, даже англоязычные специалисты продолжают читать SQL как сиквел вместо эс-кью-эл (по-русски также часто говорят «эс-ку-эль»).
Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования. Собственно разработкой языка запросов занимались Дональд Чэмбэрлин (Donald D. Chamberlin) и Рэй Бойс (Ray Boyce). Пэт Селинджер (Pat Selinger) занималась разработкой стоимостного оптимизатора (англ. cost-based optimizer), Рэймонд Лори (Raymond Lorie) занимался компилятором запросов.
Стоит отметить, что SEQUEL был не единственным языком подобного назначения. В Калифорнийском Университете Беркли была разработана некоммерческая СУБД Ingres (являвшаяся, между прочим, дальним прародителем популярной сейчас некоммерческой СУБД PostgreSQL), которая являлась реляционной СУБД, но использовала свой собственный язык QUEL, который, однако, не выдержал конкуренции по количеству поддерживающих его СУБД с языком SQL.
Первыми СУБД, поддерживающими новый язык, стали в 1979 году Oracle V2 для машин VAX от компании Relational Software Inc. (впоследствии ставшей компанией Oracle) и System/38 от IBM, основанная на System/R. Вопреки сложившемуся мнению, первой стала именно СУБД Oracle V2[источник не указан 174 дня].
Первый официальный стандарт языка SQL был принят ANSI в 1986 году и ISO (Международной организацией по стандартизации) в 1987 году (так называемый SQL-86) и несколько уточнён в 1989 году. Дальнейшее развитие языка поставщиками СУБД потребовало принятия в 1992 году нового расширенного стандарта (ANSI SQL-92 или просто SQL2). Следующим стандартом стал SQL:1999 (SQL3). В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже. История версий стандарта:
| Год | Название | Иное название | Изменения |
|---|---|---|---|
| 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[2] |
[править] Вопросы совместимости
Как и со многими стандартами в IT-индустрии, с языком SQL возникла проблема: когда-то многие производители использующего SQL программного обеспечения решили, что функционал в текущей на тот момент времени версии стандарта недостаточен и его желательно расширить. Это привело к тому, что у разных производителей систем управления баз данных (СУБД) в ходу разные диалекты SQL, в общем случае между собой несовместимые.
До 1996 года вопросами соответствия коммерческих реализаций SQL стандарту занимался в основном институт NIST, который и устанавливал уровень соответствия стандарту. Но позднее подразделение, занимавшееся СУБД, было расформировано, и на текущий момент все усилия по проверке СУБД на соответствие стандарту ложатся на её производителя.
Впервые понятие «уровня соответствия» было предложено в стандарте SQL-92. А именно, ANSI и NIST определяли четыре уровня соответствия реализации этому стандарту:
- Entry (базовый)
- Transitional (переходный) — проверку на соответствие этому уровню проводил только институт NIST
- Intermediate (промежуточный)
- Full (полный)
Легко можно понять, что каждый последующий уровень соответствия заведомо подразумевал соответствие предыдущему уровню. Далее, согласно данной лесенке стандартов любая СУБД, которая соответствовала уровню Entry, могла заявлять себя как «SQL-92 compliant», хотя на самом деле переносимость и соответствие стандарту ограничивалось набором возможностей, входящих в этот уровень.
Положение изменилось с введением стандарта SQL:1999. Отныне стандарт приобрёл модульную структуру — основная часть стандарта была вынесена в раздел «SQL/Foundation», все остальные были выведены в отдельные модули. Соответственно, остался только один уровень совместимости — Core, что означало поддержку этой основной части. Поддержка остальных возможностей оставлена на усмотрение производителей СУБД. Аналогичное положение имело место и с последующими версиями стандарта.
[править] Преимущества и недостатки
[править] Преимущества
[править] Независимость от конкретной СУБД
Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML, могут быть достаточно легко перенесены из одной СУБД в другую. Существуют системы, разработчики которых изначально закладывались на применение по меньшей мере нескольких СУБД (например: система электронного документооборота Documentum может работать как с Oracle, так и с Microsoft SQL Server и IBM DB2). Естественно, что при применении некоторых специфичных для реализации возможностей такой переносимости добиться уже очень трудно.
[править] Наличие стандартов
Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту только способствует «стабилизации» языка. Правда, стоит обратить внимание, что сам по себе стандарт местами чересчур формализован и раздут в размерах, например, Core-часть стандарта SQL:2003 представляет собой более 1300 страниц текста.
[править] Декларативность
С помощью SQL программист описывает только то, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обработке SQL-запроса. Однако не стоит думать, что это полностью универсальный принцип — программист описывает набор данных для выборки или модификации, однако ему при этом полезно представлять, как СУБД будет разбирать текст его запроса. Чем сложнее сконструирован запрос, тем больше он допускает вариантов написания, различных по скорости выполнения, но одинаковых по итоговому набору данных.
[править] Недостатки
[править] Несоответствие реляционной модели данных
Создатели реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности они указывают на следующие проблемы SQL[3]:
- Повторяющиеся строки
- Неопределённые значения (nulls)
- Явное указание порядка колонок слева направо
- Колонки без имени и дублирующиеся имена колонок
- Отсутствие поддержки свойства «=»
- Использование указателей
- Высокая избыточность
В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем Манифесте[4] они излагают принципы СУБД следующего поколения и предлагают язык Tutorial D, который является подлинно реляционным.
[править] Сложность
Хотя SQL и задумывался, как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.
[править] Отступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92, многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
[править] Сложность работы с иерархическими структурами
Ранее диалекты SQL большинства СУБД не предлагали способа манипуляции древовидными структурами. Некоторые поставщики СУБД предлагали свои решения. Например, Oracle использует выражение CONNECT BY. В настоящее время в ANSI стандартизована рекурсивная конструкция WITH из диалекта SQL DB2.
[править] Расширения
[править] Процедурные расширения
Поскольку SQL не является языком программирования (то есть не предоставляет средств для автоматизации операций с данными), вводимые разными производителями расширения касались в первую очередь процедурных расширений. Это хранимые процедуры (англ. stored procedures) и процедурные языки-«надстройки». Практически в каждой СУБД применяется свой процедурный язык. Стандарт для процедурных расширений представлен спецификацией SQL/PSM). Перечень процедурных расширений для самых популярных СУБД приведён в следующей таблице.
| СУБД | Краткое название | Расшифровка |
|---|---|---|
| Borland InterBase/ Firebird |
PSQL | Procedural SQL |
| IBM DB2 | SQL PL (англ.) | SQL Procedural Language (расширяет SQL/PSM); также в DB2 хранимые процедуры могут писаться на обычных языках программирования: Си, Java и т.д. |
| Microsoft SQL Server/ Sybase ASE |
Transact-SQL | Transact-SQL |
| MySQL | SQL/PSM | SQL/Persistent Stored Module (соответствует стандарту SQL:2003[источник не указан 174 дня]) |
| Oracle | PL/SQL | Procedural Language/SQL (основан на языке Ada) |
| PostgreSQL | PL/pgSQL | Procedural Language/PostgreSQL Structured Query Language (очень похож на Oracle PL/SQL) |
[править] Примечания
- ↑ Andy Oppel. Databases Demystified. — San Francisco, CA: McGraw-Hill Osborne Media. — С. 90—91. — ISBN 0-07-225364-9 — «„SEQUEL“ был торговой маркой британской авиастроительной группы компаний Hawker Siddeley»
- ↑ http://archives.postgresql.org/pgsql-hackers/2008-09/msg00071.php
- ↑ O’Reilly Network An Interview with Chris Date
- ↑ The Third Manifesto
[править] См. также
[править] Ссылки
- Текст стандарта SQL-92(англ.)
- Форум по СУБД и SQL(рус.)
- Упражнения по SQL. Самоучитель по SQL DML(рус.)(англ.)
- SQL. Введение и руководство
- Краткий курс SQL
- Интерактивный учебник по SQL с примерами и задачами
- Наиболее интересные новшества в стандарте SQL:2003
[править] Литература
- Бен Форта. Освой самостоятельно язык запросов SQL / Пер. с англ. — 3-е изд. — М.: Диалектика, 2005. — 288 с.
- Пол Уилтон, Джон Колби. Язык запросов SQL для начинающих / Пер. с англ. — М.: Диалектика, 2005. — 496 с.
- К. Дж. Дейт. Введение в системы баз данных / Пер. с англ. — 8-е изд. — М.: Вильямс, 2005. — 1328 с.
- Кевин Клайн. SQL. Справочник. — М.: КУДИЦ-ОБРАЗ, 2006. — 832 с.
|
|
|
|---|---|
| Используемые в разработке |
Ада • АПЛ • Ассемблер • ActionScript • ABAP/4 • AutoIt • AWK • BASIC • C • Кобол • C++ • C# • ColdFusion • D • dBase • Delphi • Eiffel • Erlang • F# • Forth • Фортран • Gambas • Groovy • Haskell • Icon • Java • JavaScript • Limbo • Лисп • Lua • MATLAB • Object Pascal • Objective-C • Оберон • Parser • Паскаль • Perl • PHP • PowerBASIC • PureBasic • Python • ПЛ/1 • Пролог • Ruby • Scala • Scheme • Smalltalk • SQL • Tcl • Vala • Visual Basic • VB.NET |
| Академические | |
| IEC61131-3 |
Instruction List • ST • FBD • Ladder Diagram • SFC |
| Прочие | |
| Эзотерические |
HQ9+/HQ9++ • INTERCAL • Brainfuck • Befunge • Malbolge • Piet • Spoon • Unlambda • Whitespace • FALSE |