数据工程师面试常见题目汇总
1、為什么?UNION?ALL?比?UNION?快?
? 答:因?yàn)樵谑褂?UNION?的時(shí)候,需要?jiǎng)h除重復(fù)的記錄,但是使用?UNION ALL?的時(shí)候不用刪除。所以如果在知道需要?UNION?的查詢不可能出現(xiàn)重復(fù)數(shù)據(jù)的時(shí)候,一定要使用?UNION?ALL。
2、什么是唯一索引?
? 答:唯一索引可以確保索引列不包含重復(fù)的值。在多列唯一索引的情況下,該索引可以確保索引列中每個(gè)值組合都是唯一的。聚集索引和非聚集索引都可以是唯一的。因此,只要列中的數(shù)據(jù)是唯一的,就可以在同一個(gè)表上創(chuàng)建一個(gè)唯一的聚集索引和多個(gè)唯一的非聚集索引。只有當(dāng)唯一性是數(shù)據(jù)本身的特征時(shí),指定唯一索引才有意義。如果必須實(shí)施唯一性以確保數(shù)據(jù)的完整性,則應(yīng)在列上創(chuàng)建UNIQUE或PRIMARY?KEY約束,而不要?jiǎng)?chuàng)建唯一索引。
3、為什么要及時(shí)刪除不用的觸發(fā)器?
? 答:觸發(fā)器定義之后,每次執(zhí)行觸發(fā)事件,都會(huì)激活觸發(fā)器并執(zhí)行觸發(fā)器中的語(yǔ)句。如果需求發(fā)生變化,而觸發(fā)器沒(méi)有進(jìn)行相應(yīng)的改變或者刪除,則觸發(fā)器仍然會(huì)執(zhí)行舊的語(yǔ)句,從而會(huì)影響新的數(shù)據(jù)的完整性。因此要將不再使用的觸發(fā)器及時(shí)刪除。
4、自定義函數(shù)支持輸出參數(shù)嗎?
? 答:自定義函數(shù)可以接受零個(gè)或多個(gè)輸入?yún)?shù),其返回值可以是一個(gè)數(shù)值,也可以是一個(gè)表,但是自定義函數(shù)不支持輸出參數(shù)。
5、STR?函數(shù)在遇到小數(shù)時(shí)如何處理?
? 答:在使用STR函數(shù)時(shí),如果數(shù)字為小數(shù),則在轉(zhuǎn)換為字符串?dāng)?shù)據(jù)類型時(shí),只返回其整數(shù)部分,如果小數(shù)點(diǎn)后的數(shù)字大于等于5,則四舍五入返回其整數(shù)部分。
6、是不是索引建立得越多越好?
? 答:合理的索引可以提高查詢的速度,但不是索引越多越好。在執(zhí)行插入語(yǔ)句的時(shí)候,數(shù)據(jù)庫(kù)要為新 插入的記錄建立索引。所以過(guò)多的索引會(huì)導(dǎo)致插入操作變慢。原則上是只有查詢用的字段才建立索引。
7、視圖的作用是什么?
答:數(shù)據(jù)庫(kù)視圖的作用主要有:
? 1. ?數(shù)據(jù)庫(kù)視圖隱藏了數(shù)據(jù)的復(fù)雜性。
? 2. ?數(shù)據(jù)庫(kù)視圖有利于控制用戶對(duì)表中某些列的訪問(wèn)。
? 3. ?數(shù)據(jù)庫(kù)視圖使用戶查詢變得簡(jiǎn)單。視圖是一個(gè)虛擬表,其內(nèi)容由查詢定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫(kù)中以存儲(chǔ)的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來(lái)自由定義視圖的查詢所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。對(duì)其中所引用的基礎(chǔ)表來(lái)說(shuō),視圖的作用類似于篩選。定義視圖的篩選可以來(lái)自當(dāng)前或其它數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)表,或者其它視圖。分布式查詢也可用于定義使用多個(gè)異類源數(shù)據(jù)的視圖。如果有幾臺(tái)不同的服務(wù)器分別存儲(chǔ)組織中不同地區(qū)的數(shù)據(jù),而您需要將這些服務(wù)器上相似結(jié)構(gòu)的數(shù)據(jù)組合起來(lái),這種方式就很有用。通過(guò)視圖進(jìn)行查詢沒(méi)有任何限制,通過(guò)它們進(jìn)行數(shù)據(jù)修改時(shí)的限制也很少。
8、存儲(chǔ)過(guò)程和自定義函數(shù)的區(qū)別?
? 答:存儲(chǔ)過(guò)程,功能強(qiáng)大,可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫(kù)操作,也可以創(chuàng)建為?SQL?Server 啟動(dòng)?時(shí)自動(dòng)運(yùn)行的存儲(chǔ)過(guò)程。而自定義函數(shù),用戶定義函數(shù)不能用于執(zhí)行一組修改全局?jǐn)?shù)據(jù)庫(kù)狀態(tài)的操作。
存儲(chǔ)過(guò)程,可以使用非確定函數(shù)。自定義函數(shù),不允許在用戶定義函數(shù)主體中內(nèi)置非確定函數(shù)。?存儲(chǔ)過(guò)程,可返回記錄集。自定義函數(shù),可以返回表變量,也可以有任意個(gè)輸出參數(shù)。?存儲(chǔ)過(guò)程,其返回值不能被直接引用,必須單獨(dú)調(diào)用。自定義函數(shù),其返回值可以被直接引用,也就是可以直接?select?*?from?函數(shù)。
9、一個(gè)表中的?Id?有多個(gè)記錄,把所有這個(gè)?id?的記錄查出來(lái),并顯示共有多少條記錄數(shù)?
? 答:可以用以下?SQL?語(yǔ)句實(shí)現(xiàn):
select?id, Count(*)?from?tb?group?by?id?having count(*)>1
select*from(select count(ID) as count?from?table group?by?ID)T?where?T.count>1
10、有一張表,里面有?3?個(gè)字段:語(yǔ)文,數(shù)學(xué),英語(yǔ)。其中有?3?條記錄分別表示語(yǔ)文?70?分,數(shù)學(xué)80?分,英語(yǔ)?58?分,請(qǐng)用一條?sql?語(yǔ)句查詢出這三條記錄并按以下條件顯示出來(lái)(并寫出您的思路):
大于或等于?80?表示優(yōu)秀,大于或等于?60?表示及格,小于?60?分表示不及格。
| 顯示格式 | 語(yǔ)文 | 數(shù)學(xué) | 英語(yǔ) |
| 及格 | 優(yōu)秀 | 不及格 |
? 答:select
(case?when??語(yǔ)文>=80?then?‘優(yōu)秀’
when??語(yǔ)文>=60?then?‘及格’?else ‘不及格’)?as ?語(yǔ)文,
(case?when??數(shù)學(xué)>=80?then?‘優(yōu)秀’?when??數(shù)學(xué)>=60?then?‘及格’
else ‘不及格’)?as ?數(shù)學(xué),
(case?when??英語(yǔ)>=80?then?‘優(yōu)秀’?when??英語(yǔ)>=60?then?‘及格’
else ‘不及格’)?as ?英語(yǔ),
from?table
11、一個(gè)日期判斷的?sql?語(yǔ)句,請(qǐng)取出?tb_send?表中日期(SendTime 字段)為當(dāng)天的所有記錄?(SendTime字段為?datetime?型,包含日期與時(shí)間)?
? 答:select?*?from?tb?where?datediff(dd,SendTime,getdate())=0
12、表中有?A?B?C?三列,用?SQL?語(yǔ)句實(shí)現(xiàn):當(dāng)?A?列大于?B?列時(shí)選擇?A?列否則選擇?B?列,當(dāng)?B?列大于?C?列時(shí)選擇?B?列否則選擇?C?列。
?答:select?(case when?a>b?then?a?else b?end?), (case when?b>c?then?b?esle c?end)?from?table_name
13、如何提高日志的切換頻率?
答:通過(guò)參數(shù)?ARCHIVE_LAG_TARGET?可以控制日志切換的時(shí)間間隔,以秒為單位。通過(guò)減少時(shí)間間隔,從而實(shí)現(xiàn)提高日志的切換頻率。
?SQL>?ALTER?SYSTEM?SET?ARCHIVE_LAG_TARGET=50?SCOPE=both
14、歸檔模式與非歸檔模式?為什么歸檔模式可以恢復(fù)到任意時(shí)刻?
? 答:歸檔是在重做日志文件被覆蓋之前,將該重做日志文件通過(guò)復(fù)制操作系統(tǒng)文件的方式,保存到指定的位置。保存下來(lái)的重做日志文件的集合被稱為歸檔重做日志文件,復(fù)制的過(guò)程被稱為歸檔。在?歸?檔?日?志?(?ARCHIVELOG?)模式下,?數(shù)?據(jù)?庫(kù)?對(duì)?重?做?日?志?文?件?進(jìn)?行?歸?檔?操?作?。?非?歸?檔?日?志(NOARCHIVELOG)模式下,不會(huì)對(duì)重做日志文件進(jìn)行歸檔操作。由于非歸檔模式不會(huì)在覆蓋之前保存, 這樣就造成了數(shù)據(jù)庫(kù)在一定時(shí)間之前的重做日志文件丟失,也就不能恢復(fù)到被覆蓋之前。而歸檔模式在任意時(shí)間上都有重做日志文件,故可以恢復(fù)到任意時(shí)刻。
15、觸發(fā)器中能否用?COMMIT,為什么?
? 答:在觸發(fā)器中不能使用COMMIT等事務(wù)控制語(yǔ)句。因?yàn)橛|發(fā)器是事務(wù)觸發(fā)的如果有事務(wù)控制語(yǔ)句就會(huì)影響到觸發(fā)它的事務(wù)。即連帶觸發(fā)它的語(yǔ)句之前的已經(jīng)完成的沒(méi)有提交的語(yǔ)句都要受到影響。這是會(huì)影響到數(shù)據(jù)的一致性的。
16、你對(duì)游標(biāo)的理解,游標(biāo)的分類?
? 答:游標(biāo)是結(jié)果集數(shù)據(jù)中的指針,作用是為遍歷結(jié)果集時(shí),存儲(chǔ)每條記錄的結(jié)果。游標(biāo)分為顯式游標(biāo)和隱式游標(biāo)。
17、如何設(shè)置網(wǎng)絡(luò)數(shù)據(jù)包的大小?
??答:一般情況下,設(shè)置網(wǎng)絡(luò)數(shù)據(jù)包的大小可參考以下方法。如果應(yīng)用程序常執(zhí)行大容量復(fù)制操作或者是發(fā)送、接收大量的text?和image?數(shù)據(jù)的話,可以將此值設(shè)大一點(diǎn)。如果應(yīng)用程序接收和發(fā)送的信息量都很小,那么可以將其設(shè)為512 字節(jié)。
18、談?wù)勀銓?duì)事務(wù)的理解?
? 答:事務(wù)從COMMIT、ROLLBACK、連接到數(shù)據(jù)庫(kù)或開始第一條可執(zhí)行的SQL語(yǔ)句時(shí)開始,到一條COMMIT、ROLLBACK語(yǔ)句或退出數(shù)據(jù)庫(kù)時(shí)結(jié)束。如果在一個(gè)事務(wù)中包含DDL語(yǔ)句,則在DDL語(yǔ)句的前后都會(huì)隱含地執(zhí)行COMMIT?語(yǔ)句,從而開始或結(jié)束一個(gè)事務(wù)。如果一個(gè)事務(wù)由于某些故障或者由于用戶改變主意而必須在提交前取消它,則數(shù)據(jù)庫(kù)被恢復(fù)到這些語(yǔ)句和過(guò)程執(zhí)行之前的狀態(tài)。利用ROLLBACK 語(yǔ)句可以在COMMIT?命令前隨時(shí)撤消或回退一個(gè)事務(wù)。可以回退整個(gè)事務(wù),也可以回退部分事務(wù),但是不能回退一個(gè)已經(jīng)被提交的事務(wù)。回退部分事務(wù)的?ROLLBACK 命令為:ROLLBACK?to?savepoint?存儲(chǔ)點(diǎn)名,存儲(chǔ)點(diǎn)是用戶放入事務(wù)中的標(biāo)記,用來(lái)表示一個(gè)可被回退的位置。存儲(chǔ)點(diǎn)通過(guò)在事務(wù)中放入一個(gè)SAVEPOINT?命令而被插入。該命令的語(yǔ)法是:SAVEPOINT?存儲(chǔ)點(diǎn)名,如果在?ROLLBACK?語(yǔ)句中沒(méi)有給出存儲(chǔ)點(diǎn)名,則整個(gè)事務(wù)被回退。
19、談?wù)勀銓?duì)索引的理解?
? 答:索引是若干數(shù)據(jù)行的關(guān)鍵字的列表,查詢數(shù)據(jù)時(shí),通過(guò)索引中的關(guān)鍵字可以快速定位到要訪問(wèn)的?記錄所在的數(shù)據(jù)塊,從而大大減少讀取數(shù)據(jù)塊的?I/O?次數(shù),因此可以顯著提高性能。
20、事務(wù)和鎖有什么關(guān)系?
? 答:可以使用多種機(jī)制來(lái)確保數(shù)據(jù)的完整性,例如約束、觸發(fā)器以及事務(wù)和鎖等。事務(wù)和 鎖的關(guān)系非常緊密。事務(wù)包含一系列的操作,這些操作要么全部成功,要么全部失敗,通過(guò)事務(wù)機(jī)制管理多個(gè)事務(wù),保證事務(wù)的一致性,事務(wù)中使用鎖保護(hù)指定的資源,防止其他用戶修改另外一個(gè)還沒(méi)有完成的事務(wù)中的數(shù)據(jù)。
21、本地索引與全局索引的差別與適用情況。
? 答:對(duì)于本地索引,每一個(gè)表分區(qū)對(duì)應(yīng)一個(gè)索引分區(qū),當(dāng)表的分區(qū)發(fā)生變化時(shí),索引的維護(hù)由數(shù)據(jù)庫(kù)?自動(dòng)進(jìn)行。對(duì)于全局索引,可以選擇是否分區(qū),而且索引的分區(qū)可以不與表分區(qū)相對(duì)應(yīng)。當(dāng)對(duì)分區(qū)進(jìn)行維?護(hù)操作時(shí),通常會(huì)導(dǎo)致全局索引的?INVALDED,必須在執(zhí)行完操作后?REBUILD。
22、插入記錄時(shí)可以不指定字段名稱嗎?
? 答:不管使用哪種?INSERT?語(yǔ)法,都必須給出?VALUES?的正確數(shù)目。如果不提供字段名,則必須給?每個(gè)字段提供一個(gè)值,否則將產(chǎn)生一條錯(cuò)誤消息。如果要在?INSERT?操作中省略某些字段,這些字段需要?滿足一定條件:該列定義為允許空值;或者表定義時(shí)給出默認(rèn)值,如果不給出值,將使用默認(rèn)值。
23、delete、truncate?和?drop?的區(qū)別?
? 答:Delete 命令用來(lái)刪除表的全部或者一部分?jǐn)?shù)據(jù)行,執(zhí)行?delete 之后,用戶需要提交(commmit)或者 回滾(rollback) transaction?來(lái)執(zhí)行刪除或者撤銷刪除,delete?命令會(huì)觸發(fā)這個(gè)表上所有的?delete?觸發(fā)器。
Truncate?刪除表中的所有數(shù)據(jù),這個(gè)操作不能回滾,也不會(huì)觸發(fā)這個(gè)表上的觸發(fā)器,truncate?比?delete更快,占用的空間更小。
Drop?命令從數(shù)據(jù)庫(kù)中刪除表,所有的數(shù)據(jù)行,索引和權(quán)限也會(huì)被刪除,所有的DML觸發(fā)器也不會(huì)被觸發(fā),這個(gè)命令也不能回滾。
24、為什么?group?by?和?order by?會(huì)使查詢變慢?
? 答:group?by?和?order?by?操作通常需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來(lái)處理查詢的結(jié)果,所以如果查詢結(jié)果很多的?話會(huì)嚴(yán)重影響性能。
25、簡(jiǎn)述數(shù)據(jù)庫(kù)的設(shè)計(jì)過(guò)程。
? 答:數(shù)據(jù)庫(kù)設(shè)計(jì)分為以下五個(gè)階段:?
需求分析:主要是準(zhǔn)確收集用戶信息需求和處理需求,并對(duì)收集的結(jié)果進(jìn)行整理和分析,形成需求說(shuō)明。
概念結(jié)構(gòu)設(shè)計(jì):對(duì)用戶需求進(jìn)行綜合、歸納、抽象,形成一個(gè)與與具體的?DBMS?無(wú)關(guān)概念模型(一般為ER模型)。
邏輯結(jié)構(gòu)設(shè)計(jì):將概念結(jié)構(gòu)設(shè)計(jì)的概念模型轉(zhuǎn)化為某個(gè)特定的?DBMS 所支持的數(shù)據(jù)模型,建立數(shù)據(jù)庫(kù)邏輯模式,并對(duì)其進(jìn)行優(yōu)化,同時(shí)為各種用戶和應(yīng)用設(shè)計(jì)外模式。
物理結(jié)構(gòu)設(shè)計(jì):為設(shè)計(jì)好的邏輯模型選擇物理結(jié)構(gòu),包括存儲(chǔ)結(jié)構(gòu)和存取方法等,建立數(shù)據(jù)庫(kù)物理模式。
實(shí)施和維護(hù):實(shí)施就是使用DLL語(yǔ)言建立數(shù)據(jù)庫(kù)模式,將實(shí)際數(shù)據(jù)載入數(shù)據(jù)庫(kù),建立真正的數(shù)據(jù)庫(kù)。維護(hù)階段是對(duì)運(yùn)行中的數(shù)據(jù)庫(kù)進(jìn)行評(píng)價(jià)、調(diào)整和修改。
了解更多數(shù)據(jù)庫(kù)知識(shí),點(diǎn)擊原文地址:www.shulanxt.com/doc/mysqldoc/sjgcs
總結(jié)
以上是生活随笔為你收集整理的数据工程师面试常见题目汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 互联网30年,泡沫如梦
- 下一篇: Flash player 10(FLEX