2011-03-14 19 views
13

Considere que tenemos dos tablas, Users y Posts. user_id es la clave externa en la tabla Posts y es clave principal en la tabla Users.¿Diferencia entre estos dos enfoques de tabla de unión?

¿Cuál es la diferencia entre estas dos consultas sql?

select user.name, post.title 
    from users as user, posts as post 
where post.user_id = user.user_id; 

vs

select user.name, post.title 
    from users as user join posts as post using user_id; 

Respuesta

11

Aparte de la sintaxis, para el fragmento pequeño, funcionan exactamente igual. Pero si es posible, siempre escriba nuevas consultas usando ANSI-JOINs.

semánticamente, la notación de coma se usa para producir un producto CARTESIANO entre dos tablas, lo que significa producir una matriz de todos los registros de la tabla A con todos los registros de la tabla B, de modo que dos tablas con 4 y 6 24 registros. Usando la cláusula WHERE, puede elegir las filas que realmente desea de este producto cartesiano. Sin embargo, MySQL en realidad no cumple y hace esta gran matriz, pero semánticamente esto es lo que significa.

Una sintaxis de JOIN es el estándar ANSI que define más claramente cómo interactúan las tablas. Al colocar la cláusula ON junto al JOIN, deja en claro lo que vincula las dos tablas.

Funcionalmente, realizarán lo mismo para sus dos consultas. La diferencia aparece cuando comienza a usar otros tipos de JOIN [OUTER].

Para MySQL específicamente, comas notación does have one difference

STRAIGHT_JOIN es similar a JOIN, excepto que la tabla de la izquierda se lee siempre antes de la tabla de la derecha. Esto se puede usar para aquellos (pocos) casos en los que el optimizador de unión coloca las tablas en el orden incorrecto.

Sin embargo, sería not be wise para aprovechar esta diferencia.

+0

En MySQL, existe una sutil diferencia entre ',' (== 'STRAIGHT_JOIN') y' JOIN'. –

+0

por lo que la notación de coma es la misma que la unión interna? ¿Y el producto cartesiano tomará más recursos y luego se unirá? –

+0

@jason [producto cartesiano] (http://en.wikipedia.org/wiki/Cartesian_product) es una operación matemática entre dos conjuntos, que se utiliza para describir la operación basada en SET en SQL.Sus dos consultas son para todos los propósitos intensivos iguales, por lo que ninguno de los dos requerirá más recursos – RichardTheKiwi

2

En MySQL JOIN syntax, CROSS JOIN, INNER JOIN y JOIN son todos iguales. Una lista de tablas separadas por comas es STRAIGHT_JOIN, que es casi idéntica a JOIN, excepto que la tabla de la izquierda siempre se lee primero. De acuerdo con el manual, esto es útil "para los (pocos) casos para los que el optimizador de combinación coloca las tablas en el orden incorrecto".

4
where post.user_id = user.user_id 

Aquí está haciendo una declaración condicional

from users as user join posts as post using user_id 

Aquí se está uniendo dos tablas utilizando la clave externa

Al final es lo mismo, pero JOIN es mejor utilizado por más avanzada consultas ...

Cuestiones relacionadas