1.SQL的select语句完整的执行顺序?
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、groupby子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、select的字段;
8、使用orderby对结果集进行排序。
2.什么是sql注入?如何防止sql注入?
sql注入通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。举例:当执行的sql为select*fromuserwhereusername=“admin”or“a”=”a”时,sql语句恒成立,参数admin毫无意义。
防止sql注入的方式:
预编译语句:如,select*fromuserwhereusername=?,sql语句语义不会发生改变,sql语句中变量用?表示,即使传递参数时为”adminor‘a’=‘a’”,也会把这整体当做一个字符串去查询。
Mybatis框架中的mapper方式中的#也能很大程度地防止sql注入($无法防止sql注入)。
3.事务的四大特征是什么?
数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久地保存在数据库之中,并不会被回滚。
4.MySQL索引的“使用”要注意什么?
1.避免在WHERE子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
2.避免在WHERE子句中使用OR来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:SELECTidFROMtWHEREnum=10ORnum=20。
3.避免在WHERE子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
4.避免在WHERE子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
5.LIKE查询,%不能在前,因为无法使用索引。如果需要模糊匹配,可以使用全文索引。
5.MySQL主从复制的流程是怎么样的?
1、Master上面的binlogdump线程,该线程负责将master的binlogevent传到slave。
2、Slave上面的IO线程,该线程负责接收Master传过来的binlog,并写入relaylog。
3、Slave上面的SQL线程,该线程负责读取relaylog并执行。
4、如果是多线程复制,无论是5.6库级别的假多线程还是MariaDB或者5.7的真正的多线程复制,SQL线程只做coordinator,只负责把relaylog中的binlog读出来然后交给worker线程,woker线程负责具体binlogevent的执行。
6.Mysql中MyISAM和InnoDB的区别有哪些?
1、InnoDB支持事务,MyISAM不支持对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和