2021-06-02

博客介绍了数据库事务,它是绑定在一起的SQL语句组,若其中一个语句操作失败,整个操作失败并回滚。为确保操作要么执行要么不执行,可使用事务,且一组语句作为事务需通过ACID测试,即原子性、一致性、隔离性和持久性。

1.什么是事务?


        事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,

如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操

作前状态,或者是上个节点。为了确保要么执行,要么不执行,就

可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试

,即原子性,一致性,隔离性和持久性。

 

### 出现空值的原因 - **分区首行**:在使用窗口函数 `max(edt) over(partition by id order by stt rows between UNBOUNDED PRECEDING and 1 PRECEDING)` 时,对于每个 `id` 分区内的第一行数据,`rows between UNBOUNDED PRECEDING and 1 PRECEDING` 表示从分区的起始行到当前行的前一行。由于第一行没有前一行,所以 `max(edt)` 在此情况下没有可比较的行,因此会返回空值。 - **数据本身为空**:如果在分区内除了当前行之外,其他行的 `edt` 字段值都为 `NULL`,那么 `max()` 函数在计算时会将这些 `NULL` 值排除,由于没有有效的非空值可供比较,也会返回 `NULL`。 ### 某行出现更大日期值的原因 - **数据顺序**:窗口函数是按照 `order by stt` 对分区内的数据进行排序的。如果在分区内,后面行的 `edt` 值本身就比前面行的 `edt` 值大,那么随着窗口的移动,`max(edt)` 会不断更新为更大的日期值。例如,在同一个 `id` 分区内,前面行的 `edt` 是较早的日期,而后面行的 `edt` 是较晚的日期,当窗口移动到后面行时,`max(edt)` 就会更新为这个较晚的日期。 - **数据异常**:可能是数据录入错误或者系统异常导致某行的 `edt` 值出现了不合理的大日期。例如,可能在录入促销结束日期时,输入了一个错误的未来日期。 示例代码如下,模拟了该查询过程: ```sql -- 创建示例表 CREATE TABLE test4 ( id INT, stt DATE, edt DATE ); -- 插入示例数据 INSERT INTO test4 (id, stt, edt) VALUES (1, '2023-01-01', '2023-01-10'), (1, '2023-01-15', '2023-01-20'), (2, '2023-02-01', '2023-02-10'), (2, '2023-02-15', '2023-02-20'); -- 执行查询 SELECT id, stt, edt, MAX(edt) OVER (PARTITION BY id ORDER BY stt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS maxEdt FROM test4; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值