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