Sử dụng hàm ABS() để lấy giá trị tuyệt đối của hiệu hai số, đảm bảo kết quả luôn dương.
Cú pháp
SELECT ABS(cột1 - cột2) AS difference FROM tên_bảng;
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE findDifferenceDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstNumber FLOAT,
-> SecondNumber FLOAT
-> );
Query OK, 0 rows affected (0.60 sec)
Chèn dữ liệu:
mysql> INSERT INTO findDifferenceDemo(FirstNumber, SecondNumber) VALUES
-> (4.2, 2.3), (23.4, 5.6), (5.8, 34.56), (7.8, 7.2), (12.8, 10.2);
Xem dữ liệu:
mysql> SELECT * FROM findDifferenceDemo;
+----+-------------+--------------+ | Id | FirstNumber | SecondNumber | +----+-------------+--------------+ | 1 | 4.2 | 2.3 | | 2 | 23.4 | 5.6 | | 3 | 5.8 | 34.56 | | 4 | 7.8 | 7.2 | | 5 | 12.8 | 10.2 | +----+-------------+--------------+
Tính hiệu tuyệt đối và sắp xếp giảm dần:
mysql> SELECT ABS(FirstNumber - SecondNumber) AS diff
-> FROM findDifferenceDemo
-> ORDER BY diff DESC;
+--------------------+ | diff | +--------------------+ | 28.760001182556152 | -- |5.8 - 34.56| | 17.799999713897705 | -- |23.4 - 5.6| | 2.6000003814697266 | -- |12.8 - 10.2| | 1.8999998569488525 | -- |7.8 - 7.2| | 0.6000003814697266 | -- |4.2 - 2.3| +--------------------+
Lưu ý về độ chính xác FLOAT
Kết quả có nhiều chữ số thập phân do FLOAT là số thực dấu chấm động (approximate). Để chính xác:
- Dùng
DECIMAL(10,2)cho tiền tệ/độ chính xác cao - Hoặc
ROUND(ABS(a-b), 2)làm tròn 2 chữ số
Ứng dụng thực tế
- Tìm sản phẩm giá gần nhất:
ORDER BY ABS(price - target_price) LIMIT 10 - Phát hiện bất thường:
WHERE ABS(value - avg_value) > threshold - So sánh fingerprint/hash:
ABS(hash1 - hash2) < tolerance
Mở rộng: Hiệu tuyệt đối nhiều cột
SELECT
ABS(col1 - col2) AS diff12,
ABS(col2 - col3) AS diff23,
ABS(col1 - col3) AS diff13
FROM table_name;