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_list1
và select_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: