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