Header Ads

Seo Services

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_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 ả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:

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