2010-12-14 103 views
5

thể trùng lặp:
(self,left outer,right outer,full outer) join - real world examplesSự khác nhau giữa LEFT, RIGHT, INNER và OUTER JOINs là gì?

Xin chào, thân SO cộng đồng!

Tôi đã làm việc với cơ sở dữ liệu SQL trong một thời gian nhưng một khía cạnh vẫn còn rất khó hiểu đối với tôi - bảng tham gia. Tôi hiểu rất rõ những gì xảy ra khi tôi viết một truy vấn nhiều bảng, nhưng khi một JOIN tham gia vào chơi, tôi cảm thấy như tôi không hiểu gì cả.

Vui lòng giúp tôi hiểu bảng tham gia là gì và sự khác nhau giữa LEFT, QUYỀN, INNER và NGOÀI RA là gì? Tự tham gia là gì?

tôi sẽ biết ơn nếu bạn có thể cung cấp một ví dụ về việc sử dụng của họ trong cấu trúc này bảng đơn giản:

Bảng tác giả

id |name 
--------------- 
1 |John 
2 |Bob 
3 |Richard 

Bảng sách

id |author_id |title  |rating 
----------------------------------------- 
1 |1   |book A  |5 
2 |1   |book B  |4.8 
3 |3   |book C  |3 

Thank bạn!

+0

Tôi googled câu hỏi chính xác đó và đưa ra một số lần truy cập trên trang đầu minh họa sự khác biệt. Có thể nhanh hơn yêu cầu ở đây. Thành thật mà nói, tôi thường phải làm mới trí nhớ của mình khi tôi đi tham gia! – DarinH

+1

"Tôi hiểu rất rõ ràng, điều gì sẽ xảy ra, khi tôi viết một truy vấn nhiều người, nhưng khi JOIN tham gia, tôi cảm thấy mình không hiểu gì cả." Huh? một tham gia là alwys khi chơi khi viết các truy vấn đa truy vấn, bạn không sử dụng cú pháp liên kết ngầm là bạn (cái có dấu phẩy giữa các bảng)? Nếu vậy, đừng bao giờ viết một đoạn mã khác bằng cách sử dụng cú pháp của chúng tôi và cú pháp rất kém. Nếu bạn sử dụng cú pháp kém đó thì không có gì lạ khi bạn không hiểu được sự gia nhập. – HLGEM

+0

HLGEM, tại sao nó đã lỗi thời và kém? –

Trả lời

3

TỪ {tham gia loại} B ON {Tham Điều kiện}

Nội: Sẽ chỉ hiển thị kết quả nơi các điều kiện tham gia là đúng. Nếu không có điều kiện thực sự cho một hàng trên A, thì nó sẽ bị xóa khỏi kết quả.

Left: Sẽ không lọc ra các hàng từ A mà không có một kết hợp tham gia vào B

Ngay: Sẽ lọc ra các hàng từ A mà không có một kết hợp tham gia vào B

Outer: trái và các phép nối phải được coi là các kết nối bên ngoài, trong đó bên trong là một kết nối bên trong.

3

Nội Tham gia:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    INNER JOIN books b ON 
     a.id = b.author_id 

sẽ cho kết quả này:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
3 |Richard |3 |3   |book C  |3 

ý rằng Bob đã không được hiển thị - một inner join luôn loại bỏ các mục mà không có mặt trong cả hai nguồn (xem xét việc tham gia tiêu chí trong trường hợp của chúng tôi a.id = b.author_id.

Left Tham gia:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    LEFT JOIN books b ON 
     a.id = b.author_id 

sẽ cho kết quả này:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
2 |Bob  |null |null  |null  |null 
3 |Richard |3 |3   |book C  |3 

Bây giờ tất cả các tác giả được thể hiện - một LEFT JOIN (hoặc LEFT OUTER JOIN, đó là giống nhau) sẽ giữ tất cả "left" hồ sơ (tác giả) và sẽ thay thế các bản ghi "đúng" không được tìm thấy bằng null.

Giới thiệu về "gia nhập phù hợp" - nó giống như "kết nối trái", nhưng có mối quan hệ nghịch đảo. Các truy vấn sau đây sẽ dẫn đến các hồ sơ tương tự như người cuối cùng (chú ý rằng bảng là theo một thứ tự ngược lại, để bù lại việc sử dụng quyền tham gia):

SELECT 
    a.*, 
    b.* 
FROM 
    books b 
    RIGHT JOIN authors a ON 
     a.id = b.author_id 

Hy vọng nó là rõ ràng hơn bây giờ.

PS: cũng có FULL OUTER JOIN. Hãy suy nghĩ về một kết hợp bên trái và bên phải kết hợp - nếu có những cuốn sách không có tác giả, chúng cũng sẽ được hiển thị khi sử dụng một kết hợp bên ngoài đầy đủ.

+0

Yêu thích nó. Nó chỉ vẽ bức tranh rất rõ ràng. –

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