2011-12-02 41 views
6

sự khác biệt giữa hai truy vấn này là gì:MySQL kết hợp hồ sơ từ hai bảng với tham gia và không

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` 

Cả hai đều trở lại cùng một dữ liệu.

Trả lời

4

WHERE bộ kết quả lọc kết quả được trả về bởi JOIN, vì vậy đây là sự khác biệt.

Miễn là bạn đang sử dụng INNER JOIN, không có sự khác biệt về hiệu suất cũng như kế hoạch thực hiện, trong trường hợp bất kỳ truy vấn OUTER JOIN nào sẽ tạo ra kế hoạch thực hiện khác nhau.

Ngoài ra chú ý đến những gì được nói trong MySql online doc:

Nói chung, bạn nên sử dụng mệnh đề ON cho điều kiện chỉ định làm thế nào để tham gia bảng, và mệnh đề WHERE để hạn chế những dòng bạn muốn trong tập kết quả.

0

Có thể có sự khác biệt trong việc triển khai nội bộ các truy vấn đó, nhưng tôi nghi ngờ điều đó. Cá nhân tôi thích JOIN vì nó làm cho kế hoạch thực hiện rõ ràng hơn.

1

Một sử dụng ANSI Tham gia người khác đang sử dụng kiểu tham gia kiểu pre-ansi. Các công cụ DB MOST sẽ biên dịch chúng thành cùng một kế hoạch thực hiện.

+0

Vào thập niên 70 khi tôi bắt đầu với SQL, câu lệnh thứ 2 là chỉ có thể tham gia. Sau đó, Chris Date "phát minh ra" JOINS khác và đó là nơi mà cú pháp mới được đưa vào. – Martin

+0

Yep; cả hai đều hoạt động tốt. Bánh mì lập trình mới đang được nói với cách "PHẢI" để làm điều đó là sử dụng ANSI. Nhưng tôi đã tìm thấy cả hai thường làm việc và SOMETIMES các pre-ANSI tham gia thực sự sẽ được nhanh hơn và ngược lại. Tôi không biết tại sao họ tạo ra các kế hoạch thực hiện khác nhau với các buổi biểu diễn khác nhau; nhưng đôi khi họ chỉ làm. – xQbert

1

Trong một từ: Khả năng đọc.

Chạy đoạn mã sau:

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 

trong http://data.stackexchange.com/stackoverflow/query/new bạn sẽ nhận được kế hoạch thực hiện cùng :)

Điểm khác biệt duyinner joinANSIfrom #threads, #postsCú pháp Transact-SQL.

Các vấn đề liên quan