Perché il Select prima del From in una query SQL? [chiuso]


67

Questo è qualcosa che mi ha infastidito molto a scuola.

Cinque anni fa, quando ho imparato l'SQL, mi sono sempre chiesto perché prima specifichiamo i campi che vogliamo e poi da dove li vogliamo.

Secondo la mia idea, dovremmo scrivere:

From Employee e
Select e.Name

Quindi perché la norma dice quanto segue?

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

Mi ci sono volute settimane per capire SQL, e so che molto di quel tempo è stato consumato dall'ordine sbagliato degli elementi.

È come scrivere in C #:

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

Quindi, presumo che abbia una ragione storica. Perché?


64
È una cospirazione DBA mantenere le scimmie OO al loro posto.
gbn

3
Sfortunatamente, non trovo alcuna informazione rilevante nel documento che ha introdotto SEQUEL e non credo che ci siano citazioni specifiche che rispondano alla tua domanda. La risposta di Gnat è forse la migliore spiegazione, ma non respingerei la teoria della cospirazione.
yannis,

2
Personalmente, ho sempre desiderato Linqnon poter usare la SQLsintassi standardizzata .
jp2code,

4
Le clausole in un'istruzione SELECT non sono all'ordine dell'operazione.
S. Lott,

8
Bella domanda Il prossimo dovrebbe essere il motivo per cui le query INSERT e UPDATE hanno dovuto utilizzare diversi modelli di sintassi: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech,

Risposte:


86

Originariamente il linguaggio SQL era chiamato SEQUEL che significa

  • Linguaggio di query inglese strutturato
    con enfasi sull'inglese , supponendo che sia vicino nell'ortografia al linguaggio naturale .

Ora sillaba queste due affermazioni mentre scrivi le frasi in inglese:

  1. "Dalla tabella Employee e Seleziona colonna e.Name"
  2. "Seleziona colonna e.Name dalla tabella Employee e"

Il secondo suona più vicino alla lingua inglese naturale, ecco perché è impostato come norma.

BTW stesso ragionamento va su Whereecc. - Le istruzioni SQL sono state progettate intenzionalmente per suonare vicino al linguaggio naturale.


7
Ovviamente Microsoft lo ha ignorato con LINQ poiché il FROM viene prima di tutto!

27
C'è molta logica lookahead in inglese: /
Michael K il

15
@Digger - questo era di progettazione: non potevano supportare intellisense nella parte selezionata se la selezione veniva prima.
Scott Whitlock,

6
@Digger: LINQ segue l'OO / moderno Object.Method o Object.Property. Non dimenticare che SQL esiste da 40 anni
gbn il

7
Avrei dovuto pubblicare questa domanda su english.stackexchange.com invece :)
Cyril Gandon il

37

Perché SELECT è richiesto in un'istruzione select e FROM non lo è.

Select 'This String'

Naturalmente la tua istruzione sql può essere analizzata per cercare SELECT, DELETE, UPDATE dopo il FROM, ma è davvero un grosso problema?

Ricorda, questo è stato fatto prima dell'intellisense. Non è così complicato.

Modifica: Probabilmente non c'è motivo per cui gli interpreti sql non possano essere costruiti per fare entrambe le cose.


2
Tuttavia, potresti anche scrivere FROM myTable;invece di FROM myTable SELECT *; Questo sembra solo un requisito perché è quello a cui eri abituato.
user606723

13
Solo perché è necessario non significa che debba venire prima.
LarsTech,

8
In ANSI SQL FROMè richiesto. Questo è il motivo per cui molti RDBMS hanno una tabella chiamata DUAL o altra tabella fittizia a riga singola
Martin Smith

@LarsTech - non deve venire prima, ma perché renderlo complicato. Si chiama un'istruzione select, basta iniziare con la parola select.
JeffO,

3
@JeffO: Ok. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek,

10

Non conosco una risposta di cui potrei fare il backup con riferimenti, ma se dovessi speculare: SQL è un linguaggio dichiarativo , una dichiarazione di tale linguaggio descrive ciò che vorresti fare al contrario di come vorresti farlo.

Pertanto, "SELEZIONA X DA Y" suona come un modo più appropriato di rispondere "Cosa mi piacerebbe selezionare dal database", anziché scrivere "DA Y SELEZIONARE X".

Inoltre, in SQL, SELECT / UPDATE / INSERT specifica il tipo di operazione che si sta per eseguire e FROM è solo una clausola che consente di selezionare dalla tabella corretta nel database. Ancora una volta, cosa stai facendo con i dati ha la precedenza su come esattamente ci riuscirai.


1
+1: non è imperativo o procedurale. L'ordine delle clausole è semplicemente in linea con l'inglese. Niente di più.
S. Lott,

ON e WHERE possono essere esempi migliori dell'importanza dell'ordine delle clausole in un'istruzione selezionata.
JeffO,

5

SQL è un linguaggio di query strutturato indirizzato a persone di lingua inglese. SELECT, INSERT, UPDATE e DELETE sono comandi imperativi. In inglese i comandi imperativi iniziano la frase o la frase. Confrontare:

West young man go!

per

Go west young man!

SQL segue il secondo formato (imperativo). Anche i quattro comandi imperativi hanno tre formati significativamente diversi. Tener conto di:

FROM    employees a,
        accounts b
UPDATE  ...

o

INTO    customers a
SELECT  ...

Se conosci l'azione che stai intraprendendo, è più facile selezionare il formato corretto.

Nel caso di select, determini quali attributi desideri, quindi aggiungi le tabelle che li hanno. Man mano che crei i criteri di selezione, puoi aggiungere altre tabelle. Quando si aggiungono dinamicamente criteri, di solito può essere eseguito alla fine di una parte statica della query.


7
Quindi Yoda non è stato coinvolto nello sviluppo di SQL.
Adamo f

Interessante che porti UPDATE. UPDATE ... FROMnon è una struttura inglese, IMO. Non che io abbia qualche suggerimento migliore ...
Robert Brown,

L'intento era di sottolineare che la preposizione deve corrispondere al verbo.
BillThor,

3

Le istruzioni SQL iniziano con i verbi. Questa è stata la scelta dei progettisti del linguaggio e molti linguaggi di programmazione funzionano in questo modo. Semanticamente, non è raro vedere linguaggi di programmazione che funzionano così:

verb(noun, noun, noun);

Inoltre, nel caso dell'istruzione SELECT fornita come esempio, la sintassi proposta inserisce l'oggetto per primo nell'istruzione. Invece di un ordine di frase VSO (verbo, soggetto, oggetto), avresti OVS, che sarebbe molto strano rispetto ai linguaggi naturali. SVO (ad esempio inglese), VSO (ad esempio arabo) e SOV (ad esempio latino) sono approssimazioni più ragionevoli del linguaggio umano.


2

Penso che complicherebbe significativamente l'analisi, specialmente con le subquery, ad es

  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

Analizzare questo sarebbe più complicato. Non si poteva dire che UPDATE era un errore di sintassi fino a quando non si era analizzata la clausola FROM e il parser avrebbe dovuto ricordare un contesto sufficiente per sapere che stava analizzando una sottoquery. Non credo che gli aggiornamenti siano consentiti nelle sottoquery, ma se lo fossero (forse con una clausola RETURNING), potresti non essere in grado di dire che questo non è valido fino a quando non hai analizzato l'istruzione SELECT.

Ciò aumenterebbe almeno k (lookahead) per la grammatica e nella peggiore delle ipotesi la renderebbe sensibile al contesto, anche se questo sta allungando i limiti dei miei documenti di progettazione di compilatori piuttosto vagamente ricordati dall'università.


Guardando l'articolo Wiki per QUELquesto è stato sviluppato all'incirca nello stesso momento in cui l'ordine delle clausole di sintassi è ciò che l'OP suggerisce.
Martin Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.