Por que o Select antes do From em uma consulta SQL? [fechadas]

67

Isso é algo que me incomodou muito na escola.

Há cinco anos, quando aprendi SQL, sempre me perguntei por que primeiro especificamos os campos que queremos e depois de onde os queremos.

De acordo com a minha ideia, devemos escrever:

From Employee e
Select e.Name

Então, por que a norma diz o seguinte?

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

Levei semanas para entender o SQL e sei que muito desse tempo foi consumido pela ordem errada dos elementos.

É como escrever em C #:

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

Então, suponho que tenha uma razão histórica. Por quê?

Cyril Gandon
fonte
64
É uma conspiração do DBA manter os macacos OO em seu lugar.
gbn 30/12
3
Infelizmente, não consigo encontrar nenhuma informação relevante no artigo que introduziu o SEQUEL e não creio que haja citações específicas que respondam à sua pergunta. A resposta do mosquito é possivelmente a melhor explicação - mas eu não descartaria a teoria da conspiração.
usar o seguinte
2
Pessoalmente, sempre desejei Linqnão ter usado a SQLsintaxe padronizada .
jp2code
4
As cláusulas em uma instrução SELECT não estão na ordem da operação.
S.Lott
8
Boa pergunta. O próximo passo deve ser o motivo pelo qual as consultas INSERT e UPDATE precisaram usar diferentes modelos de sintaxe: (campo1, campo2) VALORES (f1, f2) vs (campo1 = f1, campo2 = f2).
LarsTech

Respostas:

86

Originalmente, a linguagem SQL era chamada SEQUEL, representando

  • Idioma de consulta em inglês estruturado
    com ênfase no inglês , supondo que ele seja próximo na ortografia para o idioma natural .

Agora, soletre essas duas instruções da mesma forma que você soletraria frases em inglês:

  1. "Na tabela Funcionário e selecione a coluna e.Name"
  2. "Selecionar coluna e.Nome da tabela Empregado e"

O segundo soa mais próximo do idioma inglês natural, por isso é definido como norma.

Entre o mesmo raciocínio, Whereetc - as instruções SQL foram projetadas intencionalmente para soarem próximas à linguagem natural.

mosquito
fonte
7
É claro que a Microsoft ignorou isso com o LINQ, pois o FROM vem primeiro!
27
Há muita lógica lookahead em inglês: /
Michael K
15
@ Digger - isso foi por design: eles não poderiam suportar o intellisense na parte de seleção se a seleção viesse primeiro.
Scott Whitlock
6
@ Digger: LINQ segue o OO / Object.Method moderno ou Object.Property. Não se esqueça que o SQL existe há 40 anos
gbn
7
Eu deveria ter posto esta pergunta em english.stackexchange.com vez :)
Cyril Gandon
37

Porque SELECT é necessário em uma instrução select e FROM não é.

Select 'This String'

É claro que sua instrução sql pode ser analisada para procurar SELECT, DELETE, UPDATE após o FROM, mas será que isso é realmente importante?

Lembre-se, tudo isso foi feito antes do senso comum. Não é tão complicado.

Edit: Provavelmente não há razão para que os intérpretes sql não possam ser criados para fazer as duas coisas.

JeffO
fonte
2
Porém, você também pode escrever em FROM myTable;vez de FROM myTable SELECT *; Isso só parece um requisito, porque é o que você costumava fazer.
user606723
13
Só porque é necessário, não significa que ele tenha que vir primeiro.
LarsTech
8
No ANSI, o SQL FROMé necessário. É por isso que muitos RDBMSs têm uma tabela chamada DUAL ou outra tabela fictícia de linha única
Martin Smith
@LarsTech - não precisa vir primeiro, mas por que complicar? É chamado de instrução select, basta começar com a palavra selecionar.
Jeffo
3
@ Jeff: Ok. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek
10

Não sei uma resposta que eu poderia fazer backup por referências, mas se eu tivesse que especular: SQL é uma linguagem declarativa , uma declaração dessa linguagem descreve o que você gostaria de fazer, em vez de como gostaria de fazê-lo.

Assim, "SELECT X FROM Y" soa como uma maneira mais apropriada de responder "O que eu gostaria de selecionar no banco de dados", em vez de escrever "FROM Y SELECT X".

Além disso, no SQL, SELECT / UPDATE / INSERT especifica o tipo de operação que você está prestes a executar e FROM é apenas uma cláusula que ajuda a selecionar a tabela correta no banco de dados. Novamente, o que você está fazendo com dados tem precedência sobre como exatamente você vai conseguir isso.

0x4B1D
fonte
11
+1: não é imperativo ou processual. A ordem das cláusulas é meramente adequada ao inglês. Nada mais.
S.Lott
ON e WHERE podem ser melhores exemplos da importância da ordem das cláusulas em uma instrução select.
Jeffo
5

SQL é uma linguagem de consulta estruturada direcionada para falantes de inglês. SELECT, INSERT, UPDATE e DELETE são comandos imperativos. Em inglês, comandos imperativos iniciam a sentença ou declaração. Comparar:

West young man go!

para

Go west young man!

SQL segue o segundo formato (imperativo). Além disso, os quatro comandos imperativos têm três formatos significativamente diferentes. Considerar:

FROM    employees a,
        accounts b
UPDATE  ...

ou

INTO    customers a
SELECT  ...

Se você conhece a ação que está realizando, é mais fácil selecionar o formato correto.

No caso de select, você determina quais atributos deseja e depois adiciona as tabelas que os possuem. Ao criar os critérios de seleção, você pode adicionar tabelas adicionais. Quando você adiciona critérios dinamicamente, geralmente isso pode ser feito no final de uma parte estática da consulta.

BillThor
fonte
7
Portanto, Yoda não estava envolvido no desenvolvimento de SQL.
Adam F
Interessante que você atualize UPDATE. UPDATE ... FROMnão é uma estrutura semelhante ao inglês, IMO. Não que eu tenha sugestões melhores ...
Robert Brown
A intenção era apontar que a preposição precisa corresponder ao verbo.
BillThor
3

As instruções SQL começam com verbos. Essa foi a escolha dos designers de linguagem, e muitas linguagens de programação funcionam dessa maneira. Semanticamente, não é incomum ver linguagens de programação que funcionam assim:

verb(noun, noun, noun);

Além disso, no caso da instrução SELECT que você fornece como exemplo, sua sintaxe proposta colocaria o objeto em primeiro lugar na instrução. Em vez de uma ordem de sentença VSO (verbo, assunto, objeto), você teria OVS, o que seria muito estranho quando comparado às linguagens naturais. SVO (por exemplo, inglês), VSO (por exemplo, árabe) e SOV (por exemplo, latim) são aproximações mais razoáveis ​​da fala humana.

David Cloutman
fonte
2

Eu acho que isso complicaria significativamente a análise, especialmente com subconsultas, por exemplo

  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

Analisar isso seria mais complicado. Você não poderia dizer que o UPDATE era um erro de sintaxe até ter analisado a cláusula FROM, e o analisador precisaria lembrar o contexto suficiente para saber que estava analisando uma subconsulta. Eu não acho que as atualizações sejam permitidas nas subconsultas, mas se elas foram (talvez com uma cláusula RETURNING), talvez você não consiga dizer que isso é inválido até ter analisado a instrução SELECT.

Isso aumentaria pelo menos k (lookahead) para a gramática e, na pior das hipóteses, o tornaria sensível ao contexto, embora isso esteja ampliando os limites dos meus trabalhos de design de compilador pouco lembrados da universidade.

ConcernedOfTunbridgeWells
fonte
Analisando o artigo da Wiki, QUELisso foi desenvolvido na mesma época em que a ordem das cláusulas de sintaxe é o que o OP sugere.
Martin Smith