程序员程序猿阵线联盟-汇总各类技术干货Java交流

Java面试题之数据库Mysql

2018-06-05  本文已影响129人  周小鑫001

一、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'

本人能力有限,也只能理解这些,

    

    

上一篇下一篇

猜你喜欢

热点阅读