一、简答题
1.简述你们公司使用的MySQL版本,并说明具体小版本及GA时间?
MySQL版本 5.7
具体版本 5.7.28
GA 20190927
2.请介绍你熟悉的数据库关系系统的种类和代表产品名称?
RDBMS关系型数据库,适合于安全级别要求高的数据以及关系叫复杂的数据
MySQL、Oracle、MSSQL、IBM、DB2、PG、云数据库
3.请简述MySQL二进制安装重点步骤?
1.清理历史环境(yum remove mariadb-libs 、rm -rf /etc/my.cnf*),创建mysql用户,创建数据库相关目录并授权(存放数据的、存放软件的)
2.下载mysql二进制包到软件目录,解压并且做软连接
3.配置环境变量/etc/profile,生效环境变量配置source /etc/profile
4.安装关键依赖软件包
yum install -y libaio-devel
5.初始化mysql数据库
mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3306/data
6.准备启停脚本
cp /data/app/mysql/support-files/mysql.server /etc/init.d/mysqld
7.准备配置文件
8.启动数据库
/etc/init.d/mysqld start
或者
service mysqld start
9.使用systemctl管理数据库
chkconfig --add mysqld
4.怎么确认数据库启动成功了?
第一种:
查看端口3306是否存活
netstat -lntp |grep mysqld
第二种:
查看mysld进程是否存在
ps -ef |grep mysqld
第三种:
直接进行登录mysql
第四种:
查看服务状态
systemctl status mysqld
/etc/init.d/mysqld status
5.简述你了解的MySQL分支版本情况?
Oracle
Mariadb
Percona Server
6.请简述mysqld的程序结构(1条SQL语句的执行过程)
连接层
1.提供连接协议
2.加载授权表,验证用户密码合法性
--skip-grant-tables
--skip-networking
3.提供链接线程(专用)
SQL层
1.验证SQL的语法、语义、权限
2.解析器进行语句解析,生成解析树
3.优化器进行代价评估,决定最终的执行计划
4.执行器得出执行结果,就是具体的位置
5.提供query cache缓存(默认不开),缓存会用redis
6.日志记录binlog(默认不开)
engine层(存储引擎层)
1.真正和磁盘交互的层
2.根据SQL层得到的执行结果,去磁盘找到数据,交给SQL层,结构化成表,最后通过连接层返回给用户
7.请简述你了解的MySQL的启动方式
1.mysql.server
sys-v
systemd
2.mysqld 加参数 &(可指定配置文件)
3.mysqld_safe 加参数 &(可指定配置文件)
2和3一般用于维护,只能进行启动
8.简述MySQL配置文件默认读取顺序
命令:mysqld --help --verbose |grep my.cnf
/etc/my.cnf --> /etc/mysql/my.cnf --> /usr/local/mysql/etc/my.cnf ---> ~/.my.cnf
9.mysqld_safe --default-files=/opt/my.cnf &是什么作用?
“安全模式”指定mysql启动时加载的配置文件,在后台运行
10.忘记管理员root的密码处理过程,请对参数详细说明
1.停止数据库
2.启动安全模式
mysqld_safe --skip-grant-tables --skip-networking
--skip-grant-tables 跳过授权表,不开启密码验证功能
--skip-networking 禁止所有网络连接,即禁止TCP/IP方法连接数据库
3.修改密码
flush privileges; #加载授权表
alter user root@'localhost' identified by '123'; #alter修改密码
4.重启数据库至正常模式
11.请列举SQL语句的常用种类
DDL 数据定义语言
DCL 数据控制语言
DML 数据操作语言
DQL 数据查询语言
12.请说明聚簇索引和辅助索引的区别
区别:
1.聚簇索引只InnoDB表具有,仅且仅有一个,是非空唯一的,一般为主键,最好是自增长列或数字列
2.辅助索引可以有多个,配合聚簇索引使用
3.叶子结点:聚簇索引存储的是整行数据,而辅助索引存储的是某个列的所有值
13.请简述以下语句执行计划可能存在的问题
阐述以下语句可能存在的问题,并提出合理解决方案
explain select * from city where countrycode='CHN' order by population;
问题探讨
1.首先查询的表是city表,查询类型是全表查询;
2.possible_keys为NULL,说明该表没有创建索引,或索引失效;
3.而rows值很大,没有索引查询的速度会很慢;
4.Extra 显示的是Using filesort,说明出现文件排序,order by条件未走索引;
解决办法
1.没有索引,为city表的countrycode和population创建联合索引
alter table city add index idx_cp(countrycode,population);
2.若索引失效,删除索引在创建索引
简述出现以下结果的可能原因
telnum数据类型可能是字符串,条件值需加引号,未加引号可能出现了隐式转化,需要进一步确定数据类型
14. 请简述,影响索引树高度的因素?
1.数据量(分表、分库、分布式)
2.列值长度(前缀索引)
3.数据类型(是有合适的数据类型)
15.请说明数据库启动失败的处理思路?
1.看数据库启动没有
netstat、ps、status。。。。
2.查看socket文件名称对不对
3.前两项都没问题,在查看日志文件
对于mysql5.6 用 mysqld & (打印到屏幕)进行查看日志
16. MySQL索引的种类都有哪些?
Btree 平衡多叉数
Rtree 空间树索引
Hash hash树索引
Fulltext 全文索引
17. 你了解的MySQL存储引擎种类有哪些?
InnoDB
MyISAM
18.InnoDB存储引擎核心特性
二、操作题
1.创建管理员用户:oldboy能通过10.0.0.0/24网段任意地址登录管理MySQL
mysql5.7 可以直接授权用户,并且会自动创建用户
grant all on *.* to oldboy@'10.0.0.%' identified by '123';
mysql8.0 需要先创建用户,在进行授权
create user oldboy@'10.0.0.%' identified by '123';
2.创建应用用户:wordpress能通过172.16.1.0/24网段任意地址登录操作wordpress库下的所有表
grant all on wordpress.* to wordpress@'172.16.1.%' identified by '123';
3.请写出/etc/my.cnf的基础配置信息
[mysqld]
user=mysql #数据库管理用户
basedir=/data/app/mysql #软件目录
datadir=/data/3306/data #数据目录
socket=/tmp/mysql.sock #socket文件位置
server_id=6
port=3306
[mysql]
socket=/tmp/mysql.sock
4.请写出使用oldboy用户远程登录MySQL的具体语句
mysql -uoldboy -p123 -h10.0.0.51 -P3306
5.查看当前数据库的字符集
show variables like '%char%';
show charset;
6. 创建GBK字符集的数据库oldboy,并查看已建库完整语句
create databse oldboy charset GBK;
show create database oldboy;
7. 请分别介绍 NOT NULL default auto_increament 的作用
not null 非空
default 设定默认值,一般配合not null 使用
auto_increament 针对数字列,自动增长,一般配合主键primary key使用
8. 创建用户oldboy,使之可以管理数据库oldboy
grant all on oldboy.* to oldboy@'10.0.0.%' identified by '123';
9. 收回oldboy用户的drop权限
revoke drop on oldboy.* from oldboy@'10.0.0.%'
10. 查看创建的用户oldboy拥有哪些权限
show grants for oldboy@'10.0.0.%';
11. 查看建表结构及表结构的SQL语句
desc student;
show create tables student;
12. 插入一条数据“1,oldboy”
insert into t1(id,name) values (1,'oldboy')
13.再批量插入2行数据“2,好的”,“3,oldboyedu”
insert into t1(id,name) values(2,'好的'),(2,'oldboyedu')
14.查询名字为oldboy的记录
select * from student where name='oldboy';
15. 查看数据库中所有引擎的类型
show engines;
16.查看数据库关于日志的参数配置
show variables like '%log%';
17.查看handler_read_key当前的状态信息
show status like 'handler_read_key';
18. 列出删除表中数据的方式
delete from student where id='1';
19.test表中,有id、name、shouji列。把id列设置为主键,在Name字段上创建普通索引
alter table test modify student primary key auto_increament comment '编号';
alter table test add index idx_n(Name);
20. 在手机字段上对前8个字符创建普通索引
alter table test add index idx_s(shouji(8));
21.查看创建的索引及索引类型等信息
dest test;
show index from test;
22.删除Name,shouji列的索引
alter table test drop index idx_n;
alter table test drop index idx_s;
23.对Name列的前6个字符以及手机列的前8个字符组建联合索引
alter table test add index idx_ts(Name(6),shouji(8));
24. 将shouji列索引替换为唯一键索
alter table test add unique index idx_id(shouji);
25.如何查看world数据库下city表中population列的重复值情况
slesct count(distinct population) from world.city;
26. 请列出explain命令中type中多种类型
all 全表查询
index 遍历索引树查询,即没有where条件的查询
range 索引范围扫描
ref 多表连接查询时,等值条件查询(非唯一,非空)
eq_ref 多表连接查询,结果集小的为驱动表,非驱动表的连接条件是主键或者唯一键(性能最好的查询类型)
const(system) 主键或唯一键等值查询
NULL 无需访问表或者索引,比如获取一个索引列的最大值或最小值
27.Select查询语句加强练习
统计世界上每个国家的总人口数.
mysql> select city.countrycode,sum(city.population) from city group by city.countrycode;
统计中国各个省的总人口数量
mysql> select city.district,sum(city.population) from city where countrycode='chn' group by city.district;
统计世界上每个国家的城市数量
mysql> select city.countrycode,count(city.name) from city group by city.countrycode;
统计中国每个省的总人口数,将总人口数小于100w进行从高到低排序显示
mysql> select city.district,sum(city.population) as total from city where city.countrycode='chn' group by city.district having total<'1000000' order by total desc;
+----------+----------------------+
| district | sum(city.population) |
+----------+----------------------+
| Ningxia | 802362 |
| Qinghai | 700200 |
| Hainan | 557120 |
| Tibet | 120000 |
+----------+----------------------+
28.生成整个数据库下的所有表的单独备份语句
29. SQL综合练习
1. 查询平均成绩大于60分的同学的学号和平均成绩;
mysql> select sc.sno,avg(sc.score) from sc group by sc.sno having avg(sc.score)>'60';
2. 查询所有同学的学号、姓名、选课数、总成绩;
mysql> select student.sno,student.sname,sum(sc.sno),sum(sc.score) from student join sc on student.sno=sc.sno group by student.sno;
3. 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
mysql> select sc.cno,max(sc.score),min(sc.score) from sc group by sc.cno;
4. 统计各位老师,所教课程的及格率
mysql> select teacher.tname,concat(count(case when sc.score>'60' then 1 end)/count(sc.cno)*100,'%') from teacher join coourse on teacher.tno=course.tno join sc on course.cno=sc.cno group by teacher.tname;
+--------+-------------------------------------------------------------------------+
| tname | concat(count(case when sc.score>'60' then 1 end)/count(sc.cno)*100,'%') |
+--------+-------------------------------------------------------------------------+
| hesw | 66.6667% |
| oldboy | 100.0000% |
| oldguo | 75.0000% |
+--------+-------------------------------------------------------------------------+
5. 查询每门课程被选修的学生数
mysql> select course.cname,count(sc.cno) from course join sc on course.cno=sc.cno group by courrse.cname;
6. 查询出只选修了一门课程的全部学生的学号和姓名
mysql> select student.sno,student.sname from student join sc on student.sno=sc.sno group by stuudent.sno having count(sc.cno)=1;
7. 查询选修课程门数超过1门的学生信息
mysql> select stu.sno,stu.sname,stu.sage,stu.ssex,count(sc.cno) from student as stu join sc on stu.sno=sc.sno group by stu.sno having count(sc.cno)>1;
8. 统计每门课程:优秀(85分以上),良好(70-85),一般(60-70),不及格(小于60)的学生列表(选做扩展)
mysql> select sc.cno,group_concat(case when sc.score>'85' then student.sname end) as '优秀',group_concat(case when sc.score<'85' and sc.score>'70' then student.sname end) as '良好',group_concat(case when sc.score>'60' and sc.score<'70' then student.sname end) as '一般',group_concat(case when sc.score<'60' then student.sname end) as '不及格' from sc join student on sc.sno=student.sno group by sc.cno;
+------+-------------------+-------------------+--------+-----------+
| cno | 优秀 | 良好 | 一般 | 不及格 |
+------+-------------------+-------------------+--------+-----------+
| 1001 | li4,zhao4 | zhang3,wang5 | ma6 | NULL |
| 1002 | zhang4 | NULL | wang5 | zhang3 |
| 1003 | oldp,wang5,zhang4 | oldgirl,ma6,zhao4 | NULL | zh4,li4 |
+------+-------------------+-------------------+--------+-----------+
9. 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
mysql> select sc.sno,student.sname,avg(sc.score) from sc join student on sc.sno=student.sno group by sc.sno having avg(sc.score)>'85';