2010-04-24 21 views
8

Tôi luôn luôn nghĩ về một Tham gia trong SQL như một loại liên kết giữa hai bảng.Trong SQL, Tham gia thực sự là Giao lộ? Và nó cũng là một liên kết hoặc "Liên minh đi ngang"?

Ví dụ,

select e.name, d.name from employees e, departments d 
    where employees.deptID = departments.deptID 

Trong trường hợp này, nó là liên kết hai bảng, để hiển thị mỗi nhân viên với một tên bộ phận thay vì một ID phận. Và giống như một "liên kết" hay "Liên minh" lình xình".

Nhưng, sau khi tìm hiểu về nội tâm tham gia vs bên ngoài tham gia, nó cho thấy rằng một gia (Nội tham gia) thực sự là một giao lộ.

Ví dụ , khi một bảng có ID 1, 2, 7, 8, trong khi bảng khác có ID 7 và chỉ có 8, cách chúng tôi nhận được giao là:

select * from t1, t2 where t1.ID = t2.ID 

để có được hai kỷ lục của "7 và 8 ". Vì vậy, nó thực sự là một giao lộ.

Vì vậy, chúng tôi có" Giao lộ "của 2 bảng. là hoạt động "Liên minh" trên 2 bảng. Tham gia có thể được coi là "Giao lộ" không? Nhưng còn về khía cạnh "liên kết" hoặc "bên lề" của nó thì sao?

Trả lời

9

Đây là số visual explanation of SQL joins từ Jeff có thể trả lời một số câu hỏi của bạn.

+2

Đây là hình ảnh gây hiểu lầm rộng rãi ... Đây chính xác hơn http://imgur.com/2mlaF1M – Arnon

2

Tham gia 'liên kết' hoặc erm ... tham gia các hàng từ hai bảng. Tôi nghĩ đó là những gì bạn có ý nghĩa bởi 'công đoàn ngang' mặc dù cá nhân tôi nghĩ rằng đó là một cách khủng khiếp để cụm từ nó. Nhưng có nhiều loại tham gia khác nhau làm những việc hơi khác nhau:

  • Tham gia bên trong thực sự là giao lộ.
  • Tham gia bên ngoài đầy đủ là một công đoàn.

Điều này page trên blog của Jeff Atwood mô tả các khả năng khác.

+0

nói rằng nếu cả hai bảng có tất cả các deptID phù hợp, vì vậy hai bảng được hợp nhất cạnh nhau, theo nghĩa đó, giống như một "công đoàn ngang" –

+1

@Jian Lin: Nếu nó giúp bạn dễ dàng nghĩ về nó như một 'công đoàn ngang' thì tốt, nhưng công đoàn có một ý nghĩa được định nghĩa rõ ràng trong SQL và không phải vậy. Tôi sẽ tránh sử dụng thuật ngữ đó khi nói chuyện với người khác. –

5

Bạn đang đi đúng hướng; các hàng được trả về bởi INNER JOIN là các hàng đáp ứng các điều kiện tham gia. Nhưng điều này giống như giao lộ chỉ vì bạn đang sử dụng bình đẳng trong điều kiện tham gia của mình, áp dụng cho các cột từ mỗi bảng.

Cũng lưu ý rằng INTERSECTION đã là một hoạt động SQL và nó có ý nghĩa khác - và nó không giống như JOIN.

SQL JOIN có thể tạo ra một loại hàng mới, có tất cả các cột từ cả hai bảng được nối. Ví dụ: col4, col5, và col6 không tồn tại trong bảng A, nhưng họ vẫn tồn tại trong các kết quả của một tham gia với bảng B:

SELECT a.col1, a.col2, a.col3, b.col4, b.col5, b.col6 
FROM A INNER JOIN B ON a.col2=b.col5; 

Một SQL INTERSECTION trả hàng mà là chung cho hai bảng riêng biệt , phải có các cột giống nhau.

SELECT col1, col2, col3 FROM A 
INTERSECT 
SELECT col1, col2, col3 FROM B; 

Điều này xảy ra để tạo ra kết quả tương tự như sau tham gia:

SELECT a.col1, a.col2, a.col3 
FROM A INNER JOIN B ON a.col1=b.col1 AND a.col2=b.col2 AND a.col3=b.col3; 

Không phải mọi thương hiệu của cơ sở dữ liệu hỗ trợ các nhà điều hành INTERSECTION.

0

Tham gia bên ngoài - không liên quan đến - Union hoặc Union All.

Ví dụ: một 'null' sẽ không xảy ra do kết quả của Liên minh hoặc Liên kết Tất cả hoạt động, nhưng kết quả từ một Tham gia bên ngoài.

0

INNER JOIN xử lý hai giá trị khác nhau là NULL. Vì vậy, nếu bạn tham gia dựa trên cột có thể có giá trị và nếu cả hai bảng có giá trị NULL trong cột đó thì INNER JOIN sẽ bỏ qua các hàng đó.

Do đó, để lấy đúng tất cả các hàng chung giữa hai bảng, INTERSECT nên được sử dụng. INTERSECT xử lý hai số NULL s với cùng giá trị.

Ví dụ (SQLite):

Tạo hai bảng với các cột nullable:

CREATE TABLE Table1 (id INT, firstName TEXT); 
CREATE TABLE Table2 (id INT, firstName TEXT); 

Chèn NULL giá trị:

INSERT INTO Table1 VALUES (1, NULL); 
INSERT INTO Table2 VALUES (1, NULL); 

Lấy hàng thường sử dụng INNER JOIN (Điều này cho thấy không có đầu ra):

SELECT * FROM Table1 INNER JOIN Table2 ON 
    Table1.id=Table2.id AND Table1.firstName=Table2.firstName; 

Lấy hàng thường sử dụng INTERSECT (Điều này cho thấy một cách chính xác hàng phổ biến):

SELECT * FROM Table1 INTERSECT SELECT * FROM Table2; 

Kết luận:

Mặc dù, nhiều lần cả INTERSECTINNER JOIN thể được sử dụng để có được những same results , chúng không giống nhau và nên được chọn tùy theo tình huống.

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