¿Por qué es Seleccionar antes de De en una consulta SQL? [cerrado]

67

Esto es algo que me molestó mucho en la escuela.

Hace cinco años, cuando aprendí SQL, siempre me pregunté por qué primero especificamos los campos que queremos y luego de dónde los queremos.

Según mi idea, deberíamos escribir:

From Employee e
Select e.Name

Entonces, ¿por qué la norma dice lo siguiente?

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

Me llevó semanas comprender SQL, y sé que gran parte de ese tiempo fue consumido por el orden incorrecto de los elementos.

Es como escribir en C #:

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

Entonces, supongo que tiene una razón histórica. ¿Por qué?

Cyril Gandon
fuente
64
Es una conspiración de DBA para mantener a los monos OO en su lugar.
gbn
3
Desafortunadamente, no puedo encontrar ninguna información relevante en el documento que presentó SEQUEL , y no creo que haya citas específicas que respondan a su pregunta. Sin embargo, la respuesta de gnat es posiblemente la mejor explicación, pero no descartaría la teoría de la conspiración.
yannis
2
Personalmente, siempre he deseado Linqno haber usado la SQLsintaxis estandarizada .
jp2code del
44
Las cláusulas en una instrucción SELECT no son el orden de la operación.
S.Lott
8
Buena pregunta. El siguiente debe ser el motivo por el cual las consultas INSERT y UPDATE tuvieron que usar diferentes modelos de sintaxis: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Respuestas:

86

Originalmente, el lenguaje SQL se llamaba SEQUEL, que significa

  • Lenguaje estructurado de consulta en inglés
    con énfasis en el inglés , suponiendo que esté cerca en la ortografía del lenguaje natural .

Ahora, deletrea estas dos frases como deletreas oraciones en inglés:

  1. "De la tabla de empleados e Seleccionar columna e.Nombre"
  2. "Seleccione la columna e.Nombre de la tabla de empleados e"

El segundo suena más cerca del idioma inglés natural, por eso se establece como norma.

Por cierto, el mismo razonamiento se aplica a Whereetc. Las instrucciones SQL fueron diseñadas intencionalmente para sonar cercanas al lenguaje natural.

mosquito
fuente
77
¡Por supuesto, Microsoft ignoró eso con LINQ ya que FROM viene primero!
27
Hay mucha lógica de anticipación en inglés: /
Michael K
15
@Digger: eso fue por diseño: no podrían admitir intellisense en la parte de selección si la selección fue primero.
Scott Whitlock
66
@Digger: LINQ sigue el OO / Object.Method moderno u Object.Property. No olvide que SQL ha existido durante 40 años
gbn
77
Debería haber publicado esta pregunta en english.stackexchange.com en su lugar :)
Cyril Gandon
37

Porque SELECT se requiere en una instrucción select y FROM no.

Select 'This String'

Por supuesto, su instrucción sql se puede analizar para buscar SELECT, DELETE, UPDATE después de FROM, pero ¿es realmente tan importante?

Recuerde, todo esto se hizo antes de intellisense. No es tan complicado.

Editar: Probablemente no haya ninguna razón por la que los intérpretes sql no puedan construirse para hacer ambas cosas.

JeffO
fuente
2
Sin embargo, también podrías escribir en FROM myTable;lugar de FROM myTable SELECT *; Esto solo parece un requisito porque es lo que solías hacer.
user606723
13
El hecho de que sea obligatorio no significa que tenga que ser lo primero.
LarsTech
8
En ANSI FROMse requiere SQL . Esta es la razón por la cual muchos RDBMS tienen una tabla llamada DUAL u otra tabla ficticia de una sola fila
Martin Smith
@LarsTech: no tiene que ser lo primero, pero ¿por qué complicarlo? Se llama instrucción select, solo comienza con la palabra select.
JeffO
3
@JeffO: De acuerdo. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek
10

No sé una respuesta que pueda respaldar por referencias, pero si tuviera que especular: SQL es un lenguaje declarativo , una declaración de dicho lenguaje describe lo que le gustaría hacer en lugar de cómo le gustaría hacerlo.

Como tal, "SELECCIONAR X DE Y" suena como una forma más apropiada de responder "Qué me gustaría seleccionar de la base de datos", en lugar de escribir "DE Y SELECCIONAR X".

Además, en SQL, SELECT / UPDATE / INSERT especifica el tipo de operación que está a punto de realizar y FROM es solo una cláusula que lo ayuda a seleccionar de la tabla correcta en la base de datos. Nuevamente, lo que está haciendo con los datos tiene prioridad sobre cómo exactamente va a lograr eso.

0x4B1D
fuente
1
+1: No es imperativo ni procesal. El orden de las cláusulas es simplemente un ajuste con el inglés. Nada mas.
S.Lott
ON y WHERE pueden ser mejores ejemplos de la importancia del orden de las cláusulas en una declaración select.
JeffO
5

SQL es un lenguaje de consulta estructurado dirigido a hablantes de inglés. SELECT, INSERT, UPDATE y DELETE son comandos imperativos. En inglés, los comandos imperativos comienzan la oración o enunciado. Comparar:

West young man go!

a

Go west young man!

SQL sigue el segundo formato (imperativo). Además, los cuatro comandos imperativos tienen tres formatos significativamente diferentes. Considerar:

FROM    employees a,
        accounts b
UPDATE  ...

o

INTO    customers a
SELECT  ...

Si conoce la acción que está realizando, es más fácil seleccionar el formato correcto.

En el caso de select, usted determina qué atributos desea y luego agrega las tablas que los tienen. A medida que crea los criterios de selección, puede agregar tablas adicionales. Cuando agrega criterios dinámicamente, generalmente se puede hacer al final de una parte estática de la consulta.

BillThor
fuente
77
Entonces Yoda no participó en el desarrollo de SQL.
Adam f
Interesante que mencione ACTUALIZACIÓN. UPDATE ... FROMNo es una estructura de tipo inglés, OMI. No es que tenga mejores sugerencias ...
Robert Brown
La intención era señalar que la preposición debe coincidir con el verbo.
BillThor
3

Las declaraciones SQL comienzan con verbos. Esa fue la elección de los diseñadores de idiomas, y muchos lenguajes de programación funcionan de esa manera. Semánticamente, no es raro ver lenguajes de programación que funcionan así:

verb(noun, noun, noun);

Además, en el caso de la instrucción SELECT que proporcione como ejemplo, la sintaxis propuesta pondría el objeto primero en la instrucción. En lugar de un orden de oración VSO (verbo, sujeto, objeto), tendría OVS, que sería muy extraño en comparación con los lenguajes naturales. SVO (por ejemplo, inglés), VSO (por ejemplo, árabe) y SOV (por ejemplo, latín) son aproximaciones más razonables del habla humana.

David Cloutman
fuente
2

Creo que complicaría significativamente el análisis, especialmente con subconsultas, por ejemplo

  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

Analizar esto sería más complicado. No podría decir que la ACTUALIZACIÓN fue un error de sintaxis hasta que haya analizado la cláusula FROM, y el analizador tendría que recordar suficiente contexto para saber que estaba analizando una subconsulta. No creo que las actualizaciones estén permitidas en las subconsultas de todos modos, pero si lo fueran (tal vez con una cláusula RETURNING), entonces es posible que no pueda decir que esto no es válido hasta que haya analizado la instrucción SELECT.

Esto al menos aumentaría k (búsqueda anticipada) para la gramática y, en el peor de los casos, lo haría sensible al contexto, aunque esto está ampliando los límites de mis trabajos de diseño de compiladores bastante poco recordados de la universidad.

Preocupado por TunbridgeWells
fuente
Mirando el artículo de Wiki para QUELeso fue desarrollado aproximadamente al mismo tiempo, el orden de las cláusulas de sintaxis es lo que sugiere el OP.
Martin Smith