Khám phá kiểu dữ liệu SQL Decimal trong SQL Server: Hướng dẫn chi tiết và ví dụ

Bài viết này sẽ hướng dẫn bạn chi tiết về kiểu dữ liệu SQL Decimal, cách sử dụng nó qua các ví dụ minh họa. Chúng ta cũng sẽ tìm hiểu cách sử dụng kiểu dữ liệu này trong SQL Server để giúp công việc của các nhà phát triển SQL trở nên dễ dàng hơn.

Giới thiệu

Các tổ chức xử lý số thập phân hàng ngày và các giá trị thập phân này có thể được nhìn thấy ở khắp mọi nơi trong các lĩnh vực khác nhau, có thể là trong ngân hàng, ngành y tế, sinh trắc học, trạm xăng, báo cáo tài chính, thể thao, v.v. Sử dụng số nguyên (bằng cách làm tròn số thập phân) chắc chắn giúp công việc của một người trở nên dễ dàng hơn nhưng nó thường dẫn đến kết quả không chính xác, đặc biệt khi chúng ta xử lý một số lượng lớn các giá trị và dữ liệu quan trọng. Trong những trường hợp như vậy, lý tưởng nhất là sử dụng kiểu dữ liệu Sql Decimal trong SQL Server để đưa ra kết quả chính xác với độ chính xác hoàn hảo.

Việc các nhà phát triển SQL chọn đúng kiểu dữ liệu trong cấu trúc bảng trong khi thiết kế và mô hình hóa cơ sở dữ liệu SQL trở nên rất quan trọng. Hãy cùng tìm hiểu sâu hơn về kiểu dữ liệu Decimal trong SQL Server.

Điều kiện tiên quyết

Kiểu dữ liệu SQL Decimal đã được sử dụng trong SQL Server từ rất lâu. Bạn có thể sử dụng bất kỳ phiên bản SQL Server nào đã cài đặt (từ 2000 trở lên) để hiểu kiểu dữ liệu này. Chúng tôi sẽ sử dụng SQL Server 2017 trong bài viết này cho mục đích trình diễn. Nếu bạn chưa cài đặt bất kỳ phiên bản nào trên hệ thống của mình và muốn thực hành với phiên bản 2017, hãy tải xuống từ đây.

Cú pháp cơ bản của kiểu dữ liệu Decimal trong SQL Server

Hãy xem cú pháp cơ bản của kiểu dữ liệu SQL Decimal trước. Nó được biểu thị như sau:

decimal [(p [,s])]

Trong đó:

  • pPrecision, tổng số chữ số trong giá trị, tức là ở cả hai phía của dấu thập phân.
  • sScale, số chữ số sau dấu thập phân.

Giá trị mặc định của p là 18 và s là 0 và đối với cả hai giá trị này, giá trị tối thiểu là 1 và giá trị tối đa là 38.

Tóm lại, bằng cách xác định các tham số trong kiểu dữ liệu SQL Decimal, chúng ta đang ước tính một cột hoặc một biến sẽ có bao nhiêu chữ số và cả số chữ số ở bên phải dấu thập phân.

Ví dụ: decimal (4,2) chỉ ra rằng số sẽ có 2 chữ số trước dấu thập phân và 2 chữ số sau dấu thập phân, một cái gì đó như thế này phải là giá trị số – ##.##.

Một điều quan trọng cần lưu ý ở đây là, tham số s (Scale) chỉ có thể được chỉ định nếu p (Precision) được chỉ định. Tỷ lệ (Scale) phải luôn nhỏ hơn hoặc bằng độ chính xác (Precision).

Định nghĩa kiểu dữ liệu SQL Decimal

Hãy làm việc với một hằng số toán học rất phổ biến – π, hay còn gọi là Pi, có giá trị bằng 3.14159 (22/7 ở dạng phân số). Sao chép và dán truy vấn bên dưới vào một cửa sổ truy vấn mới và thực thi nó.

DECLARE @MyDecimal1 DECIMAL (6,0)
DECLARE @MyDecimal2 DECIMAL (6,5)
DECLARE @MyDecimal3 DECIMAL (3,1)

SELECT @MyDecimal1 = 12.99999
SELECT @MyDecimal2 = 12.99999
SELECT @MyDecimal3 = 12.99999

SELECT @MyDecimal1 AS Decimal_6_0,
       @MyDecimal2 AS Decimal_6_5,
       @MyDecimal3 AS Decimal_3_1;

Kết quả với cú pháp cơ bản của kiểu dữ liệu Sql Decimal.Kết quả với cú pháp cơ bản của kiểu dữ liệu Sql Decimal.

Tập kết quả trên cho thấy cách SQL Server coi mỗi sự kết hợp giữa độ chính xác (Precision) và tỷ lệ (Scale) như một kiểu dữ liệu khác nhau. Giống như ở đây, decimal (6, 0) hoạt động khác với các kiểu dữ liệu decimal (6,5)decimal (3,1) và được coi là ba loại khác nhau. Bằng cách này, chúng ta có thể điều chỉnh các tham số trong kiểu SQL Decimal để đạt được kết quả mong muốn.

Bây giờ chúng ta đã biết cách tạo kiểu dữ liệu Decimal này trong SQL Server, hãy khám phá nó với nhiều ví dụ.

Sử dụng SQL Decimal trong các Bảng

Hãy nhanh chóng tạo một bảng mới, có tên là Patients, sử dụng kiểu dữ liệu decimal cho các cột height (chiều cao) và weight (cân nặng). Chúng ta sẽ chèn một vài hàng bằng mệnh đề INSERT như hình dưới đây cho mục đích trình diễn.

CREATE TABLE Patients (
  ID INT,
  Height DECIMAL (3, 2),
  Weight DECIMAL (5, 2)
);

INSERT INTO Patients (ID, Height, Weight)
VALUES (1, 1.75, 70.50),
       (2, 1.80, 80.25),
       (3, 1.65, 60.75);

Sau khi dữ liệu được điền vào bảng, chúng ta có thể truy vấn dữ liệu này bằng câu lệnh SELECT như hình dưới đây. Các giá trị thập phân có thể được nhìn thấy trong các thuộc tính chiều cao và cân nặng.

SELECT *
FROM Patients;

Bảng Patients sử dụng kiểu dữ liệu SQL Decimal cho các cột chiều cao và cân nặng, minh họa cách lưu trữ và truy vấn dữ liệu thập phân.

Hãy tìm hiểu điều gì xảy ra nếu chúng ta cố gắng chèn các giá trị vượt quá các giá trị độ chính xác (Precision) hoặc tỷ lệ (Scale) được chỉ định trong khi xác định các cột Chiều cao và Cân nặng. Đối với bản demo này, chúng ta sẽ chèn thêm 2 hàng vào bảng này (hiển thị bên dưới).

INSERT INTO Patients (ID, Height, Weight)
VALUES (4, 10.9, 1000.45),
       (5, 11.75, 90.50);

Nó gặp lỗi dưới đây nói rằng lỗi tràn số học và SQL Server đã chấm dứt các câu lệnh.

Lỗi gặp phải khi chèn các giá trị vượt quá trong các cột kiểu dữ liệu Sql Decimal.Lỗi gặp phải khi chèn các giá trị vượt quá trong các cột kiểu dữ liệu Sql Decimal.

Hãy đi sâu vào nguyên nhân của vấn đề này:

  • Height Decimal (3, 2) có nghĩa là giá trị có thể có tổng cộng 3 chữ số và 2 chữ số ở bên phải dấu thập phân. Trong dòng mã đầu tiên ở trên, giá trị 10.9 (được coi là 10.90 = 4 chữ số tổng thể) vượt quá phạm vi được chỉ định (3, 2) và gây ra tràn.
  • Weight Decimal (5,2) có nghĩa là tổng số chữ số không được vượt quá 5 và 2 chữ số có thể được đặt ở bên phải dấu thập phân. Tuy nhiên, giá trị 1000.45 trong dòng mã thứ hai ở trên vượt quá phạm vi được chỉ định là (5, 2) vì nó có nghĩa là tổng cộng 6 chữ số và gây ra lỗi tràn.

Lưu ý nhanh – Trong thông báo lỗi trên, nếu bạn nhận thấy, “data type numeric” được nêu thay vì data type decimal, lý do là kiểu dữ liệu Decimal và Numeric hoàn toàn giống nhau, cả hai đều là kiểu dữ liệu có độ chính xác cố định và có thể được sử dụng thay thế cho nhau.

Giải quyết lỗi

Một trong những cách giải quyết dễ dàng nhất là tăng mức độ chính xác của các cột để lưu trữ các số lớn hơn. Chúng ta có thể thay đổi kiểu dữ liệu của các cột mà không cần xóa bảng hoặc cột bằng mã bên dưới.

ALTER TABLE Patients
ALTER COLUMN Height DECIMAL (4, 2);

ALTER TABLE Patients
ALTER COLUMN Weight DECIMAL (7, 2);

Sau khi thay đổi, hãy thực thi các truy vấn Insert để chèn các hàng này vào bảng.

Các giá trị được chèn thành công sau khi thay đổi kiểu dữ liệu decimal trong Sql Server.Các giá trị được chèn thành công sau khi thay đổi kiểu dữ liệu decimal trong Sql Server.

Chúng ta có thể thấy các hàng được thêm vào bảng.

SELECT *
FROM Patients;

Truy vấn dữ liệu từ bảng trong SSMS.Truy vấn dữ liệu từ bảng trong SSMS.

Cân nhắc về lưu trữ với kiểu dữ liệu Decimal trong SQL Server

Kiểu dữ liệu SQL Decimal yêu cầu các byte lưu trữ sau cho độ chính xác được chỉ định như được cung cấp bởi Microsoft dưới đây:

Độ chính xác Dung lượng (Bytes)
1 – 9 5
10 – 19 9
20 – 28 13
29 – 38 17

Việc tiêu thụ không gian của kiểu dữ liệu SQL Decimal dựa trên định nghĩa cột và không dựa trên kích thước của giá trị được gán cho nó. Ví dụ: Decimal (12, 4) với giá trị 888.888 chiếm 9 byte trên đĩa và giá trị Decimal (22, 2) là 9999.99 tiêu thụ 13 byte trên đĩa. Đây là lý do tại sao kiểu dữ liệu này thuộc loại cột có độ dài cố định.

Là một nhà phát triển SQL, tôi luôn cố gắng sử dụng kiểu dữ liệu SQL Decimal là decimal (9, 2) để tiêu thụ ít dung lượng lưu trữ nhất, 5 byte trên đĩa và mang lại hiệu suất tốt hơn.

Kết luận

Tôi hy vọng bài viết này cung cấp một cách tiếp cận dễ hiểu về cách sử dụng kiểu dữ liệu SQL Decimal. Luôn đảm bảo độ chính xác của biến thập phân hoặc số được chỉ định là đủ để chứa các giá trị được gán cho nó. Ngoài ra, chúng ta đã quan sát, cách chọn đúng loại kiểu dữ liệu giúp các nhà phát triển SQL tiết kiệm dung lượng lưu trữ trên đĩa.

Trong trường hợp có bất kỳ câu hỏi nào, vui lòng hỏi trong phần bình luận bên dưới.

Để tiếp tục hành trình của bạn với SQL Server và các kiểu dữ liệu được sử dụng trong đó, tôi khuyên bạn nên xem qua các liên kết bên dưới.