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