數(shù)據(jù)庫面試問題匯總_第1頁
數(shù)據(jù)庫面試問題匯總_第2頁
數(shù)據(jù)庫面試問題匯總_第3頁
數(shù)據(jù)庫面試問題匯總_第4頁
數(shù)據(jù)庫面試問題匯總_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上數(shù)據(jù)庫面試問題匯總1. 數(shù)據(jù)庫管理命令1.1查詢所有數(shù)據(jù)庫- show databases;1.2創(chuàng)建數(shù)據(jù)庫,并將數(shù)據(jù)庫字符集默認為utf-8-create database day814-default character set utf8-;1.3查看數(shù)據(jù)庫的默認字符集-show create database day814;1.4 刪除數(shù)據(jù)庫- drop database day15;1.5 修改數(shù)據(jù)庫(即修改數(shù)據(jù)庫的默認字符集)-alert database day814 default character set gbk;2. 表管理命令2.1選擇數(shù)據(jù)庫命令

2、- use day814;2.2查看所有表- show tables;2.3 創(chuàng)建表- create table student(-sid int,-sage int,-sname varchar(20)-);2.4 查看表結(jié)構-desc student;2.5 刪除表- drop table student;2.6 修改表添加字段-alter table student add column sgender varchar(2);刪除字段-alter table studnet drop column sgender;修改字段類型-alter table student modify col

3、umn sgender varchar(100);修改字段名稱-alter table student change column sgender gender varchar(100);修改表名稱-alter table student rename to teacher;3. 數(shù)據(jù)管理3.1增刪改數(shù)據(jù)-增加數(shù)據(jù)INSERT INTO student VALUES(1,tom,20,2);/要嚴格按照表的字段順序插入數(shù)據(jù)增加部分數(shù)據(jù)INSERT INTO student (id,name) VALUES(2,tina);-刪除數(shù)據(jù)條件刪除DELETE FROM student WHERE i

4、d=2;注意:DELETE FROM和TRUNCATE FROM的區(qū)別DELETE FROM:可以全表刪除,也可以條件刪除,只能刪除數(shù)據(jù),不能刪除約束,最后刪除之后,可以回滾事務;TRUNCATE FROM: 只能全表刪除,不能條件刪除,即可以刪除表的數(shù)據(jù),也可以刪除表的約束,不能回滾事務;-修改數(shù)據(jù)帶條件修改UPDATE student SET age=1,name=tom WHERE id=2;3.2查詢數(shù)據(jù)(重點)3.2.1查詢所有列(*通配符)-SELECT * FROM student;3.2.2查詢指定列-SELECT sid,sname, gender FROM student;

5、3.2.3查詢時添加常量列-SELECT sid,sname,gender,sage,java_Class AS sgrade FROM student;/在查詢student表時,添加一個sgrade列,內(nèi)容為java_Class;3.2.4查詢時合并列-SELECT sid,sname,(servlet+jsp) AS 總成績 FROM student;3.2.5查詢時去除重復記錄-SELECT DISTINCT gender FROM student;-SELECT DISTINCT address FROM student;3.2.6條件查詢(模糊條件查詢)- 邏輯條件 AND(與)

6、OR(或) SELECT * FROM student WHERE sid=2 AND sname=c+; /交集SELECT * FROM student WHERE sid=2 OR sname=張三; /并集- 比較條件 <, >,<= 最重要的<>不等于,另外 BETWEEN ANDSELECT * FROM student WHERE jsp<=90 AND jsp>=75;- 判空條件需求:查詢地址為null的學生(包括null和空字符串)注意:NULL 表示沒有值空字符串 表示有值的;-模糊條件LIKE 表示模糊條件 ; %表示任意字符S

7、ELECT * FROM student WHERE sname LIKE j%;3.2.7聚合查詢常用的聚合函數(shù) : sum() avg() max() min() count() SELECT MAX(jsp) AS max_score FROM student;SELECT AVG(jsp) AS average score FROM student;這里注意:count統(tǒng)計數(shù)據(jù)不包含null的數(shù)據(jù)3.2.8 分頁查詢查詢第1,2 條記錄SELECT * FROM student LIMIT 0,2;/注意:LIMIT 0:起始行行數(shù),2:總行數(shù);3.2.9 查詢排序ASC: 升序;DE

8、SC 降序SELECT * FROM student ORDER BY sid ASC;SELECT * FROM student ORDER BY servlet ASC;SELECT * FROM student ORDER BY servlet ASC,jsp DESC;3.2.10分組查詢- 2.11 分組查詢(group by)- 需求: 查詢男女的人數(shù)- 預期結(jié)果: - 男 3 - 女 2 -算法步驟: 1) 把學生按照性別分組(GROUP BY gender) - 2) 統(tǒng)計每組的人數(shù)(COUNT(*)SELECT gender,COUNT(*) FROM student GRO

9、UP BY gender;3.2.11分組查詢后篩選- 2.12 分組查詢后篩選- 需求: 查詢總?cè)藬?shù)大于2的性別- 算法:1) 查詢男女的人數(shù)- 2)篩選出人數(shù)大于2的記錄(having)- 注意: 分組之前條件使用where關鍵字,分組之后條件使用having關鍵字SELECT gender,COUNT(*) FROM student WHERE GROUP BY gender HAVING COUNT(*)>2;綜上,所有的SQL語句指令,主要包含3個部分:數(shù)據(jù)庫管理、表管理、數(shù)據(jù)管理。SQL語句分類:數(shù)據(jù)定義語言、數(shù)據(jù)查詢語言、數(shù)據(jù)操作語言。4. 數(shù)據(jù)約束4.1 默認值 4.2非

10、空 4.3唯一4.4 主鍵(=非空+唯一)5. 數(shù)據(jù)庫設計:三大范式第一范式:要求表的每個字段必須是不可分割的獨立單元;比如 student : nameJava狗娃應該改為name oldname Java 狗娃第二范式:在第一張范式基礎上,要求每張表只表達一個意思,表的每個字段都和主鍵有依賴;employee(員工): 員工編號 員工姓名 部門名稱 訂單名稱 -違反第二范式員工表:員工編號 員工姓名 部門名稱 訂單表: 訂單編號 訂單名稱 - 符合第二范式第三范式:在第二范式的基礎上,要求每張表的主鍵之外的其他字段都只能和主鍵有直接決定依賴關系;員工表: 員工編號(主鍵) 員工姓名 部門編

11、號 部門名 -符合第二范式,違反第三范式(數(shù)據(jù)冗余高)員工表:員工編號(主鍵) 員工姓名 部門編號 -符合第三范式(降低數(shù)據(jù)冗余)部門表:部門編號 部門名解析:個人對數(shù)據(jù)庫三大范式的理解:首先數(shù)據(jù)表中的每個字段都必須是不可分割的獨立單元;其次,在第一范式的基礎上 ,要求每張表只表達一個意思,表的每個字段都和主鍵有依賴;最后,在第二范式的基礎上,要求每張表的主鍵之外的其他字段都只能和主鍵有直接決定依賴關系。6. 存儲過程帶有邏輯的SQL語句,存儲過程帶上流過程控制語句(if else for while);(1) 存儲過程執(zhí)行效率非??欤驗槭窃诜斩藞?zhí)行;(2) 存儲過程移植性比較差,不同數(shù)據(jù)

12、的存儲過程是不能移植的;7. 數(shù)據(jù)庫索引實現(xiàn)原理1. 關于數(shù)據(jù)庫索引采用的數(shù)據(jù)結(jié)構題目1: Mysql數(shù)據(jù)庫用過吧?l里面的索引是基于什么數(shù)據(jù)結(jié)構。答:主要是基于Hash表和B+樹題目2: 很好請你說一下B+樹的實現(xiàn)細節(jié)是什么樣的?B-樹和B+樹有什么區(qū)別?聯(lián)合索引在B+樹中如何存儲?答: 首先,數(shù)據(jù)庫使用樹型結(jié)構來增加查詢效率,并保持有序。那么,為什么不使用二叉樹來實現(xiàn)數(shù)據(jù)結(jié)構呢,二叉樹算法時間復雜度是lg(N),查詢速度和比較次數(shù)都是較小的。實際上,查詢索引操作最耗資源的不在內(nèi)存中,而是磁盤IO。索引是存在磁盤上的,當數(shù)據(jù)量比較大的時候,索引的大小可能達到幾個G。那么,我們利用索引進行查詢

13、的時候,不可能把索引直接加載到內(nèi)存中,只能一次讀取一個磁盤頁,一個磁盤頁對應著一個節(jié)點,一次讀取操作時一個磁盤io。在二叉樹查詢時,最壞的情況下查找的次數(shù)是樹的高度,即io次數(shù)為樹的高度。B-樹就是比二叉樹“矮胖”的樹。二叉樹的特征如下:1. 根節(jié)點至少有兩個子女2. 每個中間節(jié)點包含k-1個元素和k個孩子,其中 m/2 <= k <= m3. 每個葉子節(jié)點包含k-1個元素,其中 m/2 <= k <= m4. 所有葉子節(jié)點位于同一層5. 節(jié)點中的元素從小到大排列,正好是孩子節(jié)點的值域。(就是孩子節(jié)點的元素都比父節(jié)點中元素的最小值大,比父節(jié)點元素的最大值?。〣-樹查詢的

14、次數(shù)并不比二叉樹的次數(shù)小,但是相比起磁盤io速度,內(nèi)存中比較的耗時就不足為提了。所以只要樹的高度足夠低,io次數(shù)少,就可以提升查找性能。而每個節(jié)點中有多個元素,都只在內(nèi)存中操作。而B+樹是基于B-樹的,增加了如下規(guī)則:1. 有k個子樹的中間節(jié)點包含有k個元素(B樹中是k-1個元素),每個元素不保存數(shù)據(jù),只用來索引,所有數(shù)據(jù)都保存在葉子節(jié)點。2. 所有的葉子結(jié)點中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子結(jié)點本身依關鍵字的大小自小而大順序鏈接。3. 所有的中間節(jié)點元素都同時存在于子節(jié)點,在子節(jié)點元素中是最大(或最?。┰?。所以,B+樹對比B-樹有如下好處:io次數(shù)少:b+樹中間節(jié)點

15、只存索引,不存在實際的數(shù)據(jù),所以可以存儲更多的數(shù)據(jù)。索引樹更加的矮胖,io次數(shù)更少。性能穩(wěn)定:b+樹數(shù)據(jù)只存在于葉子節(jié)點,查詢性能穩(wěn)定范圍查詢簡單:b+樹不需要中序遍歷,遍歷鏈表即可。B樹:有序數(shù)組+平衡多叉樹; B+樹:有序數(shù)組鏈表+平衡多叉樹;數(shù)據(jù)庫索引采用B+樹的主要原因是B樹在提高了磁盤IO性能的同時并沒有解決元素遍歷的效率低下的問題。正是為了解決這個問題,B+樹應運而生。B+樹只要遍歷葉子節(jié)點就可以實現(xiàn)整棵樹的遍歷。而且在數(shù)據(jù)庫中基于范圍的查詢是非常頻繁的,而B樹不支持這樣的操作(或者說效率太低)。8. 數(shù)據(jù)庫三大引擎之間差異(1) MyISAM特性:不支持事務、MyISA

16、M存儲引擎不支持事務,所以對事務有要求的業(yè)務場景不能適應;表級鎖定:其鎖定機制是表級索引,這雖然可以讓鎖定的實現(xiàn)成本很小但也同時大大降低了并發(fā)性能;讀寫互相阻塞:不僅會在寫入時阻塞讀取,還會在讀取時,阻塞寫入,但讀本身并不會阻塞另外的讀。只會緩存索引:MyISAM可以通過key_Buffer緩存以大大提高訪問性能減少磁盤IO,但是這個緩存區(qū)只會緩存索引,而不會緩存數(shù)據(jù)。(2) InnoDB特性:具有較好的事務支持,支持4個事務隔離級別,支持多版本讀;行級鎖定:通過索引實現(xiàn),全表掃描仍然會是表鎖,注意間隙鎖的影響;讀寫阻塞與事務隔離級別相關;具有非常高效的緩存特性,能緩存特性,也能緩存數(shù)據(jù);整個

17、表和主鍵以Cluster方式存儲,組成一顆平衡樹;所有Secondary Index都會保存主鍵信息;(3) NDBCluster分布式:分布式存儲引擎,可以由多個NDBCluster存儲引擎組成集群分別存放整體數(shù)據(jù)的一部分;支持事務:和Innodb一樣,支持事務;可與MySqld不在同一主機:可以和MysqlId分開存在于獨立的主機上,然后通過網(wǎng)絡和MysqlId通信交互;內(nèi)存需求量巨大:新版本索引以及被索引的數(shù)據(jù)必須存放在內(nèi)存中,老版本所有數(shù)據(jù)和索引必須存放在與內(nèi)存中;9. 臟讀和幻讀在說數(shù)據(jù)庫的臟讀和幻讀時,首先要說數(shù)據(jù)庫的事務,事務的4大特性:(1) 原子性:事務是數(shù)據(jù)庫的邏輯工作單位

18、,它對數(shù)據(jù)庫的修改,要么全部執(zhí)行,要么全部不執(zhí)行;(2) 一致性:事務前后,數(shù)據(jù)庫的狀態(tài)都滿足所有的完整性約束;(3) 隔離性:并發(fā)執(zhí)行的N個事務是隔離的,一個不影響一個,一個 事務在沒有commit之前,被修改的數(shù)據(jù)不可能被其他事務看到(如何實現(xiàn)的呢,通過設置數(shù)據(jù)庫的隔離級別)(4) 持久性:持久性意味著當系統(tǒng)或介質(zhì)發(fā)生故障時,確保已提交事務的更新不能丟失,持久性主要在于DBMS的恢復性能;(系統(tǒng)故障,數(shù)據(jù)不丟失)臟讀:又稱無效數(shù)據(jù)讀出,一個事務讀取另外一個事務還沒有提交的數(shù)據(jù)叫做臟讀;例如:事務T1修改了一行數(shù)據(jù),但是還沒有提交,這時候事務T2讀取了被事務T1修改后的數(shù)據(jù),之后T1因某種原

19、因回滾了,那么事務T2讀取的數(shù)據(jù)就是臟的;解決辦法:把數(shù)據(jù)庫的事務隔離級別調(diào)整到READ_COMMITTED;不可重復讀:不可重復讀是指同一個事務內(nèi),兩個相同的查詢返回了不同的結(jié)果;例如:事務T1讀取某一數(shù)據(jù),事務T2讀取并修改了該數(shù)據(jù),T1為了對讀取值進行檢驗而在此讀取該數(shù)據(jù),那么 T1發(fā)現(xiàn)兩次讀取的結(jié)果不同;解決辦法:把數(shù)據(jù)庫的事務隔離級別調(diào)整到REPEATABLE_COMMITTED;幻讀:例如:當系統(tǒng)管理員A將數(shù)據(jù)庫中所有學生的成績從具體分數(shù)改為ABCDE等級,但是系統(tǒng)管理員B就在這個時候插入了一條具體分數(shù)的記錄,當系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,

20、這叫幻讀。解決辦法:把數(shù)據(jù)庫的事務隔離級別調(diào)整到SERIALIZABLE_READ;綜上:重點注意 :不可重復讀和幻讀的區(qū)別,不可重復讀強調(diào)的是查詢修改,幻讀強調(diào)的是插入和刪除。10. Spring事務管理à什么是事務:事務(transaction)是由一系列操作序列構成的程序執(zhí)行單元,這些操作要么都做,要么都不做,是一個不可分割的工作單位à事務的4個基本性質(zhì):原子性、一致性、隔離性、持久性à數(shù)據(jù)庫并發(fā)操作可能引起的問題:臟讀:事務A讀取了事務B中尚未提交的數(shù)據(jù),如果事務B回滾,則A讀取使用了錯誤的數(shù)據(jù)(讀取了未提交的數(shù)據(jù))不可重復讀:事務A多次的讀取過程中,事務

21、B對數(shù)據(jù)進行了修改,導致事務A多次讀取的數(shù)據(jù)不一致。丟失更新:在事務A期間,事務B對數(shù)據(jù)進行了更新,在事務A撤銷之后,覆蓋了事務B提交的數(shù)據(jù)。(又叫做回滾丟失)幻讀:在事務A多次讀取過程中,事務B對數(shù)據(jù)進行了新增操作,導致事務A多次讀取的數(shù)據(jù)不一致。(幻讀和不可重復讀的區(qū)別在于:不可重復讀是針對數(shù)據(jù)的更新操作,只要再記錄上加上寫鎖,就可避免, 幻讀是對記錄的insert操作,要禁止幻讀必須加上全局的寫鎖,比如在表上加寫鎖。)àSQL92定義的4中隔離級別: 未提交讀(Read uncommitted):寫操作加寫鎖,讀操作不加鎖。禁止丟失更新(回滾丟失),但是會出現(xiàn)所有其他數(shù)據(jù)并發(fā)問

22、題。 提交讀(Read committed):寫操作加寫鎖,讀操作加讀鎖。禁止丟失更新(回滾丟失)和臟讀,是大多數(shù)關系型數(shù)據(jù)庫的默認隔離級別。 可重復讀(Read repeatable):對于讀操作加讀鎖到事務結(jié)束,其他事務的更新操作只能等到事務結(jié)束之后進行。和提交讀的區(qū)別在于,提交讀的讀操作時加讀鎖到本次讀操作結(jié)束,可重復讀的粒度更大。禁止兩類丟失更新,禁止臟讀和不可重復讀,但可能出現(xiàn)幻讀。 序列化(Serializable):讀操作加表級讀鎖至事務結(jié)束。可禁止幻讀。à隔離級別越高,數(shù)據(jù)一致性的保證越強,但同時數(shù)據(jù)庫的并發(fā)能力也越差。2. 存儲過程的作用? 存儲過程可以使得對數(shù)據(jù)庫

23、的管理、以及顯示關于數(shù)據(jù)庫及其用戶信息的工作容易得多。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲并作為一個單元處理。存儲過程存儲在數(shù)據(jù)庫內(nèi),可由應用程序通過一個調(diào)用執(zhí)行,而且允許用戶聲明變量、有條件執(zhí)行以及其它強大的編程功能。 存儲過程可包含程序流、邏輯以及對數(shù)據(jù)庫的查詢。它們可以接受參數(shù)、輸出參數(shù)、返回單個或多個結(jié)果集以及返回值。 可以出于任何使用 SQL 語句的目的來使用存儲過程,它具有以下優(yōu)點: 可以在單個存儲過程中執(zhí)行一系列 SQL 語句。 可以從自己的存儲過程內(nèi)引用其它存儲過程,這可以簡化一系列復雜語句。 存儲過程在創(chuàng)建時即在服務器上進行編譯,所以執(zhí)行起來比單個 SQL 語句快。3. 查詢的優(yōu)化1).根據(jù)查詢條件建立合適的index2).因為SQL是從右

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論