2011-12-02 8 views
6

¿Cuál es la diferencia entre estas dos consultas:MySQL que combina registros de dos tablas con unirse y sin

SELECT `threads`.`id` AS `threads.id` , `posts`.`id` , `posts`.`content` 
FROM `threads` 
JOIN `posts` ON `threads`.`id` = `posts`.`thread_id` 

Y

SELECT `threads`.`id` AS `threads.id` , `posts`.`id` , `posts`.`content` 
FROM `threads` , `posts` 
WHERE `threads`.`id` = `posts`.`thread_id` 

ambos vuelven mismos datos.

Respuesta

4

WHERE conjunto de resultados de filtrado de cláusulas que se devuelve por JOIN, por lo que esta es una diferencia.

Mientras esté usando INNER JOIN no hay diferencias ni el rendimiento ni el plan de ejecución, en el caso de cualquier consulta OUTER JOIN produciría un plan de ejecución diferente.

también prestar atención a lo que se dice en el MySql online doc:

En general, se debe utilizar la cláusula ON para las condiciones que especifica cómo unirse a las tablas, y la cláusula WHERE para restringir qué le filas falta en el conjunto de resultados.

0

Puede haber una diferencia en la implementación interna de esas consultas, pero lo dudo. Preferiría personalmente JOIN porque hace que el plan de ejecución sea más obvio.

1

Uno usa uniones ANSI y el otro usa uniones estilo pre-ansi. Los motores MOST DB los compilarán en el mismo plan de ejecución.

+0

En los años 70, cuando comencé con SQL, el segundo fue el único posible. Entonces Chris Date "inventó" otras UNIONES y ahí es donde se introdujo la nueva sintaxis. – Martin

+0

Sí; ambos funcionan bien Al nuevo pan del programador se le dice que la forma "correcta" de hacerlo es usar ANSI. Pero he encontrado que ambos suelen funcionar y A VECES las uniones ANSI previas serán más rápidas y viceversa. No sé por qué generan diferentes planes de ejecución con diferentes actuaciones; pero a veces simplemente lo hacen. – xQbert

1

En una palabra: legibilidad.

Ejecutar el siguiente código:

create table #threads (
id int 
) 

create table #posts (
id int, 
thread_id int, 
content varchar(10) 
) 

insert into #threads values (1) 
insert into #threads values (2) 
insert into #posts values (1, 1, 'Stack') 
insert into #posts values (2, 2, 'OverFlow') 


SELECT #threads.id AS 'threads.id' , #posts.id , #posts.content 
FROM #threads 
JOIN #posts ON #threads.id = #posts.thread_id 

SELECT #threads.id AS 'threads.id' , #posts.id , #posts.content 
FROM #threads, #posts 
WHERE #threads.id = #posts.thread_id 

drop table #threads 
drop table #posts 

en http://data.stackexchange.com/stackoverflow/query/new obtendrá el mismo plan de ejecución :)

La única diferencia real es queinner join es ANSI y la from #threads, #posts es Sintaxis de Transact-SQL.

Cuestiones relacionadas