目录标题
- 1、SQL语言分类
- 2、join连接
- 3、列转换
- 3.1 列转行
- 3.2 行转列
- 4、分页查询
- 5、字符串处理函数
- 5.1 字符函数
- 5.2 数学函数
- 5.3 日期函数
- 6、索引
- 6.1 什么是索引
- 6.2 建立索引的优缺点
- 6.3 索引有哪些
- 6.4 索引为什么快
- 6.5 什么情况下加索引
- 6.6 怎么知道索引用没用上
- 6.7 用过组合索引吗,是有序的吗
- 6.8 什么情况下会使索引失效?
- 6.9 sql优化您们是怎么做的?
- 7、Mysql建表考虑因素
- 8、数据库事务的四大特性
- 9、drop、delete与truncate的区别
- 10、查询执行流程
1、SQL语言分类
- DQL数据查询语言select
- DML数据管理语言:insert update delete
- DDL数据定义语言: create update alter
- TCL事务控制语言: commit rollback
2、join连接
(1)内连接:inner join
等值连接
非等值连接
自连接
(2)外连接:
左外连接left join
右外连接right join
全外连接full join
(3)交叉连接cross join
笛卡尔乘积现象:表1有m行,表2有n行,结果是m*n行
笛卡尔乘积发生原因:没有有效的连接条件
笛卡尔乘积如何避免:添加有效的连接条件
3、列转换
3.1 列转行
原表:
输出:
select t1.id,name
from t lateral view explode(split(list,'|')) as name
3.2 行转列
select t1.id,concat_ws('|',collect_set(t1.name))
from animal_info t1
group by t1.id
4、分页查询
当前要显示的数据,一页显示不全,需要分页提交SQL请求
语法:
select
from a join b on 条件
group by
having
order by
limit offset,size;
offset要显示条目的起始索引(索引从0开始)
size要显示的条目个数
执行顺序:from , join ,on , where,group by,having ,select ,order by ,limit
5、字符串处理函数
5.1 字符函数
-
length :获取字节个数,一个字母是一个字节,一个汉字是三个字节(utf-8)或者两个字节(gdk)
-
concat :拼接字符串。concat(字段1,字段2 ,。。)
-
upper,lower:大小写
-
substr:
substr(‘12345678’,7)截取从指定索引处后面的所有字符
substr(‘12345678’,7)截取从指定索引处指定字符长度的字符 -
instr(‘qwertyu’,‘t’)返回字串第一次出现的索引,如果找不到返回0
-
trim去除前后字符
select trim(’ 张翠山 ') as output -
lpad用指定的字符实现左填充指定长度
select lpad(‘硬生生’,10,‘*’) as output -
replace替换
select replace(‘张无忌爱上了周芷若’,‘周芷若’,‘赵敏’)
5.2 数学函数
round 四舍五入
ceil 向上取整
floor 向下取整
truncate 截断
select truncate(1.699,1) 输出1.6
mod取余数 mod(10,3)=1
5.3 日期函数
now 返回当前系统日期+时间
curdate 返回当前系统日期,不包含时间
year()month()day()截取年月日
date_format(‘2018/6/3’,‘%Y年%m月%d日’)
6、索引
6.1 什么是索引
索引指数据库的目录。比如:字典上面的字母目录(适用于大数据量)
6.2 建立索引的优缺点
优点:查询速度快
缺点:增删改慢,因为数据要同步取维护索引文件,所以速度慢
6.3 索引有哪些
普通、主键、唯一组合
6.4 索引为什么快
索引结构:B+Tree
6.5 什么情况下加索引
(1)主键自动建立唯一索引
(2)频繁作为查询条件的字段应该创建索引
(3)查询中与其他表关联的字段,外键关系建立索引
(4)单键/组合索引的选择问题,组合索引的性价比更高
(5)查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
(6)查询中统计或者分组字段。
(7)过滤条件好的字段选择一段选择加索引
6.6 怎么知道索引用没用上
通过explain查询sql执行计划,主要看key使用的是哪个索引
6.7 用过组合索引吗,是有序的吗
用过, 有序
6.8 什么情况下会使索引失效?
(1)like
(2)like “%123%,前面不能+%
(3)使用 关键字 in ,or ,null,!=
6.9 sql优化您们是怎么做的?
(1)首先开启数据库慢查询日志,定位到查询效率比较低的sql , 找出对应的sql语句并进行分析
- 表设计是否规范,是否符合三范式的标准
第一范式:保证原子性(不可拆分)
第二范式:每张表都有主键
第三范式:每一列都有主键相关 - 查看数据表中是否存在大量的冗余字段,字段数据类型是否合理
- 尽可能的使用varchar代替char 建表数据类型,能用数值的绝对不用字符存储
- 尽量避免null值,使用默认值替代空值,数值型可以使用0,字符型可以使用空字符串
(2)查看sql语句是否规范
- 避免使用关键字:or ,in,not in ,!=,<>,避免使用select *
- 尽量避免子查询,大部分子查询都可以连接查询
- 用到or的地方可以使用union去代替实现
- 用到in的地方可以使用exists去代替
(3)分析sql的索引是否可以用上 - explain查询sql的执行计划,重点关注的几个列就是,type是不是全表扫描
- 看一下索引是否能够用的上,主要看key使用的是哪个索引
- 看一下rows扫描行数是不是很大
7、Mysql建表考虑因素
1、表名
2、字段类型
时间格式的数据有:date、datetime和timestamp等等可以选择。
字符类型的数据有:varchar、char、text等可以选择。
数字类型的数据有:int、bigint、smallint、tinyint等可以选择。
3、字段长度
在mysql中除了varchar和char是代表字符长度之外,其余的类型都是代表字节长度。
4、字段个数——不超过20个
8、数据库事务的四大特性
ACID:持久性 隔离性 一致性 原子性
原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
一致性:是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性:是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性:是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
事务隔离级别:读未提交(1000)、读已提交(1100)、可重复读(1110)、串行化(1111)。
9、drop、delete与truncate的区别
drop、delete、truncate都表示删除,但是三者有一些差别:
1、Delete用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除。会触发这个表上所有的delete触发器
2、Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小;
3、Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。
因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete;在保留表而删除所有数据的时候用truncate。
10、查询执行流程
简单来说分为五步:① 客户端发送一条查询给服务器。② 服务器先检查查询缓存,如果命中了缓存则立刻返回存储在缓存中的结果,否则进入下一阶段。③ 服务器端进行 SQL 解析、预处理,再由优化器生成对应的执行计划。④ MySQL 根据优化器生成的执行计划,调用存储引擎的 API 来执行查询。⑤ 将结果返回给客户端。
from - join - on - where - groupby - having - select - orderby - limit