Truy vấn dữ liệu – Kết hợp dữ liệu của hai câu truy vấn

Kết hợp dữ liệu của 2 câu truy vấn
Kết hợp dữ liệu của 2 câu truy vấn

Trong một vài trường hợp, chúng ta cần kết hợp dữ liệu của hai câu truy vấn lại. T-SQL hỗ trợ chúng ta các toán tử trên tập hợp UNION, EXCEPT và INTERSECT. Để dễ dàng tiếp cận với nội dung bài này, có thể các bạn cần ôn tập toán một chút.

Nếu xem kết quả trả về của mỗi câu truy vấn là một tập hợp các kết quả. Chúng ta có thể sử dụng các toán tử trên tập hợp, để kết hợp dữ liệu của 2 câu truy vấn.

UNION – Phép hợp

Khi sử dụng mệnh đề UNION, chúng ta có 2 phương thức:

UNION ALL: Kết quả trả về là các phần tử của 2 tập hợp.

UNION ALL
UNION ALL

Ví dụ: Mình muốn truy vấn tên (FirstName) của tất cả nhân viên và khách hàng.

Các bạn hãy thực thi câu truy vấn này và xem kết quả. Sau khi kiểm tra kết quả, chúng ta có thể thấy 1 vài kết quả trùng. Và dù có cố nhét thêm từ khóa DISTINCT vào cả 2 câu truy vấn, chúng ta cũng có 1 vài kết quả trùng. Lý do trùng lặp các bạn có thể nhìn hình minh họa cho phương thức UNION ALL của chúng ta.

UNION: Đôi khi chúng ta không muốn các dòng dữ liệu bị trùng lặp. Lúc này, UNION sẽ loại bỏ các dòng dữ liệu trùng.

UNION
UNION

Câu truy vấn phía trên của chúng ta được đổi thành:

Và tất cả các dữ liệu trùng lặp trong kết quả đã bị loại bỏ. Các bạn hãy thử lại câu truy vấn trên.

INTERSECT – Phép giao

Với kiến thức về toán học, chúng ta không khó để tiếp cận với toán tử này đúng không nào. Phép giao sẽ lấy phần chung của cả 2 tập hợp.

INTERSECT
INTERSECT

Trong thực tế, rất nhiều trường hợp chúng ta cần đến phép toán này. Ví dụ: Cửa hàng của bạn mở một chương trình tri ân khách hàng. Sẽ tặng quà random cho một số khách hàng. Nhưng tất nhiên, chúng ta chỉ muốn tri ân những tài khoản đã mua hàng và bỏ qua những tài khoản chưa có giao dịch phát sinh. Lúc này, chúng ta sẽ cần một câu truy vấn như sau:

EXCEPT –  Phép hiệu

Tương tự hai phép toán UNION và INTERSECT. Phép toán EXCEPT (hay Difference) còn gọi là phép hiệu hay phép trừ cũng tương đối dễ hiểu. Các bạn có thể nhìn vào hình minh họa bên dưới.

EXCEPT
EXCEPT

Ví dụ: Mình muốn tìm tất cả các ca sĩ (Artist) không phát hành Album nào. Với kiến thức hiện tại, chúng ta có nhiều cách làm, mình sẽ đưa ra gợi ý và các bạn thử thực hiện chúng:

  • Liên kết nhiều bảng dữ liệu – LEFT JOIN: Chúng ta sẽ sử dụng phương thức LEFT JOIN. Kết hợp giữa bảng Artist và bảng Album. Tất nhiên bảng Artist sẽ nằm bên trái. Khi đó, các Artist không có Album tương ứng sẽ được điền các giá trị NULL. Với điều kiện đơn giản, chúng ta sẽ lựa chọn được các Artist không có Album.
  • Sử dụng câu truy vấn con: Chúng ta sẽ sử dụng subquery trong mệnh đề WHERE sử dụng điều kiện NOT IN. Mệnh đề con sẽ liệt kê tất cả ArtistId trong bảng Album.
  • Cách mới: Áp dụng phép toán trừ bằng mệnh đề EXCEPT. Chúng ta sẽ sử dụng 2 câu truy vấn. Câu truy vấn thứ nhất tìm tất cả các ArtistId trong bảng Artist. Câu truy vấn thứ 2 sẽ tìm tất cả ArtistId trong bảng Album. Và các Artist chưa phát hành Album sẽ bằng ‘tất cả artist’ – ‘artist đã phát hành album’. Câu truy vấn của chúng ta sẽ là:

Đầu tiên bạn hãy thực thi câu truy vấn trên trước. Sau đó, chúng ta cùng nhau xem lại kết quả của 3 câu truy vấn trong 3 cách. Dựa vào kết quả trả về của từng câu truy vấn, các bạn sẽ rút ra được kinh nghiệm, chúng ta sẽ chọn phương án nào trong các trường hợp khác nhau.