Когда SQL обрабатывает порядок операций запроса, он начинается с части «FROM». Поэтому можно задать вопрос: почему запросы не вводятся как «FROM mytable SELECT *;» но вместо этого как «SELECT * FROM mytable;»
Я понимаю, что только у создателей языка есть однозначный ответ, но я искал какое-то интуитивное объяснение, которое, возможно, мне не хватает.
@NathanHughes Тогда они явно не говорили по-немецки или на многих других языках, где глагол часто стоит в конце предложения, после винительного объекта.
Вы задали этот вопрос очень своевременно, поскольку в прошлом месяце группа исследователей из Google опубликовала статью, описывающую их идею о том, как «исправить» синтаксис SQL.
https://storage.googleapis.com/gweb-research2023-media/pubtools/1004848.pdf
Они отмечают то же самое, что и вы: пункты оператора SQL SELECT
расположены не в том порядке, в котором они обычно выполняются механизмом РСУБД. Они хотят изменить синтаксис SQL, чтобы он стал более интуитивно понятным, т. е. соответствовал тому, как, по их мнению, выполняется запрос.
SQL спроектирован как декларативный язык. Вы описываете желаемый результат, а движок должен продумать шаги, которые помогут вам получить этот результат. Это должно быть абстракцией.
Для меня разумно начинать запрос со списка выбора, описывающего столбцы, которые вы хотите включить в результат. После этого вы указываете таблицы и условия.
Например: «Мне нужен список штатов США и сумма продаж в каждом штате. Получите эти данные из таблиц «Штаты» и «Продажи». Включите только продажи, которые не были возвращены».
SELECT us_state, COUNT(*)
FROM States JOIN Sales USING (us_state)
WHERE Sales.returned = false
GROUP BY us_state;
Это незнакомо некоторым разработчикам, которые не могут избавиться от стереотипа, согласно которому язык программирования должен описывать точные шаги в точном порядке для получения результата.
Они хотят, чтобы SQL был императивным языком, а не декларативным.
Но SQL не является описанием того, как должен выполняться запрос. Это описание желаемого результата.
+1 к этому ответу. Однако важно отметить, что рисунок 2 — это лишь одна из возможных последовательностей шагов. Например, ORDER BY может появиться перед WHERE, а список SELECT может окончательно изменить последовательность операторов JOIN и FROM.
Автодополнение — большое преимущество в современных реалиях. Нынешнее поколение избалованных разработчиков не хочет вручную набирать код. Pipe-синтаксис помогает реализовать это.
Также не забывайте, что английский не является родным языком для всех программистов. Вот почему ваша фраза, начинающаяся со слов «Я хочу список», звучит кувырком на многих других языках. PS: Согласен, что разработчики должны знать английский.
@AlexanderPetrov, автозаполнение можно реализовать таким образом, чтобы после ввода имен столбцов в список выбора вы могли получать предложения по именам таблиц, содержащих эти столбцы. Или вы можете сначала ввести предложение FROM
, а затем отредактировать список выбора. Не обязательно писать строки SQL-запросов сверху вниз. На самом деле я обычно начинаю с предложения FROM
, а затем перемещаю курсор.
Что касается требований по английскому языку, то это справедливо практически для любого языка программирования (за исключением, пожалуй, LISP). Кроме того, изменение порядка предложений в SQL не меняет требования к тому, чтобы программисты распознавали ключевые слова языка. Им не обязательно свободно владеть английским языком, чтобы распознать несколько ключевых слов.
Просто они хотели, чтобы оно читалось как естественный язык.