2011-11-24 8 views
5

SQL 1: select * from t1 join t2 on t1.f1 = t2.f2¿Cuál es la diferencia entre las dos notaciones de unión SQL?

SQL 2: select * from t1,t2 where t1.f1 = t2.f2

Los resultados que regresan son los mismos. ¿Hay alguna diferencia entre ellos? Por ejemplo, en cómo el DBMS los ejecuta, o en el plan de consulta?

+5

http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference –

Respuesta

11

No hay diferencia operativa entre las dos consultas.

Sin embargo, la notación de unión explícita es el mejor estilo para aprender y usar; deje el otro para el código heredado (aún no modificado).

+1

gracias por su edit.my inglés no es suficiente. – SleeplessKnight

6

Uno es de estilo antiguo y el otro es nuevo (ANSI). La razón principal por la que he encontrado por qué querría usar el nuevo estilo es para el soporte estándar de combinaciones externas. Con el estilo antiguo, las combinaciones externas son específicas del proveedor. Nuevo estilo tiene que estándar:

select * from t1 left outer join t2 on t1.f1 = t2.f2 

En su ejemplo, SQL 1 es el nuevo y SQL 2 es el viejo estilo, por cierto.

+0

Es posible que desee indicar cuál es 'estilo antiguo' y cuál es 'estilo nuevo'. –

+0

Buen punto. Actualizado –

+0

¿significa el proveedor específico que depende de un producto SQL diferente (como sqlserver y Oracle)? – SleeplessKnight

1

Básicamente, no hay diferencia entre las dos consultas en operación.

Sin embargo, ambos tienen el mismo plan de ejecución y tienen el mismo costo, lo que significa que ambas consultas tardan el mismo tiempo en ejecutarse (el mismo rendimiento).

El uso del operador de unión es una forma moderna.

1

Los dos son semánticamente equivalentes (entre otras variaciones sobre el tema). Una diferencia es que muchos usuarios de Stackoverflow son muy expresivos al expresar su intolerancia a las uniones internas de "estilo antiguo" (su SQL 2), hasta el punto en que cualquiera que las publique corre el riesgo de ser degradado además de ser amonestado en los comentarios. También es probable que vea el término 'antipatrón' aplicado, lo cual no tiene sentido. No he encontrado esta intolerancia de estilo fuera de la comunidad SO. De hecho, las uniones internas de "estilo antiguo" son muy comunes en la literatura de SQL.

+0

Posiblemente porque cualquiera que esté activo en las etiquetas SO SQL por un tiempo [ver] (http://stackoverflow.com/q/7442344) [lots] (http://stackoverflow.com/q/3056271) [of] (http://stackoverflow.com/q/7330433) [examples] (http://stackoverflow.com/q/6156757) de combinaciones cartesianas inadvertidas que se habrían evitado con la sintaxis explícita 'JOIN '. –

+0

@MartinSmith: su lógica es defectuosa: he estado activo en las etiquetas SO SQL por un tiempo y no he desarrollado una intolerancia a este estilo;) Prefiero pensar que se ha desarrollado por razones psicológicas; Puedo dibujar paralelos con 'SELECT *' y 'NATURAL JOIN' a lo largo de las líneas de," Cosas malas pueden pasar si ... " – onedaywhen

Cuestiones relacionadas