Mengapa Pilih sebelum Dari dalam kueri SQL? [Tutup]

67

Ini adalah sesuatu yang sangat mengganggu saya di sekolah.

Lima tahun yang lalu, ketika saya belajar SQL, saya selalu bertanya-tanya mengapa kita pertama menentukan bidang yang kita inginkan dan kemudian dari mana kita menginginkannya.

Menurut ide saya, kita harus menulis:

From Employee e
Select e.Name

Jadi mengapa norma mengatakan yang berikut?

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

Butuh waktu berminggu-minggu bagi saya untuk memahami SQL, dan saya tahu bahwa banyak waktu yang dikonsumsi oleh urutan elemen yang salah.

Itu seperti menulis dalam C #:

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

Jadi, saya berasumsi bahwa itu memiliki alasan historis. Mengapa?

Cyril Gandon
sumber
64
Ini adalah konspirasi DBA untuk menjaga monyet OO di tempat mereka.
gbn
3
Sayangnya, saya tidak dapat menemukan info yang relevan di koran yang memperkenalkan SEQUEL , dan saya rasa tidak ada kutipan khusus yang menjawab pertanyaan Anda. Namun, jawaban nyamuk mungkin adalah penjelasan terbaik - tetapi saya tidak akan mengabaikan teori konspirasi.
yannis
2
Secara pribadi, saya selalu berharap Linqtidak dapat menggunakan SQLsintaks standar .
jp2code
4
Klausa dalam pernyataan SELECT bukan urutan operasi.
S.Lott
8
Pertanyaan yang bagus Anda yang berikutnya harus menjadi alasan mengapa permintaan INSERT dan UPDATE harus menggunakan model sintaks yang berbeda: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Jawaban:

86

Awalnya bahasa SQL disebut SEQUEL singkatan

  • Bahasa Query Bahasa Inggris Terstruktur
    dengan penekanan pada Bahasa Inggris , dengan asumsi itu mirip dengan pengejaan ke bahasa alami .

Sekarang, eja dua pernyataan ini seperti Anda mengeja kalimat bahasa Inggris:

  1. "Dari tabel Karyawan e Pilih kolom e.Nama"
  2. "Pilih kolom e. Nama Dari tabel Karyawan e"

Kedua terdengar lebih dekat dengan bahasa Inggris alami karena itu ditetapkan sebagai norma.

Alasan yang sama BTW berlaku untuk Wheredll - pernyataan SQL sengaja dirancang untuk terdengar dekat dengan bahasa alami.

agas
sumber
7
Tentu saja Microsoft mengabaikannya dengan LINQ sebagai FROM yang lebih dulu!
27
Ada banyak logika lookahead dalam bahasa Inggris: /
Michael K
15
@Digger - itu karena desain: mereka tidak bisa mendukung intellisense di bagian pilih jika pilih datang lebih dulu.
Scott Whitlock
6
@Digger: LINQ mengikuti OO / Object.Method atau Object.Property modern. Jangan lupa SQL sudah ada selama 40 tahun
gbn
7
Seharusnya saya memposting pertanyaan ini di english.stackexchange.com :)
Cyril Gandon
37

Karena SELECT diperlukan dalam pernyataan pilih dan FROM tidak.

Select 'This String'

Tentu saja pernyataan sql Anda dapat diuraikan untuk mencari SELECT, DELETE, UPDATE setelah FROM, tetapi apakah ini benar-benar masalah besar?

Ingat, ini semua dilakukan sebelum Intellisense. Itu tidak rumit.

Sunting: Mungkin tidak ada alasan penerjemah sql tidak dapat dibangun untuk melakukan keduanya.

JeffO
sumber
2
Padahal, Anda juga bisa menulis FROM myTable;alih-alih FROM myTable SELECT *; Ini hanya tampak seperti persyaratan karena memang sudah biasa.
user606723
13
Hanya karena itu diperlukan bukan berarti itu harus didahulukan.
LarsTech
8
Dalam ANSI SQL FROMdiperlukan. Inilah sebabnya mengapa banyak RDBMS memiliki tabel yang disebut DUAL atau tabel dummy baris tunggal lainnya
Martin Smith
@ LarsTech - tidak harus didahulukan, tetapi mengapa membuatnya rumit. Itu disebut pernyataan pilih, mulai saja dengan kata pilih.
JeffO
3
@ Jeffoff: Oke. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek
10

Tidak tahu jawaban yang bisa saya cadangkan dengan referensi, tetapi jika saya harus berspekulasi: SQL adalah bahasa deklaratif , pernyataan bahasa tersebut menggambarkan apa yang ingin Anda lakukan sebagai lawan dari bagaimana Anda ingin melakukannya.

Dengan demikian, "SELECT X FROM Y" terdengar sebagai cara yang lebih tepat untuk menjawab "Apa yang ingin saya pilih dari basis data", yang bertentangan dengan penulisan "FROM Y SELECT X".

Selain itu, dalam SQL, SELECT / UPDATE / INSERT menentukan jenis operasi yang akan Anda lakukan dan FROM hanyalah klausa yang membantu Anda memilih dari tabel di database. Sekali lagi, apa yang Anda lakukan dengan data lebih diutamakan dari seberapa tepatnya Anda akan mencapainya.

0x4B1D
sumber
1
+1: Ini bukan keharusan atau prosedural. Urutan klausa hanya cocok dengan bahasa Inggris. Tidak ada lagi.
S.Lott
ON dan WHERE mungkin merupakan contoh yang lebih baik tentang pentingnya urutan klausa dalam pernyataan pilihan.
JeffO
5

SQL adalah bahasa permintaan terstruktur yang ditargetkan untuk penutur bahasa Inggris. SELECT, INSERT, UPDATE, dan DELETE adalah perintah penting. Dalam bahasa Inggris perintah imperatif memulai kalimat atau pernyataan. Membandingkan:

West young man go!

untuk

Go west young man!

SQL mengikuti format kedua (imperatif). Juga empat perintah imperatif memiliki tiga format yang sangat berbeda. Mempertimbangkan:

FROM    employees a,
        accounts b
UPDATE  ...

atau

INTO    customers a
SELECT  ...

Jika Anda tahu tindakan yang Anda lakukan, lebih mudah untuk memilih format yang benar.

Dalam hal pilih, Anda menentukan atribut mana yang Anda inginkan, lalu menambahkan tabel yang memilikinya. Saat Anda membangun kriteria pemilihan, Anda dapat menambahkan tabel tambahan. Saat Anda menambahkan kriteria secara dinamis, biasanya dapat dilakukan di akhir bagian statis dari kueri.

BillThor
sumber
7
Jadi Yoda tidak terlibat dalam pengembangan SQL.
adam f
Menarik bahwa Anda membuka UPDATE. UPDATE ... FROMbukan struktur seperti bahasa Inggris, IMO. Bukannya aku punya saran yang lebih baik ...
Robert Brown
Maksudnya adalah untuk menunjukkan bahwa preposisi harus sesuai dengan kata kerja.
BillThor
3

Pernyataan SQL dimulai dengan kata kerja. Itu adalah pilihan para perancang bahasa, dan banyak bahasa pemrograman bekerja seperti itu. Secara semantik, tidak jarang melihat bahasa pemrograman yang bekerja seperti ini:

verb(noun, noun, noun);

Juga, dalam kasus pernyataan SELECT yang Anda berikan sebagai contoh, sintaks yang Anda usulkan akan menempatkan objek pertama dalam pernyataan. Alih-alih urutan kalimat VSO (kata kerja, objek, objek), Anda akan memiliki OVS, yang akan menjadi sangat aneh bila dibandingkan dengan bahasa alami. SVO (mis. Bahasa Inggris), VSO (mis. Bahasa Arab), dan SOV (mis. Bahasa Latin) adalah pendekatan yang lebih masuk akal dari pembicaraan manusia.

David Cloutman
sumber
2

Saya pikir itu akan menyulitkan penguraian, terutama dengan subqueries, misalnya

  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

Mem-parsing ini akan lebih rumit. Anda tidak bisa mengatakan bahwa UPDATE adalah kesalahan sintaksis sampai Anda telah mem-parsing klausa FROM, dan parser harus mengingat konteks yang cukup untuk mengetahui bahwa ia mem-parsing subquery. Saya kira pembaruan tidak diperbolehkan di subquery, tetapi jika itu (mungkin dengan klausa PENGEMBALIAN) maka Anda mungkin tidak dapat mengatakan bahwa ini tidak valid sampai Anda telah menguraikan pernyataan SELECT.

Setidaknya ini akan meningkatkan k (lookahead) untuk tata bahasa dan paling buruk membuatnya menjadi konteks yang sensitif, meskipun ini memperluas batas makalah desain kompiler saya yang agak samar-samar diingat dari universitas.

ConcernedOfTunbridgeWells
sumber
Melihat artikel Wiki untuk QUELyang dikembangkan sekitar waktu yang sama urutan klausa sintaksis adalah apa yang disarankan OP.
Martin Smith