Các loại Join
CROSS JOIN
Cross Join là một hình thức JOIN đơn giản nhất khớp với từng hàng từ một bảng cơ sở dữ liệu với tất cả các hàng khác.
Nói cách khác, nó cung cấp cho chúng ta kết hợp của từng hàng của bảng đầu tiên với tất cả các bản ghi trong bảng thứ hai.
Giả sử chúng tôi muốn có được tất cả các hồ sơ thành viên chống lại tất cả các hồ sơ phim, chúng tôi có thể sử dụng kịch bản hiển thị bên dưới để có được kết quả mong muốn của chúng tôi.
SELECT * FROM `movies` CROSS JOIN `members`
Thực thi đoạn script trên trong bàn làm việc của MySQL cho chúng ta kết quả như sau.
id | title | | id | first_name | last_name | movie_id |
1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
7 | GIA | 18+ | 1 | Adam | Smith | 1 |
7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
7 | GIA | 18+ | 6 | Lee | Pong | 10 |
8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INNER JOIN
THAM GIA bên trong được sử dụng để trả về các hàng từ cả hai bảng thỏa mãn điều kiện đã cho.
Giả sử, bạn muốn có được danh sách các thành viên đã thuê phim cùng với các tựa phim được họ thuê. Bạn chỉ có thể sử dụng INNER JOIN cho điều đó, trả về các hàng từ cả hai bảng thỏa mãn với các điều kiện đã cho.
SELECT members.`first_name` , members.`last_name` , movies.`title`
FROM members ,movies
WHERE movies.`id` = members.`movie_id`
Thực hiện các kịch bản trên cho
first_name | last_name | title |
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
Lưu ý kịch bản kết quả trên cũng có thể được viết như sau để đạt được kết quả tương tự.
SELECT A.`first_name` , A.`last_name` , B.`title`
FROM `members`AS A
INNER JOIN `movies` AS B
ON B.`id` = A.`movie_id`
OUTER JOIN
Outer Join trả về tất cả các bản ghi khớp từ cả hai bảng.
Nó có thể phát hiện các bản ghi không có kết quả khớp trong bảng đã tham gia. Nó trả về giá trị NULL cho các bản ghi của bảng đã tham gia nếu không tìm thấy kết quả khớp.
Nghe có vẻ khó hiểu? Hãy xem xét một ví dụ -
LEFT JOIN
Giả sử bây giờ bạn muốn có được tiêu đề của tất cả các bộ phim cùng với tên của các thành viên đã thuê chúng. Rõ ràng là một số bộ phim đã không được thuê bởi bất kỳ ai. Chúng ta chỉ đơn giản có thể sử dụng LEFT JOIN cho mục đích này.
LEFT JOIN trả về tất cả các hàng từ bảng bên trái ngay cả khi không tìm thấy hàng phù hợp trong bảng bên phải. Trường hợp không tìm thấy kết quả phù hợp trong bảng bên phải, NULL được trả về.
SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
ON B.`movie_id` = A.`id`
Bạn có thể thấy rằng trong kết quả trả về được liệt kê bên dưới, đối với các phim không được thuê, các trường tên thành viên đang có giá trị NULL. Điều đó có nghĩa không có thành viên phù hợp với tìm thấy bảng thành viên cho rằng bộ phim cụ thể.
title | first_name | last_name |
ASSASSIN'S CREED: EMBERS | Adam | Smith |
Real Steel(2012) | Ravi | Kumar |
Safe (2012) | Susan | Davidson |
Deadline(2009) | Jenny | Adrianna |
Marley and me | Lee | Pong |
Alvin and the Chipmunks | NULL | NULL |
The Adventures of Tin Tin | NULL | NULL |
Safe House(2012) | NULL | NULL |
GIA | NULL | NULL |
The Dirty Picture | NULL | NULL |
Note: Null is returned for non-matching rows on right
RIGHT JOIN
RIGHT JOIN rõ ràng là trái ngược với LEFT JOIN. RIGHT JOIN trả về tất cả các cột từ bảng bên phải ngay cả khi không tìm thấy hàng phù hợp trong bảng bên trái. Trường hợp không tìm thấy kết quả trùng khớp trong bảng bên trái, NULL được trả về.
Trong ví dụ của chúng tôi, hãy giả sử rằng bạn cần lấy tên của các thành viên và phim do họ thuê. Bây giờ chúng tôi có một thành viên mới chưa thuê bất kỳ bộ phim nào
SELECT A.`first_name` , A.`last_name`, B.`title`
FROM `members` AS A
RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Thực thi đoạn script trên trong bàn làm việc của MySQL cho kết quả như sau.
first_name | last_name | title |
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
NULL | NULL | Alvin and the Chipmunks |
NULL | NULL | The Adventures of Tin Tin |
NULL | NULL | Safe House(2012) |
NULL | NULL | GIA |
NULL | NULL | The Dirty Picture |
| | |
Lưu ý: Null được trả về cho các hàng không khớp ở bên trái
Mệnh đề "ON" và "USING"
Trong các ví dụ truy vấn THAM GIA ở trên, chúng tôi đã sử dụng mệnh đề ON để khớp với các bản ghi giữa bảng.
Điều khoản sử dụng cũng có thể được sử dụng cho cùng một mục đích. Sự khác biệt với SỬ DỤNG là nó cần phải có tên giống hệt nhau cho các cột khớp trong cả hai bảng.
Trong bảng "phim" cho đến nay, chúng tôi đã sử dụng khóa chính của nó với tên "id". Chúng tôi đã đề cập đến cùng trong bảng "thành viên" với tên "movie_id".
Hãy đổi tên trường "phim" bảng "id" để có tên "movie_id". Chúng tôi làm điều này để có tên trường trùng khớp.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Tiếp theo, hãy sử dụng SỬ DỤNG với ví dụ TRÊN TRÁI trên.
SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
USING ( `movie_id` )
Ngoài việc sử dụng ON và USING with JOINs, bạn có thể sử dụng nhiều mệnh đề MySQL khác như GROUP BY, WHERE và thậm chí các chức năng như SUM , AVG , v.v.
Tại sao chúng ta nên sử dụng JOIN?
Bây giờ bạn có thể nghĩ, tại sao chúng ta sử dụng JOIN khi chúng ta có thể thực hiện cùng một tác vụ chạy truy vấn. Đặc biệt nếu bạn có một số kinh nghiệm về lập trình cơ sở dữ liệu, bạn biết rằng chúng ta có thể chạy từng truy vấn một, sử dụng đầu ra của từng truy vấn liên tiếp. Tất nhiên, điều đó là có thể. Nhưng bằng cách sử dụng JOIN, bạn có thể hoàn thành công việc bằng cách chỉ sử dụng một truy vấn với bất kỳ tham số tìm kiếm nào.
Mặt khác, MySQL có thể đạt được hiệu suất tốt hơn với JOIN vì nó có thể sử dụng Lập chỉ mục. Chỉ cần sử dụng truy vấn JOIN duy nhất thay vì chạy nhiều truy vấn sẽ giảm chi phí máy chủ. Thay vào đó, sử dụng nhiều truy vấn sẽ dẫn đến việc chuyển nhiều dữ liệu hơn giữa MySQL và các ứng dụng (phần mềm). Hơn nữa, nó đòi hỏi nhiều thao tác dữ liệu hơn trong ứng dụng cuối cùng.
Rõ ràng là chúng ta có thể đạt được hiệu suất ứng dụng và MySQL tốt hơn bằng cách sử dụng JOIN
Tóm lược
- JOIN cho phép chúng tôi kết hợp dữ liệu từ nhiều hơn một bảng vào một tập kết quả.
- JOIN có hiệu suất tốt hơn so với các truy vấn phụ
- INNER JOINS chỉ trả về các hàng đáp ứng các tiêu chí nhất định.
- OUTER JOINS cũng có thể trả về các hàng mà không tìm thấy kết quả khớp nào. Các hàng chưa từng có được trả về với từ khóa NULL.
- Các loại JOIN chính bao gồm Nội, Bên trái, Bên ngoài Bên phải, THAM GIA chéo, v.v.
- Mệnh đề thường được sử dụng trong các hoạt động JOIN là "ON". Mệnh đề "USING" yêu cầu các cột khớp phải cùng tên.
- JOINS cũng có thể được sử dụng trong các mệnh đề khác, chẳng hạn như GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS etc.
Đăng nhận xét