เหตุใดจึงเลือกก่อนหน้าจากในแบบสอบถาม 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 ที่จะรักษาลิง OO ไว้ในที่ของมัน
GBN

3
น่าเสียดายที่ฉันไม่สามารถหาข้อมูลที่เกี่ยวข้องในกระดาษที่แนะนำ SEQUELและฉันไม่คิดว่ามีการอ้างอิงเฉพาะที่ตอบคำถามของคุณ คำตอบของริ้นอาจเป็นคำอธิบายที่ดีที่สุด - แต่ฉันจะไม่ละทิ้งทฤษฎีสมคบคิด
yannis

2
โดยส่วนตัวฉันต้องการเสมอLinqไม่สามารถใช้SQLไวยากรณ์มาตรฐาน
jp2code

4
ส่วนคำสั่งในคำสั่ง SELECT ไม่ใช่ลำดับของการดำเนินการ
S.Lott

8
เป็นคำถามที่ดี คุณควรจะเป็นคนถัดไปว่าทำไมแบบสอบถาม INSERT และ UPDATE จึงต้องใช้รูปแบบไวยากรณ์ที่แตกต่างกัน: (field1, field2) ค่า (f1, f2) vs (field1 = f1, field2 = f2)
LarsTech

คำตอบ:


86

แต่เดิมภาษา SQL ถูกเรียกว่าสืบเนื่องยืน

  • โครงสร้างภาษาอังกฤษของแบบสอบถาม
    โดยเน้นที่ภาษาอังกฤษโดยสันนิษฐานว่าใกล้เคียงกับการสะกดในภาษาธรรมชาติ

ตอนนี้สะกดสองข้อความนี้ตามที่คุณสะกดประโยคภาษาอังกฤษ:

  1. "จากตารางพนักงาน e เลือกคอลัมน์ e.Name"
  2. "เลือกคอลัมน์ e.Name จากตารางพนักงาน e"

เสียงที่สองฟังดูใกล้เคียงกับภาษาอังกฤษตามธรรมชาตินั่นคือเหตุผลว่าทำไมมันจึงถูกกำหนดให้เป็นบรรทัดฐาน

การใช้เหตุผลเดียวกันของ BTW ไปที่Whereเป็นต้น - คำสั่ง SQL ได้รับการออกแบบโดยเจตนาให้เสียงใกล้เคียงกับภาษาธรรมชาติ


7
แน่นอนว่า Microsoft เพิกเฉยต่อการใช้ LINQ เนื่องจาก FROM มาก่อน!

27
มีตรรกะ lookahead มากมายในภาษาอังกฤษ: /
Michael K

15
@Digger - นั่นคือจากการออกแบบ: พวกเขาไม่สามารถรองรับการใช้งาน Intellisense ในส่วนที่เลือกได้หากการเลือกมาก่อน
Scott Whitlock

6
@Digger: LINQ ตามด้วย OO / modern Object.Method หรือ Object.Property อย่าลืม SQL ได้รับรอบ 40 ปี
GBN

7
ฉันควรจะโพสต์คำถามนี้ไว้บนenglish.stackexchange.comแทน :)
Cyril Gandon

37

เนื่องจาก SELECT จำเป็นต้องมีในคำสั่ง select และ FROM ไม่ใช่

Select 'This String'

แน่นอนว่าคำสั่ง sql ของคุณสามารถวิเคราะห์คำเพื่อเลือก SELECT, DELETE, UPDATE หลังจาก FROM ได้ แต่จริง ๆ แล้วเป็นเรื่องใหญ่หรือไม่?

โปรดจำไว้ว่าสิ่งนี้กระทำก่อนที่จะถึงเวลา Intellisense มันไม่ซับซ้อนเลย

แก้ไข: อาจไม่มีเหตุผลที่ล่าม sql ไม่สามารถสร้างขึ้นเพื่อทำทั้งสองอย่าง


2
แม้ว่าคุณสามารถเขียนFROM myTable;แทนFROM myTable SELECT *; ดูเหมือนว่าเป็นข้อกำหนดเท่านั้นเพราะเป็นสิ่งที่คุณคุ้นเคย
user606723

13
เพียงเพราะมันไม่จำเป็นต้องหมายความว่ามันจะต้องมาก่อน
LarsTech

8
ใน ANSI SQL FROMจำเป็นต้องมี นี่คือเหตุผลที่ RDBMS จำนวนมากมีตารางที่เรียกว่าDUAL หรือตารางจำลองแถวเดี่ยวอื่น ๆ
Martin Smith

@ LarsTech - ไม่ต้องมาก่อน แต่ทำไมทำให้มันซับซ้อน มันเรียกว่าคำสั่งที่เลือกเพียงแค่เริ่มต้นด้วยคำที่เลือก
JeffO

3
@JeffO: โอเค SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek

10

ไม่ทราบคำตอบที่ฉันสามารถสำรองโดยอ้างอิง แต่ถ้าฉันต้องคาดเดา: SQL เป็นภาษาที่ประกาศคำสั่งของภาษาดังกล่าวอธิบายสิ่งที่คุณต้องการจะทำเมื่อเทียบกับวิธีที่คุณต้องการจะทำ

ดังนั้น "SELECT X FROM Y" จึงเป็นวิธีตอบรับที่เหมาะสมกว่า "ฉันต้องการเลือกอะไรจากฐานข้อมูล" ซึ่งต่างจากการเขียน "FROM 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
ดังนั้นโยดาไม่ได้มีส่วนร่วมในการพัฒนา 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 และ parser จะต้องจำบริบทเพียงพอที่จะรู้ว่ามันเป็นการแยกวิเคราะห์คำถาม ฉันไม่คิดว่าการอัปเดตนั้นอนุญาตให้ใช้กับเคียวรีย่อยได้ แต่ถ้าพวกเขา (อาจมีประโยคส่งคืน) ดังนั้นคุณอาจไม่สามารถบอกได้ว่านี่ไม่ถูกต้องจนกว่าคุณจะวิเคราะห์คำสั่ง SELECT

อย่างน้อยก็จะเพิ่ม k (lookahead) สำหรับไวยากรณ์และที่เลวร้ายที่สุดทำให้บริบทนั้นอ่อนไหวแม้ว่าสิ่งนี้จะขยายขอบเขตของเอกสารการออกแบบคอมไพเลอร์ที่ผมจำได้ค่อนข้างจำเจจากมหาวิทยาลัย


ดูบทความวิกิพีเดียสำหรับQUELที่ได้รับการพัฒนาในเวลาเดียวกันคำสั่งของไวยากรณ์คือสิ่งที่ OP แนะนำ
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.