Почему в запросе SQL выбирается перед From? [закрыто]


67

Это то, что меня очень беспокоило в школе.

Пять лет назад, когда я изучал SQL, я всегда задавался вопросом, почему мы сначала указываем поля, которые хотим, а затем, откуда мы их хотим.

Согласно моей идее, мы должны написать:

From Employee e
Select e.Name

Так почему же норма говорит следующее?

Select e.Name -- Eeeeek, what does e mean?
From Employee e -- Ok, now I know what e is

Мне потребовались недели, чтобы понять SQL, и я знаю, что много этого времени было потрачено на неправильный порядок элементов.

Это как писать в C #:

string name = employee.Name;
var employee = this.GetEmployee();

Итак, я предполагаю, что у этого есть историческая причина. Почему?


64
Это заговор DBA, чтобы держать OO обезьян на их месте.
ГБН

3
К сожалению, я не могу найти какую-либо соответствующую информацию в газете, которая представляет SEQUEL , и я не думаю, что есть конкретные цитаты, которые отвечают на ваш вопрос. Ответ Гнатона, возможно, является лучшим объяснением, но я бы не отказался от теории заговора.
Яннис

2
Лично я всегда хотел, Linqчтобы не могли использовать стандартизированный SQLсинтаксис.
jp2code

4
Предложения в операторе SELECT не являются порядком операции.
С.Лотт

8
Хороший вопрос Далее следует выяснить, почему запросы INSERT и UPDATE должны были использовать разные синтаксические модели: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Ответы:


86

Первоначально язык SQL назывался SEQUEL, обозначая

  • Структурированный английский язык запросов
    с упором на английский , предполагая, что он близок к написанию на естественном языке.

Теперь произнесите эти два утверждения так же, как и английские предложения:

  1. «Из таблицы сотрудников e Выберите столбец e.Name»
  2. «Выберите столбец e.Name из таблицы сотрудников e»

Второй звучит ближе к естественному английскому языку, поэтому он считается нормой.

Кстати, то же самое относится и к Whereт. Д. - операторы SQL были специально разработаны, чтобы звучать близко к естественному языку.


7
Конечно, Microsoft проигнорировала это с LINQ, потому что FROM стоит первым!

27
В английском языке много загадочной логики: /
Майкл К

15
@Digger - это было разработано: они не могли поддерживать intellisense в выбранной части, если выбор был первым.
Скотт Уитлок

6
@Digger: LINQ следует за OO / modern Object.Method или Object.Property. Не забывайте, что SQL существует уже 40 лет
gbn

7
Я должен был бы опубликовать этот вопрос на сайте english.stackexchange.com :)
Кирилл Гандон

37

Потому что SELECT требуется в операторе выбора, а FROM - нет.

Select 'This String'

Конечно, ваш оператор SQL может быть проанализирован для поиска SELECT, DELETE, UPDATE после FROM, но действительно ли это так важно?

Помните, все это было сделано до осмысления. Это не так сложно.

Редактировать: Вероятно, нет причин, по которым SQL-интерпретаторы не могут быть созданы для обеих целей


2
Хотя вы могли бы также написать FROM myTable;вместо FROM myTable SELECT *; Это только кажется требованием, потому что это то, к чему вы привыкли.
user606723 30.12.11

13
То, что это требуется, не означает, что оно должно быть на первом месте.
LarsTech

8
В ANSI SQL FROMтребуется. Вот почему во многих РСУБД есть таблица с именем DUAL или другая
Martin Smith,

@LarsTech - это не обязательно должно быть на первом месте, но зачем усложнять. Это называется оператором выбора, просто начните со слова выбора.
Джефф

3
@JeffO: Хорошо. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber,
Аллон Гуралнек

10

Не знаю ответа, который я мог бы подтвердить ссылками, но если бы мне пришлось размышлять: SQL - декларативный язык , оператор такого языка описывает то, что вы хотели бы сделать, а не то, как вы хотели бы это сделать.

Таким образом, «SELECT X FROM Y» звучит как более подходящий способ ответить «Что бы я хотел выбрать из базы данных», а не писать «FROM Y SELECT X».

Кроме того, в SQL SELECT / UPDATE / INSERT указывает тип операции, которую вы собираетесь выполнить, а FROM - это просто предложение, которое помогает вам выбрать нужную таблицу в базе данных. Опять же, то , что вы делаете с данными, имеет приоритет над тем, как именно вы собираетесь этого достичь.


1
+1: это не обязательно или процедурно. Порядок пунктов просто соответствует английскому языку. Ничего больше.
С.Лотт

ON и WHERE могут быть лучшими примерами важности порядка предложений в операторе select.
Джефф

5

SQL - это язык структурированных запросов, ориентированный на носителей английского языка. SELECT, INSERT, UPDATE и DELETE являются обязательными командами. В английском языке императивные команды начинают предложение или утверждение. Для сравнения:

West young man go!

в

Go west young man!

SQL следует второму (обязательному) формату. Также четыре императивные команды имеют три существенно разных формата. Рассмотреть возможность:

FROM    employees a,
        accounts b
UPDATE  ...

или же

INTO    customers a
SELECT  ...

Если вы знаете, какое действие вы предпринимаете, проще выбрать правильный формат.

В случае выбора вы определяете, какие атрибуты вы хотите, а затем добавляете таблицы, которые имеют их. По мере построения критериев выбора вы можете добавлять дополнительные таблицы. Когда вы динамически добавляете критерии, это обычно можно сделать в конце статической части запроса.


7
Так что Йода не участвовал в разработке SQL.
Адам Ф

Интересно, что вы воспитываете ОБНОВЛЕНИЕ. UPDATE ... FROMэто не англоязычная структура, IMO. Не то чтобы у меня были лучшие предложения ...
Роберт Браун

Намерение состояло в том, чтобы указать, что предлог должен соответствовать глаголу.
BillThor

3

Операторы SQL начинаются с глаголов. Это был выбор разработчиков языков, и многие языки программирования работают именно так. Семантически, это не редкость видеть языки программирования, которые работают так:

verb(noun, noun, noun);

Кроме того, в случае оператора SELECT, который вы приводите в качестве примера, предложенный вами синтаксис помещает объект на первое место в операторе. Вместо порядка предложений VSO (глагол, субъект, объект) у вас будет OVS, что будет очень странно по сравнению с естественными языками. SVO (например, английский), VSO (например, арабский) и SOV (например, латинский) являются более разумными приближениями человеческой речи.


2

Я думаю, что это значительно усложнит анализ, особенно с подзапросами, например

  FROM Foo f
  JOIN (FROM Bar b
        WHERE b.ID = f.ID
        UPDATE b
           SET b.Wibble = 1) x
    ON x.ID = f.ID
SELECT f.XYZ

Разбор это было бы более сложным. Вы не могли бы сказать, что UPDATE была синтаксической ошибкой, пока вы не проанализировали предложение FROM, и парсер должен был запомнить достаточно контекста, чтобы знать, что он анализирует подзапрос. Я не думаю, что обновления допустимы в подзапросах в любом случае, но если бы они были (возможно, с предложением RETURNING), то вы не сможете сказать, что это недопустимо, пока не проанализируете инструкцию SELECT.

Это, по крайней мере, увеличило бы k (перспектива) для грамматики и в худшем случае сделало бы ее контекстно-зависимой, хотя это расширяет границы моих довольно смутно запомненных работ по проектированию компиляторов из университета.


Глядя на статью Wiki, QUELкоторая была разработана примерно в то же время, порядок предложений синтаксиса - это то, что предлагает OP.
Мартин Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.