Tìm hiểu về JOIN trong SQL: Các loại JOIN thường được sử dụng

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ý.

JOIN trong SQL

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.

Các loại JOIN trong SQL

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
Gee 
Harris 
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
Gee  Null
Harris  Null
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.

  Sao lưu và phục hồi dữ liệu trong SQL server

  So sánh RDBMS và NoSQL. Nên sử dụng loại CSDL nào cho dự án của bạn?

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
Gee  null 
Harris  null 
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
Gee  Van Nuys 
Gee  Branch 
Gee  Modesto 
Harris  Van Nuys 
Harris  Branch 
Harris  Modesto 
Carreras  Van Nuys 
Carreras  Branch 
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:

Xem thêm tuyển dụng các vị trí IT hấp dẫn trên TopDev