Perché la selezione prima di Da in una query SQL? [chiuso]

67

Questo è qualcosa che mi ha infastidito molto a scuola.

Cinque anni fa, quando ho imparato SQL, mi sono sempre chiesto perché prima specifichiamo i campi che vogliamo e 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 tempo è stato consumato dall'ordine errato degli elementi.

È come scrivere in C #:

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

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

    
posta Cyril Gandon 30.12.2011 - 14:34
fonte

6 risposte

86

Il linguaggio SQL originariamente era chiamato SEQUEL che sta per

  • Strutturato Inglese linguaggio di query
    con l'enfasi su inglese , supponendo che sia vicino allo spelling della lingua naturale .

Adesso scrivi queste due affermazioni mentre pronunci le frasi inglesi:

  1. "Dalla tabella dei dipendenti e Seleziona la colonna e.Nome"
  2. "Seleziona colonna e.Nome dalla tabella dei dipendenti e"

Secondo suono più vicino alla naturale lingua inglese, ecco perché è impostato come norma.

BTW stesso ragionamento va a Where etc - Le istruzioni SQL sono state intenzionalmente progettate per suonare vicino al linguaggio naturale.

    
risposta data 30.12.2011 - 14:43
fonte
37

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

Select 'This String'

Ovviamente 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'intelligence. Non è così complicato.

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

    
risposta data 30.12.2011 - 15:34
fonte
10

Non so una risposta che potrei fare per riferimenti, ma se dovessi speculare: SQL è una lingua dichiarativa , una dichiarazione di tale linguaggio descrive che vorresti fare a differenza di come ti piacerebbe farlo.

Come tale, "SELEZIONA X DA Y" suona come un modo più appropriato di rispondere "Cosa mi piacerebbe selezionare dal database", invece di scrivere "FROM Y SELECT X".

Inoltre, in SQL, SELECT / UPDATE / INSERT specifica il tipo di operazione che stai per fare e FROM è solo una clausola che ti aiuta a selezionare dalla tabella giusta nel database. Anche in questo caso, cosa stai facendo con i dati ha la precedenza su come esattamente lo raggiungerai.

    
risposta data 30.12.2011 - 14:47
fonte
5

SQL è un linguaggio di query strutturato indirizzato agli utenti di lingua inglese. SELECT, INSERT, UPDATE e DELETE sono comandi imperativi. In inglese i comandi imperativi iniziano la frase o l'istruzione. Confronto:

West young man go!

a

Go west young man!

SQL segue il secondo formato (imperativo). Anche i quattro comandi imperativi hanno tre formati significativamente diversi. Prendere in considerazione:

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, si determinano gli attributi che si desidera, quindi si aggiungono le tabelle che li hanno. Mentre si creano i criteri di selezione, è possibile aggiungere tabelle aggiuntive. Quando si aggiungono dinamicamente i criteri, di solito può essere fatto alla fine di una porzione statica della query.

    
risposta data 01.01.2012 - 07:38
fonte
3

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

verb(noun, noun, noun);

Inoltre, nel caso dell'istruzione SELECT fornita a titolo di esempio, la sintassi proposta posiziona l'oggetto prima nell'istruzione. Invece di un ordine di frase VSO (verbo, soggetto, oggetto), avresti OVS, il che sarebbe molto strano se confrontato con le lingue naturali. SVO (ad esempio inglese), VSO (ad esempio arabo) e SOV (ad esempio latino) sono approssimazioni più ragionevoli del linguaggio umano.

    
risposta data 21.03.2012 - 10:10
fonte
2

Penso che complicherebbe in modo significativo l'analisi, specialmente con le sottoquery, 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

L'analisi di questo sarebbe più complicata. Non si poteva dire che l'UPDATE fosse un errore di sintassi fino a quando non si fosse analizzata la clausola FROM e il parser avrebbe dovuto ricordare un contesto sufficiente per sapere che stava analizzando una sottoquery. Non penso che gli aggiornamenti siano comunque ammissibili nelle sottoquery, ma se lo fossero (magari con una clausola RETURNING), potreste non essere in grado di dire che questo non era valido finché non avete analizzato l'istruzione SELECT.

Ciò dovrebbe almeno aumentare k (lookahead) per la grammatica e, nel peggiore dei casi, renderlo sensibile al contesto, anche se questo sta estendendo i confini dei miei documenti di compilatore piuttosto vagamente ricordati dall'università.

    
risposta data 30.12.2011 - 19:12
fonte

Leggi altre domande sui tag