mysql 单表外键和事务


聚合函数

作用:将一列数据作为一个整体,进行纵向的计算

常用的聚合函数有: 1. count(字段),统计记录数, 2. sum(字段)求和操作, 3. max(字段)最大值 4. min(字段) 最小值 5. avg(字段) 平均值

语法格式:select 聚合函数(字段名)from 表名 [where 条件]

count(1),count(*),count(字段)的区别

count(1) 和count()都是用于计算表中记录的数量,不同的是 count()表示计算表中的所有记录的数量,不考虑记录中的具体值 count(1)表示计算表中的所有非空的数量,对每条记录都会计算。 count(列) 只包括列名那一列,在统计结果会忽略值为空的计数即某个字段值为NULL

效率上:

列名为主键,count(字段) 会比count(1)快 列名不为主键,count(1)会比count(列名)快 如果表多个列并且没有主键,则count(1) 的执行效率优于count() 如果有主键,select count(主键)的执行效率是最优的 如果表只有一个字段,select count()最优

在实际使用中,功能是等价的,都是返回表中的记录总数,在效率中,数据库对其进行优化,底层数据库对表进行扫描,然后对满足条件的记录进行计数。 mysql ,postgreSql,Oracle,Sql server 可能会对count(*)和count(1)进行特殊优化,如果语句中没有where子句时直接返回表的记录数而不需要进行实际的记录计数

分组查询

使用group by 字句 在分组之后进行条件过滤,使用having判断条件,语法格式:select 分组字段/聚合函数 from 表名 group by 分组字段 having 判断条件

  1. 主键索引
    1. 主键索引是一种特殊的索引,用来标识每条记录
    1. 使用主键进行分组时,mysql 通常会利用主键索引进行分组操作,主键是唯一的且已经按顺序排列
    1. 主键索引的查询效率通常较高,尤其是在分组和聚合操作中
  2. 唯一索引
    1. 唯一索引是指索引列的值必须是唯一的,可以包括 NULL值
    1. 使用唯一索引进行分组时,mysql利用索引进行分组操作,稍微慢于主键索引,唯一索引可能不是按顺序排列
    1. 唯一索引通常也能提供较高的查询效率
  3. 聚合索引
    1. 聚合索引是包含多个列的索引,用于覆盖多个查询条件
    1. 当使用聚合索引进行分组时,mysql 可能会选择使用索引来执行分组操作,取决于查询的具体条件和索引的结构。
    1. 聚合索引的效率取决于查询中涉及的列和索引的选择性,以及索引的大小。
  4. 一般字段索引
    1. 对于普通字段上的索引,当使用索引进行分组时,mysql 可能会选择使用索引来执行分组操作,但与聚合索引类似,效率取决于查询具体条件和索引的选择性。
    1. 一般字段索引的效率通常较低于主键索引和唯一索引

索引的选择对于group by 查询的效率影响比较大,主键索引和唯一索引通常提供较高的性能,而聚合索引和一般索引的效率略有差异取决于查询的具体情况

where 与 having的区别

where 在分组进行过滤,where 后面不能跟聚合函数 having在分组后进行条件过滤,在having后面可以写聚合函数

主键约束

不可重复,唯一,不为空,用来表述数据库中的每一条记录,只能有一个主键 语法格式 字段名 字段类型 primary key

delete 和truncate

delete 删除表中所有数据,将表中数据逐条删除 truncate 删除表中所有数据,是将整个表删除,然后重建一个结构相同的表

唯一约束

表中的某一列不能够重复(对null值,不做唯一判断,可以为空),可以多个 格式 字段名 字段类型unique

手动事务

  1. 开启事务 start transaction; 或者 begin;
  2. 提交事务 commit;
  3. 回滚事务 rollback;

自动提交事务

mysql 默认的提交方式,自动提交事务,每执行一条 DML语句,都是单独的一个事务

## 查看是否开启事务 show variables like 'autocommit'; set @@autocommit = off //改为否

## 四大特性 1. 原子性 A 每个事务都是一个整体,不可以再拆分,事务中的sql 要么都成功,要么失败 2. 一致性 C 事务在执行前数据库的状态和事务执行之后的状态要保持一致 3. 隔离性 I 事务与事务之间不相互影响,执行时要保证隔离状态 4. 持久性 D 一旦失误执行成功,对数据的修改是持久的

mysql 事务隔离级别 默认是RR级别

  1. 数据并发访问 一个数据库拥有多个访问客户端,这些客户端以并发的方式访问数据库,数据库的相同数据可以被多个事务同时访问,如果不采取隔离措施,会导致问题,进而破坏数据的完整性
  2. 并发访问产生的问题 脏读 一个事务读取到了另一个事务中尚未提交的事务,例如,一个在线银行系统中,用户在转账过程中查看余额,即使转账尚未提交,用户也应该能够看到最新的余额。 不可重复读 一个事务两次读取的数据内容不一致,要求是在一个事务中多次读取数据是一致的这是update操作时引发的问题,例如,在一个图书销售系统中,一个事务查询了某本书的库存数量,然后再次查询库存数量时发现已经发生了变化 幻读 一个事务中,某一个select 操作得到的结果所表征的数据状态,无法支撑后续的业务操作,查询到的数据状态不准确导致幻读,例如在一个在线商店系统中,一个事务内的查询操作可能会多次查询某个商品的销售数量,但由于其他事务的购买行为,同一次查询可能会返回不同的销售数量。

隔离级别

  1. read uncommitted: 读未提交,解决不了问题
  2. read commit 读已经提交,可以解决脏读
  3. repeatable read 可重复度,解决脏读,不可重复读
  4. serializable 串行化,解决脏读,不可重复读,幻读。

如何操作

查看隔离级别 select @@tx_isolation; 设置隔离级别 set global transaction isolation level 级别名称;