Tại sao Chọn trước từ trong truy vấn SQL? [đóng cửa]


67

Đây là điều làm tôi bận tâm rất nhiều ở trường.

Năm năm trước, khi tôi học SQL, tôi luôn tự hỏi tại sao trước tiên chúng tôi chỉ định các lĩnh vực chúng tôi muốn và sau đó chúng tôi muốn chúng từ đâu.

Theo ý tưởng của tôi, chúng ta nên viết:

From Employee e
Select e.Name

Vậy tại sao định mức lại nói như sau?

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

Tôi đã mất nhiều tuần để hiểu SQL và tôi biết rằng rất nhiều thời gian đó đã bị sử dụng sai thứ tự các yếu tố.

Nó giống như viết bằng C #:

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

Vì vậy, tôi cho rằng nó có một lý do lịch sử. Tại sao?


64
Đó là một âm mưu của DBA để giữ những con khỉ OO ở vị trí của chúng.
gbn

3
Thật không may, tôi không thể tìm thấy bất kỳ thông tin liên quan nào trong bài viết giới thiệu SEQUEL và tôi không nghĩ có những trích dẫn cụ thể trả lời câu hỏi của bạn. Câu trả lời của gnat có thể là lời giải thích tốt nhất mặc dù - nhưng tôi sẽ không bác bỏ thuyết âm mưu.
yannis

2
Cá nhân, tôi luôn mong muốn Linqkhông thể sử dụng SQLcú pháp được tiêu chuẩn hóa .
jp2code

4
Các mệnh đề trong câu lệnh SELECT không phải là thứ tự của thao tác.
S.Lott

8
Câu hỏi hay. Bạn là người tiếp theo nên là lý do tại sao các truy vấn INSERT và UPDATE phải sử dụng các mô hình cú pháp khác nhau: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Câu trả lời:


86

Nguyên ngôn ngữ SQL được gọi là SEQUEL đứng cho

  • Ngôn ngữ truy vấn tiếng Anh có cấu trúc
    với sự nhấn mạnh vào tiếng Anh , giả sử nó gần với chính tả của ngôn ngữ tự nhiên .

Bây giờ, đánh vần hai câu này khi bạn đánh vần các câu tiếng Anh:

  1. "Từ bảng Nhân viên e Chọn cột e.Name"
  2. "Chọn cột e.Name Từ bảng nhân viên e"

Âm thanh thứ hai gần với ngôn ngữ tiếng Anh tự nhiên, đó là lý do tại sao nó được đặt làm chuẩn.

Lý do tương tự BTW đi đến Wherevv - Các câu lệnh SQL được thiết kế có chủ ý để nghe gần với ngôn ngữ tự nhiên.


7
Tất nhiên Microsoft đã bỏ qua điều đó với LINQ khi TỪ đến trước!

27
Có rất nhiều logic nhìn bằng tiếng Anh: /
Michael K

15
@ Trình kích hoạt - đó là theo thiết kế: họ không thể hỗ trợ intellisense trong phần chọn nếu phần chọn xuất hiện trước.
Scott Whitlock

6
@ Trình kích hoạt: LINQ tuân theo OO / Modern.Method hoặc Object.Property. Đừng quên SQL đã tồn tại được 40 năm
gbn

7
Thay vào đó tôi nên đăng câu hỏi này lên tiếng Anh.stackexchange.com :)
Cyril Gandon

37

Bởi vì CHỌN được yêu cầu trong một câu lệnh chọn và TỪ thì không.

Select 'This String'

Tất nhiên câu lệnh sql của bạn có thể được phân tích cú pháp để tìm CHỌN, XÓA, CẬP NHẬT sau TỪ, nhưng nó có thực sự là vấn đề lớn không?

Hãy nhớ rằng, tất cả điều này đã được thực hiện trước khi intellisense. Nó không phức tạp lắm.

Chỉnh sửa: Có lẽ không có lý do gì phiên dịch sql không thể được xây dựng để làm cả hai.


2
Mặc dù, bạn cũng có thể viết FROM myTable;thay vì FROM myTable SELECT *; Điều này chỉ có vẻ như là một yêu cầu bởi vì đó là những gì bạn đã từng sử dụng.
dùng606723

13
Chỉ vì nó được yêu cầu không có nghĩa là nó phải đến trước.
LarsTech

8
Trong ANSI SQL FROMlà bắt buộc. Đây là lý do tại sao nhiều RDBMS có một bảng được gọi DUAL hoặc bảng giả hàng đơn khác
Martin Smith

@LarsTech - nó không phải đến trước, nhưng tại sao làm cho nó phức tạp. Nó được gọi là câu lệnh select, chỉ cần bắt đầu với từ select.
JeffO

3
@JeffO: Được rồi. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek

10

Không biết câu trả lời mà tôi có thể sao lưu bằng các tài liệu tham khảo, nhưng nếu tôi phải suy đoán: SQL là ngôn ngữ khai báo , một tuyên bố của ngôn ngữ đó mô tả những gì bạn muốn làm trái ngược với cách bạn muốn làm.

Như vậy, "CHỌN X TỪ Y" nghe có vẻ như là một cách trả lời thích hợp hơn "Tôi muốn chọn gì từ cơ sở dữ liệu", trái ngược với cách viết "TỪ Y CHỌN X".

Ngoài ra, trong SQL, CHỌN / CẬP NHẬT / INSERT chỉ định loại hoạt động bạn sắp thực hiện và TỪ chỉ là một mệnh đề giúp bạn chọn từ bảng bên phải trong cơ sở dữ liệu. Một lần nữa, những gì bạn đang làm với dữ liệu được ưu tiên hơn như thế nào chính xác bạn đang đi để đạt được điều đó.


1
+1: Nó không bắt buộc hoặc thủ tục. Thứ tự của các mệnh đề chỉ đơn thuần là phù hợp với tiếng Anh. Chỉ có bấy nhiêu thôi.
S.Lott

ON và WHERE có thể là ví dụ tốt hơn về tầm quan trọng của thứ tự các mệnh đề trong một câu lệnh chọn.
JeffO

5

SQL là một ngôn ngữ truy vấn có cấu trúc được nhắm mục tiêu cho người nói tiếng Anh. CHỌN, XÁC NHẬN, CẬP NHẬT và XÓA là các lệnh bắt buộc. Trong tiếng Anh mệnh lệnh bắt đầu câu hoặc câu. So sánh:

West young man go!

đến

Go west young man!

SQL tuân theo định dạng thứ hai (bắt buộc). Ngoài ra bốn lệnh bắt buộc có ba định dạng khác nhau đáng kể. Xem xét:

FROM    employees a,
        accounts b
UPDATE  ...

hoặc là

INTO    customers a
SELECT  ...

Nếu bạn biết hành động bạn đang thực hiện, việc chọn đúng định dạng sẽ dễ dàng hơn.

Trong trường hợp chọn, bạn xác định thuộc tính nào bạn muốn, sau đó thêm các bảng có chúng. Khi bạn xây dựng tiêu chí lựa chọn, bạn có thể thêm các bảng bổ sung. Khi bạn tự động thêm tiêu chí, nó thường có thể được thực hiện ở cuối phần tĩnh của truy vấn.


7
Vì vậy, Yoda không tham gia phát triển SQL.
adam f

Thật thú vị khi bạn đưa lên CẬP NHẬT. UPDATE ... FROMkhông phải là một cấu trúc giống như tiếng Anh, IMO. Không phải là tôi có đề xuất nào tốt hơn ...
Robert Brown

Mục đích là chỉ ra rằng giới từ cần phải phù hợp với động từ.
BillThor

3

Các câu lệnh SQL bắt đầu bằng các động từ. Đó là sự lựa chọn của các nhà thiết kế ngôn ngữ và nhiều ngôn ngữ lập trình hoạt động theo cách đó. Về mặt ngữ nghĩa, không có gì lạ khi thấy các ngôn ngữ lập trình hoạt động như thế này:

verb(noun, noun, noun);

Ngoài ra, trong trường hợp câu lệnh CHỌN mà bạn đưa ra làm ví dụ, cú pháp được đề xuất của bạn sẽ đặt đối tượng lên đầu tiên trong câu lệnh. Thay vì thứ tự câu VSO (động từ, chủ đề, đối tượng), bạn sẽ có OVS, sẽ rất lạ khi so sánh với các ngôn ngữ tự nhiên. SVO (ví dụ tiếng Anh), VSO (ví dụ tiếng Ả Rập) và SOV (ví dụ tiếng Latin) là những xấp xỉ hợp lý hơn của lời nói của con người.


2

Tôi nghĩ rằng nó sẽ làm phức tạp đáng kể việc phân tích cú pháp, đặc biệt là với các truy vấn con, vd

  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

Phân tích cú pháp này sẽ phức tạp hơn. Bạn không thể nói rằng CẬP NHẬT là lỗi cú pháp cho đến khi bạn đã phân tích mệnh đề TỪ và trình phân tích cú pháp sẽ phải nhớ đủ ngữ cảnh để biết rằng nó đang phân tích cú pháp truy vấn con. Tôi không nghĩ rằng các bản cập nhật được cho phép trong các truy vấn con, nhưng nếu chúng (có thể có mệnh đề RETURNING) thì bạn có thể không thể nói điều này là không hợp lệ cho đến khi bạn đã phân tích cú pháp câu lệnh SELECT.

Điều này ít nhất sẽ làm tăng k (lookahead) cho ngữ pháp và tệ nhất là làm cho nó nhạy cảm với bối cảnh, mặc dù điều này đang kéo dài giới hạn của các bài viết thiết kế trình biên dịch khá nhớ của tôi từ trường đại học.


Nhìn vào bài viết Wiki cho QUELđiều đó đã được phát triển cùng lúc thứ tự các mệnh đề cú pháp là những gì OP gợi ý.
Martin Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.