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).

Скриншот из Quora (с переводом)

В какой-то степени репутация имеет значение.

Тот факт, что более “респектабельные” программисты смотрят на 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 помогает достичь конечной цели, не сомневайтесь в его полноценности и статусе. Просто надейтесь на то, что ваш запрос будет выполнен.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Zach Quinn: 10 Reasons SQL Is And Is Not Programming

Предыдущая статьяИспользование SwiftUI в UIKit
Следующая статьяРазработка продвинутого GUI на Python