MySQL第一阶段练习题

一、简答题

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';

你可能感兴趣的:(MySQL第一阶段练习题)