Thao tác JOIN là một kiến thức cơ bản trong SQL giúp chúng ta có thể kết hợp dữ liệu từ nhiều bảng khác nhau dựa theo những điều kiện cụ thể. Có nhiều loại JOIN phục vụ cho từng mục đích mà bạn cần hiểu rõ để có thể áp dụng đúng để xử lý một câu lệnh SQL hiệu quả. Bài viết hôm nay chúng ta cùng nhau tìm hiểu chi tiết về JOIN trong SQL và cụ thể cách sử dụng từng loại JOIN để có thể lấy được dữ liệu mong muốn khi truy vấn nhé.
JOIN trong SQL
Trong ngôn ngữ truy vấn có cấu trúc (SQL – Structured Query Language), JOIN là một thao tác được sử dụng để kết hợp hay nối (join) dữ liệu từ nhiều bảng có liên quan lại với nhau để tập hợp chúng thành kết quả mong muốn. Như ở ví dụ dưới đây, chúng ta có 2 bảng: 1 bảng chứa dữ liệu tên học sinh, 1 bảng chứa dữ liệu về môn học mà học sinh đấy đăng ký; chúng có liên kết với nhau bởi Student ID. Câu lệnh JOIN giúp chúng ta tạo ra được 1 bảng kết quả chứa danh sách gồm cả tên học sinh và môn học đăng ký.
Thao tác JOIN thường được sử dụng trong lệnh SELECT và đi kèm với điều kiện JOIN thông qua khai báo ON. Cú pháp như sau:
SELECT * FROM bang1 INNER JOIN bang2 ON bang1.cotId = bang2.cotId;
Trong đó:
- INNER JOIN: khai báo loại JOIN muốn thực hiện
- ON: khai báo mối liên hệ giữa các bảng, thông thường được định nghĩa trước theo khóa ngoài (foreign key)
Các loại JOIN trong SQL
Tùy thuộc vào mục đích lấy ra kết quả mong muốn, chúng ta có một số loại JOIN như dưới đây. Nó khá tương đồng với các phép toán tập hợp giúp bạn có thể nhớ dễ dàng hơn. Ví dụ như FULL OUTER JOIN là phép hợp, INNER JOIN chính là phép giao.
Chúng ta cùng đi chi tiết vào các loại JOIN trong SQL nhé. Để dễ hiểu và thực hành, hãy thao tác trực tiếp trên 2 bảng ví dụ sau đây:
Bảng 1: Tên khách hàng
Customer ID | Last Name |
1 | Gee |
2 | Harris |
3 | Carreras |
29485 | Abel |
29486 | Abercrombie |
29489 | Adams |
Bảng 2: Thành phố
Customer ID | City |
29485 | Van Nuys |
29486 | Branch |
29489 | Modesto |
1. INNER JOIN
INNER JOIN trả về các bản ghi có giá trị khớp trong cả 2 bảng.
Cú pháp:
SELECT * FROM Name (INNER) JOIN City ON Name.CustomerID = City.CustomerID
Kết quả nhận được:
Customer ID | Last Name | City |
29485 | Abel | Van Nuys |
29486 | Abercrombie | Branch |
29489 | Adams | Modesto |
Lưu ý: INNER JOIN giống với JOIN, từ khóa INNER là optional, bạn có thể thêm vào hoặc không.
2. LEFT JOIN/ RIGHT JOIN
LEFT JOIN trả về tất cả các bản ghi từ bảng bên trái và các giá trị thỏa mãn điều kiện từ bảng bên phải. Nếu không có giá trị thỏa mãn được tìm thấy, giá trị NULL sẽ được gán cho nó. Ngược lại với LEFT JOIN thì RIGHT JOIN sẽ lấy tất cả các bản ghi từ bảng bên phải kết hợp với các giá trị thỏa mãn điều kiện từ bảng bên phải.
Cú pháp:
SELECT * FROM Name LEFT JOIN City ON Name.CustomerID = City.Customer
SELECT * FROM City RIGHT JOIN Name ON Name.CustomerID = City.CustomerID
Ở đây bảng bên trái được hiểu là bảng có tên khai báo trước từ khóa JOIN, bảng bên phải sẽ nằm sau từ khóa JOIN.
Kết quả nhận được từ LEFT JOIN:
Customer ID | Last Name | City |
1 | Gee | Null |
2 | Harris | Null |
3 | Carreras | Null |
29485 | Abel | Van Nuys |
29486 | Abercrombie | Branch |
29489 | Adams | Modesto |
Kết quả nhận được từ RIGHT JOIN:
Customer ID | City | Last Name |
29485 | Van Nuys | Abel |
29486 | Branch | Abercrombie |
29489 | Modesto | Adams |
Một vài lưu ý khi bạn sử dụng LEFT JOIN/ RIGHT JOIN:
- LEFT OUTER JOIN giống với LEFT JOIN, tương tự RIGHT OUTER JOIN giống với RIGHT JOIN; từ khóa OUTER là optional. Nó cũng giúp bạn phân biệt giữa INNER JOIN (nối trong) và OUTER JOIN (nối ngoài)
- LEFT JOIN và RIGHT JOIN hoàn toàn có thể thay thế cho nhau tùy vào thứ tự, vị trí bảng trái và bảng phải trong câu lệnh SQL. Tuy vậy bạn không nên nhầm lẫn 2 thao tác này vì nó có thể cho ra kết quả với kích thước bản ghi hoàn toàn khác nhau nếu giữa nguyên vị trí bảng bên trái và bảng bên phải.
3. FULL JOIN
FULL JOIN hay FULL OUTER JOIN trả về tất cả các record có trong 2 bảng với các bản ghi được kết hợp theo điều kiện đầu vào, nếu không tìm thấy giá trị tương ứng sẽ được set bằng NULL. Có thể xem [FULL JOIN] = [LEFT JOIN] union [RIGHT JOIN].
Cú pháp:
SELECT * FROM City FULL JOIN Name ON Name.CustomerID = City.CustomerID
Kết quả nhận được:
Customer ID | Last Name | City |
1 | Gee | null |
2 | Harris | null |
3 | Carreras | null |
29485 | Abel | Van Nuys |
29486 | Abercrombie | Branch |
29489 | Adams | Modesto |
4. CROSS JOIN
CROSS JOIN trả về mọi tổ hợp các bản ghi kết hợp từ cả 2 bảng, hay nó chính là tích Descartes của 2 bảng. Số lượng bảng ghi kết quả = tích giữa 2 số lượng của 2 bảng (Ví dụ trên sẽ sinh ra 6 * 3 = 18 bản ghi).
Cú pháp:
SELECT * FROM Name CROSS JOIN City
Kết quả nhận được:
Customer ID | Last Name | City |
1 | Gee | Van Nuys |
1 | Gee | Branch |
1 | Gee | Modesto |
2 | Harris | Van Nuys |
2 | Harris | Branch |
2 | Harris | Modesto |
3 | Carreras | Van Nuys |
3 | Carreras | Branch |
3 | Carreras | Modesto |
29485 | Abel | Van Nuys |
29485 | Abel | Branch |
29485 | Abel | Modesto |
29486 | Abercrombie | Van Nuys |
29486 | Abercrombie | Branch |
29486 | Abercrombie | Modesto |
29489 | Adams | Van Nuys |
29489 | Adams | Branch |
29489 | Adams | Modesto |
Thực tế thì CROSS JOIN ít khi được sử dụng vì giá trị trả về không có nhiều ý nghĩa; ngoài ra nó có thể sinh ra kết quả có kích thước rất lớn, chiếm nhiều bộ nhớ. Vì vậy hãy lưu ý trước khi sử dụng CROSS JOIN.
Tham khảo việc làm SQL hấp dẫn
5. Các loại JOIN khác
Ngoài INNER JOIN, OUTER JOIN thì chúng ta còn có 1 số loại JOIN khác ít được dùng hơn như:
- SELF JOIN: Một bảng được JOIN với chính nó
- NATURE JOIN: Tương tự INNER JOIN nhưng không khai báo điều kiện ON mà sử dụng việc liên kết theo tên bảng. NATURE JOIN hỗ trợ với PostgreSQL
- LEFT JOIN EXCLUDE/ RIGHT JOIN EXCLUDE: Thực hiện LEFT JOIN/ RIGHT JOIN mà không muốn lấy phần INNER JOIN. Thực tế thì không có riêng loại JOIN này, bạn có thể dễ dàng thực hiện nó bằng việc thêm điều kiện WHERE Key IS NULL để lọc bỏ những record chung.
- FULL JOIN EXCLUDE: Thực hiện FULL JOIN và bỏ đi phần INNER JOIN, xử lý tương tự loại ở trên
Kết bài
Qua bài viết trên, hy vọng các bạn đã nắm được một cách chi tiết nhất về thao tác JOIN trong SQL cùng các loại JOIN thường được sử dụng. JOIN được sử dụng thường xuyên trong truy vấn dữ liệu và trong nhiều xử lý cơ bản khác với SQL, vì vậy bạn cần nắm chắc và sử dụng đúng loại JOIN để tối ưu hóa chương trình chạy. Cảm ơn các bạn đã đọc bài và hẹn gặp lại trong các bài viết tiếp theo của mình.
Tác giả: Phạm Minh Khoa
Xem thêm:
- Sao lưu và phục hồi dữ liệu trong SQL server
- Cách sử dụng Transaction trong SQL hiệu quả
- Tuyển tập 25 câu hỏi phỏng vấn PostgreSQL thường gặp
Xem thêm tuyển dụng các vị trí IT hấp dẫn trên TopDev