2009-02-19 77 views
708

Cả hai tham gia sẽ cung cấp cho tôi những kết quả tương tự:Sự khác nhau giữa JOIN và INNER JOIN

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

vs

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

Có sự khác biệt giữa các báo cáo trong hoạt động hoặc bằng cách khác?

Sự khác biệt giữa các triển khai SQL khác nhau có khác nhau không?

+0

Xem câu hỏi này:

+1

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

+5

Nên mở lại vì câu hỏi khác được báo hiệu là tương đương thì không. OP yêu cầu nếu có sự khác biệt nào bằng văn bản JOIN hoặc INNER JOIN –

Trả lời

789

Họ có chức năng tương đương, nhưng INNER JOIN có 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ụ: LEFT hoặc RIGHT hoặc CROSS) bao gồm trong nó.

+4

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

+1

Đó là chuẩn ANSI SQL. Xem thêm: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt; https://en.wikipedia.org/wiki/SQL-92 – Indian

195

Không, không có sự khác biệt, tinh khiết syntactic sugar.

+11

Tôi sẽ không gọi đường cú pháp này. Loại tham gia "Mặc định", "viết tắt" hoặc "bí danh" có thể. – mk12

+34

* Trong khoa học máy tính, 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 hơn hoặc thể hiện *. Tôi tin rằng khả năng bỏ qua 'INNER' thuộc định nghĩa này. – Quassnoi

+6

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ó được dành riêng cho các loại cú pháp thú vị hơn, không chỉ là các tên thay thế cho mọi thứ. – mk12

43

Tương tự như vậy với OUTER JOINs từ "OUTER" là không bắt buộc, nó là LEFT hoặc RIGHT từ khóa đó làm cho JOIN một "OUTER" JOIN.

Tuy nhiên đối với một số lý do tôi luôn luôn sử dụng "OUTER" như trong LEFT OUTER JOIN và 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 
+14

Tôi đối lập với bạn: Tôi luôn nói "INNER JOIN" nhưng tôi không bao giờ sử dụng OUTER; vì vậy "LEFT JOIN" và "RIGHT JOIN". Đoán tôi chỉ giữ nhân vật của tôi đếm liên tục! –

+0

Vì vậy, bạn không thể có một bên trong hoặc bên phải tham gia bên trong? –

+3

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

108

INNER JOIN = JOIN:

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

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

HOẶC

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

SELECT ...
TỪ TableA
[INNER] THAM GIA TableB

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

37

Điều này có khác nhau giữa các lần triển khai SQL khác nhau không?

Có, MS Access không cho phép chỉ join yêu cầu inner join.

591

Chỉ cần nhập JOIN sẽ thực hiện theo mặc định INNER JOIN.

Đối với tất cả những người khác, một hình ảnh đôi khi có giá trị hơn hàng trăm lời:

enter image description here

Hình ảnh lịch sự của CodeProject


+296

Trong trường hợp này, hàng trăm từ có thể đã trả lời câu hỏi. Hình ảnh này chỉ đơn giản là không chứa câu trả lời cho câu hỏi. Câu hỏi đặt ra là sự khác biệt giữa JOIN và INNER JOIN và hình ảnh này không có ví dụ cho JOIN một mình. Điều đó nói rằng tôi biết và thích bức tranh này rất nhiều nhưng nó không phù hợp như một câu trả lời. – konqi

+31

Tôi đến đây tìm kiếm những gì JOIN là một phím tắt cho.Tôi biết INNER, LEFT OUTER và RIGHT OUTER làm gì. –

+0

Đó có phải là hình ảnh chính xác không? tôi đã tìm thấy những sai lầm –

20

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

Các bit có liên quan của ngữ pháp là documented here

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

Hiển thị rằng tất cả là không bắt buộc. Trang tiếp tục làm rõ rằng

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

Ngữ pháp thực hiện cũng chỉ ra rằng có một thời gian nơi INNER cần dù. Khi chỉ định gợi ý kết hợp.

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; 

enter image description here

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