Java面试题之数据库Mysql
一、Mysql
1、SQL 的Select 语句完整的执行顺序
1、from 子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录进行筛选;
3、 group by 子句将数据划分为多个分组
4、使用聚集函数进行计算
5、使用having子句筛选分组;
6、计算所有表达式。
7、Select 的字段
8、使用order by 对结果集进行排序
2、SQL之聚合函数
聚合函数是对一组值进行计算并返回单一的值的函数,它经常与Select 语句中的group by 子句一同使用
1.avg()返回的是指定组分钟的平均值,空置被忽略。
2.count():返回指定的是指定组中的项目个数。
3.max()返回指定数据中的最大值
4.min()返回指定数据中的最小值。
5.sum() 返回制定数据的和,只能用于数字序列,控制忽略
3、SQL之连接查询(左连接和右连接的区别)
外连接,
左连接:以左边作为基本进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应的字段数据,如果
不匹配则显示为null
右连接:以右表作为基准进行查询,右表数据会全部显示,左表和右表匹配的数据则显示相应的字段的数据,如果不匹配显示为null
全连接:先以左表为进行左连接,在以右表进行右连接
内连接:显示表之间所有连接匹配的所用行
4、SQL值SQL注入
防止SQl注入的方式
1.预编译语句,
2,Mybatis框架中的mapper方式中的#也能很大程度的防止sql注入
5、Mysql性能优化
1)当只有一行数据时使用limit
查询时如果已知会得到一条数据,这种情况下加上limit1会增加性能,因为mysql数据库引擎会在找到一条记录结果
停止搜索,而不是继续查询相爱一条符合标准直到所有记录都查询完毕
2)选择正确的数据库的引擎
Mysql 中有两个数据库引擎MyISAM和InnoDB,每个引擎有利有弊
MyISAM适用于一些大量查询的应用,但对于有大量写功能的应用不是很友好,甚至你只需要update一个字段整个表
都会被锁起来,而别的进程就算是读操作也不行要等到当前update操作完成之后才能继续运行,另外,MyISAM对于
select count(*)这类操作时非常快的
InnoDB的趋势会是一个非常复杂的存储引擎,对于一些小的应用回避MyISAM还慢,但是支持“行锁”,所以在写操作
比较多的时候会比较优秀,并且,它支持很多的高级应用,例如:事务
3).用not exists 代替not in
NOt exists 用到了连接能够发挥已经建立好的 索引的作用,not in不能使用索引,Not in 是最慢的方式要同每条记录比较。
在数据量比较大的操作不建议使用这种方式。
4)对操作符的优化,尽量不采用不利于索引的操作符
如:in not in is null is not null <>等
事务的四大特征是什么
数据库事务transanction 正确执行的四个基本要素,ACID,原子性(Atomicity)、一致性,隔离性,持久性
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节,事务在执行过程中发生
错误,会被回滚到事务开始前的状态,就像这个事务从来执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完成性约束没有被破坏
隔离性:隔离状态执行型事务,它们好像是系统在给定时间内执行的唯一操作,如果有两个事物,运行在相同的时间内。
执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统,这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化,
持久性:在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚,
limit的基数比较时使用between
例如: select * admin order by admin_id limit 100000,10
优化为:Select from admin where admin_id between 100000 and 1000010 order by admin_id
尽量避免使用在列做运算,这样会导致索引失效
例如:Select * from admin where year(admin_time)>2014
优化为:Select * from admin where admin_time>'2014-01-01'
本人能力有限,也只能理解这些,