2019-06-17 MySQL測試題(一)

2019-06-17 MySQL測試題(一)mysql

1.簡述大家公司使用的MySQL版本,並說明具體小版本及GA時間?redis

oracle mysql 5.6.38
oracle mysql 5.7.20
GA時間:2017-9-13

2.請介紹你熟悉的數據庫的種類和表明產品名稱?sql

ODBMS:oracle mysql mssql postgresql
NoSQL:memcached mongodb redis

3.請簡述MySQL二進制安裝重點步驟?mongodb

下載解壓
建立mysql用戶
建立數據文件夾並設置權限
設置環境變量並source:echo 'export PATH=$PATH:/usr/local/mysql/bin'>>/etc/profile;source /etc/profile
初始化數據庫:mysqld --initialize-insecure  --user=mysql --datadir=/data/mysql --basedir=/usr/bin/mysql
生成配置文件:/etc/my.cnf
啓動服務

4.怎麼確認數據庫啓動成功了?數據庫

進程:ps -ef|grep mysqld
端口:netstat -lnutp|grep 3306;ss -lnutp|grep 3306
直接mysql 登錄測試

5.簡述你瞭解的MySQL分支版本狀況?c#

oracle mysql:      最新版本8.0 穩定版本 5.7
percona mysql:  最新版本8.0 穩定版本 5.7
mariadb:            最新版本10.4 穩定版本 10.3

6.請簡述mysqld的程序結構(1條SQL語句的執行過程)緩存

鏈接層:
    提供鏈接協議,驗證,專用鏈接線程
SQL層
    語法,語義,權限,解析,優化,執行,查詢緩存,日誌記錄
存儲引擎層
    至關於Linux文件系統,例如:InnoDB提供了事務,CSR,熱備,MVCC,行級鎖等

7.請簡述你瞭解的MySQL的啓動方式oracle

sys-v:mysql.server--->mysqld_safe---->mysqld
systemd: mysqld --defaults-file
mysqld_safe 
mysqld

8.簡述MySQL配置文件默認讀取順序socket

[root@Manager ~]# 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配置文件並在後臺啓動mysql

10.忘記管理員root的密碼處理過程,請對參數詳細說明

[root@Manager ~]# mysqld_safe --skip-grant-tables --skip-networking
--skip-grant-tables: 關閉鏈接層的驗證功能
--skip-networking:關閉TCP/IP協議

11.請列舉SQL語句的經常使用種類

DDL
DCL
DML
DQL

12.請說明彙集索引和輔助索引的區別

輔助索引,葉子節點只存儲,有序的某個列的全部值
彙集索引,存儲的是整行數據
輔助索引通常是配合彙集索引使用,經過輔助所用找到主鍵值,而後經過彙集索引找到數據行,減小了回表查詢帶來的硬盤IO

13.請簡述如下語句執行計劃可能存在的問題

explain select * from city where countrycode='CHN' order by population;

![](https://s1.51cto.com/images/blog/201906/17/ddacb4adefc3f67f6b766453b41a925b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
image.png
結果:type--all;Extra--filesort;
1. countrycode沒有走索引,有多是沒創建索引,或者是索引失效
2. 出現了filesort文件排序, orderby條件也沒走索引

建議: 
1. 若是沒有索引致使,創建聯合索引(countrycode,population)
2. 若是是索引失效,刪除索引重建
簡述出現如下結果的可能緣由
![](https://s1.51cto.com/images/blog/201906/17/3b002b14ce2948738950877c85e2bc8e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

應該是 telnum列是字符串類型,不加引號致使出現了隱式轉換,須要進一步判斷數據類型,建議加上單引號.
請簡述,影響索引樹高度的因素?
數據量級:分表分庫分佈式
索引鍵值太長:前綴索引
數據類型:char varchar選擇,enum,選擇合理的數據類型

14.請簡述,影響索引樹高度的因素?

數據量級:分表分庫分佈式
索引鍵值太長:前綴索引
數據類型:char varchar選擇,enum,選擇合理的數據類型

15.請說明數據庫啓動失敗的處理思路?

先看服務有沒有啓動;
再看配置文件中sock文件設置,ls查看有無文件
再而後看日誌;
若是沒有日誌,使用mysqld直接測試啓動

16MySQL索引的種類都有哪些?

B樹
HASH
R樹

17你瞭解的MySQL存儲引擎種類有哪些?

InnoDB,MyIAM,CSV,TokuDB, Percona-XtraDB

18.InnoDB存儲引擎核心特性

事務,CSR,MVCC,行級鎖,熱備,外鍵

2、操做題
1.建立管理員用戶:oldboy能經過10.0.0.0/24網段任意地址登陸管理MySQL

create user oldboy@'10.0.0.%/255.255.255.0' identified by '123';
SELECT DISTINCT user,host FROM mysql.user;  
user   | host                   |
+--------+------------------------+
| oldboy | 10.0.0.%/255.255.255.0 
...
2.建立應用用戶:wordpress能經過172.16.1.0/24網段任意地址登陸操做wordpress庫下的全部表

create user wordpress@'172.16.1.%/255.255.255.0' identified by '123';
grant all on wordpress.* to wordpress@'172.16.1.%/255.255.255.0'; 
grant all select update insert delete wordpress.* to wordpress@'172.16.1.%/255.255.255.0';

3.請寫出/etc/my.cnf的基礎配置信息

[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
server_id=1
port=3306
[mysql]
socket=/tmp/mysql.sock

4.請寫出使用oldboy用戶遠程登陸MySQL的具體語句

mysql -uoldboy -p -h 10.0.0.30 -P3306(端口可省略)

5.查看當前數據庫的字符集

show語句
show charset;

6.建立GBK字符集的數據庫oldboy,並查看已建庫完整語句

create database oldboy charset gbk;
show create database oldboy;

7.請分別介紹 NOT NULL default auto_increament 的做用

Not NULL :非空
default: 默認值
auto_increament:自動增加

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 stu;
show create table stu;
12.插入一條數據「1,oldboy」

insert into stu values(1,'oldboy');

13.再批量插入2行數據「2,老男孩」,「3,oldboyedu」

insert into stu values(2,'老男孩');
insert into stu values(3,'oldboyedu');
14.查詢名字爲oldboy的記錄

select * from t1 where name='oldboy';
查看數據庫中全部引擎的類型
show engines;
16.查看數據庫關於日誌的參數配置

show variables like '%log%';
17.查看handler_read_key當前的狀態信息

show status like 'handler_read_key';

18.delete和truncate區別

delete :邏輯逐條刪除數據行
trucate:物理刪除表段中的全部數據頁

19.test表中,有id、name、shouji列。把id列設置爲主鍵,在Name字段上建立普通索引

create table test (
id int not null  primary key comment '學號',
name varchar(64) not null comment '姓名',
telnum char(11) not null comment '手機號'
)engine InnoDB Charset Utf8 comment '學生表';
alter table test add index idx_name(name);

20.在手機字段上對前8個字符建立普通索引

alter table add index idx_tel(telnum(8));

21.查看建立的索引及索引類型等信息

desc test;
show index from test

22.刪除Name,shouji列的索引

alter table test drop index idx_name ;
alter table test drop index idx_tel;

23.對Name列的前6個字符以及手機列的前8個字符組建聯合索引

alter table test add index idx_n_t(name(6),telnum(8));

24.將shouji列索引替換爲惟一鍵索

alter table test add unique index idx_tel(telnum);

25.如何查看world數據庫下city表中population列的重複值狀況

select name,population,count(id) from world.city group by population having count(id)>1
 order by count(id) desc ;

26.請列出explain命令中type中多種類型

ALL,INDEX,RANGE,REF,EQ_REF,SYSTEM(const),NULL

27.Select查詢語句增強練習

統計世界上每一個國家的總人口數:
select countrycode,sum(population)
 from city 
group by countrycode;
統計中國各個省的總人口數量:
select district,sum(population) from city 
where countrycode='CHN' 
group by district;
統計世界上每一個國家的城市數量:
select countrycode,count(name)
 from city 
group by countrycode;
統計中國每一個省的總人口數,將總人口數小於100w進行從高到低排序顯示:
select district,sum(population)
 from city where countrycode='CHN' 
group by district 
having sum(population)<1000000 
order by sum(population) desc;

28.生成整個數據庫下的全部表的單獨備份語句

SELECT CONCAT("mysqldump -uroot -p123 ",table_schema," ",table_name," >/bak/",table_schema,"_",table_name,".sql")
FROM information_schema.TABLES

29.SQL綜合練習

1). 查詢平均成績大於60分的同窗的學號和平均成績;

select student_id,avg(num) from score group by student_id having avg(num) > 60
2). 查詢全部同窗的學號、姓名、選課數、總成績;

select score.student_id,sum(score.num),count(score.student_id),student.sname
from score left join student 
on score.student_id = student.sid  
group by score.student_id
3). 查詢各科成績最高和最低的分:以以下形式顯示:課程ID,最高分,最低分

select course_id, max(num) as max_num, min(num) as min_num from score group by course_id;
4).統計各位老師,所教課程的及格率(case)

count(case  when isfull(socre,0)>=60 then 1 end)/count(*)
group by 學科
5).查詢每門課程被選修的學生數

 select course_id, count(student_id) from score group by course_id;
6).查詢出只選修了一門課程的所有學生的學號和姓名

select student.sid, student.sname, count(course_id) 
from score left join student 
on score.student_id  = student.sid
group by course_id having count(course_id)  = 1
7).查詢選修課程門數超過1門的學生信息

select * from score group by student_id having count(student_id) > 1
8).統計每門課程:優秀(85分以上),良好(70-85),通常(60-70),不及格(小於60)的學生列表(case)

SELECT t1.c#,t2.cname,
       SUM(CASE WHEN t1.score > 85 AND t1.score <= 100 THEN 1 ELSE 0 END) AS 優秀人數,
       SUM(CASE WHEN t1.score > 70 AND t1.score <= 85 THEN 1 ELSE 0 END)  AS 良好人數,
       SUM(CASE WHEN t1.score > 60 AND t1.score <= 70 THEN 1 ELSE 0 END)  AS 通常人數,
       SUM(CASE WHEN t1.score <= 60 THEN 1 ELSE 0 END)                    AS 剛及格人數
FROM sc t1
INNER JOIN course t2
  ON t1.c# = t2.c#
GROUP BY t1.c#,t2.cname
9).查詢平均成績大於85的全部學生的學號、姓名和平均成績

select student_id,sname, avg(if(isnull(score,0) ,>85))
from score left join student 
on score.student_id = student.sid 
group by student_id;

SELECT student_id, sname,AVG(score.score) AS avg_score
from score left join student 
ON score.student_id = student.sid 
GROUP BY student_id
HAVING AVG(score.score) > 85
相關文章
相關標籤/搜索