数分面试题-SQL高频考点

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值