SQL — язык программирования? 10 аргументов “за” и “против”
Вторая по обсуждаемости тема в среде специалистов по SQL: как произносить то, что большинство людей называют Sequel ([сиквел] вместо [эс кью эл]). Это удивительно, поскольку язык существует более 40 лет.
Если вы не согласны со мной, боюсь, придется отложить дебаты на другой раз.
Но, пожалуй, самая обсуждаемая тема, связанная с SQL, — это вопрос о том, считается ли он языком программирования.
Введите в поисковую систему “SQL не язык программирования”, и один только сайт Quora выдаст более 200 тысяч результатов (многие из них относятся к данному обсуждению).
Нужно отметить, что вопрос “Sequel или SQL” находится на 10-й странице Google-поиска по дискуссии о SQL на Reddit. Так что, возможно, это действительно не самый обсуждаемый вопрос.
Как инженеру по данным, мне часто приходится работать с SQL. Я пишу SQL, тестирую SQL, храню SQL в репозитории и запускаю SQL в производство. Когда мне поручают задачу, ориентированную на SQL, я чувствую себя программистом.
Я затронул этот вопрос, потому что, когда я начал работать специалистом по данным, старшие коллеги объяснили мне важность точности языка, основных терминов и концепций.
Например, специалисты по работе с данными поймут, что, говоря “набор данных”, вы подразумеваете “таблицу”, но заинтересованная сторона может не уловить этой тонкой разницы.
Если вы не точны в использовании профессиональной лексики, то рискуете подорвать доверие к себе как к эксперту в предметной области. Это может нанести удар по вашей карьере, особенно если вы новичок в своей сфере.
Я не буду склонять вас к какому-то определенному мнению в дискуссии о том, является ли SQL языком программирования. Скорее, хочу дать вам возможность сделать собственные выводы из представленных фактов, аргументов и публикаций на форуме.
В конце концов, это и есть обучение.
Что определяет язык программирования
Хотя для SQL принят единый руководящий стандарт (ANSI SQL), двоичного теста для определения языка программирования не существует.
Считается, что тест Тьюринга осуществляет проверку на соответствие языку программирования. Однако некоторые языки, не прошедшие тест Тьюринга, включая SQL, все же претендуют на статус языка программирования по другим метрикам (и аргументам, выдвигаемым программистами-энтузиастами).
На мой взгляд, одно из лучших определений языка программирования — от Университета Макгилла в Монреале (Канада):
Язык программирования — это искусственный язык, который можно использовать для управления [поведением] машины, в частности компьютера. Языки программирования, как и человеческие, регулируются с помощью синтаксических и семантических правил, определяющих их структуру и понятийный аппарат соответственно.
Но даже это четкое определение не удержит разработчиков от споров о том, что является/не является языком программирования и что можно/нельзя считать критериями в данном случае.
Это нормально. По крайней мере, найдена точка опоры.
Почему SQL не является языком программирования
Название
Один из главных аргументов тех, кто не считает SQL языком программирования, кроется в самом его названии.
SQL — Structured Query Language (структурированный язык запросов).
Для некоторых этого концептуального отличительного признака SQL достаточно, чтобы автоматически отказать ему в статусе языка программирования.
Создание и выполнение запросов, а не скриптов
По своей природе SQL не предназначен для создания приложений. Его назначение — позволить вам выполнять операции над существующими данными (или создавать структуры для хранения этих данных, например таблицы).
Пока результаты запроса не вставлены в таблицу или не сохранены в виде представления, они считаются временными.
Если запрашиваемые данные не существуют, запрос не имеет смысла и не реализуется.
При этом многие диалекты SQL позволяют разработчикам писать хранимые процедуры и пользовательские функции на скриптовых языках, таких как JavaScript.
Не изменяет состояние
SQL позволяет выполнять операции, которые делятся на три большие категории:
- DC — Data Control (управление данными);
- DD — Data Declaration (объявление данных);
- DM — Data Manipulation (манипулирование данными).
SQL изменяет состояние базы данных с помощью таких команд, как UPDATE (обновить), INSERT (вставить) и DELETE (удалить).
SELECT (выбрать) не изменяет состояние и структуру базы данных и не выполняет никаких ощутимых операций, как это делается в Python, если только не используется в определенном контексте, например при настройках запроса на “перезапись”.
Эта команда действует просто как фильтр, возвращая данные, соответствующие входным критериям.
Отсутствие циклирования
Ни один диалект SQL не обладает методом циклирования.
Практически каждый случай циклирования, который можно наблюдать в SQL, является результатом обходного пути или скрипта, такого как UDF и хранимая процедура.
Многие противники языка дисквалифицируют SQL на основании его неспособности выполнять итерации по элементам.
Одним из критериев соответствия языку программирования в тесте Тьюринга является возможность использования языка для создания бесконечного цикла без завершения.
В отличие от Python, готового работать в бесконечном цикле, пока программист не заметит свою синтаксическую ошибку, запрос на SQL завершится либо по тайм-ауту, либо в результате ошибки.
Репутация в отрасли
Этот нетехнический критерий стоит упомянуть хотя бы потому, что причина, по которой некоторые вещи остаются неизменными, заключается в отсутствии желания что-либо менять.
Можно утверждать, что это относится и к разработчикам, не признающим SQL языком программирования.
Мемы, подобные приведенному ниже, являются частью более масштабного системного принижения авторитета SQL как потенциального языка программирования (и, соответственно, дискредитации тех самых странных, немногочисленных разработчиков SQL).
В какой-то степени репутация имеет значение.
Тот факт, что более “респектабельные” программисты смотрят на SQL свысока, говорит не столько о его репутации как инструмента программирования, сколько о программистах, которые приводят необоснованные аргументы.
Несмотря на то что SQL уже 40 лет, среди разработчиков все еще находятся люди, которые делают заявления, подобные приведенному выше.
Вероятно, некоторые компании все еще считают, что SQL так же прост в освоении, как и пакет Microsoft Suite.
Почему SQL является языком программирования
Соответствие критерию Тьюринга
Более десяти лет назад в SQL появилась конструкция, которую сегодняшние SQL-разработчики считают чем-то само собой разумеющимся: иерархические запросы.
Если этот термин вам ни о чем не говорит, возможно, вы его знаете как аббревиатуру: CTE или Common Table Expression (обобщенное табличное выражение).
Речь идет о тех забавных выражениях, которые начинаются с двух коротких слов: WITH __ AS…
Как я уже говорил, одним из критериев соответствия языку программирования по Тьюрингу является способность языка выполнять итерации без завершения.
Рекурсия подходит под этот критерий, поскольку позволяет бесконечно расширять циклические структуры.
Переменные, условная логика, определения функций
Возвращаясь к определению языка программирования, можно заметить, что SQL поддерживает многие аспекты языков программирования, которые можно рассматривать в соответствии с “синтаксическими” и “семантическими” правилами.
Почти каждый диалект SQL позволяет разработчику объявлять переменные, которые могут использоваться статически и динамически.
Операторы CASE служат блоками IF/ELSE в SQL и даже могут быть вложенными.
Пользовательские функции, включая хранимые пользовательские функции, позволяют определять и создавать функции аналогично тому, как это делается в скриптовом языке.
Многие диалекты SQL поддерживают интеграцию со скриптовыми языками, такими как JavaScript.
Это позволяет разработчикам писать более сложный код, выходящий за рамки традиционной логики SQL.
Поскольку SQL применяет JavaScript для написания хранимой процедуры или пользовательской функции, он вполне может считаться процедурным языком программирования.
Возможность создавать приложения (хотя это сложно)
Эти функции можно хранить и вызывать в составе более крупного сценария SQL. Они могут выполняться так же, как код любого другого языка программирования.
Я не думал, что найду кого-нибудь из разработчиков SQL-приложений. В конце концов, противники и сторонники SQL сходятся на том, что такие приложения непрактичны.
Тем не менее мне удалось отыскать человека, который попытался создать приложение на основе SQL.
В 2018 году (согласно коммиту на GitHub) аспирант по имени Ноа Доерсинг из Университета Тюбингена использовал SQL для реализации псевдокода, описывающего алгоритм распознавания рукописного текста, созданный почти 60 лет назад.
Доерсинг реализовал весь алгоритм на SQL, используя только веб-приложение для загрузки изображений рукописных символов в базу данных SQL. Узнать больше об этом проекте можно здесь.
Соответственно, заголовок его статьи звучит так: “SQL — это язык программирования”.
Так считают в Google
Конечно, Google не объявлял SQL языком программирования (и не имеет на это полномочий).
Однако бывший инженер по данным Google рассказал, что компания хранит и внедряет SQL в производство в виде кода точно так же, как Python и GO.
Google понимает, что SQL часто является основой конвейеров данных ETL/ELT/EL. А чтобы эти конвейеры были эффективными, SQL должен храниться и запускаться в производство, как любой другой код.
Как и в работе с любым другим кодом, написанным на любом другом языке программирования, Google уделяет особое внимание форматированию SQL-кода, контролю версий, инструментарию и свободному доступу.
Если Google и не считает SQL языком программирования, то, по крайней мере, признает, что он необходим для создания и поддержки надежных, масштабируемых конвейеров данных.
Заключение
Я не призываю вас занять ту или иную сторону. Но будучи инженером по данным, я склоняюсь в пользу языка программирования.
Однако вам, изучающему SQL, важно уловить суть этого разговора.
Осознание того, почему те же тесты Тьюринга используются для оценки достоинств языка программирования, поможет вам понять, почему некоторые люди, с которыми вы общаетесь в процессе изучения SQL, так заинтересованы в своем мнении.
Как и человеческий язык, язык программирования — это средство общения для передачи знаний и достижения конечной цели, будь то получение информации, ее загрузка или манипулирование ею.
Если SQL помогает достичь конечной цели, не сомневайтесь в его полноценности и статусе. Просто надейтесь на то, что ваш запрос будет выполнен.
- Руководство по наиболее востребованным базовым командам SQL
- SQL: загадки на сообразительность
- Руководство по SQL: команда MySQL INSERT в подробностях
Читайте нас в Telegram, VK и Дзен
Язык SQL – общая характеристика, интерфейс с традиционными языками программирования
Язык SQL – общая характеристика, интерфейс с традиционными языками программирования
Оглавление
1 Характеристики
2 Вопросы практического программирования
3 Вопросы совместимости
4 Реализации SQL
5 Типы команд SQL
6 Преимущества и недостатки языка SQL
6.1 Преимущества
6.2 Недостатки
Список использованных источников
1. Характеристики
В начале 1970-х годов в одной из исследовательских лабораторий компании IBM была разработана экспериментальная реляционная СУБД IBM System R, для которой затем был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. Аббревиатура SEQUEL расшифровывалась как Structured English QUEry Language — «структурированный английский язык запросов». Позже по юридическим соображениям язык SEQUEL был переименован в SQL.
Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования. Собственно разработкой языка запросов занимались Дональд Чэмбэрлин (Donald D. Chamberlin) и Рэй Бойс (Ray Boyce). Пэт Селинджер (Pat Selinger) занималась разработкой стоимостного оптимизатора (cost-based optimizer), Рэймонд Лори (Raymond Lorie) занимался компилятором запросов.
Первыми СУБД, поддерживающими новый язык, стали в 1979 году Oracle V2 для машин VAX от компании Relational Software Inc. (впоследствии ставшей компанией Oracle) и System/38 от IBM, основанная на System/R. Вопреки сложившемуся мнению, первой стала именно СУБД Oracle.
Рост количества данных, необходимость их хранения и обработки привели к тому, что возникла потребность в создании стандартного языка баз данных, который мог бы функционировать в многочисленных компьютерных системах различных видов. Действительно, с его помощью пользователи могут манипулировать данными независимо от того, работают ли они на персональном компьютере, сетевой рабочей станции или универсальной ЭВМ.
SQL (англ. Structured Query Language — «язык структурированных запросов») — универсальный компьютерный информационно-логический язык, появившийся в результате разработки реляционной модели данных, применяемый для создания, модификации и управления данными в реляционных базах данных.
Изначально, SQL был основным способом работы пользователя с базой данных и представлял собой небольшую совокупность команд (операторов) допускающих создание таблиц, добавление в таблицы новых записей, извлечение записей из таблиц (в соответствии с заданным условием), удаление записей и изменение структур таблиц. В связи с усложнением язык SQL стал более прикладным языком программирования, а пользователи получили возможность использовать визуальные построители запросов.
SQL принципиально отличается от традиционных алгоритмических языков программирования прежде всего тем, что он относится к непроцедурным языкам. На языке типа Кобол или Си можно записать шаг за шагом все инструкции, необходимые для исполнения программы. Язык SQL позволяет задать только то, “что нужно делать”, а само исполнение отдельных операций (“как делать”) возлагается непосредственно на СУБД. Такой подход в значительной мере определяется самой философией реляционных баз данных. СУБД в данном случае рассматривается как “черный ящик”, и что происходит внутри него, пользователя не должно касаться. Его должно интересовать только внесение в базу данных необходимых изменений и получение правильного ответа на запрос.
Другой особенностью SQL является так называемая трехзначная логика. В большинстве языков булево выражение может принимать только два значения: истина и ложь. Язык SQL позволяет записывать в базу данных значение NULL (пустое значение). NULL – это специальный код, который помещается в столбец таблицы, если по какой-нибудь причине в нем отсутствуют данные. Когда значение NULL участвует в операциях сравнения, булев результат будет ни истина и ни ложь, а неизвестно.
Все языки манипулирования данными, созданные для многих СУБД до появления реляционных баз данных, были ориентированы на операции с данными, представленными в виде логических записей файлов. Разумеется, это требовало от пользователя детального знания организации хранения данных и серьезных усилий для указания того, какие данные необходимы, где они размещаются и как их получить.
Благодаря работающим с файловыми серверами СУБД, множество пользователей получают доступ к одним и тем же базам данных. Упрощается разработка различных автоматизированных систем управления организациями. Однако при таком подходе вся обработка запросов из программ или с терминалов пользовательских ЭВМ на них и выполняется, поэтому для реализации даже простого запроса необходимо считывать с файлового сервера или записывать на него целые файлы, а это ведет к конфликтным ситуациям и перегрузке сети. Для исключения указанных недостатков была предложена технология клиент-сервер, но при этом понадобился единый язык общения с сервером – выбор пал на SQL.
Рассматриваемый язык SQL ориентирован на операции с данными, представленными в виде логически взаимосвязанных совокупностей таблиц-отношений. Важнейшая особенность его структур – ориентация на конечный результат обработки данных, а не на процедуру этой обработки. Язык SQL сам определяет, где находятся данные, индексы и даже какие наиболее эффективные последовательности операций следует использовать для получения результата, а потому указывать эти детали в запросе к базе данных не требуется.
SQL в настоящее время получил очень широкое распространение и фактически превратился в стандартный язык реляционных баз данных. Стандарт на язык SQL был выпущен Американским национальным институтом стандартов (ANSI) в 1986 г., а в 1987 г. Международная организация стандартов (ISO) приняла его в качестве международного. Дальнейшее развитие языка поставщиками СУБД потребовало принятия в 1992 году нового расширенного стандарта (ANSI SQL-92 или просто SQL2). Следующим стандартом стал SQL:1999 (SQL3). В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже.
2. Вопросы практического программирования
Как правило, любой поставщик СУБД предоставляет вместе со своей системой внешнюю утилиту, которая позволяет вводить операторы SQL в режиме командной строки и выдает на консоль результаты их выполнения (так, как это сделано на этой страничке, предоставляющей интерактивный доступ к БД publications). Недостатки такого режима работы очевидны: необходимо знать SQL, необходимо помнить схему БД, отсутствует возможность удобного просмотра результатов выполнения запросов. Поэтому, подобные утилиты стали инструментами администраторов баз данных, а для создания пользовательских приложений используются универсальные и специализированные языки программирования. Приложения, написанные таким образом, позволяют пользователю сосредоточиться на решении собственных задач, а не на структурах данных.
Почти все способы организации взаимодействия пользователя с базой данных основаны на модели «клиент-сервер». Т.е. предполагается, что каждое приложение обработки данных разбито, как минимум, на две части:
клиента, который отвечает за организацию пользовательского интерфейса
сервер, который собственно хранит данные, обрабатывает запросы и посылает их результаты клиенту для отображения
При этом предполагается, что каждая часть приложения функционирует на отдельном компьютере, т.е. к выделенному серверу БД с помощью локальной сети подключены персональные компьютеры пользователей (клиенты). Это наиболее популярная сегодня схема организации вычислительной среды.
Язык SQL позволяет только манипулировать данными, но в нем отсутствуют средства создания экранного интерфейса, что необходимо для пользовательских приложений. Для создания этого интерфейса служат универсальные языки третьего поколения (C, C++, Pascal) или проблемно-ориентированные языки четвертого поколения (xBase, Informix 4Gl, Progress, Jam. ). Эти языки содержат необходимые операторы ввода / вывода на экран, а также операторы структурного программирования (цикла, ветвтеления и т.д.). Также эти языки допускают определение структур, соответствующих записям таблиц обрабатываемой базы данных. В исходный текст программы включаются операторы языка SQL, которые во время исполнения передаются серверу БД, который собственно и производит манипулирование данными. Отношения, полученные в результате выполнения сервером SQL-запросов, возвращаются прикладной программе, которая заполняет строками этих отношений заранее определенные структуры. Дальнейшая работа клиентской программы (отображение, корректировка записей) ведется с этими структурами.
Каждая СУБД помимо интерактивной SQL-утилиты обязательно имеет библиотеку доступа и набор драйверов для различных операционных систем.
Библиотека доступа — это, как правило, объектный файл, исходный код которого создан на универсальном языке типа C. Эта библиотека содержит набор функций, позволяющих пользовательскому приложению соединятся с базой данных, передавать запросы серверу и получать ответные данные. Типичный набор функций такой библиотеки (имена функций зависят от используемой библиотеки):
Библиотечные вызовы преобразуются драйвером базы данных в сетевые вызовы и передаются сетевым программным обеспечением на сервер.
На сервере происходит обратный процесс преобразования: сетевые пакеты -> функции библиотеки -> SQL-запросы, запросы обрабатываются, их результаты передаются клиенту.
Как видим, такой способ создания приложений чрезвычайно гибок, позволяет реализовать практически любое приложение, но в то же время имеет явные недостатки:
разработка клиентской программы возможна только для той операционной системы и на том языке программирования, который поддерживатеся библиотекой, необходим драйвер базы данных, который определяет допустимые типы сетевых интерфейсов, большой объем кодирования, нестандартизованные библиотечные функции.
В результате получаем приложение, которое привязано как к сетевой среде, так и к программно-аппаратной платформе и используемой базе данных.
Некоторой модификацией данного способа является использование «встроенного» языка SQL. В этом случае в текст программы на языке третьего поколения включаются не вызовы библиотек, а непосредственно предложения SQL, которые предваряются ключевым выражением «EXEC SQL». Перед компиляцией в машинный код такая программа обрабатывается препроцессором, который транслирует смесь операторов «собственного» языка СУБД и операторов SQL в «чистый» исходный код. Затем коды SQL замещаются вызовами соответствующих процедур из библиотек исполняемых модулей, служащих для поддержки конкретного варианта СУБД.
Такой подход позволил несколько снизить степень привязанности к СУБД, например, при переключении прикладной программы на работу с другим сервером базы данных достаточно было заново обработать ее исходный текст новым препроцессором и перекомпилировать.
3. Вопросы совместимости
По традиции, как и со многими стандартами в IT-индустрии, с языком SQL возникла проблема: на каком-то этапе многие производители использующего SQL программного обеспечения решили, что функционал в текущей (на тот момент времени) версии стандарта недостаточен, и его желательно расширить. В результате у разных производителей систем управления баз данных (СУБД) в ходу разные диалекты SQL, в общем случае между собой несовместимые.
Среди недостатков использования стандартов оказывается ограничение гибкости и функциональных возможностей конкретной реализации. Под реализацией языка SQL понимается программный продукт SQL соответствующего производителя. Для расширения функциональных возможностей многие разработчики, придерживающиеся принятых стандартов, добавляют к стандартному языку SQL различные расширения.
Все конкретные реализации языка несколько отличаются друг от друга. В интересах самих же производителей гарантировать, чтобы их реализация соответствовала современным стандартам ANSI в части переносимости и удобства работы пользователей. Тем не менее каждая реализация SQL содержит усовершенствования, отвечающие требованиям того или иного сервера баз данных. Эти усовершенствования или расширения языка SQL представляют собой дополнительные команды и опции, являющиеся добавлениями к стандартному пакету и доступные в данной конкретной реализации.
До 1996 года вопросами соответствия коммерческих реализаций SQL стандарту занимался в основном Национальный институт стандартов и технологий (NIST), который и устанавливал уровень соответствия стандарту. Поздне́е подразделение, занимавшееся СУБД, было расформировано, и на текущий момент все усилия по проверке СУБД на соответствие стандарту ложатся на её производителя.
Положение изменилось с введением стандарта SQL:1999. Отныне стандарт приобрёл модульную структуру — основная часть стандарта была вынесена в раздел «SQL/Foundation», все остальные были выведены в отдельные модули. Соответственно, остался только один уровень совместимости — Core, что означало поддержку этой основной части. Поддержка остальных возможностей оставлена на усмотрение производителей СУБД.
В настоящее время язык SQL поддерживается многими десятками СУБД различных типов.
4. Реализации SQL
Строго говоря, SQL не является языком программирования согласно определению этого термина. SQL представляет собой субъязык данных, предназначенный для использования только в качестве интерфейса с БД. Сам по себе SQL не содержит тех средств, которые необходимы для разработки законченных программ. Подобные задачи должны решаться либо с помощью языков программирования или управления заданиями, либо интерактивно, в результате действий, выполняемых самим пользователем. По причине подобной незавершенности в плане организации вычислительного процесса язык SQL может применяться в форме одной из трех прикладных реализаций:
1. Интерактивный (или автономный) SQL дает возможность пользователям непосредственно извлекать информацию из базы или записывать в нее данные. Информация, получаемая по запросу SQL, может быть выдана на экран, переадресована в файл или на принтер.
2. Статический SQL позволяет записать фиксированный исполняемый код SQL, он обычно используется в приложениях на процедурных языках.
Есть две разновидности статического SQL: встроенный и модульный.
Встроенный SQL определен как код SQL, который включен в исходный текст программы, написанной на другом языке программирования. В реальной жизни большинство приложений разрабатываются на алгоритмических языка (например, Си или Кобол), однако для обращения к БД используется встроенный SQL.
В модульном варианте операторы SQL записаны в отдельных модулях, которые компонуются с модулями основного языка. В первый стандарт – SQL86 – был включен только модульный SQL, а встроенный SQL не нашел себе места в официальной части стандарта, хотя и был приведен в приложении. Сегодня встроенный SQL пользуется гораздо большей популярностью среди разработчиков, чем модульный, и стандарт SQL92 поддерживает обе версии статического SQL.
3. Динамический SQL дает возможность генерировать код SQL во время исполнения приложения и используется вместо статического SQL в тех случаях, когда при разработке приложения необходимый код SQL еще не может быть определен или зависит от того, какой выбор сделает пользователь.
Операторы динамического SQL обычно применяются в диалоговых средах для построения запросов и в графических средствах разработки приложений БД.
5. Типы команд SQL
Реализация в SQL концепции операций, ориентированных на табличное представление данных, позволила создать компактный язык с небольшим набором предложений. Язык SQL может использоваться как для выполнения запросов к данным, так и для построения прикладных программ.
Основные категории команд языка SQL предназначены для выполнения различных функций, включая построение объектов базы данных и манипулирование ими, начальную загрузку данных в таблицы, обновление и удаление существующей информации, выполнение запросов к базе данных, управление доступом к ней и ее общее администрирование.
Основные категории команд языка SQL:
DDL – язык определения данных;
DML – язык манипулирования данными;
DQL – язык запросов;
DCL – язык управления данными;
команды администрирования данных;
команды управления транзакциями
Определение структур базы данных (DDL)
Язык определения данных (Data Definition Language, DDL) позволяет создавать и изменять структуру объектов базы данных, например, создавать и удалять таблицы. Основными командами языка DDL являются следующие: CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX, ALTER INDEX, DROP INDEX.
Манипулирование данными (DML)
Язык манипулирования данными (Data Manipulation Language, DML) используется для манипулирования информацией внутри объектов реляционной базы данных посредством трех основных команд: INSERT, UPDATE, DELETE.
Выборка данных (DQL)
Язык запросов DQL наиболее известен пользователям реляционной базы данных, несмотря на то, что он включает всего одну команду SELECT. Эта команда вместе со своими многочисленными опциями и предложениями используется для формирования запросов к реляционной базе данных.
Язык управления данными (DCL — Data Control Language)
Команды управления данными позволяют управлять доступом к информации, находящейся внутри базы данных. Как правило, они используются для создания объектов, связанных с доступом к данным, а также служат для контроля над распределением привилегий между пользователями. Команды управления данными следующие: GRANT, REVOKE.
Команды администрирования данных
С помощью команд администрирования данных пользователь осуществляет контроль за выполняемыми действиями и анализирует операции базы данных; они также могут оказаться полезными при анализе производительности системы. Не следует путать администрирование данных с администрированием базы данных, которое представляет собой общее управление базой данных и подразумевает использование команд всех уровней.
Команды управления транзакциями
Существуют следующие команды, позволяющие управлять транзакциями базы данных: COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION.
6. Преимущества и недостатки языка SQL
6.1 Преимущества Язык SQL является основой многих СУБД, т.к. отвечает за физическое структурирование и запись данных на диск, а также за чтение данных с диска, позволяет принимать SQL-запросы от других компонентов СУБД и пользовательских приложений. Таким образом, SQL – мощный инструмент, который обеспечивает пользователям, программам и вычислительным системам доступ к информации, содержащейся в реляционных базах данных.
Основные достоинства языка SQL заключаются в следующем:
стандартность – как уже было сказано, использование языка SQL в программах стандартизировано международными организациями;
независимость от конкретных СУБД – все распространенные СУБД используют SQL, т.к. реляционную базу данных можно перенести с одной СУБД на другую с минимальными доработками;
возможность переноса с одной вычислительной системы на другую – СУБД может быть ориентирована на различные вычислительные системы, однако приложения, созданные с помощью SQL, допускают использование как для локальных БД, так и для крупных многопользовательских систем;
реляционная основа языка – SQL является языком реляционных БД, поэтому он стал популярным тогда, когда получила широкое распространение реляционная модель представления данных. Табличная структура реляционной БД хорошо понятна, а потому язык SQL прост для изучения;
возможность создания интерактивных запросов – SQL обеспечивает пользователям немедленный доступ к данным, при этом в интерактивном режиме можно получить результат запроса за очень короткое время без написания сложной программы;
возможность программного доступа к БД – язык SQL легко использовать в приложениях, которым необходимо обращаться к базам данных. Одни и те же операторы SQL употребляются как для интерактивного, так и программного доступа, поэтому части программ, содержащие обращение к БД, можно вначале проверить в интерактивном режиме, а затем встраивать в программу;
обеспечение различного представления данных – с помощью SQL можно представить такую структуру данных, что тот или иной пользователь будет видеть различные их представления. Кроме того, данные из разных частей БД могут быть скомбинированы и представлены в виде одной простой таблицы, а значит, представления пригодны для усиления защиты БД и ее настройки под конкретные требования отдельных пользователей;
возможность динамического изменения и расширения структуры БД – язык SQL позволяет манипулировать структурой БД, тем самым обеспечивая гибкость с точки зрения приспособленности БД к изменяющимся требованиям предметной области;
поддержка архитектуры клиент-сервер – SQL – одно из лучших средств для реализации приложений на платформе клиент-сервер. SQL служит связующим звеном между взаимодействующей с пользователем клиентской системой и серверной системой, управляющей БД, позволяя каждой из них сосредоточиться на выполнении своих функций.
Язык SQL может использоваться широким кругом специалистов, включая администраторов баз данных, прикладных программистов и множество других конечных пользователей.
Язык SQL – первый и пока единственный стандартный язык для работы с базами данных, который получил достаточно широкое распространение. Практически все крупнейшие разработчики СУБД в настоящее время создают свои продукты с использованием языка SQL либо с SQL-интерфейсом. 6.2 Недостатки — Несоответствие реляционной модели данных
Создатели реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем Манифестеони излагают принципы СУБД следующего поколения и предлагают язык Tutorial D, который является подлинно реляционным.
— Сложность
Хотя SQL и задумывался как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.
— Отступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92, многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
— Сложность работы с иерархическими структурами СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ Википедия – режим доступа: wikipedia.org/wiki/SQL
Вопросы практического програмирования – режим доступа: edu.ru/education/materials/zelenkov/ch_4_7.html
Введение в структурированный язык запросов SQL – режим доступа: intuit.ru/department/database/sql/1/
Всё про Sql – режим доступа: sql.ru/
Введение в стандарты языка баз данных SQL – режим доступа: citforum.ru/database/sqlbook/index.shtml
Какие операции позволяет реализовать язык sql
В этой главе рассматриваются некоторые способы создания приложений, работающих с базой данных при помощи языка SQL. Как правило, любой поставщик СУБД предоставляет вместе со своей системой внешнюю утилиту, которая позволяет вводить операторы SQL в режиме командной строки и выдает на консоль результаты их выполнения (так, как это сделано на этой страничке, предоставляющей интерактивный доступ к БД publications). Недостатки такого режима работы очевидны: необходимо знать SQL, необходимо помнить схему БД, отсутствует возможность удобного просмотра результатов выполнения запросов. Поэтому, подобные утилиты стали инструментами администраторов баз данных, а для создания пользовательских приложений используются универсальные и специализированные языки программирования. Приложения, написанные таким образом, позволяют пользователю сосредоточиться на решении собственных задач, а не на структурах данных.
- клиента, который отвечает за организацию пользовательского интерфейса
- сервер, который собственно хранит данные, обрабатывает запросы и посылает их результаты клиенту для отображения
Язык SQL позволяет только манипулировать данными, но в нем отсутствуют средства создания экранного интерфейса, что необходимо для пользовательских приложений. Для создания этого интерфейса служат универсальные языки третьего поколения (C, C++, Pascal) или проблемно-ориентированные языки четвертого поколения (xBase, Informix 4Gl, Progress, Jam. ). Эти языки содержат необходимые операторы ввода / вывода на экран, а также операторы структурного программирования (цикла, ветвтеления и т.д.). Также эти языки допускают определение структур, соответствующих записям таблиц обрабатываемой базы данных. В исходный текст программы включаются операторы языка SQL, которые во время исполнения передаются серверу БД, который собственно и производит манипулирование данными. Отношения, полученные в результате выполнения сервером SQL-запросов, возвращаются прикладной программе, которая заполняет строками этих отношений заранее определенные структуры. Дальнейшая работа клиентской программы (отображение, корректировка записей) ведется с этими структурами.
Рассмотрим различные способы орагнизации доступа прикладной программы к серверу базы данных.
Каждая СУБД помимо интерактивной SQL-утилиты обязательно имеет библиотеку доступа и набор драйверов для различных операционных систем. Схема взаимодействия клиентского приложения с сервером базы данных в этом случае выглядит так:
- DB_connect(char *имя_базы_данных, char *имя_пользователя, char *пароль) — устанавливает соединение с базой данной, возвращает указатель на структуру db , описывающую характеристики этого соединения
- DB_exec(db, char *запрос) — выполнить запрос к базе данных, определяемой структурой db . Применяется для любых запросов кроме SELECT. Возвращает код выполнения запроса (0 — удачно, либо код ошибки)
- DB_select(db, char *запрос) — выполнить запрос на извлечение данных (SELECT). Возвращает структуру result , содержащую результаты выполнения запроса (реляционное отношение).
- DB_fetch(result) — извлечь следующую запись из структуры result .
- DB_close(db) — закрыть соединение с базой данных.
#include /* Файл, содержащий описание функций библиотеки */ . /* Организация интерфейса с пользователем, запрос его имени и пароля */ /* Присвоение значений переменным: dbname - имя базы данных */ /* username - имя пользователя */ /* password - пароль */ . db=DB_connect(dbname,username,password); /* Установление соединения */ if (db == NULL) < error_message(); /* Выдача сообщения об ошибке на монитор пользователя */ exit(1); /* Завершение работы */ >. /* Ожидание запроса пользователя. Формирование строки s_query - запроса */ /* на выборку данных */ . result=DB_select(db,s_query); /* Пересылка запроса на сервер */ if (result==NULL) < error_message(); /* Ошибка выполнения запроса. Выдача сообщения */ exit(2); /* Завершение работы */ >. /* Вывод результатов запроса на монитор пользователя. Ожидание следующего */ /* запроса. Подготовка строки u_query="UPDATE . SET . ", содержащей */ /* запрос на изменение данных. */ . res=DB_exec(db,u_query); /* Пересылка запроса на сервер */ if (res != 0 ) < error_message(); /* Ошибка выполнения запроса. Выдача сообщения */ exit(2); /* Завершение работы */ >. . DB_close(db); /*Завершение работы */
Данная программа, обеспечивающая взаимодействие пользователя с СУБД, компилируется совместно с библиотекой доступа. Библиотечные вызовы преобразуются драйвером базы данных в сетевые вызовы и передаются сетевым программным обеспечением на сервер.
На сервере происходит обратный процесс преобразования: сетевые пакеты -> функции библиотеки -> SQL-запросы, запросы обрабатываются, их результаты передаются клиенту.
- разработка клиентской программы возможна только для той операционной системы и на том языке программирования, который поддерживатеся библиотекой
- необходим драйвер базы данных, который определяет допустимые типы сетевых интерфейсов
- большой объем кодирования
- нестандартизованные библиотечные функции.
Некоторой модификацией данного способа является использование «встроенного» языка SQL. В этом случае в текст программы на языке третьего поколения включаются не вызовы библиотек, а непосредственно предложения SQL, которые предваряются ключевым выражением «EXEC SQL». Перед компиляцией в машинный код такая программа обрабатывается препроцессором, который транслирует смесь операторов «собственного» языка СУБД и операторов SQL в «чистый» исходный код. Затем коды SQL замещаются вызовами соответствующих процедур из библиотек исполняемых модулей, служащих для поддержки конкретного варианта СУБД.
Такой подход позволил несколько снизить степень привязанности к СУБД, например, при переключении прикладной программы на работу с другим сервером базы данных достаточно было заново обработать ее исходный текст новым препроцессором и перекомпилировать.
Большим достижением явилось появление (1994 г.) в стандарте SQL интерфейса уровня вызова — CLI (Call Level Interface), в котором стандартизован общий набор рабочих процедур, обеспечивающий совместимость со всеми основными серверами баз данных. Ключевой элемент CLI — специальная библиотека для компьютера-клиента, в которой хранятся вызовы процедур и большинство часто используемых сетевых компонентов для организации связи с сервером. Это ПО поставляется разработчиком средств SQL, не является универсальным и поддерживает разнообразные транспортные протоколы.
Использование программных вызовов позволяет свести к минимуму операции на компьютере-клиенте. В общем случае клиент формирует оператор языка SQL в виде строки и пересылает ее на сервер посредством процедуры исполнения (execute). Когда же сервер в качестве ответа возвращает несколько строк данных, клиент считывает результат с помощью серии вызовов процедуры выборки данных. Далее информация из столбцов полученной таблицы может быть связана с соответствующими переменными приложения. Вызов специальной процедуры позволяет клиенту определить считанное число строк, столбцов и типы данных в каждом столбце.
Интерфейс CLI построен таким образом, что перед передачей запроса серверу клиент не должен заботиться о типе оператора SQL, будь то выборка, обновление, удаление или вставка.
Очень важный шаг к созданию переносимых приложений обработки данных сделала фирма Microsoft, опубликовавшая в 1992 году спецификацию ODBC (Open Database Connetcivity — открытого интерфейса к базам данных), предназначенную для унификации доступа к данным с персональных компьютеров работающих под управлением операционной системы Windows. (Заметим, что ODBC опирается на спецификации CLI). Структурная схема доступа к данным с использованием ODBC:
- приложения становятся привязанными к платформе MS Windows
- увеличивается время обработки запросов (как следствие введения дополнительного программного слоя)
- необходимо предварительная инсталляция ODBC-драйвера и настройка ODBC (указание драйвера, сетевого пути к серверу, базы данных и т.д.) на каждом рабочем месте. Параметры этой настройки являются статическими, т.е. приложение их самостоятельно изменить не может.
JDBC (Java DataBase Connectivity) — это интерфейс прикладного программирования (API) для выполнения SQL-запросов к базам данных из программ, написанных на языке Java. Напомним, что язык Java, созданный компанией Sun, является платформенно — независимым и позволяет создавать как собственно приложения (standalone application), так и программы (апплеты), встраиваемые в web-страницы. Более подробная информация о Java и связанных с ним технологиях находится на серверах java.sun.ru.
JDBC во многом подобен ODBC (см. рисунок), также построен на основе спецификации CLI, однако имеет ряд замечательных отличий. Во-первых, приложение загружает JDBC-драйвер динамически, следовательно администрирование клиентов упрощается, более того, появляется возможность переключаться на работу с другой СУБД без перенастройки клиентского рабочего места. Во-вторых, JDBC, как и Java в целом, не привязан к конкретной аппаратной платформе, следовательно проблемы с переносимостью приложений практически снимаются. В-третьих, использование Java-приложений и связанной с ними идеологии «тонких клиентов» обещает снизить требования к оборудованию клиентских рабочих мест.
- Мартин Грабер. Введение в SQL.-М.:Лори,1996.
- Дж.Боуман, С.Эмерсон, М.Дарновски. Практическое руководство по SQL.-Киев: Диалектика,1997.
Что такое расширения языка для SQL Server?
Расширения языка — это функция SQL Server, используемая для выполнения внешнего кода. Реляционные данные могут использоваться во внешнем коде с помощью платформы расширяемости. В SQL Server 2019 поддерживаются среды выполнения Java, C#, R и Python.
Сведения о запуске Python или R в SQL Server см. в документации по Службам машинного обучения. В SQL Server 2019 и более поздних версий можно использовать настраиваемые среды выполнения Python и R с расширениями языка. Дополнительные сведения см. в статье Установка настраиваемой среды выполнения Python для SQL Server и Установка настраиваемой среды выполнения R для SQL Server.
Возможности расширений языка
Расширения языка используют платформу расширяемости для исполнения внешнего кода. Выполнение кода изолировано от процессов ядра, но полностью интегрировано с выполнением запросов SQL Server. Вы можете выполнять код в источнике данных, чтобы не передавать данные по сети.
Внешние языки определяются с помощью инструкции CREATE EXTERNAL LANGUAGE. Системная хранимая процедура sp_execute_external_script используется в качестве интерфейса для исполнения кода.
Использование расширений языка имеет несколько преимуществ.
- Защита данных. Выполнение кода внешнего языка ближе к источнику данных позволяет избежать небезопасного перемещения данных.
- Скорость. Базы данных оптимизированы для операций на основе наборов.
- Простота развертывания и интеграции. SQL Server является отправной точкой операций для многих других задач и приложений управления данными. Используя данные в базе данных, вы гарантируете, что языковое расширение использует согласованные и актуальные данные.
Собственная общеязыковая среда выполнения SQL (CLR) позволяет реализовать некоторые функциональные возможности SQL Server на языках .NET. Обсуждение различий между SQL CLR и расширениями языка SQL см. в разделе Сравнение расширений языка SQL Server и SQL CLR.
Дальнейшие действия
- Установка расширения языка Java в Windows или Linux
- Установка расширения языка C# в Windows
- Установка настраиваемой среды выполнения Python для SQL Server
- Установка настраиваемой среды выполнения R для SQL Server
- Установка Пакета Microsoft Extensibility SDK для Java
