首页 > 代码库 > 面试总结之mysql
面试总结之mysql
总结自己在面试过程遇到的数据库问题,以备不时之需。
1、你在你们公司用的什么版本的mysql数据库,用过mysql5.7吗?
在学校学习mysql的时候用的5.5,在公司的时候用的5.6,5.7还真没用过。(真坑)
知识总结:目前互联网公司,线上mysql用的最多的版本是mysql5.5,5.6,5.7,性能比较如下:
只读:5.7比5.6快2倍,比5.5快3倍。
读写:5.7比5.6快1.5倍,比5.5快2.5倍。
msql的体系结构基本如下:
一条sql的执行大致分下8个步骤:
server层没有太大的变化,主要是存储引擎层的改变。也就是目前最火的Innodb存储引擎,无论从它的功能上、还是性能上,都有所提高。(基本都是在增强innodb存储引擎)
5.7的新特性引见一个作者的博文:http://sumongodb.blog.51cto.com/4979448/1949800,大家可以看一下。
2、mysql常用命令有哪些,怎麽为某个用户分配权限?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
create database name ; 创建数据库 use databasename; 选择数据库 drop database name ; 直接删除数据库,不提醒 show tables; 显示表 describe tablename; 表的详细描述 select 中加上 distinct 去除重复字段 显示当前mysql版本和当前日期 select version(), current_date ; 修改mysql中root的密码: shell>mysql -u root -p mysql> update user set password = password (“root123″) where user =’root’; mysql> flush privileges 刷新权限 mysql>use dbname; 打开数据库 mysql>show databases; 显示所有数据库 mysql>show tables; 显示数据库mysql中所有的表 mysql> desc user ; 显示表mysql数据库中 user 表的列信息) grant 创建一个可以从任何地方连接到服务器的一个超管账户,必须分配一个密码 mysql> grant all privileges on *.* to ‘user_name‘ @ ‘localhost‘ identified by ‘password‘ ; 格式: grant select on 数据库.* to 用户名@登录主机 identified by “密码” 删除授权: mysql> revoke all privileges on *.* from root@”%”; mysql> delete from user where user =”root” and host=”%”; mysql> flush privileges ; 重命名表: mysql > alter table t1 rename t2; 备份: mysqldump -hhostname -uusername -ppassword databasename > backup.sql; 恢复: mysql -hhostname -uusername -ppassword databasename< backup.sql; |
3、三表关联查询、单表自关联、单表分组排序查询、limit查询等。(必考)
我觉的考察最多的,lnner join 表 on (内连接) left join 表 on(左连接)重点 right join 表 on (右连接)full join 表 on(完全连接)
第一、单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。
第二、两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
第三、多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
注意事项:
ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。
WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
结论:ON只进行连接操作,WHERE只过滤中间表的记录。
连接查询是SQL查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。下面总结一下两表连接查询选择方式的依据:
查两表关联列相等的数据用内连接。
Col_L是Col_R的子集时用右外连接。
Col_R是Col_L的子集时用左外连接。
Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
一般是count和distinct函数连用,完成一个查询操作。聚集函数是对于列而言的,不是元组。(例如sum、max等函数)聚集函数只能用于select子句和group by中的having子句。
一般是group by和order by colum desc/asc 连用,完成某个查询。select 后面的列+order by 后面的列 必须在group by 里面,也就是说 select 和 order by 后面的列是 group by 列的子集。而 select 和 order by 之间是没有什么瓜葛的。
limit配合其他查询(常考),LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。例如:
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
总之,多刷点数据库的面试题,一般你的sql写的比较好,企业就会考虑要你。
4、做过mysql的优化吗,说说?(必考--当时我回答的是语句的优化和索引)
我们不是做运维的,sql优化问题从硬件配置,软件配置参数,sql语句调优配合索引等三个大方面实现mysql调优。
参考一个作者的博客:http://blog.csdn.net/ning109314/article/details/9997867
面试总结之mysql