a

Câu hỏi Sự khác nhau giữa “INNER JOIN” và “OUTER JOIN” là gì?


Cũng thế nào LEFT JOIN, RIGHT JOIN và FULL JOIN phù hợp?


4018
2017-09-01 22:36


gốc


Trong số các câu trả lời và nhận xét & tham chiếu của họ bên dưới chỉ một thực sự giải thích cách biểu đồ Venn đại diện cho toán tử: Vùng giao nhau vòng tròn biểu thị tập hợp các hàng trong A JOIN B. Khu vực duy nhất cho mỗi vòng tròn thể hiện tập hợp các hàng bạn nhận được bằng cách lấy các hàng của bảng không tham gia vào A JOIN B và thêm các cột duy nhất cho bảng khác tất cả được đặt thành NULL. (Và hầu hết cung cấp cho một tương ứng không có thật mơ hồ của các vòng tròn để A và B.) - philipxy
Rất nhiều câu trả lời đã được cung cấp nhưng tôi chưa thấy hướng dẫn này được đề cập. Nếu bạn biết sơ đồ Venn, đây là một hướng dẫn tuyệt vời: blog.codinghorror.com/a-visual-explanation-of-sql-joins  Đối với tôi, nó đủ ngắn gọn để đọc nhanh nhưng vẫn nắm được toàn bộ khái niệm và làm việc tốt cho tất cả các trường hợp. Nếu bạn không biết sơ đồ Venn là gì - hãy học chúng.Thực hiện 5-10 phút để làm như vậy và sẽ giúp bạn bất cứ khi nào bạn cần hình dung làm việc với các bộ và quản lý các hoạt động trên các bộ. - DanteTheSmith
@ DanteTheSmith Không, mà bị các vấn đề tương tự như các sơ đồ ở đây. Xem bình luận của tôi ở trên lại câu hỏi & dưới đây lại rằng bài đăng blog rất: "Jeff repudiates blog của mình một vài trang xuống trong các ý kiến". Biểu đồ Venn hiển thị các phần tử trong tập hợp. Chỉ cần cố gắng để xác định chính xác những gì các bộ và những gì các yếu tố trong các sơ đồ này. Bộ không phải các bảng và các phần tử không phải hàng của họ. Ngoài ra bất kỳ hai bảng có thể được tham gia, do đó, PK & FKs là không thích hợp. Tất cả các không có thật. Bạn đang làm điều mà hàng nghìn người khác đã làm - có một ấn tượng mơ hồ bạn (sai) giả định có ý nghĩa. - philipxy
Ai đó có thể trả lời điều này trong tham chiếu đến dữ liệu được lập chỉ mục chuỗi thời gian - Tham gia bên trong và bên ngoài thường không hoạt động theo ý nghĩa con người / Venn khi nói đến các dấu thời gian khác nhau chỉ bằng mili giây. - yeliabsalohcin
@yeliabsalohcin Đọc nhận xét của tôi trên trang này (và câu trả lời của tôi). Nếu không có hàng trùng lặp thì biểu đồ Venn minh họa Sự khác biệt giữa các kết nối bên ngoài và innter, vì vậy chúng minh họa các kết nối bên ngoài về mặt bên trong tham gia và ngược lại nếu bạn biết họ làm gì. Nhưng sơ đồ Venn không minh họa những gì bên ngoài tham gia hoặc bên trong tham gia trở lại về đầu vào của họ trừ khi đầu vào không có hàng trùng lặp và có cùng cột. (Nếu bạn có một câu hỏi khác, hãy đăng câu hỏi đó dưới dạng câu hỏi. Ứng dụng không quan trọng. "Kết hợp" các vấn đề, tùy thuộc vào loại và chế độ dữ liệu.) - philipxy


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


Giả sử bạn đang tham gia vào các cột không có bản sao, đó là trường hợp rất phổ biến:

  • Kết nối bên trong của A và B cho kết quả của A giao nhau B, tức là phần bên trong của biểu đồ Venn ngã tư.

  • Một phép nối ngoài của A và B cho kết quả của A union B, tức là các phần bên ngoài của một liên minh biểu đồ Venn.

Ví dụ

Giả sử bạn có hai bảng, với một cột đơn lẻ và dữ liệu như sau:

A    B
-    -
1    3
2    4
3    5
4    6

Lưu ý rằng (1,2) là duy nhất đối với A, (3,4) là phổ biến và (5,6) là duy nhất đối với B.

Tham gia bên trong

Một tham gia bên trong bằng cách sử dụng một trong hai truy vấn tương đương cho giao điểm của hai bảng, tức là hai hàng chúng có điểm chung.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Tham gia bên ngoài bên trái

Một liên kết bên ngoài bên trái sẽ cung cấp tất cả các hàng trong A, cộng với bất kỳ hàng phổ biến nào trong B.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Tham gia bên ngoài bên phải

Một kết nối bên ngoài bên phải sẽ cung cấp tất cả các hàng trong B, cộng với bất kỳ hàng phổ biến nào trong A.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Tham gia toàn bộ bên ngoài

Một phép nối ngoài đầy đủ sẽ cho bạn sự kết hợp của A và B, tức là tất cả các hàng trong A và tất cả các hàng trong B. Nếu một cái gì đó trong A không có một số liệu tương ứng trong B, thì phần B là null và ngược lại ngược lại.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

5428
2017-09-01 22:59



Sẽ tốt hơn nếu làm tăng thêm ví dụ bằng cách thêm một hàng khác trong bảng B với giá trị 4. Điều này sẽ cho thấy rằng các kết nối bên trong không cần phải bằng không có các hàng. - softveda
Một lời giải thích tuyệt vời, tuy nhiên tuyên bố này: Một phép nối ngoài của A và B cho kết quả của A union B, tức là các phần bên ngoài của một liên minh biểu đồ venn. không được nói một cách chính xác. Một kết nối bên ngoài sẽ cho kết quả của A giao nhau B ngoài một trong những điều sau đây: tất cả A (bên trái), tất cả B (bên phải) hoặc tất cả A và tất cả B (full join). Chỉ có kịch bản cuối cùng này thực sự là một công đoàn B. Tuy nhiên, một lời giải thích tốt bằng văn bản. - Thomas
Câu trả lời chuyên nghiệp! Thích nó. Btw: Tôi vẫn không thể tìm thấy sự khác biệt giữa LEFT JOIN và LEFT OUTER JOIN, v.v. Nếu đây không phải là một phần của câu hỏi tôi có thể gửi một câu hỏi mới :) - YvesR
Tôi có phải là FULL JOIN là một bí danh của FULL OUTER JOIN và LEFT JOIN là một bí danh của LEFT OUTER JOIN không? - Damian
@Ameer, Cảm ơn. Tham gia không đảm bảo một đơn đặt hàng, bạn sẽ cần thêm mệnh đề ORDER BY. - Mark Harrison


Ngoài ra, bạn có thể xem xét lược đồ sau đây cho các loại tham gia khác nhau;

visual explanation of joins

Nguồn: Visual-Representation-of-SQL-Tham gia giải thích chi tiết bởi C.L. Moffatt


2443
2018-05-16 23:03



Lưu ý: Không có FULL OUTER JOIN trong MySQL. stackoverflow.com/questions/12473210/… - Michael Ozeryansky
Tôi nghĩ rằng sơ đồ này giả định rằng không có bản sao Key, Ý nghĩa Key là duy nhất. Nếu Key không phải là duy nhất, tôi nghĩ kết quả sẽ là một cây thánh giá và số lượng trả về sẽ cao hơn nhiều so với kích thước của A. - AlikElzin-kilaka
Trong ví dụ FULL OUTER JOIN với phần giao cắt bị loại trừ, sẽ không sử dụng 'A.Key IS NULL' loại trừ tất cả các hàng từ A bởi vì nếu khóa là NULL thì theo định nghĩa hàng không tồn tại? Tôi không thấy cơ chế đó đạt được kết quả cho sơ đồ VENN như thế nào. - Kelly S. French
@ KellyS.French Xem nhận xét của tôi về câu hỏi và các câu trả lời khác giải thích cách đọc sơ đồ Venn. Các khu vực không bao gồm các hàng từ bảng A & B. Chúng bao gồm các hàng nhất định được thực hiện từ ghép nối một hàng từ A và một hàng từ B. Mà cũng không phải là hàng của đầu ra của câu lệnh SELECT. Các câu trả lời sơ đồ Venn là tất cả người nghèo. - philipxy
A đại diện cho tất cả tiềm năng các hàng đến từ tableA, B đại diện cho tất cả tiềm năng các hàng đến từ bảngB. Các vùng màu đỏ trong biểu đồ đánh dấu của những hàng này thực sự sẽ được bao gồm trong tập kết quả. Lưu ý rằng có thể (và thường là) nhiều, nhiều hơn thế nữa tiềm năng các hàng đến từ một bảng so với thực tế có các hàng trong bảng đó. Đó là bởi vì bất kỳ hàng nào trong tableA sẽ là có khả năng xảy ra một lần cho mỗi hàng trong tableB tham chiếu đến nó. Đây được gọi là sản phẩm cartes. - Stijn de Witt


Tôi khuyên bạn nên Bài viết trên blog của Jeff. Mô tả hay nhất mà tôi từng thấy, cộng với hình ảnh trực quan, ví dụ:

Tham gia bên trong:

enter image description here

Tham gia đầy đủ bên ngoài:

enter image description here


591
2017-08-30 11:52



Sơ đồ này là một chút gây hiểu lầm cho khái niệm này. Đọc các bình luận trong bài viết. - softveda
@ ya23: ý bạn là gì khi tham gia đầy đủ bên ngoài? - ursitesion
Ngoại trừ Jeff từ bỏ blog của anh ấy một vài trang trong phần bình luận: "Những người bình luận chỉ ra rằng các sơ đồ bị phá vỡ trong trường hợp có nhiều kết quả trùng lặp, hoàn toàn đúng. Tôi đã thực sự nghĩ đến các phép nối dọc khóa chính, có xu hướng là duy nhất bởi Ví dụ như các ví dụ không được thể hiện theo cách đó. Giống như sản phẩm Descartes hoặc Cross, bất cứ thứ gì dẫn đến nhiều hàng hơn ban đầu bạn bắt đầu với hoàn toàn phá vỡ toàn bộ khái niệm sơ đồ Venn. Vì vậy hãy ghi nhớ điều đó. " - philipxy
@philipxy có tương tự sơ đồ Venn chỉ hoạt động cho khóa chính sau khi bỏ qua NULLs- điều này thường không được nêu. Các sơ đồ Venn không giúp giải thích cách các cột khác trong tập kết quả được lấp đầy với NULL. - Galax
@ Galax Thật không may, cho dù các tham gia là trên các phím (cho phép một mình khóa chính) không giúp các sơ đồ để làm cho tinh thần. (Mặc dù tôi trích dẫn Jeff nói rằng anh ta nghĩ nó.) (Tôi không hiểu "công việc của bạn cho khóa chính sau khi bỏ qua NULL" hoặc "các cột khác trong tập kết quả được lấp đầy với NULL". Tôi biết nhiều hơn hoặc ít hơn sắp xếp điều bạn đang cố gắng nói nhưng bất kỳ thư từ nào nhưng câu trả lời của tôi cho câu hỏi là phức tạp và như vậy là thông thoáng giải trình. Mặc dù tôi sẽ chào đón một người. Chính xác gì đang được nhóm lại làm sao bởi các vòng tròn? - philipxy


Các sơ đồ Venn không thực sự làm điều đó cho tôi.

Họ không cho thấy bất kỳ sự phân biệt giữa tham gia chéo và tham gia bên trong, ví dụ, hoặc thường cho thấy sự khác biệt giữa các kiểu biến vị ngữ nối khác nhau hoặc cung cấp một khuôn khổ cho lý do về cách chúng hoạt động.

Không có thay thế cho sự hiểu biết về xử lý logic và nó là tương đối đơn giản để nắm bắt anyway.

  1. Hãy tưởng tượng một tham gia chéo.
  2. Đánh giá on mệnh đề chống lại tất cả các hàng từ bước 1 giữ những vị trí mà vị từ ước lượng true
  3. (Chỉ dành cho các kết nối bên ngoài) thêm lại vào bất kỳ hàng bên ngoài nào đã bị mất trong bước 2.

(NB: Trong thực tế, trình tối ưu hóa truy vấn có thể tìm cách thực hiện truy vấn hiệu quả hơn là mô tả thuần túy ở trên nhưng kết quả cuối cùng phải giống nhau)

Tôi sẽ bắt đầu với một phiên bản hoạt hình của một tham gia toàn bộ bên ngoài. Giải thích thêm sau.

enter image description here


Giải trình

Bảng nguồn

enter link description here

Đầu tiên bắt đầu với một CROSS JOIN (Sản phẩm AKA Descartes). Điều này không có ON và chỉ trả về mọi kết hợp của các hàng từ hai bảng.

CHỌN A.Colour, B.Colour FROM A CROSS JOIN B

enter link description here

Các kết nối bên trong và bên ngoài có một vị từ mệnh đề "ON".

  • Tham gia bên trong. Đánh giá điều kiện trong mệnh đề "ON" cho tất cả các hàng trong kết quả kết hợp chéo. Nếu trả về true hàng đã tham gia. Nếu không thì hãy loại bỏ nó.
  • Tham gia bên ngoài bên trái. Tương tự như bên trong tham gia sau đó cho bất kỳ hàng nào trong bảng bên trái không khớp với bất kỳ thứ gì xuất ra với giá trị NULL cho cột bảng bên phải.
  • Tham gia bên ngoài bên phải. Tương tự như bên trong tham gia sau đó cho bất kỳ hàng trong bảng bên phải mà không phù hợp với bất cứ điều gì đầu ra này với giá trị NULL cho các cột bảng bên trái.
  • Tham gia đầy đủ bên ngoài. Tương tự như bên trong tham gia sau đó bảo tồn các hàng trái không phù hợp như trong bên ngoài bên ngoài tham gia và bên phải không phù hợp với hàng như bên phải bên ngoài tham gia.

Vài ví dụ

CHỌN A.Colour, B.Colour FROM A INNER JOIN B ON A.Colour = B.Colour

Ở trên là tham gia equi cổ điển.

Inner Join

Phiên bản hoạt ảnh

enter image description here

CHỌN A.Colour, B.Colour FROM A INNER JOIN B ON A.Colour NOT IN ('Green', 'Blue')

Điều kiện nối bên trong không nhất thiết phải là một điều kiện bình đẳng và nó không cần tham chiếu các cột từ cả hai (hoặc thậm chí cả hai) của các bảng. Đánh giá A.Colour NOT IN ('Green','Blue') trên mỗi hàng trả về kết hợp chéo.

inner 2

CHỌN A.Colour, B.Colour FROM A INNER JOIN B ON 1 = 1

Điều kiện kết nối đánh giá là đúng cho tất cả các hàng trong kết quả kết nối chéo, vì vậy điều này chỉ giống như một phép nối chéo. Tôi sẽ không lặp lại hình ảnh của 16 hàng một lần nữa.

CHỌN A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour

Các kết nối bên ngoài được đánh giá hợp lý theo cùng cách như các phép nối bên trong ngoại trừ nếu một hàng từ bảng bên trái (cho một phép nối trái) không tham gia với bất kỳ hàng nào từ bảng bên phải, nó được giữ nguyên trong kết quả NULL giá trị cho cột bên phải.

LOJ

CHỌN A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL

Điều này chỉ đơn giản là hạn chế kết quả trước đó để chỉ trả về các hàng ở đó B.Colour IS NULL. Trong trường hợp cụ thể này, các hàng sẽ được giữ nguyên vì chúng không có kết quả phù hợp trong bảng bên phải và truy vấn trả về một hàng màu đỏ không khớp trong bảng B. Điều này được gọi là chống tham gia bán.

Điều quan trọng là chọn một cột cho IS NULL kiểm tra hoặc không thể vô hiệu hóa hoặc điều kiện tham gia đảm bảo rằng bất kỳ NULL các giá trị sẽ bị loại trừ để mẫu này hoạt động chính xác và tránh chỉ mang lại các hàng xảy ra để có NULL giá trị cho cột đó ngoài các hàng không khớp.

loj is null

CHỌN A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour

Các khớp nối bên ngoài bên phải hoạt động tương tự như các phép nối ngoài bên trái, ngoại trừ chúng giữ lại các hàng không khớp từ bảng bên phải và mở rộng các cột bên tay trái.

ROJ

CHỌN A.Colour, B.Colour FROM A FULL OUTER JOIN B ON A.Colour = B.Colour

Các kết nối bên ngoài đầy đủ kết hợp hành vi của các phép nối trái và phải và bảo toàn các hàng không khớp từ cả hai bảng bên trái và bên phải.

FOJ

CHỌN A.Colour, B.Colour FROM A FULL OUTER JOIN B ON 1 = 0

Không có hàng nào trong tham gia chéo khớp với 1=0 vị ngữ. Tất cả các hàng từ cả hai bên đều được bảo toàn bằng cách sử dụng các quy tắc kết nối bên ngoài bình thường với NULL trong các cột từ bảng ở phía bên kia.

FOJ 2

CHỌN COALESCE (A.Colour, B.Colour) AS Màu TỪ MỘT ĐẦY ĐỦ RA ĐẦY ĐỦ B ON 1 = 0

Với một sửa đổi nhỏ cho truy vấn trước, người ta có thể mô phỏng một UNION ALL của hai bảng.

UNION ALL

CHỌN A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour = 'Green'

Lưu ý rằng WHERE khoản (nếu có) một cách hợp lý chạy sau khi tham gia. Một lỗi phổ biến là thực hiện một phép nối ngoài bên trái và sau đó bao gồm một mệnh đề WHERE với một điều kiện trên bảng bên phải mà không bao gồm các hàng không phù hợp. Ở trên kết thúc lên thực hiện việc tham gia bên ngoài ...

LOJ

... Và sau đó mệnh đề "Where" chạy. NULL= 'Green' không đánh giá đúng vì vậy hàng được bảo toàn bởi kết nối bên ngoài kết thúc sẽ bị loại bỏ (cùng với màu xanh) chuyển đổi kết nối một cách hiệu quả thành một bên trong.

LOJtoInner 

Nếu ý định chỉ bao gồm các hàng từ B trong đó Màu là Xanh lục và tất cả các hàng từ A bất kể cú pháp chính xác sẽ là

CHỌN A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour AND B.Colour = 'Green'

enter image description here

SQL Fiddle

Xem các ví dụ này chạy trực tiếp tại SQLFiddle.com.


529
2017-12-13 11:58



Tôi sẽ nói rằng trong khi điều này không hiệu quả đối với tôi cũng như sơ đồ Venn, tôi đánh giá cao mọi người khác nhau và học khác nhau và đây là một lời giải thích rất rõ ràng không giống như bất kỳ tôi đã thấy trước đây, vì vậy tôi hỗ trợ @ypercube trao thưởng điểm thưởng. Cũng tốt công việc giải thích sự khác biệt của việc đặt điều kiện bổ sung trong mệnh đề JOIN vs mệnh đề WHERE. Kudos cho bạn, Martin Smith. - Old Pro
@OldPro Các sơ đồ Venn là OK như xa như họ đi tôi giả sử nhưng họ là im lặng về cách đại diện cho một tham gia chéo, hoặc để phân biệt một loại tham gia predicate như equi tham gia từ khác. Mô hình tinh thần của việc đánh giá biến vị ngữ nối trên mỗi hàng của kết quả kết nối chéo sau đó thêm trở lại vào các hàng chưa khớp nếu một phép nối ngoài và cuối cùng đánh giá nơi làm việc tốt hơn cho tôi. - Martin Smith
Các sơ đồ Venn là tốt cho đại diện cho các công đoàn và giao lộ và sự khác biệt nhưng không tham gia. Chúng có một số giá trị giáo dục nhỏ cho các phép nối rất đơn giản, tức là tham gia trong đó điều kiện kết nối là trên các cột duy nhất. - ypercubeᵀᴹ
@Arth - Không, bạn không đúng. SQL Fiddle sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 đây là điều mà biểu đồ Venn không thể minh họa. - Martin Smith
@MartinSmith Wow, tôi đồng ý, tôi hoàn toàn sai! Quá quen với việc làm việc với từng người một .. cảm ơn sự điều chỉnh. - Arth


Sau đây được lấy từ bài báo "MySQL - LEFT JOIN và RIGHT JOIN, INNER JOIN và OUTER JOIN"của Graham Ellis trên blog Horse's Mouth.

Trong một cơ sở dữ liệu như MySQL, dữ liệu được chia thành một số bảng sau đó được kết nối (Joined) cùng nhau JOIN trong SELECT lệnh để đọc các bản ghi từ nhiều bảng. Đọc ví dụ này để xem nó hoạt động như thế nào.

Đầu tiên, một số dữ liệu mẫu:

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

REGULAR JOIN

Nếu chúng ta thực hiện JOIN thường xuyên (không có từ khóa INNER, OUTER, LEFT hoặc RIGHT), thì chúng ta sẽ nhận được tất cả các bản ghi khớp theo cách thích hợp trong hai bảng và các bản ghi trong cả hai bảng đến không khớp sẽ không được báo cáo :

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

CHỖ NỐI BÊN TRÁI

Nếu chúng ta thực hiện LEFT JOIN, chúng ta sẽ nhận được tất cả các bản ghi khớp với cùng một cách và IN ADDITION, chúng ta sẽ có thêm một bản ghi cho mỗi bản ghi chưa từng có trong bảng bên trái của phép nối - do đó đảm bảo (trong ví dụ này) :

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

RIGHT JOIN

Nếu chúng ta thực hiện RIGHT JOIN, chúng ta sẽ nhận được tất cả các bản ghi phù hợp và IN ADDITION một bản ghi phụ cho mỗi bản ghi chưa khớp trong bảng bên phải của phép nối - trong ví dụ của tôi, điều đó có nghĩa là mỗi thuộc tính đều được đề cập ngay cả khi chúng ta không có chi tiết người bán:

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

Một INNER JOIN thực hiện một phép nối đầy đủ, giống như ví dụ đầu tiên, và từ OUTER có thể được thêm sau từ LEFT hoặc RIGHT trong hai ví dụ cuối cùng - nó được cung cấp cho khả năng tương thích ODBC và không bổ sung thêm các khả năng.


291
2018-02-14 05:53



REGULAR JOIN và INNER JOIN là điều tương tự. Graham Ellis muốn nói gì REGULAR là INNER JOIN là "mặc định" JOIN, khi không có LEFT hoặc là RIGHT từ khóa đã được chỉ định. Nếu bạn đọc toàn bộ bài viết, cuối cùng anh ta nói "Một INNER JOIN thực hiện một phép nối đầy đủ, giống như ví dụ đầu tiên, và từ OUTER có thể được thêm sau từ LEFT hoặc RIGHT trong hai ví dụ cuối cùng - nó được cung cấp cho ODBC khả năng tương thích và không thêm khả năng bổ sung. " - vegatripy
Đối với những người đang bối rối bởi pid và spid, pid viết tắt của "person id", và spid là viết tắt của "id tài sản bán". - Andrew Grimm
Điều gì sẽ xảy ra nếu chúng ta chỉ muốn chọn Mr.BROWN, cô SMITH và ông Pullen? - Fortune
@Fortune Select (hàng có name bằng một trong số) chúng từ cái gì? Làm thế nào điều này liên quan đến sự khác biệt giữa các kết nối bên trong và bên ngoài? - philipxy
nhiều câu trả lời không nghĩ về một - nhiều tình huống , và điều này sẽ đánh lừa ai đó, câu trả lời của bạn tốt hơn! - rocket1037


Tham gia bên trong

Truy xuất các hàng phù hợp chỉ, có nghĩa là, A intersect B.

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Tham gia bên ngoài bên trái

Chọn tất cả các bản ghi từ bảng đầu tiên và bất kỳ bản ghi nào trong bản ghi thứ hai bảng khớp với các phím đã nối.

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Tham gia hoàn toàn bên ngoài

Chọn tất cả các bản ghi từ bảng thứ hai và mọi bản ghi trong lần đầu tiên bảng khớp với các phím đã nối.

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Tài liệu tham khảo


114
2018-01-27 12:16



Tên công cụ là gì? Tôi thấy nó thú vị vì nó cho thấy số hàng và biểu đồ venn - Grijesh Chauhan
@GrijeshChauhan Datamartist :) - Tushar Gupta
@Trushar :( nó không dành cho hệ thống Linux .. - Grijesh Chauhan
@GrijeshChauhan Yeah Nhưng bạn có thể thử chạy nó bằng cách sử dụng rượu nho . - Tushar Gupta
Ohh! vâng tôi .. Tôi đã sử dụng SQLyog sử dụng rượu vang .. đó cũng là PlayOnLinux - Grijesh Chauhan


Tham gia được sử dụng để kết hợp dữ liệu từ hai bảng, với kết quả là một bảng mới, tạm thời. Các phép nối được thực hiện dựa trên một cái gì đó được gọi là vị từ, nó chỉ định điều kiện để sử dụng để thực hiện một phép nối. Sự khác biệt giữa một phép nối bên trong và một phép nối ngoài là một phép nối bên trong sẽ chỉ trả lại các hàng thực sự khớp dựa trên biến vị ngữ nối. Cho phép xem xét bảng nhân viên và vị trí:

enter image description here

Tham gia bên trong: - Inner join tạo một bảng kết quả mới bằng cách kết hợp các giá trị cột của hai bảng (Nhân viên và Vị trí) dựa trên tham số-vị ngữ. Truy vấn so sánh từng hàng của Nhân viên với mỗi hàng của Vị trí để tìm tất cả các hàng thỏa mãn tham số-vị ngữ. Khi tham số-vị ngữ được thỏa mãn bằng cách khớp các giá trị không NULL, các giá trị cột cho mỗi cặp hàng phù hợp của Nhân viên và Vị trí được kết hợp thành hàng kết quả. Dưới đây là những gì SQL cho một bên trong tham gia sẽ như thế nào:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Bây giờ, đây là kết quả của việc chạy SQL đó như thế nào: enter image description here enter image description here

Tham gia bên ngoài: - Một phép nối ngoài không yêu cầu mỗi bản ghi trong hai bảng được nối với nhau để có một bản ghi khớp. Bảng đã nối giữ lại mỗi bản ghi — ngay cả khi không có bản ghi khớp nào khác tồn tại. Bên ngoài tham gia chia nhỏ hơn nữa thành các kết nối bên ngoài bên trái và các kết nối bên ngoài bên phải, tùy thuộc vào các hàng của bảng được giữ lại (trái hoặc phải).

Tham gia bên ngoài bên trái: - Kết quả của phép nối ngoài bên trái (hoặc đơn giản là nối trái) cho các bảng Nhân viên và Vị trí luôn chứa tất cả các bản ghi của bảng "trái" (Nhân viên), ngay cả khi điều kiện kết nối không tìm thấy bất kỳ bản ghi khớp nào trong bảng "bên phải" (Vị trí). Dưới đây là những gì SQL cho một bên ngoài bên ngoài tham gia sẽ giống như, bằng cách sử dụng các bảng trên:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Bây giờ, đây là kết quả của việc chạy SQL này sẽ như thế nào: enter image description here enter image description here

Tham gia bên ngoài bên phải: - Một bên ngoài bên phải tham gia (hoặc phải tham gia) gần giống với một bên ngoài bên ngoài tham gia, ngoại trừ với việc điều trị của các bảng đảo ngược. Mỗi hàng từ bảng "bên phải" (Vị trí) sẽ xuất hiện trong bảng đã tham gia ít nhất một lần. Nếu không có hàng phù hợp từ bảng "bên trái" (Nhân viên) tồn tại, NULL sẽ xuất hiện trong các cột từ Nhân viên cho những bản ghi không khớp với Vị trí. Đây là những gì SQL trông giống như:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

Sử dụng các bảng ở trên, chúng ta có thể cho thấy kết quả của một tập hợp bên ngoài bên phải trông như thế nào:

enter image description hereenter image description here

Tham gia hoàn toàn bên ngoài: - Full Outer Join hoặc Full Join là giữ lại thông tin không khớp bằng cách bao gồm các hàng không khớp trong kết quả của một phép nối, sử dụng một phép nối ngoài đầy đủ. Nó bao gồm tất cả các hàng từ cả hai bảng, bất kể bảng khác có giá trị khớp hay không. enter image description here

Nguồn hình ảnh

Hướng dẫn tham khảo MySQL 8.0 - Tham gia cú pháp

Oracle Tham gia hoạt động


108
2017-12-18 06:54





Nói một cách đơn giản:

An tham gia bên trong chỉ lấy các hàng phù hợp.

Trong khi đó, tham gia bên ngoài truy xuất các hàng phù hợp từ một bảng và tất cả các hàng trong bảng khác .... kết quả phụ thuộc vào cái nào bạn đang sử dụng:

  • Trái: Hàng phù hợp trong bảng bên phải và tất cả các hàng trong bảng bên trái

  • Đúng: Hàng phù hợp trong bảng bên trái và tất cả các hàng trong bảng bên phải hoặc

  • Đầy: Tất cả các hàng trong tất cả các bảng. Nó không quan trọng nếu có một trận đấu hay không


101
2018-01-12 11:07



@nomen Không phải là câu trả lời này giải quyết nó, nhưng INNER JOIN là một giao lộ và FULL OUTER JOIN là UNION tương ứng nếu các bộ / vòng tròn bên trái và bên phải chứa các hàng (tương ứng) LEFT & RIGHT join. PS Câu trả lời này không rõ ràng về các hàng trong đầu vào và đầu ra. Nó gây nhầm lẫn "trong bảng bên trái / bên phải" với "có phần bên trái / phải ở bên trái / phải" và nó sử dụng "hàng phù hợp" so với "tất cả" để có nghĩa là hàng được mở rộng theo hàng từ bảng khác so với số không. - philipxy