SQLクエリでFromの前にSelectがあるのはなぜですか?[閉まっている]


67

これは学校で私を悩ませたものです。

5年前、私が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を紹介した論文には関連情報が見つかりません。また、あなたの質問に答える特定の引用があるとは思いません。しかし、gnatの答えはおそらく最良の説明です-しかし、私は陰謀論を却下しません。
ヤニス

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と呼ばれていました

  • ストラクチャード英語クエリ言語は、
    を重視して英語のスペルが近いことを仮定して、自然言語。

ここで、英語の文章を綴るのと同じように、次の2つの文を綴ります。

  1. 「従業員テーブルからe列e.Nameを選択」
  2. 「従業員テーブルeから列e.Nameを選択」

2番目は自然な英語に近いように聞こえるので、標準として設定されています。

ちなみに、同じ理由はWhere他にも当てはまります。SQLステートメントは、自然言語に近いように意図的に設計されています。


7
もちろん、FROMが最初になるので、MicrosoftはLINQでそれを無視しました!

27
英語には先読み論理がたくさんあります:/
Michael K

15
@Digger-それは設計によるものです。選択が最初に来た場合、選択部分でインテリセンスをサポートできませんでした。
スコットホイットロック

6
@Digger:LINQはOO / modern Object.MethodまたはObject.Propertyに従います。SQLは、40年前から出回っていることを忘れないでください
GBN

7
私は、上の記事この質問を持っている必要がありenglish.stackexchange.comを :)代わりに
シリルGandon

37

SELECTステートメントではSELECTが必須であり、FROMは必須ではないためです。

Select 'This String'

もちろん、SQLステートメントを解析して、FROMの後にSELECT、DELETE、UPDATEを検索することもできますが、それは本当に大したことですか?

覚えておいて、これはすべてインテリセンスの前に行われました。それほど複雑ではありません。

編集:SQLインタープリターが両方を行うために構築できなかった理由はおそらくないでしょう。


2
ただし、FROM myTable;代わりに書くこともできFROM myTable SELECT *ます。これはあなたが以前使っていたものだからです。
user606723

13
必要だからといって、最初に来なければならないわけではありません。
LarsTech

8
ANSIではSQL FROMが必要です。多くのRDBMSと呼ばれるテーブル持っている理由はここにあるDUAL か、他の単一の行にダミーのテーブル
マーティン・スミス

@LarsTech-最初に来る必要はありませんが、なぜそれを複雑にします。これはselect文と呼ばれ、selectという単語で始まります。
JeffO

3
@ジェフ:オーケー。SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber
アロングラネク

10

私が参照によりバックアップ可能性が答えを知っているが、私は推測していた場合はいけない:SQLは宣言型言語は、そのような言語のステートメントが記述するものとは対照的に、あなたがやりたい、あなたがそれをやりたいです。

このように、「SELECT X FROM Y」は、「FROM Y SELECT X」と書くのではなく、「データベースから選択したいもの」に答えるより適切な方法として聞こえます。

さらに、SQLでは、SELECT / UPDATE / INSERTは実行しようとしている操作のタイプを指定し、FROMはデータベース内の適切なテーブルから選択するのに役立つ句にすぎません。繰り返しますが、データでをしているのは、それをどの程度正確に達成しようとしているよりも優先されます


1
+1:命令型でも手続き型でもありません。句の順序は単に英語に適合しています。これ以上何もない。
S.Lott

ONおよびWHEREは、selectステートメントの句の順序の重要性のより良い例です。
JeffO

5

SQLは、英語を話す人を対象とした構造化照会言語です。SELECT、INSERT、UPDATE、およびDELETEは必須のコマンドです。英語では、命令型コマンドは文または文を開始します。比較する:

West young man go!

Go west young man!

SQLは2番目(必須)の形式に従います。また、4つの命令型コマンドには、大きく異なる3つの形式があります。考慮してください:

FROM    employees a,
        accounts b
UPDATE  ...

または

INTO    customers a
SELECT  ...

実行しているアクションがわかっている場合は、正しい形式を選択する方が簡単です。

selectの場合、必要な属性を決定してから、それらの属性を持つテーブルを追加します。選択基準を作成するときに、追加のテーブルを追加できます。基準を動的に追加する場合、通常はクエリの静的な部分の最後で実行できます。


7
そのため、YodaはSQLの開発には関与していませんでした。
アダムf

興味深いことに、UPDATEを表示します。 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

これの解析はより複雑になります。FROM句を解析するまでUPDATEが構文エラーであることはわかりませんでした。また、パーサーは、サブクエリを解析していることを知るのに十分なコンテキストを記憶する必要があります。とにかく、サブクエリで更新が許可されるとは思いませんが、更新された場合(おそらくRETURNING句を使用)、SELECTステートメントを解析するまでこれが無効であるとは言えないかもしれません。

これにより、少なくとも文法のk(lookahead)が増加し、最悪の場合は状況依存になりますが、これは大学からのかなり曖昧に記憶されたコンパイラー設計論文の範囲を広げています。


QUELそのためのWiki記事を見ると、ほぼ同時に構文句の順序がOPが示唆しているように開発されました。
マーティンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.