1、 聚合函数
count(*)
和count(column)
以及count(1)
的区别
SELECT COUNT(*) FROM province
count(*)=10
SELECT COUNT(1) FROM province
count(1)=10
SELECT COUNT(shenghui) FROM province
count(shenghui)=9
- 首先
count(column)
会忽略所有null值,所以查询shenghui
字段时,count数是9 - 一般情况下,
count(*)
和count(1)
计算结果一致 - 如果有主键的话,
count(主键)
的运行效率最快;如果没有主键,count(1)
比count(*)
要快 - 如果整个表只有一行,那么
count(*)
的运行效率最快;如果超过一行,count(1)
比count(*)
快,因为count(*)
会扫描整个表
2、sql的执行顺序(已经按顺序排序好)
from -- 对查询指定的表计算笛卡尔积
on -- 按照 join_condition 过滤数据
join -- 添加关联外部表数据
where --按照 where_condition过滤数据
group by --进行分组操作
聚合函数 avg,sum....
having -- 按照 having_condition过滤数据
select --选择指定的列
distinct --指定列去重
order by --按照 order_by_condition排序
limit --取出指定记录量进行分页
mysql事务
MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的
基本特性ACID
- 原子性指的是一个事务中的操作要么全部成功,要么全部失败。
- 一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱,A减少了100元,那么B对应的必定多100元,不可能出现一个少了,另一个不改变
- 隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。
- 持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。
隔离级别事务隔离级别要实际解决的问题
脏读:
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
可重复读:
可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新(UPDATE)操作
不可重复读:
对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。
幻读:
eg:程序员某一天消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事物开启),看到确实是花了2千元,就在这个时候,程序员花了1万元买了一台电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子提交事务),发现花了1.2万元,似乎出现了幻读,就是幻读。
事务隔离级别
- 读未提交(READ UNCOMMITTED)
可能会读到其他事务未提交的数据,也叫做脏读。
- 读已提交 (READ COMMITTED)
两次读取结果不一致,叫做不可重复读。不可重复读解决了脏读的问题,他只会读取已经提交的事务。
- 可重复读 (REPEATABLE READ)
mysql的默认级别,就是每次读取结果都一样,但是有可能产生幻读。
- 串行化 (SERIALIZABLE)
一般是不会使用的,他会给每一行读取的数据加锁,会导致大量超时和锁竞争的问题。