Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm hiệu tuyệt đối giữa hai số trong MySQL với ABS()

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;