Trong phần trước của loạt bài về MySQL này, tôi đã trình bày cách bạn có thể tìm nạp dữ liệu bằng cách sử dụng các mệnh đề MySQL. Trong phần này chúng ta sẽ tìm hiểu về hàm Joins trong MySQL, tại sao chúng được sử dụng và cách sử dụng chúng. Hãy bắt đầu.
Làm cách nào để tôi có thể liên kết hai bảng trong MySQL
MySQL Joins cho phép bạn truy cập dữ liệu từ nhiều bảng. Một MySQL Join được thực hiện bất cứ khi nào hai hoặc nhiều bảng được nối trong một câu lệnh SQL. MySQL Joins bao gồm:MySQL Inner Join (còn được gọi là Simple Join), MySQL Left Outer Join (còn được gọi là Left Join, nó trả về các bản ghi phù hợp từ bảng bên trái), Right Join (điều này trả về các bản ghi phù hợp từ bảng bên phải) và Tham gia đầy đủ (điều này trả về các bản ghi phù hợp từ tất cả các bảng). Sử dụng MySQL JOINs, bạn sẽ có thể tham gia nhiều hơn hai bảng.
Trong MySQL, phép nối bên trong là phép nối mặc định. Trên các từ khóa nhất định tại thời điểm đó, nó chọn tất cả các hàng từ cả hai bảng, miễn là có một tọa độ giữa các cột trong cả hai bảng.
Không giống như SQL, MySQL không coi Outer Join là một loại Join riêng biệt. Để có được kết quả tương tự như Tham gia bên ngoài, bạn cần tham gia Tham gia bên ngoài bên trái và Tham gia bên ngoài bên phải.
Có thể kết hợp bao nhiêu bảng trong MySQL
Theo tài liệu chính thức của MySQL 8.0, số lượng bảng tối đa trong một câu lệnh JOIN là 61. Tuy nhiên, lưu ý rằng câu lệnh JOIN có thể yêu cầu nhiều tài nguyên máy chủ khi số lượng bảng tăng lên. Nếu đây là trường hợp của truy vấn của bạn, tôi thực sự khuyên bạn nên chia nó thành nhiều truy vấn để giảm tải trên máy chủ.
Chúng ta hãy bắt đầu bằng cách thêm một bảng mới vào cơ sở dữ liệu của chúng ta, bảng này sẽ chứa thông báo cùng với ID người dùng đã gửi thông báo này, chúng tôi sẽ đặt tên cho nó là các thông báo. Lược đồ trong bảng của chúng ta là:
TẠO BẢNG `thông báo` (
`id` int (11) KHÔNG ĐẦY ĐỦ,
`tin nhắn` varchar (255) KHÔNG ĐẦY ĐỦ
)
Chúng tôi sẽ sử dụng cùng một chức năng dữ liệu chọn mà chúng tôi đã tạo trong crud.php của chúng tôi tập tin. Bây giờ chúng ta hãy bắt đầu bằng cách tham gia hai bảng này. Bạn cũng có thể điền vào bảng của mình để có thể thực hành nó.
Ngừng lãng phí thời gian trên máy chủ
Cloudways xử lý việc quản lý máy chủ cho bạn để bạn có thể tập trung vào việc tạo ra các ứng dụng tuyệt vời và giữ cho khách hàng của bạn hài lòng.
Bắt đầu miễn phíTham gia bên trong
Nội dung Tham gia kết hợp bảng theo cách mà nó chỉ hiển thị những kết quả phù hợp với điều kiện được đưa ra và ẩn những kết quả khác. Cấu trúc của các truy vấn Tham gia bên trong là:
SELECT column_name
TỪ bảng1
INNER JOIN table2
BẬT table1.column_name =table2.column_name;
Tham gia nội bộ và tham gia đơn giản đều giống nhau. Bạn cũng có thể viết truy vấn của mình như sau:
SELECT column_name
TỪ bảng1
THAM GIA bảng2
BẬT table1.column_name =table2.column_name;
Bây giờ chúng ta hãy tìm nạp Tên và thông báo từ cơ sở dữ liệu của chúng ta bằng cách sử dụng phép nối bên trong. Truy vấn sẽ như thế này
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id";
CONCAT hàm được sử dụng để nối cột hai chuỗi trong MySQL. Bây giờ hãy mở index.php của bạn mà chúng tôi đã tạo trước đó, sao chép đoạn mã sau vào đó.
<table> <tr> <td> Name</td> <td> Email</td> <td> Message</td> <!-- <td> Message</td> <td> Date</td>!--> </tr> <?php include 'crud.php'; $sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id"; $result = selectdata($sql); if($result != "zero") { while($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; if($row['message'] === null){echo "<td>" . 'null'. "</td>";} else { echo "<td>" . $row['message']. "</td>"; } ; echo "</tr>"; } } else { echo $result; } ?> </table> ?>
Khi bạn chạy trang này trên máy chủ lưu trữ web PHP, kết quả của bạn sẽ giống như sau:
Như bạn có thể thấy rõ, nó chỉ trả về những kết quả khớp với user_id và nơi thông báo không rỗng.
THAM GIA ĐÚNG
RIGHT JOIN kết hợp hai bảng theo cách mà nó trả về tất cả giá trị từ bên phải và giá trị phù hợp từ các bảng bên trái và cũng trả về null trên bảng bên trái khi không tìm thấy kết quả phù hợp nào. Cấu trúc cho RIGHT JOIN là:
SELECT column_name
TỪ bảng1
QUYỀN THAM GIA bảng2
BẬT table1.column_name =table2.column_name;
Bây giờ, hãy để chúng tôi tìm nạp Tên và thông điệp từ cơ sở dữ liệu của chúng tôi tạo thành thông báo trong bảng bên phải của chúng tôi và myguests trong bảng bên trái của chúng tôi.
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests RIGHT JOIN messages ON messages.id = myguests.id";
Bây giờ hãy mở index.php và thay thế $ sql truy vấn với những điều trên. Khi bạn chạy nó, kết quả của bạn sẽ là:
Nếu bạn xem qua tin nhắn , bạn sẽ thấy một số ID sẽ không khớp với bất kỳ ID người dùng nào, đó là lý do tại sao truy vấn này trả về giá trị rỗng trong tên và cột email, nơi nó sẽ không tìm thấy bất kỳ khớp nào ở cột bên trái.
THAM GIA TRÁI
LEFT Joins tham gia vào hai bảng theo cách mà nó trả về tất cả giá trị từ bên trái và giá trị phù hợp từ các bảng bên phải và cũng trả về null trên bảng bên phải khi không tìm thấy kết quả phù hợp nào. Cấu trúc cho LEFT JOIN là:
SELECT column_name
TỪ bảng1
bảng THAM GIA TRÁI2
BẬT table1.column_name =table2.column_name;
Bây giờ, hãy để chúng tôi tìm nạp Tên và thông báo từ cơ sở dữ liệu của chúng tôi tạo thông báo trong bảng bên phải của chúng ta và myguest in bảng bên trái của chúng tôi.
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests LEFT JOIN messages ON messages.id = myguests.id";
Bây giờ, hãy mở index.php và truy vấn thay cho $ sql với những điều trên. Khi bạn chạy nó, kết quả của bạn sẽ là:
Nếu bạn xem qua tin nhắn , bạn sẽ tìm thấy một số ID sẽ không khớp với bất kỳ ID người dùng nào, đó là lý do tại sao truy vấn này trả về null trong cột Thông báo, nơi nó sẽ không tìm thấy bất kỳ kết quả phù hợp nào trong cột bên phải.
UNION
UNION trong MySQL được sử dụng để kết hợp nhiều cột từ các bảng khác nhau thành một cột duy nhất. Cấu trúc của truy vấn UNION để chọn các giá trị duy nhất là:
CHỌN (các) column_name TỪ bảng1
CÔNG ĐOÀN
CHỌN (các) tên cột TỪ table2;
Và để chọn các giá trị lặp lại từ các cột là:
CHỌN (các) column_name TỪ bảng1
LIÊN KẾT TẤT CẢ
CHỌN (các) tên cột TỪ table2;
Bây giờ, hãy để chúng tôi tìm nạp ID từ các bảng của chúng tôi.
$sql = "SELECT id FROM myguests UNION SELECT id FROM messages";
Bây giờ hãy mở index.php và thay thế $ sql truy vấn với những điều trên. Khi bạn chạy nó, kết quả của bạn sẽ là:
Truy vấn đã tìm nạp cho chúng tôi tất cả các ID duy nhất được tìm thấy trong cả hai bảng.
Cross JOIN hoặc Descartes Product
Loại JOIN này trả về tích cacte của các hàng từ các bảng trong Tham gia. Nó sẽ trả về một bảng bao gồm các bản ghi kết hợp mỗi hàng từ bảng đầu tiên với mỗi hàng của bảng thứ hai.
Cú pháp Cross JOIN là,
SELECT column-name-list from table-name1 CROSS JOIN table-name2;
TỰ THAM GIA
Tự tham gia là một phép nối thông thường, nhưng bảng được nối với chính nó.
SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
THAM GIA NGOÀI TRỜI ĐẦY ĐỦ
Từ khóa FULL OUTER JOIN trả về tất cả các bản ghi khi có sự trùng khớp trong bản ghi bảng bên trái (table1) hoặc bên phải (table2).
Lưu ý:FULL OUTER JOIN có thể trả về các tập kết quả rất lớn!
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Tham gia nhiều bảng
Trong các blog trước, bạn đã học cách nối hai bảng với nhau bằng cách sử dụng các truy vấn nối SQL khác nhau. Nhưng nếu bạn đang làm việc trên một ứng dụng lớn, tức là xây dựng một cửa hàng thương mại điện tử và tạo nhiều bảng trong đó, chẳng hạn như khách hàng, đơn đặt hàng và sản phẩm, thì sự phức tạp trong việc nối các bảng chắc chắn có thể phát sinh. Để sắp xếp điều này, bạn cần lấy tất cả các sản phẩm được đặt hàng bởi những khách hàng cụ thể. Lược đồ giống nhau, vì vậy tôi không khai báo nó ở đây. Hãy xem truy vấn:
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table1.id
Trước tiên, chúng tôi kết hợp bảng 1 và bảng 2, bảng này cung cấp một bảng tạm thời với dữ liệu kết hợp từ bảng1 và bảng2, tại thời điểm đó, bảng này được kết hợp với bảng3. Phương trình này có thể được mở rộng cho hơn 3 bảng thành N bảng, Bạn chỉ cần đảm bảo rằng truy vấn SQL phải có N-1 câu lệnh nối để sắp xếp nối N bảng.
Truy vấn trên sẽ cho phép bạn so khớp các hàng từ bảng1 (trong mọi trường hợp) với các hàng của hai bảng khác. Sử dụng LEFT JOIN cho phép bạn kết hợp table2 và table3 với table1 (không chỉ table2 với table1 và table3 với table2).
Bạn cũng có thể thêm các điều kiện như WHERE, AND và ORDERBY
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table2.id WHERE month = 'numberHere' AND (table2.email IS NOT NULL OR table3.email IS NOT NULL) ORDER BY submitdate DESC
Kết luận:
Trong hướng dẫn này, chúng ta đã tìm hiểu về các phép nối được sử dụng rất nhiều trong cơ sở dữ liệu quan hệ. Phép nối không chỉ được sử dụng cho hai bảng và bạn có thể nối nhiều hơn hai bảng bằng cách sử dụng cùng một kỹ thuật. Trong phần tám và phần cuối cùng của loạt bài về MySQL này, tôi sẽ thảo luận về cách sử dụng Biểu thức chính quy (REGEX) để tìm nạp và sắp xếp dữ liệu trong MySQL. Vì điều đó, hãy đăng ký bản tin blog của chúng tôi và bạn cũng có thể đăng ký Ngăn xếp PHP được quản lý của chúng tôi và bắt đầu thử nghiệm các hướng dẫn này trên các máy chủ được tối ưu hóa PHP của chúng tôi.
Các câu hỏi thường gặpQ. Làm cách nào để kết hợp hai bảng với nhau?
Trả lời: Nối hai bảng trong SQL có thể được thực hiện theo bốn cách chính:Nối bên trong (trả về các hàng có cột phù hợp), Nối trái (TẤT CẢ các bản ghi trong bảng bên trái và kết hợp các bản ghi trong bảng bên phải), Nối phải (TẤT CẢ các bản ghi trong bảng bên phải và khớp các bản ghi trong bảng bên trái) và Union (loại bỏ các bản sao).
Q. Bạn có thể sử dụng lệnh SQL nào để nối hai bảng?
Trả lời: Hai bảng có thể được kết hợp bằng cách sử dụng câu lệnh INNER JOIN trả về các bản ghi phù hợp từ cả hai bảng.
Q. Làm cách nào để nối hai bảng trong SQL mà không cần nối?
Trả lời: Bạn có thể sử dụng câu lệnh sau để nối các bảng mà không thực sự sử dụng câu lệnh JOIN
SELECT * FROM TableA a, TableB b