MySQL - Full Join
Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng lặn sâu vào thế giới thú vị của MySQL và khám phá một công cụ mạnh mẽ trong bộ công cụ SQL của chúng ta: Full Join. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng bước qua khái niệm này, cũng như tôi đã làm cho hàng trăm học viên trong những năm dạy học của mình. Vậy, hãy lấy một cốc cà phê (hoặc trà, nếu đó là sở thích của bạn), và cùng nhau bắt đầu hành trình học tập này nhé!
Full Join là gì?
Trước khi chúng ta nhảy vào chi tiết của Full Joins trong MySQL, hãy bắt đầu với một ví dụ đơn giản. Hãy tưởng tượng bạn đang lên kế hoạch cho một buổi tiệc, và bạn có hai danh sách khách: một từ bạn thân và một từ anh chị em ruột. Full Join giống như việc kết hợp hai danh sách này theo cách bao gồm tất cả mọi người từ cả hai danh sách, ngay cả khi họ chỉ xuất hiện trong một danh sách.
Trong thuật ngữ cơ sở dữ liệu, Full Join kết hợp các hàng từ hai hoặc nhiều bảng dựa trên một cột liên quan giữa chúng, bao gồm tất cả các hàng từ tất cả các bảng, ngay cả khi không có sự khớp trong các bảng khác.
Cú pháp
Dưới đây là cú pháp cơ bản cho một Full Join trong SQL:
SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;
Bây giờ, tôi几乎可以 nghe thấy bạn nói, "Nhưng đợi đã! MySQL không có từ khóa FULL JOIN!" Và bạn hoàn toàn đúng! MySQL không hỗ trợ trực tiếp FULL JOIN, nhưng đừng lo lắng - chúng ta có một giải pháp thông minh bằng cách sử dụng UNION. Hãy cùng khám phá chi tiết.
MySQL Full Join (Sử dụng UNION)
Since MySQL doesn't have a built-in FULL JOIN, we can simulate it using a combination of LEFT JOIN and RIGHT JOIN with UNION. Here's how it works:
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
UNION
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.id = t2.id;
Hãy phân tích điều này:
- Chúng ta thực hiện một LEFT JOIN để lấy tất cả các hàng từ table1, cùng với các hàng khớp từ table2.
- Sau đó, chúng ta UNION với một RIGHT JOIN, lấy tất cả các hàng từ table2, cùng với các hàng khớp từ table1.
- UNION kết hợp kết quả này, hiệu quả như một FULL JOIN.
Ví dụ thực tế
Để làm rõ hơn, hãy sử dụng một ví dụ thực tế. Hãy tưởng tượng chúng ta đang quản lý một thư viện nhỏ và chúng ta có hai bảng: books
và borrowers
.
Đầu tiên, hãy tạo các bảng này:
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);
CREATE TABLE borrowers (
borrower_id INT PRIMARY KEY,
book_id INT,
borrower_name VARCHAR(100)
);
INSERT INTO books VALUES (1, 'To Kill a Mockingbird', 'Harper Lee');
INSERT INTO books VALUES (2, '1984', 'George Orwell');
INSERT INTO books VALUES (3, 'Pride and Prejudice', 'Jane Austen');
INSERT INTO borrowers VALUES (1, 1, 'Alice');
INSERT INTO borrowers VALUES (2, NULL, 'Bob');
INSERT INTO borrowers VALUES (3, 4, 'Charlie');
Bây giờ, hãy thực hiện Full Join:
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id;
Truy vấn này sẽ trả về kết quả sau:
book_id | title | borrower_id | borrower_name |
---|---|---|---|
1 | To Kill a Mockingbird | 1 | Alice |
2 | 1984 | NULL | NULL |
3 | Pride and Prejudice | NULL | NULL |
NULL | NULL | 2 | Bob |
NULL | NULL | 3 | Charlie |
Hãy phân tích kết quả này:
- Chúng ta thấy tất cả các sách, ngay cả những sách không được mượn (như '1984' và 'Pride and Prejudice').
- Chúng ta thấy tất cả các người mượn, ngay cả những người không đang mượn sách (như Bob).
- Chúng ta thậm chí còn thấy Charlie, người đang mượn một sách không có trong bảng
books
của chúng ta (book_id 4).
Đây là sức mạnh của Full Join - nó cung cấp cho chúng ta một bức tranh toàn diện về dữ liệu của chúng ta, nổi bật cả các khớp và không khớp giữa các bảng.
Full Join với WHERE Clause
Đôi khi, chúng ta có thể muốn lọc kết quả Full Join của mình. Chúng ta có thể làm điều này bằng cách thêm một WHERE clause vào truy vấn của mình. Ví dụ, hãy nói chúng ta muốn tìm tất cả các sách không được mượn:
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
WHERE br.borrower_id IS NULL
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id
WHERE b.book_id IS NULL;
Truy vấn này sẽ trả về:
book_id | title | borrower_id | borrower_name |
---|---|---|---|
2 | 1984 | NULL | NULL |
3 | Pride and Prejudice | NULL | NULL |
NULL | NULL | 2 | Bob |
NULL | NULL | 3 | Charlie |
Kết quả này cho thấy:
- Các sách không được mượn ('1984' và 'Pride and Prejudice')
- Các người mượn không đang mượn sách (Bob)
- Các người mượn đang mượn một sách không có trong bảng
books
của chúng ta (Charlie)
Kết luận
Và thế là chúng ta đã đến đây, các học viên yêu quý! Chúng ta đã cùng nhau hành trình qua thế giới Full Joins trong MySQL, từ việc hiểu khái niệm đến việc thực hiện nó với các ví dụ thực tế. Nhớ rằng, trong khi MySQL không có FULL JOIN内置, chúng ta có thể đạt được cùng kết quả bằng cách sử dụng sự kết hợp của LEFT JOIN, RIGHT JOIN và UNION.
Full Joins vô cùng hữu ích khi bạn cần xem tất cả dữ liệu từ nhiều bảng, bất kể có sự khớp giữa chúng hay không. Chúng giống như người bạn thân thiện trong buổi tiệc, đảm bảo rằng mọi người đều tham gia, bất kể họ có biết nhau hay không!
Trong hành trình MySQL tiếp theo của bạn, hãy tiếp tục thực hành với các tình huống khác nhau. Càng chơi với các khái niệm này, bạn sẽ càng thoải mái hơn. Và谁知道呢? Bạn có thể trở thành chuyên gia cơ sở dữ liệu được bạn bè tin tưởng!
Chúc các bạn lập trình vui vẻ, và hy vọng các truy vấn của bạn luôn trả về kết quả mà bạn mong muốn!
Credits: Image by storyset