java面试—mysql数据库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Qizonghui/article/details/81878796

MYSQL
一、sql的select语句完整的执行顺序
    1.sql select的执行顺序:
    1)、from组装来自不同数据源的数据;
    2)、where基于指定的条件对记录进行筛选;
    3)、group by将数据划分为多个分组
    4)、使用聚集函数进行计算
    5)、使用having筛选分组
    6)、计算所有的表达式;
    7)、select的字段
    8)、使用order by对结果集进行排序
    2.sql查询处理的步骤序号:(**这些步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入,这些虚拟表对调用者不可用,只有最后一步生成的表才会给调用者使用,)
    1)、FROM<left_table>
    2)、<join_type>JOIN<right_table>
    3)、ON <join_condition>
    4)、WHERE<where_condition>
    5)、GROUP BY<group_by_list>
    6)、WITH{CUBE|ROLLUP}
    7)、HAVING<having_condition>
    8)、SELECT
    9)、DISTINCT
    10)、ORDER BY<order_by_list>
    11)、<TOP_specification><select_list>
    
    3.逻辑查询处理:
    1)、FROM:对from中的前两个表执行笛卡尔积,生成虚拟表vt1
    2)、on:对vt1应用on筛选器,插入tv2
    3)、outer(join):如果指定louter join(cross join或inner join),保留表中未找到匹配的行将作为外部行添加到vt2,生成vt3.如果from子句包含两个以上表,则对应一个联接生成的结果表和下一个表重复执行步骤1到3;直到处理完所有的表位置。
    4)、where:对tv3筛选,只有true的行才插入到tv4
    5)、group by:按group by中列列表对tv4中的进行分组,生成tv5
    6)、cute|rollup:把超组插入vt5,生成vt6
    7)、having:对vt6应用到筛选器,为true的插入到vt7
    8)、select:处理select列表,生成vt8
    9)、distinct:将重复行从vt8中删除。生成vt9
    10)、order by:将vt9中行按order by子句中列列表顺序,生成一个游标:vc10
    11)、top:从vc10中开始处选择指定数量或比例的行,生成表tv11,返回给调用者;
二、sql之聚合函数:
    聚合函数是一对值进行计算并返回单一的值的函数,它经常与select语句中的group by子句一同使用;
    1)、avg():返回的是指定组中的平均值,空值被忽略。
    2)、count():返回的是指定组中的总数;
    3)、max():返回指定数据中最大值;
    4)、min():返回指定数据中最小值;
    5)、sum():返回指定数据和,只能用于数字列,空值被忽略;
    6)、group by():对数据进行分组,对执行完group by之后的组进行聚合函数的运算,计算每一组的值,最后用having去掉不符合条件的组,having子句中的每一个元素必须出现在select列表中(只针对mysql)
三、sql之连接查询(左链接和右连接区别)
    1.外连接:
        1)、左连接(左外连接):以左表为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配则显示null;
        2)、右连接(右外连接):以右表作为基准进行查询,右表数据会全部显示出来,左表如果和右表匹配的数据则显示相应字段的数据,如果不匹配则显示为null;
        3)、全连接:先以左表进行左外连接,再以右表进行右外连接
        4)、内连接:显示表之间有连接匹配的所有行
    2.内连接
        显示表之间有连接匹配的所有行
四、sql注入
    通过在web表单中输入sql语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图执行sql语句。
    防止sql注入:
        1.预编译语句:如select * from user where username=?,sql语句语义不会发生改变,sql语句中变量用?表示,传递参数是什么就是什么;
        2.mybatis框架中mapper方式中#也能很大程序防止sql注入($无法防止sql注入)
五、mysql性能优化
    1.当只要一行数据使用limit 1
    查询时如果已知会得到一条数据,这种情况下加上limit 1 会增加性能。因为mysql数据库引擎会在找到一条结果停止搜索,而不是继续查询下一条是否符合标准直到所有记录查询完毕。
    2.选择正确的数据引擎
    mysql中有两个引擎myisam和innodb,每个引擎有利有弊
    1)、myisam适用于一些大量查询的应用,但对于有大量写功能的应用不是很好,甚至你只需要update一个字段整个表都会被锁起来,而别的进程就算是读操作也不行要等到当前update操作完成之后才能继续进行,另外,myisam对于select count(*)这类操作是超级快的。
    2)、innodb的趋势会是一个非常复杂的存储引擎,对于一些小的应用会比myisam还慢,但是支持“行锁”,所以在写操作比较多的时候会比较优秀。并且,它支持很多的高级应用(事物);
    3.用not exists代替not in
    not exists用到了连接能够发挥已经建立好的索引的引用,not in不能使用索引。not in是最慢的方式要同每条记录比较,在数据量比较大的操作不建议使用;
    4.对操作符的优化,尽量不采用不利于索引的操作符如:(in 、not in, is null, is not null ,<> 等)
    建立索引:
    mysql中可以利用alter table语句来为表中的字段添加索引,语法为:alter table 声明 add index(字段名);
六、mysql事物
    mysql和其他的数据库产品有一个很大的不同就是事物由存储引擎所决定,例如:myisam,memory,archive都不支持事务,事务就是为了解决一组查询要么全部执行成功,要么全部执行失败,
    mysql事务默认是采取自动提交的模式,除非显示开始一个事务。
    修改自动提交模式,0=off,1=on
七、事务的四大特征
    原子性,一致性,隔离性,持久性
    1.原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前状态,就像这个事务从来没有执行过一样;
    2.一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
    3.隔离性:隔离状态执行事务,是他们好像是系统在给定时间内执行的唯一操作,如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事物在系统中认为只有该事务在使用系统,这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化和序列化请求,使得在同一时间仅有一个请求用于同一数据。
    4.持久化:在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并且不会被回滚;
八、mysql中四种隔离级别
    1.读未提交:未提交读隔离级别也叫脏读,就是事务可以读取其他事务未提交的数据。
    2.读已提交:在其他数据库系统如sql server默认的隔离级别就是提交读,已提交读隔离级别就是在事务未提交之前所做的修改其他事务是不可见的。
    3.可重复读:保证同一个事务中的多次相同的查询的结果是一致的,比如一个事务一开始查询了一条记录然后过了几秒钟又执行了相同的查询,保证两次查询的结果是相同的,可重复读也是mysql的默认隔离级别;
    4.可串行化:可串行化就是保证读取的范围内没有新的数据插入,比如事务第一次查询得到某个范围的数据,第二次查询也同样得到了相同范围数据,中间没有新的数据插入到该范围中。
九、mysql存储过程创建
    

    
    
    
    
    
    

猜你喜欢

转载自blog.csdn.net/Qizonghui/article/details/81878796