Chúng ta có thể sử dụng cú pháp của MySQL JOIN để nối hai bảng vào hàm PHP – mysql_query[]. Hàm này được sử dụng để thực thi lệnh SQL và sau đó là một hàm PHP khác – mysql_fetch_array[] có thể được sử dụng để tìm nạp tất cả dữ liệu đã chọn
Để minh họa nó, chúng ta có ví dụ sau -
Ví dụ
Trong ví dụ này, chúng tôi đang sử dụng hai bảng MySQL có dữ liệu sau -
mysql> SELECT * FROM tcount_tbl; +-----------------+----------------+ | tutorial_author | tutorial_count | +-----------------+----------------+ | mahran | 20 | | mahnaz | NULL | | Jen | NULL | | Gill | 20 | | John Poul | 1 | | Sanjay | 1 | +-----------------+----------------+ 6 rows in set [0.01 sec] mysql> SELECT * from tutorials_tbl; +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 1 | Learn PHP | John Poul | 2007-05-24 | | 2 | Learn MySQL | Abdul S | 2007-05-24 | | 3 | JAVA Tutorial | Sanjay | 2007-05-06 | +-------------+----------------+-----------------+-----------------+ 3 rows in set [0.00 sec]
Bây giờ, sau đây là tập lệnh PHP sẽ nối các bảng để chọn tất cả các tác giả từ bảng tutorials_tbl và sẽ chọn số lượng hướng dẫn tương ứng từ tcount_tbl
MySQL JOINS được sử dụng với câu lệnh SELECT. Nó được sử dụng để lấy dữ liệu từ nhiều bảng. Nó được thực hiện bất cứ khi nào bạn cần tìm nạp bản ghi từ hai bảng trở lên
Có ba loại tham gia MySQL
- MySQL INNER THAM GIA [hoặc đôi khi được gọi là tham gia đơn giản]
- MySQL LEFT OUTER JOIN [hoặc đôi khi được gọi là LEFT JOIN]
- MySQL RIGHT OUTER JOIN [hoặc đôi khi được gọi là RIGHT JOIN]
THAM GIA Bên trong MySQL [Tham gia đơn giản]
MySQL INNER JOIN được sử dụng để trả về tất cả các hàng từ nhiều bảng khi điều kiện nối được thỏa mãn. Đây là kiểu nối phổ biến nhất
cú pháp
Hình ảnh đại diện
Hãy lấy một ví dụ
Xét 2 bảng "sĩ quan" và "sinh viên", có dữ liệu sau
Thực hiện truy vấn sau
đầu ra
MySQL Left Outer Tham gia
LEFT OUTER JOIN trả về tất cả các hàng từ bảng bên trái được chỉ định trong điều kiện BẬT và chỉ những hàng từ bảng khác nơi điều kiện nối được đáp ứng
cú pháp
Hình ảnh đại diện
Hãy lấy một ví dụ
Xét 2 bảng "sĩ quan" và "sinh viên", có dữ liệu sau
Thực hiện truy vấn sau
đầu ra
MySQL Right Outer Tham gia
MySQL Right Outer Join trả về tất cả các hàng từ bảng bên PHẢI được chỉ định trong điều kiện BẬT và chỉ những hàng từ bảng khác nơi điều kiện tham gia của anh ta được đáp ứng
Ghi chú. THAM GIA là chủ đề bị hiểu lầm nhiều nhất trong số những người học SQL. Để đơn giản và dễ hiểu, chúng tôi sẽ sử dụng Cơ sở dữ liệu mới để thực hành mẫu. Như hình dưới đây
idfirst_namelast_namemovie_id1AdamSmith12RaviKumar23SusanDavidson54JennyAdrianna85LeePong10
idtitlecategory1ASSASSIN'S CREED. EMBERSAHoạt hình2Real Steel[2012]Hoạt hình3Alvin and the ChipmunksHoạt hình4Cuộc phiêu lưu của Tin TinHoạt hình5Safe [2012]Hành động6Safe House[2012]Hành động7GIA18+8Hạn chót 200918+9The Dirty Picture18+10Marley và tôiLãng mạn
Các loại tham gia
THAM GIA chéo
Cross THAM GIA là một hình thức THAM GIA đơn giản nhất khớp từng hàng từ một bảng cơ sở dữ liệu với tất cả các hàng của một bảng khác
Nói cách khác, nó cung cấp cho chúng ta sự 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 lấy tất cả các bản ghi thành viên so với tất cả các bản ghi phim, chúng tôi có thể sử dụng tập lệnh được hiển thị bên dưới để có được kết quả mong muốn
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
THAM GIA BÊN TRONG
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 lấy danh sách các thành viên đã thuê phim cùng với tên phim mà họ đã thuê. Bạn chỉ có thể sử dụng INNER THAM GIA cho điều đó, trả về các hàng từ cả hai bảng thỏa mãn 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 thi đoạn script 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 ý tập lệnh 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`
THAM GIA bên ngoài
MySQL Outer THAM GIA trả về tất cả các bản ghi phù hợp từ cả hai bảng
Nó có thể phát hiện các bản ghi không 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?
CHỖ NỐI BÊN TRÁI
Giả sử bây giờ bạn muốn lấy 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ố phim chưa được ai thuê. Chúng tôi chỉ có thể sử dụng LEFT JOIN cho mục đích
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`
Thực thi đoạn script trên trong bàn làm việc của MySQL mang lại. 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ê, trường tên thành viên có giá trị NULL. Điều đó có nghĩa là không có thành viên phù hợp nào tìm thấy bảng thành viên cho 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
QUYỀN THAM GIA
RIGHT JOIN rõ ràng là đối lập 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ả phù hợp trong bảng bên trái, NULL được trả về
Trong ví dụ của chúng ta, 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
Thực thi đoạn script trên trong bàn làm việc của MySQL sẽ 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 Note: Null is returned for non-matching rows on left
Mệnh đề “ON” và “USING”
Trong các ví dụ về truy vấn THAM GIA ở trên, chúng ta đã sử dụng mệnh đề ON để khớp các bản ghi giữa các bảng
Mệnh đề USING cũng có thể được sử dụng cho mục đích tương tự. Sự khác biệt với USING là nó cần phải có tên giống hệt nhau cho các cột phù hợ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 đã gọi tương tự trong bảng "thành viên" với tên "movie_id"
Hãy đổi tên bảng “phim” trường “id” thành tên “movie_id”. Chúng tôi làm điều này để có tên trường phù hợp giống hệt nhau
SELECT * FROM `movies` CROSS JOIN `members`0
Tiếp theo, hãy sử dụng USING với ví dụ LEFT JOIN ở trên
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 100
Ngoài việc sử dụng BẬT và SỬ DỤNG với THAM GIA, bạn có thể sử dụng nhiều mệnh đề MySQL khác như GROUP BY, WHERE và thậm chí các hàm như SUM, AVG, v.v.
Tại sao chúng ta nên sử dụng phép nối?
Bây giờ bạn có thể nghĩ, tại sao chúng ta sử dụng THAM GIA 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 khi sử dụng THAM GIA, 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 THAM GIA vì nó có thể sử dụng Lập chỉ mục. Chỉ cần sử dụng một truy vấn THAM GIA thay vì chạy nhiều truy vấn sẽ làm giảm chi phí máy chủ. Thay vào đó, sử dụng nhiều truy vấn dẫn đến nhiều chuyển dữ liệu hơn giữa MySQL và các ứng dụng [phần mềm]. Hơn nữa, nó cũng yêu cầu nhiều thao tác dữ liệu hơn ở cuối ứng dụng