Câu hỏi Sự khác nhau giữa INNER JOIN, LEFT JOIN, RIGHT JOIN và FULL JOIN là gì? [bản sao]


Câu hỏi này đã có câu trả lời ở đây:

Sự khác biệt giữa INNER JOIN, LEFT JOIN, RIGHT JOIN và FULL JOIN  trong MySQL?


1207
2018-04-18 17:15


gốc


tizag.com/mysqlTutorial/mysqljoins.php  tizag.com/mysqlTutorial/mysqlleftjoin.php - Brad
Lời giải thích của Jeff Attwood về các sơ đồ Venn có thể làm điều đó cho bạn. Giải thích trực quan về các kết nối SQL - Cups
FULL JOIN bên ngoài không tồn tại trên MySQL - aleroot
Tôi lưu ý rằng không có câu trả lời nào cụ thể cho MySQL, làm có ngữ nghĩa riêng trong một số lĩnh vực. Tôi cũng muốn xem một bài viết phong nha. - Lightness Races in Orbit
Chỉ trong năm 2011 bạn mới có thể đặt một câu hỏi như thế này, bạn làm điều đó ngay bây giờ và bạn bị downvoted ngay lập tức, lol. - Felipe Lopez


Các câu trả lời:


Đọc bài viết gốc này về Dự án mã sẽ giúp bạn rất nhiều: Visual đại diện của SQL tham gia.

alt text

Ngoài ra, hãy kiểm tra bài đăng này: SQL SERVER - Hiệu suất tốt hơn - LEFT JOIN hoặc NOT IN?.

Tìm bản gốc tại: Sự khác biệt giữa JOIN và OUTER JOIN trong MySQL.


2506
2018-05-31 13:29



Những hình ảnh này không làm điều đó cho tôi. Tại sao hình ảnh trên cùng bên phải không đơn giản SELECT * FROM TableA;? Tại sao ảnh trên cùng bên trái không đơn giản SELECT * FROM TableB;? Tại sao hình ảnh ở trên không SELECT * FROM A INTERSECT SELECT * FROM B ? v.v. - onedaywhen
Tôi có một vấn đề với toàn bộ khái niệm: đó là những biểu diễn trực quan của công đoàn, giao nhau, ngoại trừ, vv Họ không có đại diện trực quan của phép chiếu do đó không thể tham gia. Tôi nghĩ rằng nó sẽ gây nhầm lẫn nhiều hơn lợi ích khi bối cảnh được tham gia. - onedaywhen
Phải không đồng ý. Tôi nghĩ đây là những hình ảnh tốt. Trong nháy mắt, bạn có thể thấy những gì sẽ được lựa chọn từ hai bảng khi sử dụng một gia nhập nhất định. "onedaywhen" nhận xét "tại sao không chỉ nói chọn * từ bảng một" .... tốt bởi vì nó là một tham gia và cần hai bảng lol. - Induster
SQL là ngôn ngữ đọc từ trái sang phải? :) - bjedrzejewski
Sơ đồ này có một vấn đề lớn, đó là nó hoàn toàn bỏ qua sự khác biệt giữa bán kết nối và tham gia. Đó là: select a.* from a inner join b on a.id = b.id so với select a.* from a where id in (select id from b). Đó là bởi vì các phép nối SQL KHÔNG phải là giao điểm của hai bộ - sự nối có thể là một-> một, một-> nhiều hoặc nhiều-> nhiều. Vì vậy, nó thực sự không thể đại diện với một sơ đồ Venn: tất cả các sơ đồ này không cho bạn thấy "phần nào của bảng sẽ được tham gia vào việc tham gia." Trong trường hợp select a.* from a cross join b nên có cùng sơ đồ như tham gia bên ngoài đầy đủ. - ubanerjea


INNER JOIN nhận tất cả các bản ghi phổ biến giữa cả hai bảng dựa trên khóa ngoại

CHỖ NỐI BÊN TRÁI nhận được tất cả các bản ghi từ bảng được liên kết LEFT nhưng nếu bạn đã chọn một số cột từ bảng RIGHT, nếu không có bản ghi liên quan, các cột này sẽ chứa NULL

RIGHT JOIN giống như ở trên nhưng nhận được tất cả các bản ghi trong bảng RIGHT

FULL JOIN nhận được tất cả các bản ghi từ cả hai bảng và đặt NULL trong các cột mà các bản ghi liên quan không tồn tại trong bảng đối diện


530
2018-04-18 20:28



Về mặt kỹ thuật không chính xác: "INNER JOIN nhận tất cả các bản ghi từ một bảng có một số mục liên quan trong bảng thứ hai" - INNER JOIN không chỉ trả về các bản ghi từ một bảng. - nietaki
@nietaki sự khác biệt giữa "INNER JOIN nhận được tất cả các bản ghi từ một bảng có một số mục liên quan trong bảng thứ hai" "AND" INNER JOIN nhận tất cả các bản ghi phổ biến giữa hai bảng "là gì? Lưu ý rằng anh ta không bao giờ nói nó chỉ trả về các bản ghi từ một bảng. - barlop
@barlop OK Tôi thấy bình luận Nietaki nghĩ rằng trong tuyên bố đầu tiên, tuyên bố là nó chỉ trả về các bản ghi từ một bảng .. Câu lệnh thứ hai còn mơ hồ hơn nhiều và không giải thích những gì bên trong tham gia. Vì vậy, nó cũng sai. - barlop
Khi bạn nói "INNER JOIN nhận được tất cả các bản ghi phổ biến giữa hai bảng" Nó cho thấy rằng có một số thử nghiệm để xem hai bản ghi có giống nhau hay không. Khi thực sự nó chỉ là một điều kiện, v.d. / hầu như luôn luôn, thử nghiệm một lĩnh vực của họ cho sự bình đẳng. Phần còn lại của bản ghi không cần phải giống hệt nhau và thông thường sẽ không 'cos nếu chúng giống hệt nhau sẽ không có lợi thế để tham gia chúng ngay từ đầu. Nó tham gia các bản ghi tương ứng .. - barlop
Những gì cũng không được nêu ở đây là những gì sẽ xảy ra khi bạn có nhiều bản ghi tương ứng .. các bản ghi có giá trị giống nhau trong trường đó .. trong bảng A hoặc bảng B hoặc bảng A và B. - barlop


Một mệnh đề SQL JOIN được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng,   dựa trên một trường chung giữa chúng.

Có nhiều loại kết nối khác nhau có sẵn trong SQL:

INNER JOIN: trả về các hàng khi có một kết quả phù hợp trong cả hai bảng.

CHỖ NỐI BÊN TRÁI: trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có kết quả phù hợp nào trong bảng bên phải.

RIGHT JOIN: trả về tất cả các hàng từ bảng bên phải, ngay cả khi không có kết quả phù hợp nào trong bảng bên trái.

FULL JOIN: Nó kết hợp các kết quả của cả hai bên trái và bên ngoài tham gia.

Bảng đã nối sẽ chứa tất cả các bản ghi từ cả hai bảng và điền vào các giá trị NULL cho các kết quả bị thiếu ở hai bên.

SELF JOIN: được sử dụng để nối một bảng với chính nó như thể bảng là hai bảng, tạm thời đổi tên ít nhất một bảng trong câu lệnh SQL.

CARTESIAN JOIN: trả về sản phẩm Descartes của các tập bản ghi từ hai hoặc nhiều bảng được nối.

Chúng tôi có thể thực hiện bốn lần tham gia đầu tiên trong Chi tiết:

Chúng tôi có hai bảng với các giá trị sau.

TableA

id  firstName                  lastName
.......................................
1   arun                        prasanth                 
2   ann                         antony                   
3   sruthy                      abc                      
6   new                         abc                                           

TableB

id2 age Place
................
1   24  kerala
2   24  usa
3   25  ekm
5   24  chennai

.................................................. ..................

INNER JOIN

chú thích : nó cung cấp cho giao điểm của hai bảng, tức là các hàng chúng có chung trong TableA và TableB

Cú pháp

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;

Áp dụng nó trong bảng mẫu của chúng tôi:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
INNER JOIN TableB
ON TableA.id = TableB.id2;

Kết quả sẽ là

firstName       lastName       age  Place
..............................................
arun            prasanth        24  kerala
ann             antony          24  usa
sruthy          abc             25  ekm

CHỖ NỐI BÊN TRÁI

chú thích : sẽ cung cấp cho tất cả các hàng đã chọn trong TableA, cộng với bất kỳ hàng được chọn phổ biến nào trong TableB.

Cú pháp

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

Áp dụng nó trong bảng mẫu của chúng tôi:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
LEFT JOIN TableB
ON TableA.id = TableB.id2;

Kết quả

firstName                   lastName                    age   Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL

RIGHT JOIN

chú thích : sẽ cung cấp tất cả các hàng đã chọn trong TableB, cộng với bất kỳ hàng nào được chọn chung trong TableA.

Cú pháp

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

Áp dụng nó trong bảng mẫu của chúng tôi:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
RIGHT JOIN TableB
ON TableA.id = TableB.id2;

Kết quả

firstName                   lastName                    age     Place
...............................................................................
arun                        prasanth                    24     kerala
ann                         antony                      24     usa
sruthy                      abc                         25     ekm
NULL                        NULL                        24     chennai

FULL JOIN

chú thích : Nó sẽ trả về tất cả các giá trị đã chọn từ cả hai bảng.

Cú pháp

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

Áp dụng nó trong bảng mẫu của chúng tôi:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
FULL JOIN TableB
ON TableA.id = TableB.id2;

Kết quả

firstName                   lastName                    age    Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL
NULL                        NULL                        24    chennai

Sự thật thú vị

Đối với INNER tham gia đơn đặt hàng không quan trọng

Đối với (LEFT, RIGHT hoặc FULL) OUTER tham gia, thứ tự quan trọng

Tốt hơn là hãy kiểm tra điều này Liên kết nó sẽ cung cấp cho bạn chi tiết thú vị về thứ tự tham gia


495
2018-02-25 12:40



full join không giống như một union. Xem stackoverflow.com/questions/905379/…        và social.msdn.microsoft.com/Forums/sqlserver/en-US/… - iliketocode
Truy vấn không sử dụng các cột được tìm thấy trong dữ liệu mẫu. - user2864740
@iliketocode Cảm ơn bạn đã chỉ ra, hãy trả lời chỉnh sửa - Arunprasanth K V
Tại sao thứ tự quan trọng cho OUTER tham gia? Bạn có nghĩa là tối ưu hóa hiệu suất truy vấn wrt? Tập kết quả giống nhau. - Andrii Rubtsov