Чому в SQL запиті "Вибір перед" З "? [зачинено]


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 утримувати мавп ОО на їх місці.
gbn

3
На жаль, я не можу знайти будь-якої відповідної інформації в роботі, яка представила SEQUEL , і я не думаю, що є конкретні цитати, які відповідають на ваше запитання. Хоча відповідь гната, можливо, найкраще пояснення - але я не відкидаю теорії змови.
янніс

2
Особисто я завжди хотів, Linqщоб не міг використовувати стандартизований SQLсинтаксис.
jp2code

4
Пункти в операторі SELECT не є порядком операції.
S.Lott

8
Приємне запитання. Наступним слід пояснити, чому для запитів INSERT та UPDATE довелося використовувати різні моделі синтаксису: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Відповіді:


86

Спочатку мова SQL називалася SEQUEL стоячи

  • Структурована англійська мова запиту
    з наголосом на англійській мові , припускаючи, що вона є близькою до написання природної мови.

Тепер пропишіть ці два твердження так, як ви написали б англійські речення:

  1. "З таблиці працівника e Виберіть стовпець e.Name"
  2. "Виберіть стовпчик e.Name із таблиці працівників"

Другий звучить ближче до природної англійської мови, тому його встановлюють як норму.

BTW те ж міркування стосується і Whereт. Д. - заяви SQL були навмисно розроблені так, щоб вони звучали наближеними до природної мови.


7
Звичайно, Microsoft проігнорувала, що LINQ як ВІД стає першим!

27
Англійською мовою є багато логіки пошуку: /
Michael K

15
@Digger - це було задумано: вони не могли підтримувати інтелігенцію у частині вибору, якщо вибір вийшов першим.
Скотт Вітлок

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

7
Я мав би надіслати це питання замість english.stackexchange.com замість цього :)
Cyril Gandon

37

Оскільки SELECT потрібен у виписці, а FROM - ні.

Select 'This String'

Звичайно, ваш sql-заяву можна проаналізувати, щоб шукати SELECT, DELETE, UPDATE після ВІД, але чи справді це велика угода?

Пам'ятайте, це все робилося до інтелігенції. Це не так складно.

Редагувати: Напевно, немає причин, що інтерпретатори sql не могли бути побудовані для того, щоб робити те і інше.


2
Хоча ви також можете писати FROM myTable;замість FROM myTable SELECT *; Це здається лише вимогою, оскільки це те, до чого ти звик.
user606723

13
Тільки тому, що це потрібно, не означає, що він повинен бути першим.
LarsTech

8
В ANSI обов'язковий SQL FROM. Ось чому багато RDBMS мають таблицю з назвою DUAL або іншу односмугову макетну таблицю
Мартін Сміт

@LarsTech - це не обов'язково першим, але чому це ускладнюється. Це називається оператором select, просто почніть із слова select.
JeffO

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

10

Не знаю відповіді, що я міг би зробити резервне копіювання посиланнями, але якщо мені доведеться міркувати: SQL - це декларативна мова , висловлювання такою мовою описує те, що ви хотіли б зробити, на відміну від того, як ви хочете це зробити.

Таким чином, "SELECT X FROM Y" звучить як більш підходящий спосіб відповіді "Що я хотів би вибрати з бази даних", на відміну від написання "F Y Y SELECT X".

Крім того, у SQL SELECT / UPDATE / INSERT вказується тип операції, яку ви збираєтесь зробити, і FROM - лише пункт, який допоможе вам вибрати з потрібної таблиці в базі даних. Знову ж таки, що ви робите з даними, має перевагу над тим , як саме ви збираєтесь цього досягти.


1
+1: Це не імперативно чи процедурно. Порядок пропозицій - це лише відповідність англійській мові. Більше нічого.
S.Lott

ON і WHERE можуть бути кращими прикладами важливості впорядкування пропозицій у виділеному операторі.
JeffO

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
Тож Yoda не брав участь у розробці SQL.
adam f

Цікаво, що ви підносите ОНОВЛЕННЯ. 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, і аналізатору доведеться запам'ятати достатній контекст, щоб знати, що він аналізував підзапит. Я не думаю, що оновлення дозволені в підзапитах у будь-якому разі, але якщо вони були (можливо, з пунктом ПОВЕРНЕННЯ), то, можливо, ви не зможете сказати, що це недійсне, поки ви не розібрали оператор SELECT.

Це принаймні збільшило б k (lookahead) для граматики і, в гіршому випадку, зробило б її контекстно-чутливою, хоча це розтягує межі моїх досить тьмяно запам’ятовуваних дизайнерських робіт компілятора з університету.


З огляду на статтю Wiki, QUELяка була розроблена приблизно в той самий час, порядок синтаксичних пропозицій - це те, що пропонує ОП.
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.