Làm thế nào để bạn kết nối các bảng trong mysql?

Mặc dù việc tách dữ liệu thành các bảng riêng biệt thường hữu ích cho mục đích hiệu suất và tính nhất quán, nhưng bạn thường cần tham khảo dữ liệu từ nhiều bảng để trả lời các yêu cầu nhất định. Nối các 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 từng bản ghi dựa trên các giá trị trường chung

Có một vài kiểu liên kết khác nhau, cung cấp nhiều cách khác nhau để kết hợp các bản ghi bảng. Trong bài viết này, chúng ta sẽ đề cập đến cách MySQL triển khai các phép nối và thảo luận về các tình huống mà mỗi phép nối là hữu ích nhất

tham gia là gì?

Tóm lại, 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 từ các nguồn khác nhau lại với 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 đầu tiên được 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 giá trị

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

SELECT

*

FROM

;

Trong một liên kết, mỗi hàng kết quả được tạo bằng cách bao gồm tất cả các cột của bảng đầu tiên, 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 mà bạn muốn hiển thị

Nhiều hàng có thể được tạo 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 với giá trị "đỏ". Khớp với cột này là một cột từ bảng thứ hai có ba hàng có giá trị đó. Phép nối sẽ tạo ra sáu hàng khác nhau cho giá trị đó biểu thị các kết hợp khác nhau có thể đạt được

Loại liên kết và điều kiện liên kết xác định cách mỗi hàng được hiển thị được xây dựng. Điều này ảnh hưởng đến những gì xảy ra với các hàng từ mỗi bảng phù hợp và không phù hợp với điều kiện tham gia

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

Các loại liên kết khác nhau

Có nhiều loại liên kết khác nhau, mỗi loại sẽ có khả năng tạo ra các kết quả khác nhau. Hiểu cách xây dựng từng loại sẽ giúp bạn xác định loại nào phù hợp với các tình huống khác nhau

Tham gia bên trong và chéo

Tham gia mặc định được gọi là một. 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 triển khai chúng theo cùng một cấu trúc

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

Nối bên trong là kiểu nối 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ó bản sao phù hợp trong bảng khác sẽ bị xóa khỏi kết quả. Ví dụ: nếu bảng đầu tiên có giá trị "xanh dương" trong cột so sánh và bảng thứ hai không có bản ghi nào có giá trị đó, hàng đó sẽ bị chặn khỏi đầu ra

Nếu bạn biểu diễn các kết quả dưới dạng sơ đồ Venn của các bảng thành phần, một phép nối bên trong cho phép bạn biểu thị vùng chồng lấp 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 các liên kết chéo. Trong MySQL, bạn có thể tạo liên kết chéo bằng cách sử dụng liên kết bên trong mà không có bất kỳ điều kiện khớp nào. Tham gia chéo không sử dụng bất kỳ phép 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 đó, kết quả được xây dựng bằng cách thêm từng hàng từ bảng đầu tiên vào từng hàng của bảng thứ hai

Điều này tạo ra tích Descartes của các hàng trong hai hoặc nhiều bảng. Trên thực tế, kiểu liên kết này kết hợp các hàng từ mỗi bảng một cách 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 có tên 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 được kết hợp với một bảng có tên 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ó cá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, thì kết quả sẽ là chín hàng được 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

A là phép nối hiển thị tất cả các bản ghi được tìm thấy trong phép nối bên trong, cộng với tất cả các hàng chưa khớp từ bảng đầu tiên. Trong MYSQL, điều này có thể được chỉ định là một

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à một

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 phép nối trái tuân theo mẫu này

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

6

Phép nối bên trái được tạo bằng cách trước tiên thực hiện phép nối bên trong để tạo 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 khớp từ bảng đầu tiên cũng được đưa vào. Vì mỗi hàng trong một liên kết bao gồm các cột của cả hai bảng, các cột không khớp sử dụng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

Nếu bạn biểu diễn kết quả dưới dạng biểu đồ Venn của các bảng thành phần, phép nối trái cho phép bạn biểu thị 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

tham gia ngay

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

61 hoặc chỉ là một

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

62

Cú pháp cơ bản của nối phải tuân theo mẫu này

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

0

Phép nối bên phải được tạo bằng cách trước tiên thực hiện phép nối bên trong để tạo 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 khớp từ bảng thứ hai cũng được đưa vào. Vì mỗi hàng trong một liên kết bao gồm các cột của cả hai bảng, nên các cột không khớp sử dụng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

Nếu bạn biểu diễn các kết quả dưới dạng sơ đồ Venn của các bảng thành phần, phép nối bên phải cho phép bạn biểu diễn 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 phép nối trái thay vì phép nối phải nếu có thể

tham gia đầy đủ

A là phép nối hiển thị tất cả các bản ghi được tìm thấy trong phép nối bên trong, cộng với tất cả các hàng chưa khớp từ cả hai bảng thành phần. MySQL vốn không triển khai đầy đủ các phép nối, nhưng chúng ta có thể mô phỏng hành vi bằng một vài thủ thuật

Để sao chép kết quả của phép nối ngoài đầy đủ, chúng tôi sẽ thực hiện nối trái cho 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 khớp từ bảng bên trái. Sau đó, chúng tôi sẽ sử dụng để kết hợp các kết quả đó với "chống tham gia" cho bảng bên phải. "Chống tham gia" là một hoạt động tham gia chỉ tìm thấy kết quả không chung giữa các bảng

Cú pháp cơ bản của phép nối đầy đủ tuân theo mẫu này

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

2

Vì mỗi hàng trong một phép nối bao gồm các cột của cả hai bảng, các cột chưa khớp sử dụng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

60 làm giá trị cho tất cả các cột trong bảng chưa khớp

Nếu bạn biểu diễn các kết quả dưới dạng sơ đồ Venn của các bảng thành phần, phép nối đầy đủ cho phép bạn biểu diễn toàn bộ cả hai vòng tròn thành phần. Giao điểm của hai đườ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 vòng tròn bên ngoài vùng chồng lấp sẽ có các giá trị từ bảng mà chúng thuộc về, sử dụng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

tự tham gia

Tự nối là bất kỳ phép nối 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 ngay lập tức 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ể thực hiện 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 gồm

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

67, thì mỗi hàng có thể chứa một cột

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

68 tham chiếu đến

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

67 khác trong bảng. Tự nối sẽ cho phép bạn ghép các hàng khác nhau này lại với nhau bằng cách nối phiên bản thứ hai của bảng với phiên bản đầu tiên nơi các giá trị này khớp với nhau

Vì bản thân tham chiếu cùng một bảng hai lần, bí danh bảng được yêu cầu để phân biệt các tham chiếu. Ví dụ, trong ví dụ trên, bạn có thể tham gia hai phiên bản của bảng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

67 bằng bí danh

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

01 và

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

02. Bằng cách đó, bạn có thể chỉ định phiên bản nào của bảng mà bạn đang đề cập đến khi xác định điều kiện nố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

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

1

tham gia điều kiện

Khi kết hợp các bảng, điều kiện kết hợp xác định cách các hàng sẽ được kết hợ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 để phép nối xảy ra trên hàng đó

Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03. Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03 sử dụng 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 thời điểm có thể xảy ra phép nối. MySQL sử dụng các cột được cung cấp để ghép các hàng từ mỗi bảng lại với nhau

Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03 trông như thế này

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

7

Ở đây, các hàng từ

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

08 và

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

20 từ

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

08 khớp với cột

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

22 từ

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

09. Vì sử dụng phép nối bên trong nên kết quả sẽ chỉ hiển thị các hàng đã được nối. Vì truy vấn sử dụng ký tự đại diện

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

24 nên 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

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

20 từ

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

08 và cột

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

22 từ

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

09 sẽ được hiển thị, mặc dù chúng có cùng giá trị chính xác do thỏa mãn điều kiện nối. Bạn có thể tránh sự trùng lặp này bằng cách gọi ra các cột chính xác mà 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

Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

10

Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

10 là cách viết tắt để chỉ định các điều kiện của mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03 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. Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

10 lấy một danh sách, được đặt trong ngoặc đơn, các tên cột dùng chung cần được so sánh

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

5

Phép nối này kết hợp

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

08 với

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

09 khi hai cột mà cả hai bảng chia sẻ [

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

20 và

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

18] mỗi cột có giá trị khớp

Sự tham gia tương tự này có thể được diễn đạt chi tiết hơn bằng cách sử dụng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03 như thế nà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

1

Mặc dù cả hai phép nối trên sẽ dẫn đến các hàng giống nhau được tạo với cùng một dữ liệu hiện tại, nhưng chúng sẽ được hiển thị hơi khác nhau. Trong khi mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

10 sẽ loại bỏ các cột trùng lặp. Vì vậy, thay vì có hai cột

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

20 riêng biệt và hai cột

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

18 riêng biệt [một cột cho mỗi bảng], kết quả sẽ chỉ có một trong số các cột được chia sẻ, tiếp theo là tất cả các cột khác được cung cấp bởi

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

08 và

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

09

Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

76

Mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

76 là một cách viết tắt khác có thể làm giảm thêm tính dài dòng của mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

10. Tham gia

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

76 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ột phù hợp trong mỗi cơ sở dữ liệu

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

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

76 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 cả

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

08 và

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

09 đều có các cột có tên là

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

20,

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

18 và

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

55, thì truy vấn trên sẽ tương đương với truy vấn này bằng cách sử dụng mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03

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

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

10

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

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

10, mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

76 loại bỏ các cột trùng lặp, do đó sẽ chỉ có một phiên bản duy nhất của mỗi cột được nối trong kết quả

Mặc dù mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

Tham gia điều kiện và mệnh đề

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

11

Các điều kiện tham gia 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 mệnh đề

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

11. Cả hai cấu trúc đều xác định các biểu thức phải đánh giá là đúng đối với hàng được xem xét. Do đó, không phải lúc nào cũng trực quan về sự khác biệt giữa việc bao gồm các phép so sánh bổ sung trong cấu trú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

11 so với việc xác định chúng trong chính mệnh đề nối

Để 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 nối được xử lý trước để xây dựng bảng nối ảo trong bộ nhớ. Sau giai đoạn này, các biểu thức trong mệnh đề

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

11 được đánh giá để lọc các hàng kết quả

Ví dụ, giả sử rằng chúng ta có hai bảng tên 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

15 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

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

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

17 với cột

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

18. Ngoài ra, chúng tôi quan tâm đến các hàng trong bả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

16 có

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

00 trên 12345

Với 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 ta thể hiện những điều kiện này sẽ quyết định kết quả chúng ta nhận được

Đầu tiên, hãy sử dụng cả hai làm điều kiện tham gia cho một

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

Các 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 thao tác sau

  1. Kết hợp bất kỳ hàng nào trong bả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

    15 với bả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

    16 trong đó
    • 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

      17 trận đấu

      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 phù hợp với 12345
  2. Bởi vì chúng tôi đang sử dụng nối trái, bao gồm bất kỳ hàng nào chưa khớp từ bảng bên trái [

    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

    15], đệm các cột từ bảng bên phải [

    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

    16] với giá trị

    SELECT

    *

    FROM

    table_1

    [INNER] JOIN table_2

    ON table_1.id = table_2.table_1_id;

    60
  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 khớp với cả hai điều kiện mà chúng tôi đang tìm kiếm. Tuy nhiên, phép nối 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 nối. Điều này dẫn đến các hàng "còn sót lạ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 đề

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

11, thay vì đưa nó vào làm điều kiện nối, chúng ta sẽ nhận được kết quả khác

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ự thực hiện so sánh 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 ________ 615 với bảng ________ 616 trong đó _________ 617 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 nối trái, bao gồm bất kỳ hàng nào chưa khớp từ bảng bên trái [

    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

    15], đệm các cột từ bảng bên phải [

    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

    16] với giá trị

    SELECT

    *

    FROM

    table_1

    [INNER] JOIN table_2

    ON table_1.id = table_2.table_1_id;

    60
  3. Đánh giá mệnh đề

    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

    11 để xóa bất kỳ hàng nào không có 12345 làm giá trị cho cột

    SELECT

    *

    FROM

    table_1

    [INNER] JOIN table_2

    ON table_1.id = table_2.table_1_id;

    06
  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

Lần này, mặc dù chúng ta đang sử dụng phép nối trái, mệnh đề

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

11 cắt ngắn kết quả bằng cách lọc ra tất cả các hàng không có đúng

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

00. Bởi vì bất kỳ hàng chưa khớp 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

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

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

Hiểu 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 được một số lỗi dễ mắc nhưng khó sửa khi bạn làm việc với dữ liệu của mình

Phần kết luận

Trong bài viết này, chúng ta đã thảo luận về phép nối là gì và cách MySQL triển khai 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 phép nối khác nhau có sẵn và cách mà các điều kiện khác nhau như mệnh đề

SELECT

*

FROM

table_1

[INNER] JOIN table_2

ON table_1.id = table_2.table_1_id;

03 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

11 ả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 phép nối, 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à nguyên tắc tổ chức và cân nhắc hiệu suất có thể tách biệt. Tìm hiểu cách sử dụng hiệu quả các liên kết có thể giúp bạn tập hợp dữ liệu bất kể dữ liệu đó được tổ chức như thế nào trong hệ thống

LIÊN QUAN ĐẾN PRISMA. IO

Prisma cho phép bạn xác định mối quan hệ giữa các mô hình trong tệp lược đồ Prisma. Sau đó, bạn có thể sử dụng các truy vấn quan hệ để làm việc với dữ liệu mở rộng trên nhiều mô hình

Làm cách nào để kết nối hai bảng trong SQL?

Làm cách nào để tham gia hai bàn? .
Chỗ nối bên trái. Tham gia bên trái = Tất cả các hàng từ bảng bên trái + Tham gia INNER. Ví dụ. .
QUYỀN tham gia. RIGHT Join = Tất cả các hàng từ RIGHT table + INNER Join. .
INNER Tham gia. Tham gia bên trong = Tất cả các hàng chung từ cả hai bảng. .
ĐẦY ĐỦ BÊN NGOÀI Tham gia. FULL OUTER Tham gia = Tất cả các hàng từ cả hai bảng

Các cách khác nhau để tham gia các bảng trong MySQL là gì?

Các loại tham gia được hỗ trợ trong MySQL .
THAM GIA BÊN TRONG. Trả về các bản ghi có giá trị khớp trong cả hai bảng
CHỖ NỐI BÊN TRÁI. 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
QUYỀN 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 cách nào để tham gia nhiều bảng trong MySQL?

Có thể sử dụng nhiều câu lệnh nối với nhau để nối nhiều bảng cùng lúc. Để làm điều đó, bạn thêm câu lệnh INNER JOIN thứ hai và câu lệnh ON thứ hai để chỉ ra bảng thứ ba và mối quan hệ thứ hai .

Làm cách nào để kết nối bảng với cơ sở dữ liệu?

Để liên kết đến dữ liệu, hãy mở cơ sở dữ liệu đích. Trên tab Dữ liệu Ngoài, trong nhóm Nhập & Liên kết, hãy bấm vào Cơ sở dữ liệu ODBC. Bấm vào Liên kết đến nguồn dữ liệu bằng cách tạo bảng được liên kết, rồi bấm vào OK. Trong hộp thoại Chọn nguồn dữ liệu, bấm vào nút

Chủ Đề