MySQL基础总结

MyBatis & MySQL 面试题

MySQL 面试题

一、MySQL 基础

1、创建数据库
create database test1;
2、查看数据库
show databases;
3、选择数据库
use mysql;
4、删除数据库
drop database test1;
5、创建表
CREATE  [TEMPORARY]  TABLE  [IF NOT EXISTS] [database_name.] <table_name>
(
  <column_name>  <data_type>  [[not] null], ......
)

注:TEMPORARY:指明创建临时表
  IF NOT EXISTS:如果要创建的表已经存在,强制不显示错误消息
  database_name:数据库名
  table_name:表名
  column_name:列名
  data_type:数据类型*

6、查看定义
desc emp;
7、查看创建的表
show create table emp ;
8、更新表名
alter table emp rename users;
9、删除表
drop table emp;
10、增加表字段
alter table emp add column age int(3);
11、删除表字段
alter table emp drop column age;
12、修改表字段
alter table emp modify ename varchar(30);

alter table emp change age age int(4);

/***
	前者可以修改列名称,后者不能. 
	change需要些两次列名称.
**/

二、MySQL基本语法

1、插入记录
//指定字段,
//自增,默认值等字段可以不用列出来,没有默认值的为自动设置为NULL
insert into emp (ename,hiredate,sal,deptno) values ('jack','2000-01-01','2000',1);

//可以不指定字段,但要一一对应
insert into emp values ('lisa','2010-01-01','8000',2);
2、批量记录
insert into emp values ('jack chen','2011-01-01','18000',2),('andy lao','2013-01-01','18000',2);
3、更新记录
update emp set sal="7000.00" where ename="jack";

update emp e,dept d set e.sal="10000",d.deptname=e.ename where e.deptno=d.deptno and e.ename="lisa";
4、删除记录
//请仔细检查where条件,慎重
delete from emp where ename='jack';
5、查看记录
//查看所有字段
select * from emp;

//查询不重复记录
select distinct(deptno) from emp ;
select distinct(deptno),emp.* from emp ;

//条件查询
//比较运算符: > < >= <= <> != ...
//逻辑运算符: and or ...
select * from emp where sal="18000" and deptno=2;
6、排序
//desc降序,asc 升序(默认)
select * from emp order by deptno ;
select * from emp order by deptno asc;
select * from emp order by deptno desc,sal desc;
7、限制记录数
select * from emp limit 1;
select * from emp limit 100,10;
select * from emp order by deptno desc,sal desc limit 1;
8、聚合:
select count(id) from emp ;
select sum(sal) from emp ;
select max(sal) from emp ;
select min(sal) from emp ;

/***
	函数:count():记录数 / sum(总和); / max():最大值 / min():最小值
**/
9、分组
//分组统计
select count(deptno) as count from emp group by deptno;
select count(deptno) as count,deptno from emp group by deptno;
select count(deptno) as count,deptno,emp.* from emp group by deptno;
10、二次过滤
select count(deptno) as count,deptno from emp group by deptno having count > 2;
11、二次汇总
select count(sal),emp.*  from emp group by sal, deptno with rollup ;

三、MySQL表的连接

  • left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录;
  • right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录;
  • inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行;
  • full join:外连接,返回两个表中的行:left join + right join;
  • cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
1、内连接
select * from emp as e,dept as d where e.deptno=d.deptno;
select * from emp as e inner join dept as d on e.deptno=d.deptno;

/***
	只返回两个表中连接字段相等的行
**/
2、左外连接
select * from emp as e left join dept as d on e.deptno=d.deptno;

/***
	包含左表中所有的记录以及右表中连接字段相等的记录
**/
3、右外连接
select * from emp as e right join dept as d on e.deptno=d.deptno;

/***
	包含右表中所有的记录以及左表中连接字段相等的记录
**/
4、子查询
//=, !=
select * from emp where deptno = (select deptno from dept where deptname="技术部");
select * from emp where deptno != (select deptno from dept where deptname="技术部");

//in, not in 
//当需要使用里面的结果集的时候必须用in(); 
select * from emp where deptno in (select deptno from dept where deptname="技术部");
select * from emp where deptno not in (select deptno from dept where deptname="技术部");

//exists , not exists
//当需要判断后面的查询结果是否存在时使用exists();
select * from emp where exists (select deptno from dept where deptno > 5);
select * from emp where not exists (select deptno from dept where deptno > 5);
5、记录联合
union:返回去重之后的结果
select ename from emp union select ename from emp;

union all:返回所有结果
select ename from emp union all select ename from emp;

四、MySQL常用数据类型

1、数值类型

上标;下标

数据类型存储范围字节
tinyint[(m)]有符号值:-128 至 127
无符号值:0 至 255
1
smallint[(m)]有符号值:-215 至 215-1
无符号值:0 至 216
2
mediumint[(m)]有符号值:-222 至 223-1
无符号值:0 至 224-1
3
int[(m)]有符号值:-231 至 231-1
无符号值:0 至 232-1
4
bigint[(m)]有符号值:-263 至 263-1
无符号值:0 至 264-1
8
float[(m, d)]最小非零值:±1.175494351e - 384
double[(m, d)]最小非零值:+2.2250738585072014e - 3088
decimal (m, d)可变;其值的范围依赖于m和dm(mysql < 3.23)
m+2(mysql > 3.23)
2、日期和时间类型
数据类型存储范围字节
DATE1000-01-01 至 9999-12-314
TIME-838:59:59 至 838:59:593
DATETIME1000-01-01 00:00:00 至 9999-12-3123:59:598
TIMESTAMP19700101080001 至 203801191114074
YEAR1901 至 21551
3、二进制数据类型
数据类型说明
TITYBLOB最大长度为255字节
BLOB最大长度为64KB
MEDIUMBLOB最大长度为16MB
LONGBLOB最大长度为4GB
4、字符串数据类型
数据类型说明
CHAR1~255个字符的定长串,它的长度必须在创建时指定,否则MySQL假定为CHAR(1)
VARCHAR可变长度,最多不超过255字节,如在创建时指定VARCHAR(n),则可存储0~n个字符的变长串
TINYTEXT同TEXT,最大长度为255字节
MEDUIMTEXT同TEXT,最大长度为16K
TEXT最大长度为64K的变长文本
LONGTEXT同Text,最大长度为4GB(纯文本,一般不会到4G)
ENUM接受最多64K个串组成的预定义集合的某个串
SET接受最多64K个串组成的预定义集合的零个或多个串

MyBatis面试题

一、Mybaits的优缺点

(1)优点:

① 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

② 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

③ 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

④ 能够与Spring很好的集成;

⑤ 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

(2)缺点:

① SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

② SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

二、#{} 和 ${} 的区别是什么?

${}是字符串替换,#{}是预处理;

Mybatis在处理 时 , 就 是 把 {}时,就是把 {}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

使用#{}可以有效的防止SQL注入,提高系统安全性。

三、Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

四、Mybatis的一级、二级缓存

(1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

(2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

(3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。

五、Mybatis动态sql有什么用?执行原理?有哪些动态sql?

Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断 并动态拼接sql的功能。

Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。

六、使用MyBatis的mapper接口调用时有哪些要求?

  • Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
  • Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;
  • Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
  • Mapper.xml文件中的namespace即是mapper接口的类路径。

七、MyBatis 如何防止sql注入

  1. 检查变量数据类型和格式;
  2. 过滤特殊符号;
  3. 绑定变量,使用预编译语句;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值