Tóm Tắt
Cột được tính toán trong SQL Server
- Trung Nguyen
-
27/11/2021
-
5 min read
Trong hướng dẫn này, bạn sẽ học cách sử dụng cột được đo lường và thống kê ( computed column ) của SQL Server để sử dụng lại logic giám sát trong nhiều truy vấn .
Giới thiệu về cột được tính toán trong SQL Server
Hãy tạo một bảng mới có tên persons
để minh họa:
Bạn đang đọc: Cột được tính toán trong SQL Server
CREATE TABLE persons
(
person_id INT PRIMARY KEY IDENTITY,
first_name NVARCHAR(100) NOT NULL,
last_name NVARCHAR(100) NOT NULL,
dob DATE
);
Và insert hai dòng dữ liệu mẫu vào bảng persons
:
INSERT INTO
persons(first_name, last_name, dob)
VALUES
('John','Doe','1990-05-01'),
('Jane','Doe','1995-03-01');
Để truy vấn tên đầy đủ của những người trong bảng persons
, bạn thường sử dụng hàm CONCAT()
hoặc toán tử +
như sau:
SELECT
person_id,
first_name + ' ' + last_name AS full_name,
dob
FROM
persons
ORDER BY
full_name;
Việc thêm biểu thức first_name + ' ' + last_name AS full_name
trong mọi truy vấn không thuận tiện và khó bảo trì.
May mắn thay, SQL Server cung ứng cho tất cả chúng ta một tính năng gọi là cột được giám sát được cho phép bạn thêm một cột mới vào bảng với giá trị được lấy từ giá trị của những cột khác trong cùng một bảng .
Ví dụ: bạn có thể thêm cột full_name
vào bảng persons
bằng cách sử dụng câu lệnh ALTER TABLE ADD COLUMN
như sau:
ALTER TABLE persons
ADD full_name AS (first_name + ' ' + last_name);
Mỗi khi bạn truy vấn dữ liệu từ bảng persons
, SQL Server sẽ tính toán giá trị cho cột full_name
dựa trên biểu thức first_name + ' ' + last_name
và trả về kết quả.
Đây là truy vấn mới, nhỏ gọn hơn rất nhiều :
SELECT
person_id,
full_name,
dob
FROM
persons
ORDER BY
full_name;
Nếu bạn kiểm tra bảng persons
, bạn có thể thấy cột full_name
mới xuất hiện trong danh sách cột:
Lưu trữ dữ liệu cột được tính toán trong SQL Server
Các cột được đo lường và thống kê hoàn toàn có thể tàng trữ. Nó có nghĩa là SQL Server tàng trữ vật lý tài liệu của những cột được giám sát trên đĩa .Khi bạn biến hóa tài liệu trong bảng, SQL Server sẽ đo lường và thống kê hiệu quả dựa trên biểu thức của những cột được thống kê giám sát và tàng trữ về mặt vật lý những tác dụng trong những cột sống sót này .Khi bạn truy vấn tài liệu từ những cột được đo lường và thống kê, SQL Server chỉ cần truy xuất tài liệu mà không cần triển khai bất kể phép tính nào. Điều này giúp tránh ngân sách giám sát với ngân sách tàng trữ bổ trợ .Hãy xem xét ví dụ sau .
Đầu tiên, hãy xóa cột full_name
của bảng persons
bằng lệnh ALTER TABLE DROP COLUMN sau:
ALTER TABLE persons
DROP COLUMN full_name;
Sau đó, thêm cột full_name
mới vào persons
bảng với thuộc tính PERSISTED
:
ALTER TABLE persons
ADD full_name AS (first_name + ' ' + last_name) PERSISTED;
Lưu ý rằng một cột được tính toán chỉ tồn tại nếu biểu thức của nó là xác định. Nó có nghĩa là đối với một tập hợp các đầu vào, biểu thức luôn trả về cùng một kết quả.
Ví dụ, biểu thức first_name + ' ' + last_name
là xác định. Tuy nhiên, hàm GETDATE()
là một hàm không xác định vì nó trả về một giá trị khác vào một ngày khác.
Công thức này trả về tuổi tính theo năm dựa trên ngày sinh và ngày thời điểm ngày hôm nay :
(CONVERT(INT,CONVERT(CHAR(8),GETDATE(),112))-CONVERT(CHAR(8),dob,112))/10000
Chúng ta hoàn toàn có thể sử dụng biểu thức này để xác lập cột tính tuổi trong năm .
Câu lệnh sau cố gắng định nghĩa cột được tính toán là age_in_year
được lưu trữ:
ALTER TABLE persons
ADD age_in_years
AS (CONVERT(INT,CONVERT(CHAR(8),GETDATE(),112))-CONVERT(CHAR(8),dob,112))/10000
PERSISTED;
SQL Server sẽ báo lỗi sau :
Computed column 'age_in_years' in table 'persons' cannot be persisted because the column is non-deterministic.
Nếu bạn xóa thuộc tính PERSISTED
, nó sẽ hoạt động:
ALTER TABLE persons
ADD age_in_years
AS (CONVERT(INT,CONVERT(CHAR(8),GETDATE(),112))-CONVERT(CHAR(8),dob,112))/10000;
Bây giờ, bạn có thể truy vấn tuổi tính theo năm của những người trong bảng persons
như sau:
SELECT
person_id,
full_name,
age_in_years
FROM
persons
ORDER BY
age_in_years DESC;
Đây là tập kết quả :
Cú pháp để thêm cột được tính toán vào bảng
Để thêm cột được tính mới vào bảng hiện có, bạn sử dụng cú pháp sau :
ALTER TABLE table_name
ADD column_name AS expression [PERSISTED];
Trong cú pháp này :
- Đầu tiên, chỉ định tên của bảng mà bạn muốn thêm cột được tính toán vào.
- Thứ hai, chỉ định tên cột được tính toán với biểu thức trả về các giá trị cho cột.
- Cuối cùng, nếu biểu thức là xác định và bạn muốn lưu trữ dữ liệu của cột được tính toán về mặt vật lý, bạn có thể sử dụng thuộc tính
PERSISTED
.
Lưu ý rằng bạn có thể tạo chỉ mục trên cột được tính toán được lưu trữ để cải thiện tốc độ truy xuất dữ liệu từ cột được tính toán.
Cú pháp định nghĩa cột được tính toán khi tạo một bảng mới
Để định nghĩa cột được tính toán khi bạn tạo bảng, bạn sử dụng cú pháp sau:
CREATE TABLE table_name(
...,
column_name AS expression [PERSISTED],
...
);
Trong hướng dẫn này, bạn đã học cách sử dụng cột được thống kê giám sát trong SQL Server để sử dụng lại logic giám sát trong nhiều truy vấn .
Nếu Comdy hữu ích và giúp bạn tiết kiệm thời gian làm việc
Bạn hoàn toàn có thể sung sướng đưa Comdy vào whitelist của trình chặn quảng cáo ❤ ️ để tương hỗ chúng tôi trong việc trả tiền cho dịch vụ tàng trữ web để duy trì hoạt động giải trí của website .
Source: https://final-blade.com
Category: Kiến thức Internet