mysql數據庫面試題

一、mysql的存儲引擎有哪些?都有什麼特點?

在這裏插入圖片描述

  • MyISAM: 擁有較高的插入,查詢速度,但不支持事務。
  • InnoDB :5.5版本後Mysql的默認數據庫,事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定
  • BDB: 源自Berkeley DB,事務型數據庫的另一種選擇,支持COMMIT和ROLLBACK等其他事務特性
  • Memory :所有數據置於內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會佔用和數據量成正比的內存空間。並且其內容會在Mysql重新啓動時丟失
  • Merge :將一定數量的MyISAM表聯合而成一個整體,在超大規模數據存儲時很有用
  • Archive :非常適合存儲大量的獨立的,作爲歷史記錄的數據。因爲它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差
  • Federated: 將不同的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分佈式應用 Cluster/NDB :高冗餘的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用
  • CSV: 邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄裏爲每個數據表創建一個.CSV文件。這是一種普通文本文件,每個數據行佔用一個文本行。CSV存儲引擎不支持索引。
  • BlackHole :黑洞引擎,寫入的任何數據都會消失,一般用於記錄binlog做複製的中繼

另外,Mysql的存儲引擎接口定義良好。有興趣的開發者通過閱讀文檔編寫自己的存儲引擎。

二、用一條SQL語句查詢出每門課都大於80分的學生姓名

在這裏插入圖片描述
解析:
1、只需name字段
2、需所有課程(2門)的fenshu字段均>80——>where篩選條件,count計算篩選where後是否不少於2門高於80分
3、顯示的結果不重複——>group by

select name from users
where fenshu >= 80
group by name
having count(name) >= 2;

三、按格式查詢結果,將上圖查詢出下圖結果(行轉列)

在這裏插入圖片描述
解析:
1、每年只4個月
2、由於是求每月總金額——> SUM函數(可據實際替換成AVG、MAX、MIN)
3、別名要求M1-M4——> as
4、如果某個月份無金額則爲0——> if函數(和三目運算符一樣)
5、顯示結果不重複——> group by

SELECT year,
SUM(IF(`month`=1,amount,0)) as 'M1',
SUM(IF(`month`=2,amount,0)) as 'M2',
SUM(IF(`month`=3,amount,0)) as 'M3',
SUM(IF(`month`=4,amount,0)) as 'M4' 
FROM Bill
GROUP BY year

PS:列轉行

使用uinon進行語句查詢連接,all使得允許出現重複值

(union要求列數相同,列數據類型相同,順序相同)

select year,1 as month,M1 as amount from Bill
union all
select year,2 as month,M2 as amount from Bill
union all
select year,3 as month,M3 as amount from Bill
union all
select year,4 as month,M4 as amount from Bill
order by years

四、將上表查詢出下圖結果(行轉列+字符串連接concat)在這裏插入圖片描述

在這裏插入圖片描述
解析:
1、日期不變,使用別名——>as
2、第二列字段要求所有當月費用連接在一起——>concat()
3、顯示結果不重複——>group by

Select date as '日期',
concat('租金',IF(`fee_name`='租金',amount,0),',','物業費',IF(`fee_name`='物業費',amount,0)) as '每月費用收取情況'
from Bill
group by date

五、優化sql語句

在這裏插入圖片描述

limit知識點:

① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;
①是從數據庫中第三條開始查詢,取一條數據,即第三條數據讀取,一二條跳過
②是從數據庫中的第二條數據開始查詢兩條數據,即第二條和第三條。

由於id爲主鍵索引,所以使用嵌套查詢所需的10個id,再進行內連接篩選
1、題目的sql會訪問1000010次數據頁。而優化後的1的sql只訪問10次數據頁

select * from user u1
inner join (select id from user limit 1000000,10) u2 on u1.id=u2.id

2、適合id連續的系統,速度極快。不適合帶有條件的、id不連續的查詢

select * from user
where id between 1000000 and 1000010
order by id desc
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章