Dlaczego w zapytaniu SQL wybrano opcję Select before the From? [Zamknięte]

67

To mnie bardzo martwiło w szkole.

Pięć lat temu, kiedy nauczyłem się języka SQL, zawsze zastanawiałem się, dlaczego najpierw określamy pola, które chcemy, a następnie skąd je chcemy.

Zgodnie z moim pomysłem powinniśmy napisać:

From Employee e
Select e.Name

Dlaczego więc norma mówi, co następuje?

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

Zrozumienie SQL zajęło mi kilka tygodni i wiem, że dużo czasu pochłonęła niewłaściwa kolejność elementów.

To jest jak pisanie w C #:

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

Zakładam więc, że ma to powód historyczny. Dlaczego?

Cyril Gandon
źródło
64
Spisek DBA polega na utrzymywaniu małp OO na ich miejscu.
gbn
3
Niestety nie mogę znaleźć żadnych istotnych informacji w artykule, który wprowadził SEQUEL , i nie sądzę, że istnieją konkretne cytaty, które odpowiedzą na twoje pytanie. Odpowiedź komara jest jednak prawdopodobnie najlepszym wytłumaczeniem - ale nie odrzuciłbym teorii spiskowej.
yannis
2
Osobiście zawsze żałowałem, Linqże nie mogłem użyć standardowej SQLskładni.
jp2code
4
Klauzule w instrukcji SELECT nie są kolejnością operacji.
S.Lott,
8
Miłe pytanie. Następnym powinno być, dlaczego zapytania INSERT i UPDATE musiały używać różnych modeli składni: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Odpowiedzi:

86

Początkowo język SQL nazwano SEQUEL stojący na

  • Structured English Query Language
    z naciskiem na angielski , zakładając, że jest on zbliżony do pisowni języka naturalnego .

Teraz przeliteruj te dwa stwierdzenia, tak jakbyś pisał angielskie zdania:

  1. „Z tabeli pracowników e Wybierz kolumnę e.Name”
  2. „Wybierz kolumnę e.Name z tabeli pracowników e”

Drugi brzmi bliżej naturalnego języka angielskiego, dlatego jest ustawiony jako norma.

BTW to samo rozumowanie dotyczy Whereitd. - Instrukcje SQL zostały celowo zaprojektowane tak, aby brzmiały zbliżone do języka naturalnego.

komar
źródło
7
Oczywiście Microsoft zignorował to z LINQ, ponieważ FROM jest na pierwszym miejscu!
27
W języku angielskim jest dużo logiki lookahead: /
Michael K
15
@Digger - tak było już zaprojektowane: nie mogliby obsługiwać inteligencji w wybranej części, gdyby wybrana była pierwsza.
Scott Whitlock,
6
@Digger: LINQ podąża za OO / modern Object.Method lub Object.Property. Nie zapomnij SQL zostało około 40 lat
gbn
7
Powinienem zamiast tego opublikować to pytanie na polish.stackexchange.com :)
Cyril Gandon
37

Ponieważ SELECT jest wymagany w instrukcji select, a FROM nie.

Select 'This String'

Oczywiście twoja instrukcja sql może zostać przeanalizowana w celu wyszukania instrukcji SELECT, DELETE, UPDATE po FROM, ale czy to naprawdę tak wielka sprawa?

Pamiętaj, że wszystko to zostało zrobione przed intellisense. To nie jest takie skomplikowane.

Edycja: Prawdopodobnie nie ma powodu, dla którego nie można było zbudować interpreterów języka SQL do wykonywania obu tych czynności.

JeffO
źródło
2
Chociaż możesz także pisać FROM myTable;zamiast FROM myTable SELECT *; Wydaje się to jedynie wymogiem, ponieważ jest to to, do czego przywykłeś.
user606723,
13
To, że jest wymagane, nie oznacza, że ​​musi być na pierwszym miejscu.
LarsTech,
8
W ANSI SQL FROMjest wymagany. To dlatego wielu RDBMSs mieć tabeli o nazwie DUAL lub inny jednorzędowe manekin stół
Martin Smith
@LarsTech - nie musi być pierwszy, ale po co komplikować. Nazywa się to instrukcją select, po prostu zacznij od słowa select.
JeffO
3
@JeffO: OK. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek
10

Nie znam odpowiedzi, którą mógłbym poprzeć referencjami, ale gdybym musiał spekulować: SQL jest językiem deklaratywnym , instrukcja takiego języka opisuje to , co chciałbyś zrobić, a nie sposób , w jaki chcesz to zrobić.

Jako taki, „WYBIERZ X Z Y” brzmi jako bardziej odpowiedni sposób odpowiedzi na „Co chciałbym wybrać z bazy danych”, w przeciwieństwie do pisania „Z Y SELECT X”.

Ponadto w języku SQL instrukcja SELECT / UPDATE / INSERT określa typ operacji, którą zamierzasz wykonać, a FROM jest tylko klauzulą, która pomaga wybrać odpowiednią tabelę w bazie danych. Ponownie, to , co robisz z danymi, ma pierwszeństwo przed tym , jak dokładnie to osiągniesz.

0x4B1D
źródło
1
+1: To nie jest konieczne ani proceduralne. Kolejność klauzul jest jedynie zgodna z angielskim. Nic więcej.
S.Lott,
ON i WHERE mogą być lepszymi przykładami znaczenia kolejności klauzul w instrukcji select.
JeffO
5

SQL jest strukturalnym językiem zapytań skierowanym do osób posługujących się językiem angielskim. WYBIERZ, WSTAW, AKTUALIZUJ i USUŃ są poleceniami rozkazującymi. W języku angielskim polecenia rozkazujące rozpoczynają zdanie lub wyrażenie. Porównać:

West young man go!

do

Go west young man!

SQL jest zgodny z drugim (imperatywnym) formatem. Również cztery polecenia rozkazowe mają trzy znacząco różne formaty. Rozważać:

FROM    employees a,
        accounts b
UPDATE  ...

lub

INTO    customers a
SELECT  ...

Jeśli znasz podejmowane działanie, łatwiej wybrać odpowiedni format.

W przypadku select określasz, które atrybuty chcesz, a następnie dodajesz tabele, które je mają. Podczas budowania kryteriów wyboru możesz dodawać dodatkowe tabele. W przypadku dynamicznego dodawania kryteriów zwykle można to zrobić na końcu statycznej części zapytania.

BillThor
źródło
7
Więc Yoda nie był zaangażowany w tworzenie SQL.
adam f
Ciekawe, że przywołujesz UPDATE. UPDATE ... FROMIMO nie jest strukturą podobną do angielskiej. Nie, żebym miał jakieś lepsze sugestie ...
Robert Brown,
Chodziło o to, aby wskazać, że przyimek musi pasować do czasownika.
BillThor
3

Instrukcje SQL zaczynają się od czasowników. To był wybór projektantów języków i tak działa wiele języków programowania. Semantycznie często zdarza się, że języki programowania działają w ten sposób:

verb(noun, noun, noun);

Również w przypadku instrukcji SELECT podanej jako przykład proponowana składnia umieści obiekt na pierwszym miejscu w instrukcji. Zamiast kolejności zdań VSO (czasownik, temat, obiekt) miałbyś OVS, co byłoby bardzo dziwne w porównaniu do języków naturalnych. SVO (np. Angielski), VSO (np. Arabski) i SOV (np. Łaciński) są bardziej rozsądnymi przybliżeniami ludzkiej mowy.

David Cloutman
źródło
2

Myślę, że znacznie skomplikowałoby to parsowanie, szczególnie przy podzapytaniach, np

  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

Analiza tego byłaby bardziej skomplikowana. Nie można było stwierdzić, że AKTUALIZACJA była błędem składni, dopóki nie przeanalizowano klauzuli FROM, a analizator składni musiałby zapamiętać wystarczający kontekst, aby wiedzieć, że analizuje podzapytanie. Nie wydaje mi się, aby aktualizacje były w każdym razie dopuszczalne w podzapytaniach, ale gdyby były (być może z klauzulą ​​RETURNING), możesz nie być w stanie stwierdzić, że było to nieprawidłowe, dopóki nie przeanalizujesz instrukcji SELECT.

Zwiększy to przynajmniej k (gramatycznie) gramatyki, aw najgorszym uczyni ją wrażliwą na kontekst, chociaż przesuwa to granice moich raczej słabo zapamiętanych prac projektowych kompilatorów z uniwersytetu.

ConcernedOfTunbridgeWells
źródło
Patrząc na artykuł Wiki, QUELktóry został opracowany w tym samym czasie, kolejność klauzul składniowych jest tym, co sugeruje OP.
Martin Smith