stringtranslate.com

SQL

Язык структурированных запросов ( SQL ) ( произносится как S-QL ; исторически «sequel») [4] [5] — это доменно-ориентированный язык , используемый для управления данными, особенно в реляционных системах управления базами данных (СУБД). Он особенно полезен при обработке структурированных данных , т. е. данных, включающих отношения между сущностями и переменными.

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

Первоначально основанный на реляционной алгебре и реляционном исчислении кортежей , SQL состоит из многих типов операторов, [6] которые можно неформально классифицировать как подъязыки , обычно: язык запросов данных (DQL), язык определения данных (DDL), язык управления данными (DCL) и язык манипулирования данными (DML). [7]

Область применения SQL включает запрос данных, манипуляцию данными (вставку, обновление и удаление), определение данных ( создание и изменение схемы ) и контроль доступа к данным. Хотя SQL по сути является декларативным языком ( 4GL ), он также включает процедурные элементы.

SQL был одним из первых коммерческих языков, использовавших реляционную модель Эдгара Ф. Кодда . Модель была описана в его влиятельной статье 1970 года «Реляционная модель данных для больших общих банков данных». [8] Несмотря на то, что SQL не полностью соответствовал реляционной модели, описанной Коддом , он стал наиболее широко используемым языком баз данных. [9] [10]

SQL стал стандартом Американского национального института стандартов (ANSI) в 1986 году и Международной организации по стандартизации (ISO) в 1987 году. [11] С тех пор стандарт был пересмотрен несколько раз, чтобы включить в себя более широкий набор функций и включить общие расширения. Несмотря на существование стандартов, практически ни одна из существующих реализаций не придерживается его полностью, и большая часть кода SQL требует по крайней мере некоторых изменений перед переносом в различные системы баз данных .

История

SQL был первоначально разработан в IBM Дональдом Д. Чемберлином и Рэймондом Ф. Бойсом после того, как они узнали о реляционной модели от Эдгара Ф. Кодда [12] в начале 1970-х годов. [13] Эта версия, изначально называвшаяся SEQUEL (Structured English Query Language), была разработана для манипулирования и извлечения данных, хранящихся в оригинальной квазиреляционной системе управления базами данных IBM, System R , которую группа в исследовательской лаборатории IBM в Сан-Хосе разработала в 1970-х годах. [13]

Первой попыткой Чемберлина и Бойса создать язык реляционной базы данных был SQUARE (Specifying Queries in A Relational Environment), но его было трудно использовать из-за нотации нижних/верхних индексов. После перехода в исследовательскую лабораторию Сан-Хосе в 1973 году они начали работу над продолжением SQUARE. [12] Первоначальное название SEQUEL, которое широко рассматривается как игра слов на QUEL , языке запросов Ingres , [14] позже было изменено на SQL (гласные отброшены), поскольку «SEQUEL» было торговой маркой британской компании Hawker Siddeley Dynamics Engineering Limited. [15] Метка SQL позже стала аббревиатурой Structured Query Language.

После тестирования SQL на испытательных площадках клиентов с целью определения полезности и практичности системы, IBM начала разрабатывать коммерческие продукты на основе своего прототипа System R, включая System/38 , SQL/DS и IBM Db2 , которые были коммерчески доступны в 1979, 1981 и 1983 годах соответственно. [16]

В конце 1970-х годов компания Relational Software, Inc. (теперь Oracle Corporation ) увидела потенциал концепций, описанных Коддом, Чемберлином и Бойсом, и разработала собственную СУРБД на основе SQL с намерением продать ее ВМС США , Центральному разведывательному управлению и другим правительственным агентствам США. В июне 1979 года компания Relational Software представила одну из первых коммерчески доступных реализаций SQL — Oracle V2 (Version2) для компьютеров VAX .

К 1986 году группы стандартов ANSI и ISO официально приняли стандартное определение языка "Database Language SQL". Новые версии стандарта были опубликованы в 1989, 1992, 1996, 1999, 2003, 2006, 2008, 2011, [12] 2016 и совсем недавно, в 2023 году. [17]

Синтаксис

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

Язык SQL подразделяется на несколько языковых элементов, в том числе:

Процедурные расширения

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

В дополнение к стандартным расширениям SQL/PSM и собственным расширениям SQL, процедурная и объектно-ориентированная программируемость доступна на многих платформах SQL через интеграцию СУБД с другими языками. Стандарт SQL определяет расширения SQL/JRT (SQL Routines and Types for the Java Programming Language) для поддержки кода Java в базах данных SQL. Microsoft SQL Server 2005 использует SQLCLR (SQL Server Common Language Runtime) для размещения управляемых сборок .NET в базе данных , в то время как предыдущие версии SQL Server были ограничены неуправляемыми расширенными хранимыми процедурами, написанными в основном на языке C. PostgreSQL позволяет пользователям писать функции на самых разных языках, включая Perl , Python , Tcl , JavaScript (PL/V8) и C. [19]

Взаимодействие и стандартизация

Обзор

Реализации SQL несовместимы между поставщиками и не обязательно полностью следуют стандартам. В частности, синтаксис даты и времени, конкатенация строк, NULLs и чувствительность к регистру сравнения различаются от поставщика к поставщику. PostgreSQL [20] и Mimer SQL [21] стремятся к соблюдению стандартов, хотя PostgreSQL не придерживается стандарта во всех случаях. Например, сворачивание не заключенных в кавычки имен в нижний регистр в PostgreSQL несовместимо со стандартом SQL, [22] который гласит, что не заключенные в кавычки имена должны быть свернуты в верхний регистр. [23] Таким образом, согласно стандарту, Fooдолжно быть эквивалентно FOO, а не foo.

Популярные реализации SQL обычно не поддерживают основные функции стандартного SQL, такие как типы данных DATEили TIME. Наиболее очевидными примерами таких систем и, между прочим, наиболее популярными коммерческими и фирменными СУБД SQL являются Oracle (которая DATEведет себя как DATETIME, [24] [25] и не имеет TIMEтипа) [26] и MS SQL Server (до версии 2008 года). В результате код SQL редко можно перенести между системами баз данных без изменений.

Причины несовместимости

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

История стандартизации

SQL был принят в качестве стандарта ANSI в 1986 году как SQL-86 [28] и ISO в 1987 году. [11] Он поддерживается ISO/IEC JTC 1, Информационные технологии, Подкомитетом SC 32, Управление данными и обмен ими .

До 1996 года программа стандартов управления данными Национального института стандартов и технологий (NIST) сертифицировала соответствие SQL DBMS стандарту SQL. Теперь поставщики самостоятельно сертифицируют соответствие своих продуктов. [29]

В первоначальном стандарте было заявлено, что официальным произношением «SQL» является аббревиатура : / ˌ ɛ s ˌ k juː ˈ ɛ l / ( «ess cue el»). [9] Несмотря на это, многие англоговорящие специалисты по базам данных (включая самого Дональда Чемберлина [30] ) используют аббревиатуру / ˈ s k w əl / («sequel»), [ 31] отражающую название языка в предварительной версии разработки «SEQUEL». [13] [15] [30]
Стандарт SQL претерпел ряд изменений:

Текущий стандарт

Стандарт обычно обозначается следующим образом: ISO/IEC 9075-n:yyyy Часть n: название , или, в качестве сокращения, ISO/IEC 9075 . Заинтересованные стороны могут приобрести документы стандартов в ISO, [36] IEC или ANSI. Некоторые старые проекты находятся в свободном доступе. [37] [38] [39]

Стандарт ISO/IEC 9075 дополняется стандартом ISO/IEC 13249: SQL Multimedia and Application Packages и некоторыми техническими отчетами .

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

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

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

Распределенная реляционная архитектура базы данных (DRDA) была разработана рабочей группой в IBM с 1988 по 1994 год. DRDA позволяет сетевым реляционным базам данных взаимодействовать для выполнения SQL-запросов. [41] [42]

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

Сообщения, протоколы и структурные компоненты DRDA определяются Распределенной архитектурой управления данными . Распределенная обработка SQL в стиле DRDA отличается от современных распределенных баз данных SQL .

Критика

Дизайн

SQL отклоняется несколькими способами от своей теоретической основы, реляционной модели и ее исчисления кортежей. В этой модели таблица представляет собой набор кортежей, тогда как в SQL таблицы и результаты запросов представляют собой списки строк; одна и та же строка может встречаться несколько раз, а порядок строк может использоваться в запросах (например, в предложении LIMIT). Критики утверждают, что SQL следует заменить языком, который строго возвращается к исходной основе: например, см. Третий манифест Хью Дарвена и К. Дж. Дейта (2006, ISBN  0-321-39942-0 ).

Ортогональность и полнота

Ранние спецификации не поддерживали основные функции, такие как первичные ключи. Наборы результатов не могли быть названы, а подзапросы не были определены. Они были добавлены в 1992 году. [12]

Отсутствие типов сумм было описано как препятствие для полного использования пользовательских типов SQL. Например, поддержка JSON должна была быть добавлена ​​новым стандартом в 2016 году. [43]

Нулевой

Концепция Null является предметом некоторых дебатов . Маркер Null указывает на отсутствие значения и отличается от значения 0 для целочисленного столбца или пустой строки для текстового столбца. Концепция Null обеспечивает 3-значную логику в SQL , которая является конкретной реализацией общей 3-значной логики . [12]

Дубликаты

Другая популярная критика заключается в том, что он допускает дублирование строк, что затрудняет интеграцию с такими языками, как Python , типы данных которых могут затруднить точное представление данных, [12] с точки зрения анализа и отсутствия модульности. Обычно этого избегают, объявляя первичный ключ или уникальное ограничение с одним или несколькими столбцами, которые уникально идентифицируют строку в таблице.

Несоответствие импеданса

В смысле, аналогичном несоответствию объектно-реляционного импеданса , несоответствие возникает между декларативным языком SQL и процедурными языками, в которые SQL обычно встроен. [ необходима цитата ]

Типы данных SQL

Стандарт SQL определяет три вида типов данных (глава 4.1.1 SQL/Foundation):

Сконструированные типы — это один из ARRAY, MULTISET, REF(erence) или ROW. Пользовательские типы сопоставимы с классами в объектно-ориентированном языке с их собственными конструкторами, наблюдателями, мутаторами, методами, наследованием, перегрузкой, перезаписью, интерфейсами и т. д. Предопределенные типы данных по сути поддерживаются реализацией.

Предопределенные типы данных

Смотрите также

Примечания

Ссылки

  1. Пол, Райан (24 октября 2005 г.). «Экскурсия по Microsoft Command Shell». Ars Technica . Получено 10 апреля 2011 г.
  2. ^ "Регистрация типа носителя для application/sql". Internet Assigned Numbers Authority . 10 апреля 2013 г. Получено 10 апреля 2013 г.
  3. ^ Шафранович, Ю. (апрель 2013 г.). "The application/sql Media Type, RFC 6922". Internet Engineering Task Force . стр. 3. doi :10.17487/RFC6922 . Получено 10 апреля 2013 г.
  4. ^ Болье, Алан (апрель 2009 г.). Мэри Э. Треселер (ред.). Learning SQL (2-е изд.). Севастополь, Калифорния, США: O'Reilly. ISBN 978-0-596-52083-0.
  5. ^ Чемберлин, Дональд Д.; Франа, Филип Л. (2001-10-03). "Устное историческое интервью с Дональдом Д. Чемберлином". University Digital Conservancy . hdl :11299/107215 . Получено 2020-01-14 . Мы изменили первоначальное название "SEQUEL" на SQL, потому что получили письмо от чьего-то юриста, в котором говорилось, что название "SEQUEL" принадлежит им. Мы сократили его до SQL, от Structured Query Language, и продукт стал известен как SQL/DS.
  6. ^ SQL-92 , 4.22 SQL-операторы, 4.22.1 Классы SQL-операторов "Существует по крайней мере пять способов классификации SQL-операторов:", 4.22.2, SQL-операторы, классифицированные по функции "Ниже приведены основные классы SQL-операторов:"; SQL:2003 4.11 SQL-операторы и более поздние редакции.
  7. ^ Чатем, Марк (2012). Язык структурированных запросов на примерах - Том I: Язык запросов к данным. Lulu.com. стр. 8. ISBN 9781291199512.
  8. ^ Кодд, Эдгар Ф. (июнь 1970 г.). «Реляционная модель данных для больших общих банков данных». Сообщения ACM . 13 (6): 377–87. CiteSeerX 10.1.1.88.646 . doi :10.1145/362384.362685. S2CID  207549016. 
  9. ^ ab Chapple, Mike. "SQL Fundamentals". Базы данных . About.com . Получено 28.01.2009 .
  10. ^ "Язык структурированных запросов (SQL)". International Business Machines. 27 октября 2006 г. Получено 10 июня 2007 г.
  11. ^ ab "ISO 9075:1987: Информационные технологии – Языки баз данных – SQL – Часть 1: Структура (SQL/Framework)". 1987-06-01.
  12. ^ abcdef Чемберлин, Дональд (2012). «Ранняя история SQL». IEEE Annals of the History of Computing . 34 (4): 78–82. doi :10.1109/MAHC.2012.61. S2CID  1322572.
  13. ^ abc Chamberlin, Donald D; Boyce, Raymond F (1974). "SEQUEL: A Structured English Query Language" (PDF) . Труды семинара ACM SIGFIDET 1974 года по описанию данных, доступу и управлению . Association for Computing Machinery: 249–64. Архивировано из оригинала (PDF) 26.09.2007 . Получено 09.06.2007 .
  14. ^ Старки, Джим. «Динамический SQL, сантехника и внутренний API». www.ibphoenix.com . Получено 19.01.2023 .
  15. ^ ab Oppel, Andy (27 февраля 2004 г.). Базы данных Demystified. Сан-Франциско, Калифорния : McGraw-Hill Osborne Media. стр. 90–1. ISBN 978-0-07-146960-9.
  16. ^ "История IBM, 1978". Архивы IBM . IBM. 23 января 2003 г. Архивировано из оригинала 17 января 2005 г. Получено 2007-06-09 .
  17. ^ «ISO - ISO/IEC JTC 1/SC 32 - Управление данными и обмен» . www.iso.org . Проверено 2 января 2021 г.
  18. ^ Международный стандарт ANSI/ISO/IEC (IS). Язык баз данных SQL — Часть 2: Основы (SQL/Основы). 1999.
  19. ^ "Программирование сервера PostgreSQL". Официальная документация PostgreSQL 9.1 . postgresql.org. 2011 . Получено 2012-03-09 .
  20. ^ " О PostgreSQL". Официальный сайт PostgreSQL 9.1 . PostgreSQL Global Development Group. 2012. Получено 9 марта 2012. PostgreSQL гордится своим соответствием стандартам. Его реализация SQL строго соответствует стандарту ANSI-SQL:2008
  21. ^ "Mimer SQL, Built on Standards". Официальный сайт Mimer SQL . Mimer Information Technology. 2009.
  22. ^ "4.1. Лексическая структура". Документация PostgreSQL . 2018.
  23. ^ "(Второй неофициальный проект обзора) ISO/IEC 9075:1992, Язык баз данных SQL, Раздел 5.2, правило синтаксиса 11". 30 июля 1992 г.
  24. ^ Лоренц, Диана; Розер, Мэри Бет; Авраам, Сандип; Амор, Анджела; Арора, Гита; Арора, Викас; Эшдаун, Лэнс; Баер, Герман; Белламконда, Шрикант (октябрь 2010 г.) [1996]. "Basic Elements of Oracle SQL: Data Types". Oracle Database SQL Language Reference 11g Release 2 (11.2) . Библиотека документации Oracle Database. Редвуд-Сити, Калифорния: Oracle USA, Inc . Получено 29 декабря 2010 г. Для каждого значения Oracle хранит следующую информацию: век, год, месяц, дата, час, минута и секундаDATE
  25. ^ Лоренц, Диана; Розер, Мэри Бет; Авраам, Сандип; Амор, Анджела; Арора, Гита; Арора, Викас; Эшдаун, Лэнс; Баер, Герман; Белламконда, Шрикант (октябрь 2010 г.) [1996]. "Базовые элементы Oracle SQL: типы данных". Справочник по языку Oracle Database SQL 11g, выпуск 2 (11.2) . Библиотека документации Oracle Database. Редвуд-Сити, Калифорния: Oracle USA, Inc. Получено 29 декабря 2010 г. Типы данных datetime ...DATE
  26. ^ Лоренц, Диана; Розер, Мэри Бет; Авраам, Сандип; Амор, Анджела; Арора, Гита; Арора, Викас; Эшдаун, Лэнс; Баер, Герман; Белламконда, Шрикант (октябрь 2010 г.) [1996]. "Basic Elements of Oracle SQL: Data Types". Oracle Database SQL Language Reference 11g Release 2 (11.2) . Библиотека документации по базам данных Oracle. Редвуд-Сити, Калифорния: Oracle USA, Inc . Получено 29 декабря 2010 г. Не определяйте столбцы со следующими типами данных SQL/DS и DB2, поскольку им не соответствует тип данных Oracle:...TIME
  27. ^ Дейт, Крис Дж. (2013). Реляционная теория для компьютерных профессионалов: что такое реляционные базы данных на самом деле (1-е изд.). Севастополь, Калифорния: O'Reilly Media. ISBN 978-1-449-36943-9.
  28. ^ "Finding Aid". X3H2 Records, 1978–95 . Американский национальный институт стандартов.
  29. ^ Долл, Шелли (19 июня 2002 г.). «Является ли SQL стандартом?». Builder.com TechRepublic . TechRepublic. Архивировано из оригинала 2012-07-05 . Получено 2016-04-12 .
  30. ^ ab Gillespie, Patrick. "Pronouncing SQL: SQL or Sequel?" . Получено 12 февраля 2012 г. .
  31. ^ Мелтон, Джим; Алан Р. Саймон (1993). "1.2. Что такое SQL?" . Понимание нового SQL: Полное руководство. Морган Кауфманн. стр. 536. ISBN 978-1-55860-245-8. SQL (правильно произносится как «эс кью элл», а не как довольно распространённое «сиквел»)…
  32. ^ Вагнер, Майкл (2010). SQL/XML:2006 — Оценка соответствия стандартам ausgewählter Datenbanksysteme . Дипломика Верлаг. п. 100. ИСБН 978-3-8366-9609-8.
  33. ^ "SQL:2008 теперь является утвержденным международным стандартом ISO". Sybase. Июль 2008. Архивировано из оригинала 28.06.2011.
  34. ^ Кришна Кулкарни, Ян-Эйке Михелс (сентябрь 2012 г.). «Временные функции в SQL:2011» (PDF) . SIGMOD Запись . 41 (3).
  35. ^ Фред Земке (2012). "Что нового в SQL:2011" (PDF) . Корпорация Oracle.
  36. ^ «ИСО/МЭК 9075».
  37. ^ SQL:1992 черновик (текст)
  38. ^ SQL:2008 draft (Zip) , Whitemarsh Information Systems Corporation
  39. ^ SQL:2011 draft (Zip) , Whitemarsh Information Systems Corporation
  40. ^ Фернандо Саенс-Перес. «Внешние соединения в дедуктивной системе баз данных» (PDF) . Lbd.udc.es . Получено 16.01.2017 .
  41. ^ Райнш, Р. (1988). «Распределенная база данных для SAA». IBM Systems Journal . 27 (3): 362–389. doi :10.1147/sj.273.0362.
  42. ^ Справочник по архитектуре распределенных реляционных баз данных . IBM Corp. SC26-4651-0. 1990.
  43. ^ Брэндон, Джейми (июль 2021 г.). "Against SQL" . Получено 2 августа 2021 г. .
  44. ^ "SQL 2003 Standard Support in Oracle Database 10g" (PDF) . Oracle . Oracle Corporation . Ноябрь 2003 . Получено 2024-03-27 .Поддержка XML была добавлена ​​в ANSI SQL 2003, часть 14.

Источники

Внешние ссылки