Hướng dẫn how fetch data from two tables in join mysql? - làm cách nào để tìm nạp dữ liệu từ hai bảng trong tham gia mysql?

Giới thiệu

Mặc dù thường rất hữu ích khi tách dữ liệu thành các bảng riêng biệt cho mục đích hiệu suất và tính nhất quán, bạn thường cần tham khảo dữ liệu từ nhiều bảng để trả lời một số yêu cầu nhất định. Tham gia bảng là một cách kết hợp dữ liệu từ các bảng khác nhau bằng cách khớp với từng bản ghi dựa trên các giá trị trường chung.

Show

Có một vài loại tham gia khác nhau, cung cấp nhiều cách khác nhau để kết hợp hồ sơ bảng. Trong bài viết này, chúng tôi sẽ đề cập đến cách MySQL thực hiện tham gia và thảo luận về các kịch bản trong đó mỗi trường hợp hữu ích nhất.

Tham gia là gì?

Nói tóm lại, tham gia là một cách hiển thị dữ liệu từ nhiều bảng. Họ làm điều này bằng cách ghép các bản ghi lại với nhau từ các nguồn khác nhau dựa trên các giá trị phù hợp trong các cột nhất định. Mỗi hàng kết quả bao gồm một bản ghi từ bảng thứ nhất kết hợp với một hàng từ bảng thứ hai, dựa trên một hoặc nhiều cột trong mỗi bảng có cùng một giá trị.

Cú pháp cơ bản của một tham gia trông như thế này:

SELECT

*

FROM

<first_table>

<join_type> <second_table>

<join_condition>;

Trong một lần nối, mỗi hàng kết quả được xây dựng bằng cách bao gồm tất cả các cột của bảng thứ nhất theo sau là tất cả các cột từ bảng thứ hai. Phần

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

7 của truy vấn có thể được sử dụng để chỉ định các cột chính xác bạn muốn hiển thị.

Nhiều hàng có thể được xây dựng từ các bảng gốc nếu các giá trị trong các cột được sử dụng để so sánh không phải là duy nhất. Ví dụ, hãy tưởng tượng bạn có một cột được so sánh từ bảng đầu tiên có hai bản ghi có giá trị "màu đỏ". Kết hợp với đây là một cột từ bảng thứ hai có ba hàng với giá trị đó. Sự tham gia sẽ tạo ra sáu hàng khác nhau cho giá trị đó đại diện cho các kết hợp khác nhau có thể đạt được.

Loại tham gia và các điều kiện tham gia xác định cách mỗi hàng được hiển thị được xây dựng. Điều này tác động đến những gì xảy ra với các hàng từ mỗi bảng và không có trận đấu với điều kiện tham gia.

Để thuận tiện, nhiều người tham gia khớp với khóa chính trên một bảng có khóa nước ngoài liên quan trên bảng thứ hai. Mặc dù các khóa chính và nước ngoài chỉ được sử dụng bởi hệ thống cơ sở dữ liệu để duy trì các đảm bảo tính nhất quán, mối quan hệ của chúng thường khiến chúng trở thành một ứng cử viên tốt cho các điều kiện tham gia.

Các loại tham gia khác nhau

Nhiều loại tham gia có sẵn, mỗi loại có khả năng tạo ra kết quả khác nhau. Hiểu cách từng loại được xây dựng sẽ giúp bạn xác định cái nào phù hợp cho các kịch bản khác nhau.

Nội tâm và chéo tham gia

Sự tham gia mặc định được gọi là tham gia bên trong. Trong MySQL, điều này có thể được chỉ định bằng cách sử dụng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

8, chỉ

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

9 hoặc

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

0. Đối với các hệ thống cơ sở dữ liệu khác,

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

8 và

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

0 thường là hai khái niệm riêng biệt, nhưng MySQL thực hiện chúng trong cùng một cấu trúc.

Dưới đây là một ví dụ điển hình chứng minh cú pháp của một lần nối bên trong:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

Tham gia bên trong là loại tham gia hạn chế nhất vì nó chỉ hiển thị các hàng được tạo bằng cách kết hợp các hàng từ mỗi bảng. Bất kỳ hàng nào trong các bảng cấu thành không có đối tác phù hợp trong bảng khác đều được xóa khỏi kết quả. Ví dụ: nếu bảng thứ nhất có giá trị "màu xanh" trong cột so sánh và bảng thứ hai không có bản ghi với giá trị đó, hàng đó sẽ bị triệt tiêu từ đầu ra.

Nếu bạn đại diện cho kết quả dưới dạng sơ đồ Venn của các bảng thành phần, một tham gia bên trong cho phép bạn biểu diễn khu vực chồng chéo của hai vòng tròn. Không có giá trị nào chỉ tồn tại trong một trong các bảng được hiển thị.

Như đã đề cập ở trên, MySQL cũng sử dụng định dạng này để tạo ra các kết nối chéo. Trong MySQL, bạn có thể tạo ra một tham gia chéo bằng cách sử dụng một lần nối bên trong mà không có bất kỳ điều kiện phù hợp nào. Tham gia chéo không sử dụng bất kỳ so sánh nào để xác định xem các hàng trong mỗi bảng có khớp với nhau hay không. Thay vào đó, các kết quả được xây dựng bằng cách chỉ thêm từng hàng từ bảng thứ nhất vào mỗi hàng của bảng thứ hai.

Điều này tạo ra một sản phẩm Cartesian của các hàng trong hai hoặc nhiều bảng. Trong thực tế, kiểu tham gia này kết hợp các hàng từ mỗi bảng vô điều kiện. Vì vậy, nếu mỗi bảng có ba hàng, bảng kết quả sẽ có chín hàng chứa tất cả các cột từ cả hai bảng.

Ví dụ: nếu bạn có một bảng gọi là

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

3 kết hợp với một bảng gọi là

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

4, mỗi bảng có hàng

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

5,

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

6 và

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

7, kết quả sẽ là chín hàng kết hợp như vậy:

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

Chỗ nối bên trái

Tham gia bên trái là một tham gia hiển thị tất cả các bản ghi được tìm thấy trong một tham gia bên trong, cộng với tất cả các hàng chưa từng có từ bảng đầu tiên. Trong MySQL, điều này có thể được chỉ định là

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

8 hoặc chỉ là

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

9.

Cú pháp cơ bản của tham gia bên trái theo mẫu này:

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

Một lần tham gia bên trái được xây dựng bằng cách thực hiện đầu tiên một tham gia bên trong để xây dựng các hàng từ tất cả các bản ghi phù hợp trong cả hai bảng. Sau đó, các bản ghi chưa từng có từ bảng đầu tiên cũng được bao gồm. Vì mỗi hàng trong một lần nối bao gồm các cột của cả hai bảng, các cột chưa từng có sử dụng

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

0 làm giá trị cho tất cả các cột trong bảng thứ hai.

Nếu bạn đại diện cho kết quả dưới dạng sơ đồ Venn của các bảng thành phần, một tham gia bên trái cho phép bạn biểu diễn toàn bộ vòng tròn bên trái. Các phần của vòng tròn bên trái được biểu thị bằng giao điểm giữa hai vòng tròn sẽ có thêm dữ liệu được bổ sung bởi bảng bên phải.

Đúng vậy tham gia

Tham gia bên phải là một sự tham gia hiển thị tất cả các bản ghi được tìm thấy trong một tham gia bên trong, cộng với tất cả các hàng chưa từng có từ bảng thứ hai. Trong MySQL, điều này có thể được chỉ định là

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

1 hoặc chỉ là

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

2.

Cú pháp cơ bản của tham gia bên phải theo mẫu này:

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

Một sự tham gia bên phải được xây dựng bằng cách thực hiện đầu tiên một tham gia bên trong để xây dựng các hàng từ tất cả các bản ghi phù hợp trong cả hai bảng. Sau đó, các hồ sơ chưa từng có từ bảng thứ hai cũng được bao gồm. Vì mỗi hàng trong một lần nối bao gồm các cột của cả hai bảng, các cột chưa từng có sử dụng

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

0 làm giá trị cho tất cả các cột trong bảng đầu tiên.

Nếu bạn đại diện cho kết quả dưới dạng sơ đồ Venn của các bảng thành phần, hãy tham gia bên phải cho phép bạn đại diện cho toàn bộ vòng tròn bên phải. Các phần của vòng tròn bên phải được biểu thị bằng giao điểm giữa hai vòng tròn sẽ có thêm dữ liệu được bổ sung bởi bảng bên trái.

Vì lý do tính di động, MySQL khuyên bạn nên sử dụng các kết nối bên trái thay vì tham gia bên phải nếu có thể.

Tham gia đầy đủ

Một sự tham gia đầy đủ là một sự tham gia hiển thị tất cả các bản ghi được tìm thấy trong một tham gia bên trong, cộng với tất cả các hàng chưa từng có từ cả hai bảng thành phần. MySQL không thực hiện hoàn toàn các kết nối đầy đủ, nhưng chúng ta có thể mô phỏng hành vi bằng một vài thủ thuật.

Để tái tạo kết quả của một lần nối bên ngoài đầy đủ, chúng tôi sẽ thực hiện tham gia bên trái vào tất cả các kết quả được chia sẻ bởi cả hai bảng và tất cả các hàng chưa từng có từ bảng bên trái. Sau đó, chúng tôi sẽ sử dụng toán tử

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

4 để kết hợp các kết quả đó với "chống join" cho bảng phù hợp. "Chống tham gia" là một hoạt động tham gia mà độc quyền tìm thấy kết quả không có điểm chung giữa các bảng.

Cú pháp cơ bản của tham gia đầy đủ theo mẫu này:

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

Vì mỗi hàng trong một lần nối bao gồm các cột của cả hai bảng, các cột chưa từng có sử dụng

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

0 làm giá trị cho tất cả các cột trong bảng chưa từng có.

Nếu bạn đại diện cho kết quả dưới dạng sơ đồ Venn của các bảng thành phần, một lần tham gia đầy đủ cho phép bạn hoàn toàn thể hiện cả hai vòng tròn thành phần. Giao điểm của hai vòng tròn sẽ có các giá trị được cung cấp bởi mỗi bảng thành phần. Các phần của các vòng tròn bên ngoài khu vực chồng chéo sẽ có các giá trị từ bảng mà chúng thuộc về, sử dụng

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

0 để điền vào các cột được tìm thấy trong bảng khác.

Tự tham gia

Tự tham gia là bất kỳ sự tham gia nào kết hợp các hàng của bảng với chính nó. Nó có thể không rõ ràng làm thế nào điều này có thể hữu ích, nhưng nó thực sự có nhiều ứng dụng phổ biến.

Thông thường, các bảng mô tả các thực thể có thể hoàn thành nhiều vai trò trong mối quan hệ với nhau. Chẳng hạn, nếu bạn có một bảng

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

7, mỗi hàng có khả năng chứa cột

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

8 tham chiếu khác

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

7 trong bảng. Một sự tham gia của bản thân sẽ cho phép bạn khâu các hàng khác nhau này lại với nhau bằng cách tham gia một phiên bản thứ hai của bảng đến lần đầu tiên nơi các giá trị này khớp với nhau.

Vì bản thân tham gia tham chiếu cùng một bảng hai lần, nên các bí danh bảng được yêu cầu để định hướng các tài liệu tham khảo. Ví dụ, trong ví dụ trên, bạn có thể tham gia hai trường hợp của bảng

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

7 bằng các bí danh

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

1 và

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

2. Bằng cách đó, bạn có thể chỉ định thể hiện của bảng bạn đang đề cập đến khi xác định các điều kiện tham gia.

Dưới đây là một ví dụ khác, lần này đại diện cho mối quan hệ giữa nhân viên và người quản lý:

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

Tham gia điều kiện

Khi kết hợp các bảng, điều kiện nối xác định mức độ các hàng sẽ được khớp với nhau để tạo thành kết quả tổng hợp. Tiền đề cơ bản là xác định các cột trong mỗi bảng phải khớp với sự tham gia xảy ra trên hàng đó.

Điều khoản SELECT *FROM table_1RIGHT JOIN table_2 ON table_1.id = table_2.table_1_id;3

Cách tiêu chuẩn nhất để xác định các điều kiện để tham gia bảng là với mệnh đề

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3. Điều khoản

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3 sử dụng một dấu bằng để chỉ định các cột chính xác từ mỗi bảng sẽ được so sánh để xác định khi nào một lần tham gia có thể xảy ra. MySQL sử dụng các cột được cung cấp để ghép các hàng với nhau từ mỗi bảng.

Điều khoản

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3 là dòng dài nhất, nhưng cũng linh hoạt nhất trong các điều kiện tham gia có sẵn. Nó cho phép tính đặc hiệu bất kể các tên cột được tiêu chuẩn hóa như thế nào của mỗi bảng được kết hợp.

Cú pháp cơ bản của mệnh đề

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3 trông như thế này:

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.ident;

Tại đây, các hàng từ

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

8 và

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

9 sẽ được nối bất cứ khi nào cột

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

0 từ

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

8 khớp với cột

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

2 từ

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

9. Bởi vì một lần nối bên trong được sử dụng, kết quả sẽ chỉ hiển thị các hàng được nối. Vì truy vấn sử dụng ký tự ký tự đại diện

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

4, tất cả các cột từ cả hai bảng sẽ được hiển thị.

Điều này có nghĩa là cả cột

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

0 từ cột

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

8 và

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

2 từ

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

9 sẽ được hiển thị, mặc dù chúng có cùng giá trị chính xác nhờ vào việc đáp ứng điều kiện tham gia. Bạn có thể tránh sự trùng lặp này bằng cách gọi các cột chính xác bạn muốn hiển thị trong danh sách cột

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

7.

Điều khoản SELECT *FROM people AS employeeJOIN people AS manager ON employee.manager_id = manager.id;0

Điều khoản

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

0 là tốc ký để chỉ định các điều kiện của mệnh đề

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3 có thể được sử dụng khi các cột được so sánh có cùng tên trong cả hai bảng. Điều khoản

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

0 lấy một danh sách, được đặt trong ngoặc đơn, của các tên cột được chia sẻ nên được so sánh.

Cú pháp chung của mệnh đề

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

0 sử dụng định dạng này:

SELECT

*

FROM

table1

JOIN

table2

USING

(id, state);

Tham gia này kết hợp

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

8 với

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

9 khi hai cột mà cả hai bảng chia sẻ (

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

0 và

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

8) mỗi cột có các giá trị phù hợp.

Sự tham gia tương tự này có thể được thể hiện nhiều hơn bằng cách sử dụng

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3 như thế này:

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

Mặc dù cả hai lần nối ở trên sẽ dẫn đến cùng một hàng được xây dựng với cùng một dữ liệu, chúng sẽ được hiển thị hơi khác nhau. Trong khi mệnh đề

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3 bao gồm tất cả các cột từ cả hai bảng, mệnh đề

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

0 triệt tiêu các cột trùng lặp. Vì vậy, thay vì có hai cột

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

0 riêng biệt và hai cột ____68 riêng biệt (một cho mỗi bảng), kết quả sẽ có một trong mỗi cột được chia sẻ, theo sau là tất cả các cột khác được cung cấp bởi

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

8 và

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

9.

Điều khoản SELECT *FROM table1JOIN table2ON table1.id = table2.ident;6

Mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.ident;

6 là một tốc ký khác có thể làm giảm thêm độ mẫn của mệnh đề

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

0. Tham gia

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.ident;

6 không chỉ định bất kỳ cột nào được khớp. Thay vào đó, MySQL sẽ tự động tham gia các bảng dựa trên tất cả các cột có các cột phù hợp trong mỗi cơ sở dữ liệu.

Cú pháp chung của mệnh đề tham gia

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.ident;

6 trông như thế này:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

0

Giả sử rằng

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

8 và

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

9 đều có các cột có tên

( SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id

)

UNION ALL

( SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id

WHERE table_1.id IS NULL

);

0,

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

8 và

SELECT

*

FROM

table1

JOIN

table2

USING

(id, state);

5, truy vấn trên sẽ tương đương với truy vấn này bằng mệnh đề

SELECT

*

FROM

table_1

RIGHT JOIN table_2

ON table_1.id = table_2.table_1_id;

3:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

1

Và truy vấn này sử dụng mệnh đề

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

0:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

2

Giống như mệnh đề

SELECT

*

FROM

people AS employee

JOIN people AS manager

ON employee.manager_id = manager.id;

0, mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.ident;

6 triệt tiêu các cột trùng lặp, do đó sẽ chỉ có một trường hợp duy nhất của mỗi cột được nối trong kết quả.

Trong khi mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.ident;

6 có thể làm giảm độ mịn của các truy vấn của bạn, nhưng phải cẩn thận khi sử dụng nó. Do các cột được sử dụng để nối các bảng được tự động tính toán, nếu các cột trong các bảng thành phần thay đổi, kết quả có thể khác nhau rất nhiều do các điều kiện tham gia mới.

Tham gia điều kiện và mệnh đề SELECT *FROM table1JOIN table2ON table1.id = table2.id AND table1.state = table2.state;1

Tham gia các điều kiện chia sẻ nhiều đặc điểm với các so sánh được sử dụng để lọc các hàng dữ liệu bằng các mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

1. Cả hai cấu trúc xác định các biểu thức phải đánh giá đúng cho hàng được xem xét. Bởi vì điều này, không phải lúc nào cũng trực quan về sự khác biệt giữa bao gồm các so sánh bổ sung trong cấu trúc

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

1 so với việc xác định chúng trong chính điều khoản tham gia.

Để hiểu được sự khác biệt sẽ dẫn đến, chúng ta phải xem xét thứ tự mà MySQL xử lý các phần khác nhau của truy vấn. Trong trường hợp này, các vị từ trong điều kiện tham gia được xử lý trước tiên để xây dựng bảng được nối ảo trong bộ nhớ. Sau giai đoạn này, các biểu thức trong mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

1 được đánh giá để lọc các hàng thu được.

Ví dụ, giả sử rằng chúng ta có hai bảng được gọi là

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

5 và

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

6 mà chúng ta cần tham gia cùng nhau. Chúng tôi muốn tham gia hai bảng bằng cách khớp cột

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

7 với cột

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

8. Ngoài ra, chúng tôi quan tâm đến các hàng trong bảng

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

6 có

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

00 là 12345.

Đưa ra các yêu cầu trên, chúng tôi có hai điều kiện mà chúng tôi quan tâm. Tuy nhiên, cách chúng tôi thể hiện các điều kiện này sẽ xác định kết quả chúng tôi nhận được.

Đầu tiên, chúng ta hãy sử dụng cả hai điều kiện tham gia cho

t1.r1 + t2.r1

t1.r1 + t2.r2

t1.r1 + t2.r3

t1.r2 + t2.r1

t1.r2 + t2.r2

t1.r2 + t2.r3

t1.r3 + t2.r1

t1.r3 + t2.r2

t1.r3 + t2.r3

9:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

3

Kết quả có khả năng trông giống như thế này:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

4

MySQL đã đạt được kết quả này bằng cách thực hiện các hoạt động sau:

  1. Kết hợp bất kỳ hàng nào trong bảng

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    5 với bảng

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    6 trong đó:
    • SELECT

      *

      FROM

      table1

      JOIN

      table2

      ON

      table1.id = table2.id AND table1.state = table2.state;

      7 khớp với

      SELECT

      *

      FROM

      table_1

      [INNER] JOIN table_2

      ON table_1.id = table_2.table_1_id;

      05.
    • SELECT

      *

      FROM

      table_1

      [INNER] JOIN table_2

      ON table_1.id = table_2.table_1_id;

      06 khớp với 12345
  2. Bởi vì chúng tôi đang sử dụng một tham gia bên trái, bao gồm bất kỳ hàng chưa từng có nào từ bảng bên trái (

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    5), việc đệm các cột từ bảng bên phải (

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    6) với các giá trị

    SELECT

    *

    FROM

    table_1

    LEFT JOIN table_2

    ON table_1.id = table_2.table_1_id;

    0.
  3. Chỉ hiển thị các cột được liệt kê trong đặc tả cột

    SELECT

    *

    FROM

    table_1

    [INNER] JOIN table_2

    ON table_1.id = table_2.table_1_id;

    7.

Kết quả là tất cả các hàng tham gia của chúng tôi đều khớp với cả hai điều kiện mà chúng tôi đang tìm kiếm. Tuy nhiên, sự tham gia bên trái khiến MySQL cũng bao gồm bất kỳ hàng nào từ bảng đầu tiên không thỏa mãn điều kiện tham gia. Điều này dẫn đến các hàng "trái" dường như không tuân theo mục đích rõ ràng của truy vấn.

Nếu chúng ta di chuyển truy vấn thứ hai (

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

06 = 12345) sang mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

1, thay vì bao gồm nó như một điều kiện tham gia, chúng ta sẽ nhận được kết quả khác nhau:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

5

Lần này, chỉ có ba hàng được hiển thị:

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

6

Thứ tự mà các so sánh được thực hiện là lý do cho những khác biệt này. Lần này, MySQL xử lý truy vấn như thế này:

  1. Kết hợp bất kỳ hàng nào trong bảng

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    5 với bảng

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    6 trong đó

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    7 khớp với

    SELECT

    *

    FROM

    table_1

    [INNER] JOIN table_2

    ON table_1.id = table_2.table_1_id;

    05.
  2. Bởi vì chúng tôi đang sử dụng một tham gia bên trái, bao gồm bất kỳ hàng chưa từng có nào từ bảng bên trái (

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    5), việc đệm các cột từ bảng bên phải (

    SELECT

    *

    FROM

    table1

    JOIN

    table2

    ON

    table1.id = table2.id AND table1.state = table2.state;

    6) với các giá trị

    SELECT

    *

    FROM

    table_1

    LEFT JOIN table_2

    ON table_1.id = table_2.table_1_id;

    0.
  3. Chỉ hiển thị các cột được liệt kê trong đặc tả cột

    SELECT

    *

    FROM

    table_1

    [INNER] JOIN table_2

    ON table_1.id = table_2.table_1_id;

    7.
  4. Chỉ hiển thị các cột được liệt kê trong đặc tả cột

    SELECT

    *

    FROM

    table_1

    [INNER] JOIN table_2

    ON table_1.id = table_2.table_1_id;

    7.

Kết quả là tất cả các hàng tham gia của chúng tôi đều khớp với cả hai điều kiện mà chúng tôi đang tìm kiếm. Tuy nhiên, sự tham gia bên trái khiến MySQL cũng bao gồm bất kỳ hàng nào từ bảng đầu tiên không thỏa mãn điều kiện tham gia. Điều này dẫn đến các hàng "trái" dường như không tuân theo mục đích rõ ràng của truy vấn.

Nếu chúng ta di chuyển truy vấn thứ hai (

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

06 = 12345) sang mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

1, thay vì bao gồm nó như một điều kiện tham gia, chúng ta sẽ nhận được kết quả khác nhau:

Lần này, chỉ có ba hàng được hiển thị:

Thứ tự mà các so sánh được thực hiện là lý do cho những khác biệt này. Lần này, MySQL xử lý truy vấn như thế này:

Kết hợp bất kỳ hàng nào trong bảng

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

5 với bảng

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

6 trong đó

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

7 khớp với

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

05.

Đánh giá mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

1 để loại bỏ bất kỳ hàng nào không có 12345 là giá trị cho cột

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

06.

Lần này, mặc dù chúng tôi đang sử dụng tham gia bên trái, mệnh đề

SELECT

*

FROM

table1

JOIN

table2

ON

table1.id = table2.id AND table1.state = table2.state;

1 cắt ngắn kết quả bằng cách lọc tất cả các hàng mà không có

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

00 chính xác. Bởi vì bất kỳ hàng chưa từng có nào sẽ có

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

00 được đặt thành

SELECT

*

FROM

table_1

LEFT JOIN table_2

ON table_1.id = table_2.table_1_id;

0, điều này sẽ loại bỏ tất cả các hàng chưa từng có được tạo ra bởi sự tham gia bên trái. Nó cũng loại bỏ bất kỳ hàng nào được khớp với điều kiện tham gia không vượt qua vòng kiểm tra thứ hai này.

Hiểu được quy trình cơ bản mà MySQL sử dụng để thực hiện các truy vấn của bạn có thể giúp bạn tránh một số sai lầm dễ thực hiện nhưng khó gây khó khăn khi bạn làm việc với dữ liệu của mình.

Sự kết luận

Hướng dẫn how fetch data from two tables in join mysql? - làm cách nào để tìm nạp dữ liệu từ hai bảng trong tham gia mysql?

Trong bài viết này, chúng tôi đã thảo luận về sự tham gia là gì và cách MySQL thực hiện chúng như một cách kết hợp các bản ghi từ nhiều bảng. Chúng tôi đã đề cập đến các loại tham gia khác nhau có sẵn và cách các điều kiện khác nhau như các mệnh đề SELECT *FROM table_1RIGHT JOIN table_2 ON table_1.id = table_2.table_1_id;3 và SELECT *FROM table1JOIN table2ON table1.id = table2.id AND table1.state = table2.state;1 ảnh hưởng đến cách cơ sở dữ liệu xây dựng kết quả.

Khi bạn quen thuộc hơn với các lần tham gia, bạn sẽ có thể sử dụng chúng như một phần thông thường trong bộ công cụ của mình để lấy dữ liệu từ nhiều nguồn khác nhau và ghép các mẩu thông tin lại với nhau để tạo ra một bức tranh đầy đủ hơn. Tham gia giúp tập hợp dữ liệu mà các nguyên tắc tổ chức và xem xét hiệu suất có thể tách rời. Học cách sử dụng hiệu quả các tham gia có thể giúp bạn tập hợp dữ liệu bất kể nó được tổ chức một cách hiệu quả trong hệ thống.

Làm thế nào lấy dữ liệu từ nhiều bảng trong tham gia?

(Bên trong) Tham gia: Trả về các bản ghi có giá trị phù hợp trong cả hai bảng.Bên trái (bên ngoài) Tham gia: Trả về tất cả các bản ghi từ bảng bên trái và các bản ghi phù hợp từ bảng bên phải.Phải (bên ngoài) Tham gia: Trả về tất cả các bản ghi từ bảng bên phải và các bản ghi phù hợp từ bảng bên trái.

Làm thế nào để tìm nạp các bản ghi chung từ hai bảng sử dụng tham gia bên trong?

Dưới đây là cú pháp cơ bản của tham gia bên trong.Cú pháp nối bên trong về cơ bản so sánh các hàng của Bảng 1 với Bảng 2 để kiểm tra xem có bất cứ điều gì phù hợp dựa trên điều kiện được cung cấp trong mệnh đề ON không.Khi điều kiện tham gia được đáp ứng, nó sẽ trả về các hàng phù hợp trong cả hai bảng với các cột đã chọn trong mệnh đề chọn.compares rows of Table1 with Table2 to check if anything matches based on the condition provided in the ON clause. When the Join condition is met, it returns matched rows in both tables with the selected columns in the SELECT clause.

Làm thế nào tôi có thể tìm nạp dữ liệu từ hai bảng trong MySQL mà không cần tham gia?

Làm thế nào để tham gia các bảng trong SQL mà không cần sử dụng các kết nối..
Sử dụng dấu phẩy giữa các tên bảng trong mệnh đề từ và chỉ định điều kiện tham gia ở đâu ..
Sử dụng tất cả liên minh / liên minh ..