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
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ị
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
8, chỉ
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
9 hoặc
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
0. Đối với các hệ thống cơ sở dữ liệu khá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
8 và
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
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
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à
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
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
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
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
Cú pháp cơ bản của phép nối trái tuân theo mẫu này
6
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
60 làm giá trị cho tất cả các cột trong bảng thứ hai
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Cú pháp cơ bản của nối phải tuân theo mẫu này
0
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
60 làm giá trị cho tất cả các cột trong bảng đầu tiên
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
2
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
60 làm giá trị cho tất cả các cột trong bảng chưa khớp
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
60 để điền vào các cột được tìm thấy trong bảng khác
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Đâ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ý
1
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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 đề
03
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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 đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Mệnh đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Cú pháp cơ bản của mệnh đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Ở đây, các hàng từ
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ị
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Điều này có nghĩa là cả cột
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Mệnh đề
10
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Mệnh đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Cú pháp chung của mệnh đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Phép nối này kết hợp
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
03 như thế này
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
1
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
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 đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Mệnh đề
76
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Mệnh đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Cú pháp chung của mệnh đề tham gia
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Giả sử rằng cả
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Và truy vấn này sử dụng mệnh đề
10
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
2
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Giống như mệnh đề
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ả
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Mặc dù mệnh đề
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Tham gia điều kiện và mệnh đề
11
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
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 đề
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
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
Để 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 đề
11 được đánh giá để lọc các hàng kết quả
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
Ví dụ, giả sử rằng chúng ta có hai bảng tên là
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ó
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
00 trên 12345
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
9
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Các kết quả có khả năng trông giống như thế này
4
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
MySQL đạt được kết quả này bằng cách thực hiện các thao tác sau
- Kết hợp bất kỳ hàng nào trong bảng
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
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
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
- 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 [
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ị
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
60
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
- Chỉ hiển thị các cột được liệt kê trong đặc tả cột
7
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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 [
06 = 12345] sang mệnh đề
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Lần này, chỉ có ba hàng được hiển thị
6
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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
- 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
05
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
- 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 [
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ị
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
60
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
- Đánh giá mệnh đề
11 để xóa bất kỳ hàng nào không có 12345 làm giá trị cho 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
06
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
- Chỉ hiển thị các cột được liệt kê trong đặc tả cột
7
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
Lần này, mặc dù chúng ta đang sử dụng phép nối trái, mệnh đề
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
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
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
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
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 đề
03 và
SELECT
*
FROM
table_1
[INNER] JOIN table_2
ON table_1.id = table_2.table_1_id;
11 ảnh hưởng đến cách cơ sở dữ liệu xây dựng kết quả
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
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ảngCá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ảngCHỖ 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ảiQUYỀ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áiLà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