当前位置: 首页 > news >正文

重头开始嵌入式第三十四天(数据库二)

sqlite3的一些补充

目录

sqlite3的一些补充

1.事物

2.连接,联合

3.触发器

4.子查询


1.事物

数据库事务是数据库管理系统执行过程中的一个逻辑单位,它由一系列对数据库的操作组成。
 
一、事务的特性
 
1. 原子性(Atomicity)
- 事务中的所有操作要么全部成功执行,要么全部不执行。如果事务中的任何一个操作失败,整个事务将回滚到事务开始前的状态。
- 例如,在银行转账过程中,从一个账户扣款和向另一个账户存款这两个操作必须作为一个事务来执行。如果扣款成功但存款失败,那么事务将回滚,确保两个账户的状态都不会发生变化。
2. 一致性(Consistency)
- 事务必须使数据库从一个一致性状态转变为另一个一致性状态。这意味着事务执行前后,数据库中的数据必须满足特定的约束条件。
- 例如,在一个订单管理系统中,事务必须确保订单的状态和库存的数量保持一致。如果一个订单被创建,那么相应的库存数量必须减少;如果订单被取消,库存数量必须恢复。
3. 隔离性(Isolation)
- 多个事务并发执行时,它们之间应该相互隔离,不能相互干扰。每个事务都应该感觉不到其他事务的存在,就好像在独立地使用数据库一样。
- 例如,两个用户同时对同一个数据库表进行修改操作时,数据库管理系统必须确保每个事务看到的数据是一致的,并且不会相互影响。
4. 持久性(Durability)
- 一旦事务被提交,它对数据库的修改就应该是永久的,即使系统发生故障也不会丢失。
- 例如,在一个电子商务系统中,当用户成功下单并支付后,订单信息被保存到数据库中。即使系统突然断电,当系统重新启动后,订单信息仍然应该存在。
 
二、事务的用途
 
1. 确保数据完整性
- 在复杂的业务逻辑中,可能涉及多个数据库操作。事务可以确保这些操作要么全部成功,要么全部失败,从而保证数据的完整性。
- 例如,在一个财务系统中,记录一笔收入和更新账户余额这两个操作必须作为一个事务来执行,以确保数据的准确性。
2. 提高并发性能
- 数据库管理系统可以通过事务的隔离级别来控制并发事务之间的相互影响,从而提高系统的并发性能。
- 例如,在一个高并发的在线交易系统中,可以通过设置适当的事务隔离级别来减少事务之间的冲突,提高系统的吞吐量。
3. 简化错误处理
- 当事务中的某个操作失败时,事务可以自动回滚到事务开始前的状态,这使得错误处理变得更加简单。
- 例如,在一个数据导入过程中,如果某个数据记录不符合格式要求,事务可以回滚,避免将错误的数据插入到数据库中。

2.连接,联合

在数据库中,“连接”和“联合”都是用于操作多个表以获取所需数据的重要概念。
 
一、连接(Join)
 
1. 定义
- 连接操作是根据两个或多个表之间的共同列,将这些表组合在一起,以获取更全面的数据集。
2. 类型
- 内连接(Inner Join):只返回两个表中满足连接条件的行。例如,有一个“学生表”和一个“成绩表”,通过学生的 ID 进行内连接,将只返回有成绩记录的学生信息。


- 外连接(Outer Join):包括左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。左外连接返回左表中的所有行以及右表中满足连接条件的行;右外连接则相反;全外连接返回两个表中的所有行,无论是否满足连接条件。


- 交叉连接(Cross Join):也称为笛卡尔积,它返回两个表中所有行的组合。如果两个表分别有 m 行和 n 行,那么交叉连接将返回 m×n 行。
 
二、联合(Union)
 
1. 定义
- 联合操作将两个或多个具有相同列结构的结果集合并为一个结果集。
2. 特点
- 要求参与联合的各个查询结果集具有相同的列数和数据类型。例如,可以将两个不同的查询结果集联合起来,以获取更广泛的数据集。
- 去除重复行(默认情况),但可以使用 UNION ALL 保留所有行,包括重复行。
 
连接和联合在数据库查询和数据处理中都起着重要的作用,可以根据具体的需求选择合适的操作来获取所需的数据。

3.触发器

在数据库中,触发器是一种特殊的存储过程,它在特定的数据库事件发生时自动执行。
 
一、触发器的作用
 
1. 数据完整性维护
- 可以在插入、更新或删除数据时,自动检查数据的合法性,并采取相应的措施来确保数据的完整性。例如,可以在插入订单数据时,检查库存数量是否足够,如果不足则拒绝插入并给出提示。
2. 数据同步
- 当一个表中的数据发生变化时,可以自动更新其他相关表中的数据,以保持数据的一致性。例如,当一个客户的联系方式在客户表中被更新时,可以自动更新与该客户相关的订单表中的联系方式。
3. 审计跟踪
- 可以记录数据库中的特定操作,以便进行审计和跟踪。例如,可以记录对重要数据表的插入、更新和删除操作,以及执行这些操作的用户和时间。
 
二、触发器的类型
 
1. 插入触发器(INSERT Trigger)
- 在向表中插入数据时触发。可以用于检查插入的数据是否符合特定的条件,或者在插入数据后自动执行一些其他操作。
2. 更新触发器(UPDATE Trigger)
- 在更新表中的数据时触发。可以用于检查更新后的数据是否符合特定的条件,或者在更新数据后自动执行一些其他操作。
3. 删除触发器(DELETE Trigger)
- 在从表中删除数据时触发。可以用于检查删除操作是否符合特定的条件,或者在删除数据后自动执行一些其他操作。
 
三、触发器的注意事项
 
1. 性能影响
- 触发器的自动执行可能会对数据库的性能产生一定的影响,特别是在频繁触发的情况下。因此,在设计触发器时,应尽量避免复杂的逻辑和大量的计算,以减少对性能的影响。
2. 调试困难
- 由于触发器是自动执行的,调试起来可能比较困难。在开发过程中,应充分测试触发器的功能,以确保其正确性。
3. 维护成本
- 随着数据库结构和业务逻辑的变化,触发器可能需要进行相应的修改和维护。因此,在设计触发器时,应考虑到未来的可维护性。

4.子查询

在数据库中,子查询是一种嵌套在其他查询内部的查询语句。

一、子查询的作用

1. 数据筛选

- 可以在查询中作为条件的一部分,用于筛选满足特定条件的数据。例如,可以使用子查询找出销售额高于平均销售额的产品。

- 先通过子查询计算出平均销售额,然后在外部查询中筛选出销售额高于这个平均值的产品。

2. 数据生成

- 可以作为一个临时表,为外部查询提供数据。例如,可以使用子查询生成一个包含特定条件的产品列表,然后在外部查询中对这个列表进行进一步的操作。

- 子查询生成的结果集可以像普通表一样在外部查询中被引用和操作。

二、子查询的类型

1. 标量子查询

- 返回单个值的子查询。这个值可以在外部查询中作为一个常量来使用。例如,可以使用标量子查询找出某个特定客户的最大订单金额。

- 外部查询可以使用这个返回的单个值进行比较或其他运算。

2. 列子查询

- 返回一列数据的子查询。这个结果集可以在外部查询中作为一个临时表的列来使用。例如,可以使用列子查询找出所有属于某个类别产品的名称。

- 外部查询可以对这个列进行聚合、筛选等操作。

3. 行子查询

- 返回一行数据的子查询。这个结果集可以在外部查询中作为一个临时表的行来使用。例如,可以使用行子查询找出某个特定产品的详细信息。

- 外部查询可以对这个行进行比较、更新等操作。

三、子查询的注意事项

1. 性能问题

- 复杂的子查询可能会导致性能下降,特别是当子查询需要大量的数据处理或与外部查询频繁交互时。在设计查询时,应尽量避免使用过于复杂的子查询,或者考虑使用其他方法来实现相同的功能。

- 可以通过优化数据库结构、建立合适的索引等方式来提高子查询的性能。

2. 可读性

- 嵌套的子查询可能会使查询语句变得复杂,难以理解。在编写子查询时,应尽量使用清晰的命名和注释,以便于其他人阅读和维护代码。

- 可以将复杂的子查询拆分成多个简单的查询,或者使用临时表来提高查询的可读性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • html备忘录
  • IDEA 2024最新软件下载
  • 【全网最全】2024年数学建模国赛C题超详细保奖思路+可视化图表+成品论文+matlab/python代码等(后续会更新
  • Elastic Stack--ELFK实例与Dashboard界面
  • docker实战基础四(如何在容器中调试和排查运行问题)
  • 基于PyTorch分布式训练的实现与优化(以CIFAR-10为例)
  • 如何搭建RGBD GS-ICP SLAM环境以及如何与自己编的pcl并存
  • 如何在JSON对象中查询特定的值?C语言实现
  • Linux 命令行/bash脚本 批量创建文件
  • Python基础语法(17多线程线程锁单例模式)
  • Android13默认开启电池百分比数字显示Framework
  • 山东大学机试试题合集
  • 服务器数据恢复—OneFS文件系统下数据被删除的数据恢复案例
  • UE驻网失败问题(三)
  • C++知识点总结
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • create-react-app项目添加less配置
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JAVA之继承和多态
  • Laravel Mix运行时关于es2015报错解决方案
  • zookeeper系列(七)实战分布式命名服务
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 目录与文件属性:编写ls
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用权重正则化较少模型过拟合
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 找一份好的前端工作,起点很重要
  • Spring第一个helloWorld
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​如何防止网络攻击?
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二)学习JVM —— 垃圾回收机制
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (南京观海微电子)——COF介绍
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET与 java通用的3DES加密解密方法
  • .sh
  • ??eclipse的安装配置问题!??
  • @javax.ws.rs Webservice注解
  • @RequestParam详解