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ù)或開(kāi)始第一條可執(zhí)行的SQL語(yǔ)句時(shí)開(kāi)始,到一條COMMIT、ROLLBACK語(yǔ)句或退出數(shù)據(jù)庫(kù)時(shí)結(jié)束。如果在一個(gè)事務(wù)中包含DDL語(yǔ)句,則在DDL語(yǔ)句的前后都會(huì)隱含地執(zhí)行COMMIT 語(yǔ)句,從而開(kāi)始或結(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)整和修改。