1.模糊查询
% 表示任意位 _表示一位 前面添加“\” 可以转义
user表
id | userName |
1 | William |
2 | Milliam |
3 | M_illiam |
select * from user where userName like '%illia%';
1 | William |
2 | Milliam |
3 | M_illiam |
select * from user where userName like '_illia%';
1 | William |
2 | Milliam |
select * from user where userName like '\_illia%';
3 | M_illiam |
2.分组函数,只有在group by (出现或者默认)能使用
max() min() count() avg() sum()
3.having 和where
where是查询前的筛选,作为查询条件,having查询后筛选,如果能用where尽量使用where,实在不行再用having
4.拼接函数
https://www.cnblogs.com/haw2106/p/10735500.html
替换函数
#sql语法:
#UPDATE 表名 SET 字段名=replace(字段名, ‘被替换字符串’, '用来替换的字符串') ;
#sql:
UPDATE `member` SET `phone`=replace(`phone`, '\'', '') ;
5.存储引擎
存储引擎是相对于表来说的,不是相对于数据库的,每张表可以有一个引擎,同一个数据库中不同的表可以使用不同存储引擎。
innoDB支持行锁,支持事务,索引和数据存在同一个文件,查询效率相比于MyISAM更高
MyISAM 支持表级锁,不支持事务,索引和数据不在同一个文件,相同情况下会比innoDB效率低,因为会多一次IO
6.索引
排好序的数据结构
数据结构演示网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
二叉树
缺点:如果一直递增的数据,那么会出现单边增长,类似于链表,查询效率低
红黑树
缺点:虽然能平衡可是层级会很多
hash
缺点:只查询相等的情况下虽然效率高,但是不支持范围查询基本上没什么用
B tree
非叶子结点也存储数据,浪费了空间
B+tree
查询次数较少,非叶子节点只需要维护一个值(8B)和一个指针(6B),大概14B,每个块默认是16K,
三层查询结构已经能够支持2000多万行的数据建立索引
非叶子节点不存储数据,只存储索引值和地址块指针
为什么要用主键,而且自增
索引是排序的,如果不是自增会发生裂变,重排,十分影响性能,如果自增那就不会出现这个问题
聚簇索引
在btree的叶子节点上,不同的叶子结点会维护一个双向链表,指向相邻的叶子结点,因为索引是排好序的,所以聚簇索引能够很快的查询到需要的数据。极大提高了查询效率。
最左匹配原则
从索引的第一位开始比对,可以比索引少,只要不跳就不会影响,如果不是从左边第一位开始或者中间跳了,那么不会走该索引,因为索引是排好序的数据结构,有一个不一样,那么索引就不能适用。
7.事务
事务特性ACID
原子性
持久性
隔离性
一致性
mysql默认三级事务(可重复读)
事务级别:
读未提交(事务A进行中时能够读取到事务B还未提交的数据,比如事务B插入了数据还未提交,此时如果A读取的话是能读取到的)
缺点:产生脏读现象,因为如果使用了别的事务未提交的数据,而恰好该事务进行了回滚,则读到的数据中包含脏数据
读已提交(事务A进行中时能够读到B已经提交的事务)
缺点:不可重复读,意思是如果A事务还未结束,它如果第一次查询时别的事务未开始操作,当查询以后如果别的事务进行了提交,事务A再次进行相同的查询则不能查询到最开始的结果
可重复读:(事务A进行中时,别的事务读数据进行修改然后提交,对事务A没有影响。如果事务A开始进行了一次查询以后,如果事务B删除或者修改了数据进行提交后,事务A再次进行查询,结果仍然是之前的结果,跟事务B的操作没有任何关系)
缺点:幻读,别的事务已经进行了修改,数据已经发生了改变,但是当前事务查询的任然是事务开启那一刻的数据,读取的数据一旦发生了变化,那么其实查询的结果已经不对了,当前查询的结果只是一个幻想(解决方案,锁方案)
串行化读、序列化读:一旦有一个事务开启别的事务不能进行,只有当前事务结束后别的事务才能开始执行,保证了查询到的结果都是正确的。保证了数据的正确性
缺点:效率太低