SQL - CHECKSUM_AGG() 函式



校驗和返回一個值,該值指示輸入值是否隨時間推移而發生變化。校驗和有助於我們識別自上次操作以來值是否已更改。此外,SQL 包含一個名為 CHECKSUM AGG 的函式,可用於驗證單個值或一組值。

SQL 的CHECKSUM_AGG() 函式返回給定表示式指定的列的校驗和值。它將所有列值加總並計算校驗和。如果某一行或多行隨時間推移而更改,則校驗和將相應更改,指示列中的值已更改。CHECKSUM_AGG() 函式會忽略 NULL 值。我們可以將 OVER 子句與該函式一起使用。此函式僅用於數值列。

此函式還允許使用兩個可選修飾符 ALL 和 DISTINCT。如果我們使用 ALL,則此函式計算所有值的聚合。如果我們使用 DISTINCT,則此函式返回唯一且非 NULL 值的數量。

語法

以下是SQL CHECKSUM_AGG() 函式的語法:

CHECKSUM_AGG ( [ ALL | DISTINCT ] expression )

引數

  • expression - 整數表示式。checksum_agg() 不允許使用聚合函式或子查詢。

示例

在以下示例中,我們使用 SQL CHECKSUM_AGG() 函式來檢測 customers 表中 AGE 列的變化。

使用 CREATE 語句,我們建立了一個名為 customers 的表:

CREATE TABLE customers(ID INT NOT NULL, 
NAME VARCHAR(30) NOT NULL, 
AGE INT NOT NULL, 
ADDRESS CHAR(30), 
SALARY DECIMAL(18, 2));

該表儲存 ID、NAME、AGE、ADDRESS 和 SALARY。現在,我們使用 INSERT 語句在 customers 表中插入 7 條記錄。

INSERT INTO customers VALUES(1, 'Ramesh', 32, 'Ahmedabad', 2000.00);
INSERT INTO customers VALUES(2, 'Khilan', 25, 'Delhi', 1500.00);
INSERT INTO customers VALUES(3, 'kaushik', 23, 'Kota', 2000.00);
INSERT INTO customers VALUES(4, 'Chaitali', 25, 'Mumbai', 6500.00);
INSERT INTO customers VALUES(5, 'Hardik', 27, 'Bhopal', 8500.00);
INSERT INTO customers VALUES(6, 'Komal', 22, 'MP', 4500.00);
INSERT INTO customers VALUES(7, 'Aman', 23, 'Ranchi', null);

以下 SQL 查詢顯示 customers 表:

SELECT * FROM customers;
以下是 customers 表:
+----+----------+-----+-----------+---------+
| ID | NAME     | AGE | ADDRESS   | SALARY  |
+----+----------+-----+-----------+---------+
|  1 | Ramesh   |  32 | Ahmedabad | 2000.00 |
|  2 | Khilan   |  25 | Delhi     | 1500.00 |
|  3 | kaushik  |  23 | Kota      | 2000.00 |
|  4 | Chaitali |  25 | Mumbai    | 6500.00 |
|  5 | Hardik   |  27 | Bhopal    | 8500.00 |
|  6 | Komal    |  22 | MP        | 4500.00 |
|  7 | Aman     |  23 | Ranchi    |    NULL |
+----+----------+-----+-----------+---------+

以下 SQL 查詢顯示更新 AGE 列前後的原始校驗和值和更新後的校驗和值:

-- get the checksum value before the column value changed.
SELECT CHECKSUM_AGG(AGE) AS original_checksum from customers;
UPDATE customers SET AGE = 30 WHERE NAME = 'Aman';
--get the checksum of the modified column.
SELECT CHECKSUM_AGG(AGE) AS original_checksum from customers;

輸出

以下是上述 SQL 查詢的輸出:

+--------------------+
|  original_checksum |
+--------------------+
|                 32 | 
+--------------------+

+--------------------+
|  original_checksum |
+--------------------+
|                 36 | 
+--------------------+

示例

在以下示例中,透過將 DISTINCT 作為引數之一傳遞,在不同的整數值上呼叫 checksum_agg() 函式。

-- get the checksum of all value.
SELECT CHECKSUM_AGG(AGE) AS original_checksum from customers;
--get the checksum of distinct value.
SELECT CHECKSUM_AGG(DISTINCT AGE) AS original_checksum from customers;

輸出

以下是上述 SQL 查詢的輸出:

+--------------------+
|  original_checksum |
+--------------------+
|                 36 | 
+--------------------+

+--------------------+
|  original_checksum |
+--------------------+
|                 61 | 
+--------------------+

示例

在以下示例中,我們使用 SQL CHECKSUM_AGG() 函式來檢測 customers 表中 SALARY 列的變化。CHECKSUM_AGG() 函式始終接受整數型別的列。由於 salary 列包含 decimal 資料型別,因此我們必須將其轉換為 INT。

以下 SQL 查詢顯示 SALARY 的原始和修改後的校驗和:

--original checksum
SELECT CHECKSUM_AGG(CAST(SALARY AS INT)) AS original_SALARY from customers;
UPDATE customers SET SALARY = 5000 WHERE NAME = 'Aman';
--checksum after modified
SELECT CHECKSUM_AGG(CAST(SALARY AS INT)) AS original_SALARY from customers;

輸出

以下是上述 SQL 查詢的輸出:

+------------------+
|  original_SALARY |
+------------------+
|            11288 | 
+------------------+

+------------------+
|  original_SALARY |
+------------------+
|            16272 | 
+------------------+
sql-aggregate-functions.htm
廣告