Sự khác biệt giữa THAM GIA và THAM GIA


999

Cả hai tham gia này sẽ cho tôi kết quả như nhau:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

đấu với

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

Có sự khác biệt nào giữa các tuyên bố trong hiệu suất hay không?

Có khác nhau giữa các triển khai SQL khác nhau không?



6
Như một lưu ý phụ: CROSS THAM GIA là một loại tốt để biết loại tham gia (nó khác với INNER THAM GIA).
Serge

Câu trả lời:


1093

Họ có chức năng tương đương, nhưng INNER JOINcó thể là một chút rõ ràng hơn để đọc, đặc biệt là nếu truy vấn có khác tham gia các loại (ví dụ LEFThay RIGHThay CROSS) bao gồm trong nó.


11
Điều này có đúng với tất cả các cơ sở dữ liệu (ví dụ: SQL, postgres không?) Có ai biết một liên kết đến tài liệu giải thích điều này không?
Chogg


14
Truy vấn đủ rõ ràng chỉ bằng cách viết THAM GIA, INNER chỉ là nhiễu.
Ivanzinho

22
Có thể tôi là một người theo chủ nghĩa thuần túy, nhưng tôi nghĩ tốt hơn là nên rõ ràng hơn là ẩn khi viết SQL. INNER THAM GIA dễ đọc hơn, đặc biệt là trong các truy vấn phức tạp.
bruceskyaus

3
@Ivanzinho: Nét bàn phím không phải là thước đo của truy vấn hoặc độ phức tạp của chương trình. Sự phức tạp trong cuộc sống thực đến từ khả năng bảo trì, trong đó khả năng đọc đóng vai trò chính. Thực tế là khi nó nói INNER THAM GIA, bạn có thể chắc chắn về những gì nó làm và nó được coi là như vậy, trong khi một THAM GIA đơn giản sẽ khiến bạn, hoặc ai đó, tự hỏi những gì tiêu chuẩn nói về việc thực hiện và là INNER / OUTER / LEFT bị bỏ lại do tai nạn hoặc do mục đích.
Tuukka Haapaniemi

243

Không, không có sự khác biệt, đường cú pháp tinh khiết .


22
Tôi sẽ không gọi đây là đường cú pháp. Kiểu tham gia "Mặc định", "tốc ký" hoặc "bí danh" có thể.
mk12

62
Trong khoa học máy tính, đường cú pháp là cú pháp trong một ngôn ngữ lập trình được thiết kế để làm cho mọi thứ dễ đọc hoặc diễn đạt hơn . Tôi tin rằng khả năng bỏ qua INNERthuộc định nghĩa này.
Quassnoi

14
Nếu bạn áp dụng định nghĩa theo đúng nghĩa đen, vâng, nhưng tôi luôn thấy nó dành riêng cho các loại cú pháp thú vị hơn, không chỉ là tên thay thế cho mọi thứ.
mk12

10
@Quassnoi thực tế chỉ rằng câu hỏi này được hỏi, chương trình sự vắng mặt của INNERkhông không làm cho các truy vấn dễ đọc hơn. Đối với tất cả những gì tôi biết, JOINcũng có thể có nghĩa là LEFT JOINnếu nó không được làm rõ bởi các câu trả lời ở đây.
martennis

2
@Quassnoi Tuyên bố wiki giới thiệu của bạn được trích dẫn là đúng với đường cú pháp, nhưng nó không đầy đủ như một định nghĩa. Cú pháp cú pháp là về cú pháp đơn giản hơn cho các trường hợp đặc biệt của cú pháp phức tạp. Sẽ phù hợp hơn khi nói rằng INNER là một "từ ồn ào".
philipxy

143

THAM GIA THAM GIA = THAM GIA

INNER THAM GIA là mặc định nếu bạn không chỉ định loại khi bạn sử dụng từ THAM GIA.

Bạn cũng có thể sử dụng LEFT OUTER THAM GIA hoặc RIGHT OUTER THAM GIA, trong trường hợp đó, từ OUTER là tùy chọn hoặc bạn có thể chỉ định CROSS THAM GIA.

HOẶC LÀ

Đối với một tham gia bên trong, cú pháp là:

CHỌN ...
TỪ TableA
[INNER] THAM GIA TableB

(nói cách khác, từ khóa "INNER" là tùy chọn - kết quả là giống nhau hoặc không có nó)



54

Tương tự với OUTER JOINs, từ "OUTER"này là tùy chọn. Đó là LEFThoặc RIGHTtừ khóa làm cho JOINmột "OUTER" JOIN.

Tuy nhiên vì một số lý do tôi luôn sử dụng "OUTER"như trong LEFT OUTER JOINvà không bao giờ LEFT JOIN, nhưng tôi không bao giờ sử dụng INNER JOIN, mà tôi chỉ sử dụng "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID

23
Tôi trái ngược với bạn: Tôi luôn nói "INNER THAM GIA" nhưng tôi không bao giờ sử dụng OUTER; vì vậy "TRÁI THAM GIA" và "THAM GIA QUYỀN". Đoán tôi chỉ giữ cho số lượng nhân vật của tôi không đổi!
Stephen Holt

10
@ Jonathan.There không có khái niệm về hướng vào một tham gia nội bộ. Các phép nối ngoài có thể tạo ra các tập kết quả chưa từng có và các kết quả có thể thay đổi dựa trên hướng. Bên trong yêu cầu phù hợp để hướng không quan trọng.
Karl Kieninger

32

Như các câu trả lời khác đã nêu, không có sự khác biệt trong ví dụ của bạn.

Các bit ngữ pháp có liên quan được ghi lại ở đây

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Cho thấy tất cả là tùy chọn. Trang tiếp tục làm rõ rằng

INNERChỉ định tất cả các cặp hàng khớp nhau được trả về. Loại bỏ các hàng chưa từng có từ cả hai bảng. Khi không có loại tham gia nào được chỉ định, đây là mặc định .

Ngữ pháp cũng không chỉ ra rằng có một thời gian nơi INNER được yêu cầu mặc dù. Khi chỉ định một gợi ý tham gia.

Xem ví dụ dưới đây

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.