Hế lô anh em ✌️✌️✌️
Đã bao giờ anh em phải ngồi để so sánh kết quả của hai câu query với số lượng các trường lên tới hàng chục thậm chí hàng trăm trường chưa?
Mình đảm bảo nếu "soi" bằng mắt thì soi xong anh em lác luôn 🤣 Vậy có cách nào để chúng ta vừa đỡ lác mắt mà lại chính xác không?
Yes, câu là trả lời là có! Chúng ta có lệnh MINUS
nhưng anh em đừng vội mừng. Nhất là anh em nào làm việc với MySQL vì sẽ không có chuyện mì ăn liền kiểu thêm cái lệnh MINUS
vào là xong đâu.
MySQL hiện chưa hỗ trợ lệnh này nhưng trong bài viết này mình sẽ cùng anh em tìm hiểu cách triển khai lệnh MINUS
này thông qua lệnh JOIN
(LEFT JOIN
) nhé.
1/ Cú pháp
Dưới đây là cú pháp chung của lệnh MINUS
(giá mà MySQL hỗ trợ cú pháp này thì các con dân vui biết mấy 😒)
SELECT select_list1
FROM table_name1
MINUS
SELECT select_list2
FROM table_name2;
Lệnh MINUS
sẽ so sánh kết quả từ hai câu query và trả về những bản ghi chỉ xuất hiện trong kết quả từ câu query đầu tiên mà không có trong câu query thứ hai.
Note:
Có 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 ảnh bên dưới để dễ hình dung hơn.
Câu query tương ứng sẽ là:
SELECT
value
FROM table1
MINUS
SELECT
value
FROM table2;
Note:
- Anh em lưu ý cho mình là nếu anh em đem lệnh này vào MySQL chạy thì kiểu gì cũng bị lỗi vì MySQL không hỗ trợ cú pháp này.
Đây chỉ là cú pháp chung và ngay sau đây mình sẽ cùng anh em xem trong MySQL chúng ta triển khai lệnh này sử dụng lệnh LEFT JOIN
như thế nào!
2/ Sử dụng LEFT JOIN để "MINUS".
Không hỗ trợ không phải là không muốn hỗ trợ mà thực ra với các câu lệnh hiện tại của MySQL đã có thể làm được công việc đó.
Ở đây chúng ta sử dụng lệnh JOIN
mà cụ thể là LEFT JOIN
để đạt được mục đích đó như sau:
SELECT
select_list
FROM
table1
LEFT JOIN table2 ON join_predicate
WHERE
table2.column_name IS NULL;
Áp dụng vào ví dụ bên trên chúng ta có câu query như bên dưới (lưu ý là mình đang "minus" theo trường value nhé anh em)
SELECT
t1.id,
t1.value
FROM
table1 t1
LEFT JOIN table2 t2 ON t1.value = t2.value
WHERE
t2.value IS NULL;
Và output sẽ là:
id|value|
--+-----+
1|A |
2|B |
4|K |
Về lệnh LEFT JOIN
thì có lẽ anh em cũng nắm được rồi, bỏ mệnh đề WHERE
đi ta sẽ thấy được kết quả đầy đủ của lệnh này như sau:
SELECT
t1.id,
t1.value,
t2.id,
t2.value
FROM
table1 t1
LEFT JOIN table2 t2 ON t1.value = t2.value
Output:
id1|value1|id2|value2|
---+------+---+------+
1|A | | |
2|B | | |
3|D | 3|D |
4|K | | |
Để đạt được mục đích như lệnh MINUS
thì chúng ta chỉ cần thêm mệnh đề WHERE
như bên trên vào là được.
3/ Lời kết
Vậy đâu nhất thiết phải sinh ra hẳn một câu lệnh trong khi chúng ta có thể thực thi nó dựa vào những câu lệnh sẵn có?
Mình nghĩ nó liên quan đến sự tiện lợi cũng như tùy vào độ phức tạp của câu query hay những cơ sở dữ liệu hỗ trợ MINUS
họ có một thuật toán tối ưu hơn khi dùng LEFT JOIN
như chúng ta.
Dù lý do là gì thì hi vọng qua bài viết này anh em cũng đã hiểu được cách chúng ta thực hiện mong muốn "MINUS" trong MySQL như thế.
Hẹn gặp lại anh em trong các bài viết tiếp theo nhé.
Tham khảo:
https://www.mysqltutorial.org/mysql-minus/
Thanks all ❤️❤️❤️
Không có nhận xét nào: