聚合函数
作用:将一列数据作为一个整体,进行纵向的计算
常用的聚合函数有: 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 判断条件
- 主键索引
-
- 主键索引是一种特殊的索引,用来标识每条记录
-
- 使用主键进行分组时,mysql 通常会利用主键索引进行分组操作,主键是唯一的且已经按顺序排列
-
- 主键索引的查询效率通常较高,尤其是在分组和聚合操作中
- 唯一索引
-
- 唯一索引是指索引列的值必须是唯一的,可以包括 NULL值
-
- 使用唯一索引进行分组时,mysql利用索引进行分组操作,稍微慢于主键索引,唯一索引可能不是按顺序排列
-
- 唯一索引通常也能提供较高的查询效率
- 聚合索引
-
- 聚合索引是包含多个列的索引,用于覆盖多个查询条件
-
- 当使用聚合索引进行分组时,mysql 可能会选择使用索引来执行分组操作,取决于查询的具体条件和索引的结构。
-
- 聚合索引的效率取决于查询中涉及的列和索引的选择性,以及索引的大小。
- 一般字段索引
-
- 对于普通字段上的索引,当使用索引进行分组时,mysql 可能会选择使用索引来执行分组操作,但与聚合索引类似,效率取决于查询具体条件和索引的选择性。
-
- 一般字段索引的效率通常较低于主键索引和唯一索引
索引的选择对于group by 查询的效率影响比较大,主键索引和唯一索引通常提供较高的性能,而聚合索引和一般索引的效率略有差异取决于查询的具体情况
where 与 having的区别
where 在分组进行过滤,where 后面不能跟聚合函数 having在分组后进行条件过滤,在having后面可以写聚合函数
主键约束
不可重复,唯一,不为空,用来表述数据库中的每一条记录,只能有一个主键 语法格式 字段名 字段类型 primary key
delete 和truncate
delete 删除表中所有数据,将表中数据逐条删除 truncate 删除表中所有数据,是将整个表删除,然后重建一个结构相同的表
唯一约束
表中的某一列不能够重复(对null值,不做唯一判断,可以为空),可以多个 格式 字段名 字段类型unique
手动事务
- 开启事务 start transaction; 或者 begin;
- 提交事务 commit;
- 回滚事务 rollback;
自动提交事务
mysql 默认的提交方式,自动提交事务,每执行一条 DML语句,都是单独的一个事务
## 查看是否开启事务 show variables like 'autocommit'; set @@autocommit = off //改为否
## 四大特性 1. 原子性 A 每个事务都是一个整体,不可以再拆分,事务中的sql 要么都成功,要么失败 2. 一致性 C 事务在执行前数据库的状态和事务执行之后的状态要保持一致 3. 隔离性 I 事务与事务之间不相互影响,执行时要保证隔离状态 4. 持久性 D 一旦失误执行成功,对数据的修改是持久的
mysql 事务隔离级别 默认是RR级别
- 数据并发访问 一个数据库拥有多个访问客户端,这些客户端以并发的方式访问数据库,数据库的相同数据可以被多个事务同时访问,如果不采取隔离措施,会导致问题,进而破坏数据的完整性
- 并发访问产生的问题 脏读 一个事务读取到了另一个事务中尚未提交的事务,例如,一个在线银行系统中,用户在转账过程中查看余额,即使转账尚未提交,用户也应该能够看到最新的余额。 不可重复读 一个事务两次读取的数据内容不一致,要求是在一个事务中多次读取数据是一致的这是update操作时引发的问题,例如,在一个图书销售系统中,一个事务查询了某本书的库存数量,然后再次查询库存数量时发现已经发生了变化 幻读 一个事务中,某一个select 操作得到的结果所表征的数据状态,无法支撑后续的业务操作,查询到的数据状态不准确导致幻读,例如在一个在线商店系统中,一个事务内的查询操作可能会多次查询某个商品的销售数量,但由于其他事务的购买行为,同一次查询可能会返回不同的销售数量。
隔离级别
- read uncommitted: 读未提交,解决不了问题
- read commit 读已经提交,可以解决脏读
- repeatable read 可重复度,解决脏读,不可重复读
- serializable 串行化,解决脏读,不可重复读,幻读。
如何操作
查看隔离级别 select @@tx_isolation; 设置隔离级别 set global transaction isolation level 级别名称;