Header Ads

Seo Services

Hế lô anh em ✌️✌️✌️

Trong bài viết trước mình đã cùng anh em tìm hiểu làm sao để MINUS trong MySQL. Chắc qua bài viết đó anh em cũng nắm được đó là khi chúng ta muốn tìm những bản ghi chỉ xuất hiện trong kết quả của câu query đầu tiên mà không có ở kết quả của câu query thứ hai.

Vậy làm sao để tìm những bản ghi xuất hiện ở cả hai kết quả của hai câu truy vấn đó? Tin vui là chúng ta có lệnh INTERSECT nhưng tin buồn là MySQL lại cũng không hỗ trợ lệnh này😒

Không sao cả, không hỗ trợ thì chúng ta tự tìm cách vậy. Trong bài viết này mình sẽ cùng em xem có những cách gì để "INTERSECT" trong MySQL nhé!

1/ Cú pháp

Dưới đây là cú pháp chung của lệnh INTERSECT (lại một lần nữa ước MySQL hỗ trợ lệnh này thì con dân vui biết mấy 🙃)

SELECT select_list1 
FROM table_1
INTERSECT
SELECT select_list2
FROM table_2;

INTERSECT có nghĩa là giao nhau và như mình đã nói bên trên thì lệnh này sẽ trả về những bản ghi cùng xuất hiện ở kết quả của cả hai câu query.

Note:

Một vài quy tắc khi sử dụng lệnh này anh em cần nhớ:

- Số lượng cũng như thứ tự ở các cột (trường) ở select_list1select_list2 phải giống nhau.

- Kiểu dữ liệu của các trường tương ứng ở cả hai câu query cũng phải cùng một kiểu.

Anh em có thể xem hình bên dưới để dễ hình dung hơn:

Câu query tương ứng sẽ là:

SELECT 
	value 
FROM table1
INTERSECT
SELECT 
	value 
FROM table2;

Note:

Đây chỉ là cú pháp chung và MySQL không hỗ trợ trực tiếp lệnh này nên nếu anh em đem lệnh này vào MySQL chạy thì chắc chắn sẽ báo lỗi.

Vậy làm sao để thực hiện được chức năng của lệnh INTERSECT trong MySQL thì mình sẽ giới thiệu với anh em hai cách sau đây.

2/ Sử dụng INNER JOIN để "INTERSECT".

Cùng là ví dụ trên mình có thể sử dụng INNER JOIN để tìm ra những bản ghi có value xuất hiện ở cả hai bảng như sau:

SELECT DISTINCT
   t1.value 
FROM table1 t1
   INNER JOIN table2 t2 ON t1.value = t2.value;

- Đầu tiên là INNER JOIN để lấy ra những bản ghi xuất hiện ở cả hai bảng.

- Sau đó dùng DISTINCT để loại bỏ những bản ghi trùng và chúng ta có kết quả cuối cùng.

3/ Sử dụng IN và Subquery để "INTERSECT".

Không chỉ dừng lại ở việc dùng INNER JOIN chúng ta còn có thể dùng IN và subquery để đạt được mục đích "INTERSECT" như sau:

SELECT DISTINCT 
	value
FROM table1
WHERE value IN (SELECT value FROM table2);

- Với câu query này thì cách hoạt động rất đơn giản thôi. Lấy ra danh sách value ở table2 sau đó với table1 chúng ta chỉ lấy những value có trong tập kết quả trả về từ danh sách value ở table2 trước đó.

- Cuối cùng DISTINCT để loại bỏ các bản ghi trùng nhau và có được kết quả cuối cùng.

4/ Lời kết.

MySQL Dev: Ủa, tại sao phải sao phải sinh ra hẳn một câu lệnh INTERSECT trong khi tôi có thể dùng tới hai cách để đạt được cùng mục đích.

Oracle Dev: Nhiều nguyên nhân lắm bạn hiền à! tiện hơn này, nhìn gọn hơn này với lại nhìn các chú cứ JOIN rồi lại DISTINCT tùm lum thế kia rõ là mệt lại không tối ưu nữa. Người ta bỏ tiền ra mua nó phải khác chứ 🤣

Okay, hi vọng là qua bài viết này anh em sẽ nắm được cách để chúng ta triển khai lệnh "INTERSECT" trong MySQL nói riêng và các hệ quản trị cơ sở dữ liệu khác nói chúng.

Hẹn gặp lại anh em trong các bài viết tiếp theo!

Tham khảo:

https://www.mysqltutorial.org/mysql-intersect/

Thanks all ❤️❤️❤️

Không có nhận xét nào:

Được tạo bởi Blogger.