金三銀四面試季:數(shù)據(jù)庫(kù)SqlServer筆試題 趕快收藏
一、數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)(通用)篇
1.說(shuō)說(shuō)主鍵、外鍵、超鍵、候選鍵
2.為什么用自增列作為主鍵?
3.觸發(fā)器的作用是什么?
4.什么是存儲(chǔ)過(guò)程?用什么來(lái)調(diào)用?
5.說(shuō)說(shuō)存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)?
6.說(shuō)說(shuō)存儲(chǔ)過(guò)程與函數(shù)的區(qū)別
7.什么叫視圖?游標(biāo)是什么?
8.視圖的優(yōu)缺點(diǎn)有哪些?
9.說(shuō)說(shuō)drop、truncate、 delete區(qū)別
10.什么是臨時(shí)表,臨時(shí)表什么時(shí)候刪除?
11.說(shuō)說(shuō)非關(guān)系型數(shù)據(jù)庫(kù)和關(guān)系型數(shù)據(jù)庫(kù)區(qū)別,優(yōu)勢(shì)比較?
12.什么是數(shù)據(jù)庫(kù)范式,根據(jù)某個(gè)場(chǎng)景設(shè)計(jì)數(shù)據(jù)表?
13.什么是 內(nèi)連接、外連接、交叉連接、笛卡爾積等?
14.varchar和char的使用場(chǎng)景?
15.SQL語(yǔ)言分類(lèi)
16.說(shuō)說(shuō)like %和-的區(qū)別
17.說(shuō)說(shuō)count(*)、count(1)、count(column)的區(qū)別
18.什么是最左前綴原則?
19.什么是索引?
20.索引的作用?它的優(yōu)點(diǎn)缺點(diǎn)是什么?
21.索引的優(yōu)缺點(diǎn)有哪些?
22.什么樣的字段適合建索引?
23.說(shuō)說(shuō)聚集索引和非聚集索引區(qū)別?
二、SqlServer筆試基礎(chǔ)篇
1.求年齡大于所有女同學(xué)年齡的男學(xué)生姓名和年齡。
2.求年齡大于女同學(xué)平均年齡的男學(xué)生姓名和年齡。
3.在 SC 中檢索成績(jī)?yōu)榭罩档膶W(xué)生學(xué)號(hào)和課程號(hào)。
4.檢索姓名以 WANG 打頭的所有學(xué)生的姓名和年齡。
5.檢索學(xué)號(hào)比 WANG 同學(xué)大,而年齡比他小的學(xué)生姓名。
6.統(tǒng)計(jì)每門(mén)課程的學(xué)生選修人數(shù) (超過(guò) 2 人的課程才統(tǒng)計(jì)) 。要求輸出課程號(hào)和選修人數(shù),查詢結(jié)果按
人數(shù)降序排列,若人數(shù)相同,按課程號(hào)升序排列。
7.求 LIU 老師所授課程的每門(mén)課程的學(xué)生平均成績(jī)。
8.求選修 C4 課程的學(xué)生的平均年齡。
9.統(tǒng)計(jì)有學(xué)生選修的課程門(mén)數(shù)。
10.在基本表 SC 中修改 4 號(hào)課程的成績(jī),若成績(jī)小于等于 75 分時(shí)提高 5% , 若成績(jī)大于 75 分時(shí)提高
4% (用兩個(gè) UPDATE 語(yǔ)句實(shí)現(xiàn))。
11 .把低于總平均成績(jī)的女同學(xué)成績(jī)提高 5% 。
12 .把選修數(shù)據(jù)庫(kù)原理課不及格的成績(jī)?nèi)臑榭罩怠?/p>
13.把WANG 同學(xué)的學(xué)習(xí)選課和成績(jī)?nèi)縿h去。
14 .在基本表 SC 中刪除尚無(wú)成績(jī)的選課元組。
15 .往基本表 S 中插入一個(gè)學(xué)生元組( ‘ S9’,‘ WU ’,18 )。。
16.什么是SQL注入式攻擊?
三、SqlServer筆試高級(jí)篇
1.什么是內(nèi)存泄漏?
2.維護(hù)數(shù)據(jù)庫(kù)的完整性和一致性,你喜歡用觸發(fā)器還是自寫(xiě)業(yè)務(wù)邏輯?為什么?
3.什么是事務(wù)?什么是鎖?
4.對(duì)一個(gè)投入使用的在線事務(wù)處理表格有過(guò)多索引需要有什么樣的性能考慮?
6.什么是SQL注入式攻擊?
7.如何防范SQL注入式攻擊?
8.你可以用什么來(lái)確保表格里的字段只接受特定范圍里的值?
公眾號(hào):DotNet開(kāi)發(fā)跳槽
9.有哪些操作會(huì)使用到TempDB;如果TempDB異常變大,可能的原因是什么,該如何處理;
10.Index有哪些類(lèi)型,它們的區(qū)別和實(shí)現(xiàn)原理是什么,索引有啥優(yōu)點(diǎn)和缺點(diǎn);如何為SQL語(yǔ)句創(chuàng)建合適的
索引,索引創(chuàng)建時(shí)有哪些需要,注意的項(xiàng),如何查看你創(chuàng)建的索引是否被使用;如何維護(hù)索引;索引損壞如
何檢查,怎么修復(fù);T-SQL有更好的索引存在,但是運(yùn)行,時(shí)并沒(méi)有使用該索引,原因可能是什么;
11.Job信息我們可以通過(guò)哪些表獲?。幌到y(tǒng)正在運(yùn)行的語(yǔ)句可以通過(guò)哪些視圖獲?。蝗绾潍@取某個(gè)T-SQL
語(yǔ)句的IO、Time等信息;
?
一、數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)(通用)篇? ? ? ? ? ? ? ? ??
1.說(shuō)說(shuō)主鍵、外鍵、超鍵、候選鍵? ? ? ? ? ? ? ? ? ? ? ?
超鍵:在關(guān)系中能唯一標(biāo)識(shí)元組的屬性集稱為關(guān)系模式的超鍵。一個(gè)屬性可以為作為一個(gè)超鍵,多個(gè)屬
性組合在一起也可以作為一個(gè)超鍵。超鍵包含候選鍵和主鍵。
候選鍵:是最小超鍵,即沒(méi)有冗余元素的超鍵。
主鍵:數(shù)據(jù)庫(kù)表中對(duì)儲(chǔ)存數(shù)據(jù)對(duì)象予以唯一和完整標(biāo)識(shí)的數(shù)據(jù)列或?qū)傩缘慕M合。一個(gè)數(shù)據(jù)列只能有一個(gè)
主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。
外鍵:在一個(gè)表中存在的另一個(gè)表的主鍵稱此表的外鍵。
2.為什么用自增列作為主鍵?? ? ? ? ? ? ? ? ? ? ? ? ??
如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會(huì)選擇主鍵作為聚集索引、
如果沒(méi)有顯式定義主鍵,則InnoDB會(huì)選擇第一個(gè)不包含有NULL值的唯一索引作為主鍵索引、
如果也沒(méi)有這樣的唯一索引,則InnoDB會(huì)選擇內(nèi)置6字節(jié)長(zhǎng)的ROWID作為隱含的聚集索引(ROWID隨著
行記錄的寫(xiě)入而主鍵遞增,這個(gè)ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。
數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點(diǎn)上。這就要求同一個(gè)葉子節(jié)點(diǎn)內(nèi)(大小為一個(gè)內(nèi)
存頁(yè)或磁盤(pán)頁(yè))的各條數(shù)據(jù)記錄按主鍵順序存放,因此每當(dāng)有一條新的記錄插入時(shí),MySQL會(huì)根據(jù)其主
鍵將其插入適當(dāng)?shù)墓?jié)點(diǎn)和位置,如果頁(yè)面達(dá)到裝載因子(InnoDB默認(rèn)為15/16),則開(kāi)辟一個(gè)新的頁(yè)
(節(jié)點(diǎn))
如果表使用自增主鍵,那么每次插入新的記錄,記錄就會(huì)順序添加到當(dāng)前索引節(jié)點(diǎn)的后續(xù)位置,當(dāng)一頁(yè)
寫(xiě)滿,就會(huì)自動(dòng)開(kāi)辟一個(gè)新的頁(yè)
如果使用非自增主鍵(如果身份證號(hào)或?qū)W號(hào)等),由于每次插入主鍵的值近似于隨機(jī),因此每次新記錄
都要被插到現(xiàn)有索引頁(yè)的中間某個(gè)位置,此時(shí)MySQL不得不為了將新記錄插到合適位置而移動(dòng)數(shù)據(jù),甚
至目標(biāo)頁(yè)面可能已經(jīng)被回寫(xiě)到磁盤(pán)上而從緩存中清掉,此時(shí)又要從磁盤(pán)上讀回來(lái),這增加了很多開(kāi)銷(xiāo),
同時(shí)頻繁的移動(dòng)、分頁(yè)操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過(guò)
OPTIMIZE TABLE來(lái)重建表并優(yōu)化填充頁(yè)面。
3.觸發(fā)器的作用是什么?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,主要是通過(guò)事件來(lái)觸發(fā)而被執(zhí)行的。它可以強(qiáng)化約束,來(lái)維護(hù)數(shù)據(jù)的完
整性和一致性,可以跟蹤數(shù)據(jù)庫(kù)內(nèi)的操作從而不允許未經(jīng)許可的更新和變化??梢月?lián)級(jí)運(yùn)算。如,某表
上的觸發(fā)器上包含對(duì)另一個(gè)表的數(shù)據(jù)操作,而該操作又會(huì)導(dǎo)致該表觸發(fā)器被觸發(fā)。
4.什么是存儲(chǔ)過(guò)程?用什么來(lái)調(diào)用?? ? ? ? ? ? ? ? ? ? ??
存儲(chǔ)過(guò)程是一個(gè)預(yù)編譯的SQL語(yǔ)句,優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說(shuō)只需創(chuàng)建一次,以后在該程序中
就可以調(diào)用多次。如果某次操作需要執(zhí)行多次SQL,使用存儲(chǔ)過(guò)程比單純SQL語(yǔ)句執(zhí)行要快。
調(diào)用:
1)可以用一個(gè)命令對(duì)象來(lái)調(diào)用存儲(chǔ)過(guò)程。
2)可以供外部程序調(diào)用,比如:java程序。
公眾號(hào):DotNet開(kāi)發(fā)跳槽
5.說(shuō)說(shuō)存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)?? ? ? ? ? ? ? ? ? ? ? ? ? ?
優(yōu)點(diǎn):
1)存儲(chǔ)過(guò)程是預(yù)編譯過(guò)的,執(zhí)行效率高。
2)存儲(chǔ)過(guò)程的代碼直接存放于數(shù)據(jù)庫(kù)中,通過(guò)存儲(chǔ)過(guò)程名直接調(diào)用,減少網(wǎng)絡(luò)通訊。
3)安全性高,執(zhí)行存儲(chǔ)過(guò)程需要有一定權(quán)限的用戶。
4)存儲(chǔ)過(guò)程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。
缺點(diǎn):
移植性差
6.說(shuō)說(shuō)存儲(chǔ)過(guò)程與函數(shù)的區(qū)別? ? ? ? ? ? ? ? ? ? ? ? ??
(1)存儲(chǔ)過(guò)程用戶在數(shù)據(jù)庫(kù)中完成特定操作或者任務(wù)(如插入,刪除等),函數(shù)用于返回特定的數(shù)
據(jù)。
(2)存儲(chǔ)過(guò)程聲明用procedure,函數(shù)用function。
(3)存儲(chǔ)過(guò)程不需要返回類(lèi)型,函數(shù)必須要返回類(lèi)型。
(4)存儲(chǔ)過(guò)程可作為獨(dú)立的pl-sql執(zhí)行,函數(shù)不能作為獨(dú)立的plsql執(zhí)行,必須作為表達(dá)式的一部分。
(5)存儲(chǔ)過(guò)程只能通過(guò)out和in/out來(lái)返回值,函數(shù)除了可以使用out,in/out以外,還可以使用return
返回值。
(6)sql語(yǔ)句(DML或SELECT)中不可用調(diào)用存儲(chǔ)過(guò)程,而函數(shù)可以。
7.什么叫視圖?游標(biāo)是什么?? ? ? ? ? ? ? ? ? ? ? ? ??
視圖:
是一種虛擬的表,具有和物理表相同的功能??梢詫?duì)視圖進(jìn)行增,改,查,操作,試圖通常是有一個(gè)表
或者多個(gè)表的行或列的子集。對(duì)視圖的修改會(huì)影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查
詢。
游標(biāo):
是對(duì)查詢出來(lái)的結(jié)果集作為一個(gè)單元來(lái)有效的處理。游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前
行檢索一行或多行??梢詫?duì)結(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時(shí)候,游
標(biāo)顯得十分重要。
8.視圖的優(yōu)缺點(diǎn)有哪些?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
優(yōu)點(diǎn):
1對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),因?yàn)橐晥D可以有選擇性的選取數(shù)據(jù)庫(kù)里的一部分。
2)用戶通過(guò)簡(jiǎn)單的查詢可以從復(fù)雜查詢中得到結(jié)果。
3)維護(hù)數(shù)據(jù)的獨(dú)立性,試圖可從多個(gè)表檢索數(shù)據(jù)。
4)對(duì)于相同的數(shù)據(jù)可產(chǎn)生不同的視圖。
缺點(diǎn):
性能:查詢視圖時(shí),必須把視圖的查詢轉(zhuǎn)化成對(duì)基本表的查詢,如果這個(gè)視圖是由一個(gè)復(fù)雜的多表查詢
所定義,那么,那么就無(wú)法更改數(shù)據(jù)
9.說(shuō)說(shuō)drop、truncate、 delete區(qū)別? ? ? ? ? ? ? ? ? ??
最基本:
1) drop直接刪掉表。
2) truncate刪除表中數(shù)據(jù),再插入時(shí)自增長(zhǎng)id又從1開(kāi)始。
3) delete刪除表中數(shù)據(jù),可以加where字句。
(1) DELETE語(yǔ)句執(zhí)行刪除的過(guò)程是每次從表中刪除一行,并且同時(shí)將該行的刪除操作作為事務(wù)記錄在
日志中保存以便進(jìn)行進(jìn)行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數(shù)據(jù)并不把單獨(dú)
的刪除操作記錄記入日志保存,刪除行是不能恢復(fù)的。并且在刪除的過(guò)程中不會(huì)激活與表有關(guān)的刪除觸
發(fā)器。執(zhí)行速度快。
公眾號(hào):DotNet開(kāi)發(fā)跳槽
(2) 表和索引所占空間。當(dāng)表被TRUNCATE 后,這個(gè)表和索引所占用的空間會(huì)恢復(fù)到初始大小,而
DELETE操作不會(huì)減少表或索引所占用的空間。drop語(yǔ)句將表所占用的空間全釋放掉。
(3) 一般而言,drop > truncate > delete
(4) 應(yīng)用范圍。TRUNCATE 只能對(duì)TABLE;DELETE可以是table和view
(5) TRUNCATE 和DELETE只刪除數(shù)據(jù),而DROP則刪除整個(gè)表(結(jié)構(gòu)和數(shù)據(jù))。
(6) truncate與不帶where的delete :只刪除數(shù)據(jù),而不刪除表的結(jié)構(gòu)(定義)drop語(yǔ)句將刪除表的
結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger)索引(index);依賴于該表的存儲(chǔ)過(guò)程/函數(shù)將被保留,
但其狀態(tài)會(huì)變?yōu)椋篿nvalid。
(7) delete語(yǔ)句為DML(data maintain Language),這個(gè)操作會(huì)被放到 rollback segment中,事務(wù)提交
后才生效。如果有相應(yīng)的 tigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā)。
(8) truncate、drop是DLL(data define language),操作立即生效,原數(shù)據(jù)不放到 rollback?
segment中,不能回滾。
(9) 在沒(méi)有備份情況下,謹(jǐn)慎使用 drop 與 truncate。要?jiǎng)h除部分?jǐn)?shù)據(jù)行采用delete且注意結(jié)合
where來(lái)約束影響范圍。回滾段要足夠大。要?jiǎng)h除表用drop;若想保留表而將表中數(shù)據(jù)刪除,如果與事
務(wù)無(wú)關(guān),用truncate即可實(shí)現(xiàn)。如果和事務(wù)有關(guān),或老師想觸發(fā)trigger,還是用delete。
(10) Truncate table 表名 速度快,而且效率高,因?yàn)??truncate table 在功能上與不帶 WHERE 子句的?
DELETE 語(yǔ)句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)
和事務(wù)日志資源少。DELETE 語(yǔ)句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng)。
TRUNCATE TABLE 通過(guò)釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁(yè)來(lái)刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁(yè)的釋
放。
(11) TRUNCATE TABLE 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。新行標(biāo)識(shí)所
用的計(jì)數(shù)值重置為該列的種子。如果想保留標(biāo)識(shí)計(jì)數(shù)值,請(qǐng)改用 DELETE。如果要?jiǎng)h除表定義及其數(shù)
據(jù),請(qǐng)使用 DROP TABLE 語(yǔ)句。
(12) 對(duì)于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應(yīng)使用不帶 WHERE 子
句的 DELETE 語(yǔ)句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發(fā)器。
?
10.什么是臨時(shí)表,臨時(shí)表什么時(shí)候刪除?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
臨時(shí)表可以手動(dòng)刪除:
DROP TEMPORARY TABLE IF EXISTS temp_tb;
臨時(shí)表只在當(dāng)前連接可見(jiàn),當(dāng)關(guān)閉連接時(shí),MySQL會(huì)自動(dòng)刪除表并釋放所有空間。因此在不同的連接中
可以創(chuàng)建同名的臨時(shí)表,并且操作屬于本連接的臨時(shí)表。
創(chuàng)建臨時(shí)表的語(yǔ)法與創(chuàng)建表語(yǔ)法類(lèi)似,不同之處是增加關(guān)鍵字TEMPORARY,
如:
?
11.說(shuō)說(shuō)非關(guān)系型數(shù)據(jù)庫(kù)和關(guān)系型數(shù)據(jù)庫(kù)區(qū)別,優(yōu)勢(shì)比較?? ? ? ? ? ? ? ? ? ? ?
非關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì):
性能:NOSQL是基于鍵值對(duì)的,可以想象成表中的主鍵和值的對(duì)應(yīng)關(guān)系,而且不需要經(jīng)過(guò)SQL層的解
析,所以性能非常高。
可擴(kuò)展性:同樣也是因?yàn)榛阪I值對(duì),數(shù)據(jù)之間沒(méi)有耦合性,所以非常容易水平擴(kuò)展。
關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì):
復(fù)雜查詢:可以用SQL語(yǔ)句方便的在一個(gè)表以及多個(gè)表之間做非常復(fù)雜的數(shù)據(jù)查詢。
CREATE TEMPORARY TABLE tmp_table (
? ? ? ? NAME VARCHAR (10) NOT NULL,
? ? ? ? time date NOT NULL
);
select * from tmp_table;
公眾號(hào):DotNet開(kāi)發(fā)跳槽
事務(wù)支持:使得對(duì)于安全性能很高的數(shù)據(jù)訪問(wèn)要求得以實(shí)現(xiàn)。
其他:
1.對(duì)于這兩類(lèi)數(shù)據(jù)庫(kù),對(duì)方的優(yōu)勢(shì)就是自己的弱勢(shì),反之亦然。
2.NOSQL數(shù)據(jù)庫(kù)慢慢開(kāi)始具備SQL數(shù)據(jù)庫(kù)的一些復(fù)雜查詢功能,比如MongoDB。
3.對(duì)于事務(wù)的支持也可以用一些系統(tǒng)級(jí)的原子操作來(lái)實(shí)現(xiàn)例如樂(lè)觀鎖之類(lèi)的方法來(lái)曲線救國(guó),比如
Redis set nx。
?
12.什么是數(shù)據(jù)庫(kù)范式,根據(jù)某個(gè)場(chǎng)景設(shè)計(jì)數(shù)據(jù)表?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
第一范式:(確保每列保持原子性)所有字段值都是不可分解的原子值。
第一范式是最基本的范式。如果數(shù)據(jù)庫(kù)表中的所有字段值都是不可分解的原子值,就說(shuō)明該數(shù)據(jù)庫(kù)表滿
足了第一范式。
第一范式的合理遵循需要根據(jù)系統(tǒng)的實(shí)際需求來(lái)定。比如某些數(shù)據(jù)庫(kù)系統(tǒng)中需要用到“地址”這個(gè)屬性,
本來(lái)直接將“地址”屬性設(shè)計(jì)成一個(gè)數(shù)據(jù)庫(kù)表的字段就行。但是如果系統(tǒng)經(jīng)常會(huì)訪問(wèn)“地址”屬性中的“城市”
部分,那么就非要將“地址”這個(gè)屬性重新拆分為省份、城市、詳細(xì)地址等多個(gè)部分進(jìn)行存儲(chǔ),這樣在對(duì)
地址中某一部分操作的時(shí)候?qū)⒎浅7奖?。這樣設(shè)計(jì)才算滿足了數(shù)據(jù)庫(kù)的第一范式,如下表所示。
上表所示的用戶信息遵循了第一范式的要求,這樣在對(duì)用戶使用城市進(jìn)行分類(lèi)的時(shí)候就非常方便,也提
高了數(shù)據(jù)庫(kù)的性能。
第二范式:(確保表中的每列都和主鍵相關(guān))在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多
種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。
第二范式在第一范式的基礎(chǔ)之上更進(jìn)一層。第二范式需要確保數(shù)據(jù)庫(kù)表中的每一列都和主鍵相關(guān),而不
能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)。也就是說(shuō)在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保
存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。
比如要設(shè)計(jì)一個(gè)訂單信息表,因?yàn)橛唵沃锌赡軙?huì)有多種商品,所以要將訂單編號(hào)和商品編號(hào)作為數(shù)據(jù)庫(kù)
表的聯(lián)合主鍵。
第三范式:(確保每列都和主鍵列直接相關(guān),而不是間接相關(guān)) 數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),
而不能間接相關(guān)。
第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。
比如在設(shè)計(jì)一個(gè)訂單數(shù)據(jù)表的時(shí)候,可以將客戶編號(hào)作為一個(gè)外鍵和訂單表建立相應(yīng)的關(guān)系。而不可以
在訂單表中添加關(guān)于客戶其它信息(比如姓名、所屬公司等)的字段。
BCNF:符合3NF,并且,主屬性不依賴于主屬性。
若關(guān)系模式屬于第二范式,且每個(gè)屬性都不傳遞依賴于鍵碼,則R屬于BC范式。
通常BC范式的條件有多種等價(jià)的表述:每個(gè)非平凡依賴的左邊必須包含鍵碼;每個(gè)決定因素必須包含鍵
碼。
BC范式既檢查非主屬性,又檢查主屬性。當(dāng)只檢查非主屬性時(shí),就成了第三范式。滿足BC范式的關(guān)系
都必然滿足第三范式。
還可以這么說(shuō):若一個(gè)關(guān)系達(dá)到了第三范式,并且它只有一個(gè)候選碼,或者它的每個(gè)候選碼都是單屬
性,則該關(guān)系自然達(dá)到BC范式。
一般,一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)符合3NF或BCNF就可以了。
第四范式:要求把同一表內(nèi)的多對(duì)多關(guān)系刪除。
第五范式:從最終結(jié)構(gòu)重新建立原始結(jié)構(gòu)。
?
13.什么是 內(nèi)連接、外連接、交叉連接、笛卡爾積等?? ? ? ? ? ? ? ? ? ? ? ? ? ??
內(nèi)連接: 只連接匹配的行
左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配
的行
右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配
公眾號(hào):DotNet開(kāi)發(fā)跳槽
的行
例如1:
例如2:
全外連接: 包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
交叉連接: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個(gè)數(shù)據(jù)源中的每個(gè)行與另一
個(gè)數(shù)據(jù)源的每個(gè)行都一一匹配
例如:
?
14.varchar和char的使用場(chǎng)景?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
1.char的長(zhǎng)度是不可變的,而varchar的長(zhǎng)度是可變的。
定義一個(gè)char[10]和varchar[10]。
如果存進(jìn)去的是‘csdn’,那么char所占的長(zhǎng)度依然為10,除了字符‘csdn’外,后面跟六個(gè)空格,varchar就
立馬把長(zhǎng)度變?yōu)?了,取數(shù)據(jù)的時(shí)候,char類(lèi)型的要用trim()去掉多余的空格,而varchar是不需要的。
2.char的存取速度還是要比varchar要快得多,因?yàn)槠溟L(zhǎng)度固定,方便程序的存儲(chǔ)與查找。
char也為此付出的是空間的代價(jià),因?yàn)槠溟L(zhǎng)度固定,所以難免會(huì)有多余的空格占位符占據(jù)空間,可謂是
以空間換取時(shí)間效率。
varchar是以空間效率為首位。
3.char的存儲(chǔ)方式是:對(duì)英文字符(ASCII)占用1個(gè)字節(jié),對(duì)一個(gè)漢字占用兩個(gè)字節(jié)。
varchar的存儲(chǔ)方式是:對(duì)每個(gè)英文字符占用2個(gè)字節(jié),漢字也占用2個(gè)字節(jié)。
4.兩者的存儲(chǔ)數(shù)據(jù)都非unicode的字符數(shù)據(jù)。
?
15.SQL語(yǔ)言分類(lèi)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
SQL語(yǔ)言共分為四大類(lèi):
一、數(shù)據(jù)查詢語(yǔ)言DQL
二、數(shù)據(jù)操縱語(yǔ)言DML
三、數(shù)據(jù)定義語(yǔ)言DDL
四、數(shù)據(jù)控制語(yǔ)言DCL。
1. 數(shù)據(jù)查詢語(yǔ)言DQL
數(shù)據(jù)查詢語(yǔ)言DQL基本結(jié)構(gòu)是由SELECT子句,F(xiàn)ROM子句,WHERE子句組成的查詢塊:
SELECT
FROM
WHERE
2. 數(shù)據(jù)操縱語(yǔ)言DML
數(shù)據(jù)操縱語(yǔ)言DML主要有三種形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 刪除:DELETE
SELECT a.,b. FROM luntan LEFT JOIN usertable as b ON a.username=b.username
SELECT a.,b. FROM city as a FULL OUTER JOIN user as b ON a.username=b.username
SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type
公眾號(hào):DotNet開(kāi)發(fā)跳槽
3. 數(shù)據(jù)定義語(yǔ)言DDL
數(shù)據(jù)定義語(yǔ)言DDL用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的各種對(duì)象-----表、視圖、索引、同義詞、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
表 視圖 索引 同義詞 簇
DDL操作是隱性提交的!不能rollback
4. 數(shù)據(jù)控制語(yǔ)言DCL
數(shù)據(jù)控制語(yǔ)言DCL用來(lái)授予或回收訪問(wèn)數(shù)據(jù)庫(kù)的某種特權(quán),并控制數(shù)據(jù)庫(kù)操縱事務(wù)發(fā)生的時(shí)間及效
果,對(duì)數(shù)據(jù)庫(kù)實(shí)行監(jiān)視等。如:
1) GRANT:授權(quán)。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點(diǎn)。回滾---ROLLBACK;回滾命令使數(shù)據(jù)庫(kù)
狀態(tài)回到上次最后提交的狀態(tài)。其格式為:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在數(shù)據(jù)庫(kù)的插入、刪除和修改操作時(shí),只有當(dāng)事務(wù)在提交到數(shù)據(jù)庫(kù)時(shí)才算完成。在事務(wù)提交前,只
有操作數(shù)據(jù)庫(kù)的這個(gè)人才能有權(quán)看到所做的事情,別人只有在最后提交完成后才可以看到。
提交數(shù)據(jù)有三種類(lèi)型:顯式提交、隱式提交及自動(dòng)提交。下面分別說(shuō)明這三種類(lèi)型。
(1) 顯式提交
用COMMIT命令直接完成的提交為顯式提交。其格式為:SQL>COMMIT;
(2) 隱式提交
用SQL命令間接完成的提交為隱式提交。這些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自動(dòng)提交
若把AUTOCOMMIT設(shè)置為ON,則在插入、修改、刪除語(yǔ)句執(zhí)行后,
系統(tǒng)將自動(dòng)進(jìn)行提交,這就是自動(dòng)提交。
其格式為:SQL>SET AUTOCOMMIT ON;
?
16.說(shuō)說(shuō)like %和-的區(qū)別? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
通配符的分類(lèi)
%百分號(hào)通配符:表示任何字符出現(xiàn)任意次數(shù)(可以是0次).
下劃線通配符:表示只能匹配單個(gè)字符,不能多也不能少,就是一個(gè)字符.
like操作符: LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配進(jìn)行比較.
注意: 如果在使用like操作符時(shí),后面的沒(méi)有使用通用匹配符效果是和=一致的,SELECT * FROM products?
WHERE products.prod_name like '1000';只能匹配的結(jié)果為1000,而不能匹配像JetPack 1000這樣的結(jié)果.
%通配符使用: 匹配以"yves"開(kāi)頭的記錄:(包括記錄"yves") SELECT FROM products WHERE?
products.prod_name like 'yves%';
匹配包含"yves"的記錄(包括記錄"yves") SELECT FROM products WHERE products.prod_name like?
'%yves%';
匹配以"yves"結(jié)尾的記錄(包括記錄"yves",不包括記錄"yves ",也就是yves后面有空格的記錄,這里需要注意)?
SELECT * FROM products WHERE products.prod_name like '%yves';
通配符使用: SELECT FROM products WHERE products.prod_name like 'yves'; 匹配結(jié)果為: 像"yyves"這樣
記錄. SELECT FROM products WHERE products.prodname like 'yves'; 匹配結(jié)果為: 像"yvesHe"這樣
的記錄.(一個(gè)下劃線只能匹配一個(gè)字符,不能多也不能少)
注意事項(xiàng):
注意大小寫(xiě),在使用模糊匹配時(shí),也就是匹配文本時(shí),mysql是可能區(qū)分大小的,也可能是不區(qū)分大小寫(xiě)的,這
個(gè)結(jié)果是取決于用戶對(duì)MySQL的配置方式.如果是區(qū)分大小寫(xiě),那么像YvesHe這樣記錄是不能
被"yves__"這樣的匹配條件匹配的.
注意尾部空格,"%yves"是不能匹配"heyves "這樣的記錄的.
注意NULL,%通配符可以匹配任意字符,但是不能匹配N(xiāo)ULL,也就是說(shuō)SELECT * FROM products WHERE?
products.prod_name like '%;是匹配不到products.prod_name為NULL的的記錄.
公眾號(hào):DotNet開(kāi)發(fā)跳槽
技巧與建議:
正如所見(jiàn), MySQL的通配符很有用。但這種功能是有代價(jià)的:通配符搜索的處理一般要比前面討論的
其他搜索所花時(shí)間更長(zhǎng)。這里給出一些使用通配符要記住的技巧。
不要過(guò)度使用通配符。如果其他操作符能達(dá)到相同的目的,應(yīng)該 使用其他操作符。
在確實(shí)需要使用通配符時(shí),除非絕對(duì)有必要,否則不要把它們用 在搜索模式的開(kāi)始處。把通配符置于搜
索模式的開(kāi)始處,搜索起 來(lái)是最慢的。
仔細(xì)注意通配符的位置。如果放錯(cuò)地方,可能不會(huì)返回想要的數(shù).
?
17.說(shuō)說(shuō)count(*)、count(1)、count(column)的區(qū)別? ? ? ? ??
count()對(duì)行的數(shù)目進(jìn)行計(jì)算,包含NULL
count(column)對(duì)特定的列的值具有的行數(shù)進(jìn)行計(jì)算,不包含NULL值。
count()還有一種使用方式,count(1)這個(gè)用法和count()的結(jié)果是一樣的。
性能問(wèn)題:
1.任何情況下SELECT COUNT() FROM tablename是最優(yōu)選擇;
2.盡量減少SELECT COUNT() FROM tablename WHERE COL = ‘value’ 這種查詢;
3.杜絕SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出現(xiàn)。
如果表沒(méi)有主鍵,那么count(1)比count()快。
如果有主鍵,那么count(主鍵,聯(lián)合主鍵)比count()快。
如果表只有一個(gè)字段,count()最快。
count(1)跟count(主鍵)一樣,只掃描主鍵。count()跟count(非主鍵)一樣,掃描整個(gè)表。明顯前者更快一
些。
?
18.什么是最左前綴原則?? ? ? ? ? ? ? ? ? ? ? ? ? ??
多列索引:
為了提高搜索效率,我們需要考慮運(yùn)用多列索引,由于索引文件以B-Tree格式保存,所以我們不用掃描
任何記錄,即可得到最終結(jié)果。
注:在mysql中執(zhí)行查詢時(shí),只能使用一個(gè)索引,如果我們?cè)趌name,fname,age上分別建索引,執(zhí)行查詢
時(shí),只能使用一個(gè)索引,mysql會(huì)選擇一個(gè)最嚴(yán)格(獲得結(jié)果集記錄數(shù)最少)的索引。
最左前綴原則:顧名思義,就是最左優(yōu)先,上例中我們創(chuàng)建了lname_fname_age多列索引,相當(dāng)于創(chuàng)建
了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引。
19.什么是索引?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
何為索引:
數(shù)據(jù)庫(kù)索引,是數(shù)據(jù)庫(kù)管理系統(tǒng)中一個(gè)排序的數(shù)據(jù)結(jié)構(gòu),索引的實(shí)現(xiàn)通常使用B樹(shù)及其變種B+樹(shù)。
在數(shù)據(jù)之外,數(shù)據(jù)庫(kù)系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指
向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn)高級(jí)查找算法。這種數(shù)據(jù)結(jié)構(gòu),就是索引。
20.索引的作用?它的優(yōu)點(diǎn)缺點(diǎn)是什么?? ? ? ? ? ? ? ? ? ?
索引作用:
協(xié)助快速查詢、更新數(shù)據(jù)庫(kù)表中數(shù)據(jù)。
為表設(shè)置索引要付出代價(jià)的:
一是增加了數(shù)據(jù)庫(kù)的存儲(chǔ)空間
二是在插入和修改數(shù)據(jù)時(shí)要花費(fèi)較多的時(shí)間(因?yàn)樗饕惨S之變動(dòng))。
ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);
公眾號(hào):DotNet開(kāi)發(fā)跳槽
21.索引的優(yōu)缺點(diǎn)有哪些?? ? ? ? ? ? ? ? ? ? ? ? ? ??
創(chuàng)建索引可以大大提高系統(tǒng)的性能(優(yōu)點(diǎn)):
(1)通過(guò)創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
(2)可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
(3)可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
(4)在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。
(5)通過(guò)使用索引,可以在查詢的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
增加索引也有許多不利的方面(缺點(diǎn)):
(1).創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。
(2).索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要
建立聚簇索引,那么需要的空間就會(huì)更大。
(3).當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)
速度。
(4).哪些列適合建立索引、哪些不適合建索引?
索引是建立在數(shù)據(jù)庫(kù)表中的某些列的上面。在創(chuàng)建索引的時(shí)候,應(yīng)該考慮在哪些列上可以創(chuàng)建索引,在
哪些列上不能創(chuàng)建索引。
一般來(lái)說(shuō),應(yīng)該在這些列上創(chuàng)建索引:
(1)在經(jīng)常需要搜索的列上,可以加快搜索的速度;
(2)在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);
(3)在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
(4)在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的;
(5)在經(jīng)常需要排序的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,這樣查詢可以利用索引的排序,加快排序
查詢時(shí)間;
(6)在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。
對(duì)于有些列不應(yīng)該創(chuàng)建索引:
(1)對(duì)于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。
這是因?yàn)椋热贿@些列很少使用到,因此有索引或者無(wú)索引,并不能提高查詢速度。相反,由于增加了
索引,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求。
(2)對(duì)于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。
這是因?yàn)?,由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中
數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。
(3)對(duì)于那些定義為text, image和bit數(shù)據(jù)類(lèi)型的列不應(yīng)該增加索引。
這是因?yàn)?,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。
(4)當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。
這是因?yàn)椋薷男阅芎蜋z索性能是互相矛盾的。當(dāng)增加索引時(shí),會(huì)提高檢索性能,但是會(huì)降低修改性
能。當(dāng)減少索引時(shí),會(huì)提高修改性能,降低檢索性能。因此,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該
創(chuàng)建索引。
索引詳解:帶你從頭到尾捋一遍MySQL索引結(jié)構(gòu)!
?
22.什么樣的字段適合建索引?? ? ? ? ? ? ? ? ? ? ? ? ?
唯一、不為空、經(jīng)常被查詢的字段
23.說(shuō)說(shuō)聚集索引和非聚集索引區(qū)別?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
聚合索引(clustered index):
聚集索引表記錄的排列順序和索引的排列順序一致,所以查詢效率快,只要找到第一個(gè)索引值記錄,其
余就連續(xù)性的記錄在物理也一樣連續(xù)存放。聚集索引對(duì)應(yīng)的缺點(diǎn)就是修改慢,因?yàn)闉榱吮WC表中記錄的
物理和索引順序一致,在記錄插入的時(shí)候,會(huì)對(duì)數(shù)據(jù)頁(yè)重新排序。
公眾號(hào):DotNet開(kāi)發(fā)跳槽
聚集索引類(lèi)似于新華字典中用拼音去查找漢字,拼音檢索表于書(shū)記順序都是按照a~z排列的,就像相同
的邏輯順序于物理順序一樣,當(dāng)你需要查找a,ai兩個(gè)讀音的字,或是想一次尋找多個(gè)傻(sha)的同音字
時(shí),也許向后翻幾頁(yè),或緊接著下一行就得到結(jié)果了。
非聚合索引(nonclustered index):
非聚集索引指定了表中記錄的邏輯順序,但是記錄的物理和索引不一定一致,兩種索引都采用B+樹(shù)結(jié)
構(gòu),非聚集索引的葉子層并不和實(shí)際數(shù)據(jù)頁(yè)相重疊,而采用葉子層包含一個(gè)指向表中的記錄在數(shù)據(jù)頁(yè)中
的指針?lè)绞健7蔷奂饕龑哟味?,不?huì)造成數(shù)據(jù)重排。
非聚集索引類(lèi)似在新華字典上通過(guò)偏旁部首來(lái)查詢漢字,檢索表也許是按照橫、豎、撇來(lái)排列的,但是
由于正文中是a~z的拼音順序,所以就類(lèi)似于邏輯地址于物理地址的不對(duì)應(yīng)。同時(shí)適用的情況就在于分
組,大數(shù)目的不同值,頻繁更新的列中,這些情況即不適合聚集索引。
根本區(qū)別:
聚集索引和非聚集索引的根本區(qū)別是表記錄的排列順序和與索引的排列順序是否一致。?
二、SqlServer筆試基礎(chǔ)篇? ? ? ? ? ? ? ? ? ? ?
試用SQL查詢語(yǔ)句表達(dá)下列對(duì)教學(xué)數(shù)據(jù)庫(kù)中三個(gè)基本表 S、SC 、C 的查詢:
S(sno,sname,SAGE,SSEX) 各字段表示學(xué)號(hào),姓名,年齡,性別
Sc(sno,cno,grade) 各字段表示學(xué)號(hào),課程號(hào),成績(jī)、
C(cno,cname, TEACHER) 各字段表示課程號(hào),課程名和教師名 其 中 SAGE, grade 是數(shù)值型,其他均
為字符型。
1.求年齡大于所有女同學(xué)年齡的男學(xué)生姓名和年齡。? ? ? ? ??
2.求年齡大于女同學(xué)平均年齡的男學(xué)生姓名和年齡。? ? ? ? ? ?
3.在 SC 中檢索成績(jī)?yōu)榭罩档膶W(xué)生學(xué)號(hào)和課程號(hào)。? ? ? ? ? ? ?
4.檢索姓名以 WANG 打頭的所有學(xué)生的姓名和年齡。? ? ? ? ? ?
5.檢索學(xué)號(hào)比 WANG 同學(xué)大,而年齡比他小的學(xué)生姓名。? ? ? ??
SELECTSNAME,SAGE FROM S AS X
WHERE X.SSEX=' 男'AND X.SAGE >ALL (SELECT SAGE FROMS AS Y WHERE
Y.SSEX=' 女')
SELECT SNAME,SAGE
FROM S
WHERE SSEX=' 男'
AND SAGE>(SELECTAVG(SAGE) FROM S WHERE SSEX='女')
SELECT Sno,CnoFROM SC WHERE GRADE IS NULL
SELECT SNAME,SAGE FROM S
WHERE SNAME LIKE 'WANG%'
SELECTX.SNAME FROM S AS X, S AS Y
WHERE Y .SNAME='WANG' AND X.Sno>Y.Sno AND X.SAGE
公眾號(hào):DotNet開(kāi)發(fā)跳槽
6.統(tǒng)計(jì)每門(mén)課程的學(xué)生選修人數(shù) (超過(guò) 2 人的課程才統(tǒng)計(jì)) 。要求
輸出課程號(hào)和選修人數(shù),查詢結(jié)果按人數(shù)降序排列,若人數(shù)相同,按
課程號(hào)升序排列。
?
7.求 LIU 老師所授課程的每門(mén)課程的學(xué)生平均成績(jī)。? ? ? ? ? ?
8.求選修 C4 課程的學(xué)生的平均年齡。? ? ? ? ? ? ? ? ? ??
9.統(tǒng)計(jì)有學(xué)生選修的課程門(mén)數(shù)。? ? ? ? ? ? ? ? ? ? ? ?
試用 SQL 更新語(yǔ)句表達(dá)對(duì)教學(xué)數(shù)據(jù)庫(kù)中三個(gè)基本表 S、
SC 、C的各個(gè)更新操作:
10.在基本表 SC 中修改 4 號(hào)課程的成績(jī),若成績(jī)小于等于 75 分時(shí)提
高 5% , 若成績(jī)大于 75 分時(shí)提高 4% (用兩個(gè) UPDATE 語(yǔ)句實(shí)
現(xiàn))。
?
SELECT SNAME
from s
where sno>(select sno from s where SNAME='WANG') andSAGE<(select sAGE from s?
where SNAME='WANG')
SELECTDISTINCT Cno,COUNT(Sno) FROM SC
GROUPBY Cno HAVING COUNT(Sno)>2
ORDER BY 2 DESC, Cno ASC
SELECT DISTINCT Cno,COUNT(Sno) as 人數(shù)
FROMSC GROUP BY Cno
HAVING COUNT(Sno)>2
ORDER BY 人 數(shù) DESC, Cno ASC
SELECT AVG(GRADE)
FROM SC join C on SC.Cno=C.Cno WHERE TEACHER='liu'
GROUP BY c.Cno
SELECTCNAME,AVG(GRADE) FROM SC ,C WHERE SC.Cno=C.Cno AND TEACHER='liu'
GROUP BY c.Cno,cname
SELECT AVG(SAGE )
FROMS WHERE Sno
IN(SELECT Sno FROM SC WHERE Cno='4')?
SELECT AVG(SAGE)
FROM S,SC WHERES.Sno=SC.Sno AND Cno='4'
SELECT COUNT(DISTINCT Cno) FROM SC
公眾號(hào):DotNet開(kāi)發(fā)跳槽
11 .把低于總平均成績(jī)的女同學(xué)成績(jī)提高 5% 。? ? ? ? ? ? ? ?
12 .把選修數(shù)據(jù)庫(kù)原理課不及格的成績(jī)?nèi)臑榭罩怠? ? ? ? ? ??
13.把WANG 同學(xué)的學(xué)習(xí)選課和成績(jī)?nèi)縿h去。? ? ? ? ? ? ?
14 .在基本表 SC 中刪除尚無(wú)成績(jī)的選課元組。? ? ? ? ? ? ??
15 .往基本表 S 中插入一個(gè)學(xué)生元組( ‘ S9’,‘ WU ’,18 )。。? ?
16.什么是SQL注入式攻擊?? ? ? ? ? ? ? ? ? ? ? ? ? ?
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串,欺騙
服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容直接用來(lái)構(gòu)造(或者影響)動(dòng)態(tài)SQL命
令,或作為存儲(chǔ)過(guò)程的輸入?yún)?shù),這類(lèi)表單特別容易受到SQL注入式攻擊。
三、SqlServer筆試高級(jí)篇? ? ? ? ? ? ? ? ? ? ?
1.什么是內(nèi)存泄漏?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
一般我們所說(shuō)的內(nèi)存泄漏指的是堆內(nèi)存的泄漏。堆內(nèi)存是程序從堆中為其分配的,大小任意的,使用完
后要顯示釋放內(nèi)存。當(dāng)應(yīng)用程序用關(guān)鍵字new 等創(chuàng)建對(duì)象時(shí),就從堆中為它分配一塊內(nèi)存,使用完后程
序調(diào)用free 或者delete 釋放該內(nèi)存,否則就說(shuō)該內(nèi)存就不能被使用,我們就說(shuō)該內(nèi)存被泄漏了。
2.維護(hù)數(shù)據(jù)庫(kù)的完整性和一致性,你喜歡用觸發(fā)器還是自寫(xiě)業(yè)務(wù)邏
輯?為什么?
?
是這樣做的,盡可能使用約束,如check, 主鍵,外鍵,非空字段等來(lái)約束,這樣做效率最高,也最方
便。其次是使用觸發(fā)器,這種方法可以保證,無(wú)論什么業(yè)務(wù)系統(tǒng)訪問(wèn)數(shù)據(jù)庫(kù)都可以保證數(shù)據(jù)的完整新和
一致性。最后考慮的是自寫(xiě)業(yè)務(wù)邏輯,但這樣做麻煩,編程復(fù)雜,效率低下。
UPDATE SC SETGRADE=GRADE*1.05 WHERE Cno='4' AND GRADE<=75?
UPDATE SC SET GRADE=GRADE*1.04 WHERE Cno='4' AND GRADE>75
UPDATE SC SETGRADE=GRADE*1.05 WHERE GRADE<(SELECT AVG(GRADE) FROM SC)
AND Sno IN (SELECT Sno FROM SWHERE SSEX=' 女')
UPDATE SC SET GRADE=NULL
WHERE GRADE<60 AND Cno IN(SELECT Cno FROM C
WHERE CNAME=' 數(shù)據(jù)庫(kù)原理 ')
DELETEFROM SC WHERE Sno IN(SELECT Sno FROM S
WHERE SNAME='WANG')
DELETE FROM SCWHERE GRADE IS NULL
INSERT INTO S(Sno,SNAME,SAGE) VALUES('59','WU',18)
公眾號(hào):DotNet開(kāi)發(fā)跳槽
3.什么是事務(wù)?什么是鎖?? ? ? ? ? ? ? ? ? ? ? ? ? ?
事務(wù)就是被綁定在一起作為一個(gè)邏輯工作單元的SQL 語(yǔ)句分組,如果任何一個(gè)語(yǔ)句操作失敗那么整個(gè)操
作就被失敗,以后操作就會(huì)回滾到操作前狀態(tài),或者是上有個(gè)節(jié)點(diǎn)。為了確保要么執(zhí)行,要么不執(zhí)行,
就可以使用事務(wù)。要將有組語(yǔ)句作為事務(wù)考慮,就需要通過(guò)ACID 測(cè)試,即原子性,一致性,隔離性和
持久性。
鎖:在所以的 DBMS中,鎖是實(shí)現(xiàn)事務(wù)的關(guān)鍵,鎖可以保證事務(wù)的完整性和并發(fā)性。與現(xiàn)實(shí)生活中鎖一
樣,它可以使某些數(shù)據(jù)的擁有者,在某段時(shí)間內(nèi)不能使用某些數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)。當(dāng)然鎖還分級(jí)別的。
?
4.對(duì)一個(gè)投入使用的在線事務(wù)處理表格有過(guò)多索引需要有什么樣的性
能考慮?
?
對(duì)一個(gè)表格的索引越多,數(shù)據(jù)庫(kù)引擎用來(lái)更新、插入或者刪除數(shù)據(jù)所需要的時(shí)間就越多,因?yàn)樵跀?shù)據(jù)操
控發(fā)生的時(shí)候索引也必須要維護(hù)。
5.什么是相關(guān)子查詢?如何使用這些查詢?
相關(guān)子查詢是一種包含子查詢的特殊類(lèi)型的查詢。查詢里包含的子查詢會(huì)真正請(qǐng)求外部查詢的值,從而
形成一個(gè)類(lèi)似于循環(huán)的狀況。
6.什么是SQL注入式攻擊?? ? ? ? ? ? ? ? ? ? ? ? ? ?
就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL
命令。在某些表單中,用戶輸入的內(nèi)容直接用來(lái)構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過(guò)程的輸
入?yún)?shù),這類(lèi)表單特別容易受到SQL注入式攻擊
7.如何防范SQL注入式攻擊?? ? ? ? ? ? ? ? ? ? ? ? ??
? 好在要防止ASP.NET應(yīng)用被SQL注入式攻擊闖入并不是一件特別困難的事情,只要在利用表單輸入的內(nèi)
容構(gòu)造SQL命令之前,把所有輸入內(nèi)容過(guò)濾一番就可以了。過(guò)濾輸入內(nèi)容可以按多種方式進(jìn)行。
? ⑴ 對(duì)于動(dòng)態(tài)構(gòu)造SQL查詢的場(chǎng)合,可以使用下面的技術(shù):
? 第一:替換單引號(hào),即把所有單獨(dú)出現(xiàn)的單引號(hào)改成兩個(gè)單引號(hào),防止攻擊者修改SQL命令的含義。
再來(lái)看前面的例子,“SELECT * from Users WHERE login = ’’’ or ’’1’’=’’1’ AND password = ’’’ or ’’1’’=’’1’”
顯然會(huì)得到與“SELECT * from Users WHERE login = ’’ or ’1’=’1’ AND password = ’’ or ’1’=’1’”不同的結(jié)
果。
? 第二:刪除用戶輸入內(nèi)容中的所有連字符,防止攻擊者構(gòu)造出類(lèi)如“SELECT * from Users WHERE
login = ’mas’ —— AND password =’’”之類(lèi)的查詢,因?yàn)檫@類(lèi)查詢的后半部分已經(jīng)被注釋掉,不再有
效,攻擊者只要知道一個(gè)合法的用戶登錄名稱,根本不需要知道用戶的密碼就可以順利獲得訪問(wèn)權(quán)限。
? 第三:對(duì)于用來(lái)執(zhí)行查詢的數(shù)據(jù)庫(kù)帳戶,限制其權(quán)限。用不同的用戶帳戶執(zhí)行查詢、插入、更新、刪
除操作。由于隔離了不同帳戶可執(zhí)行的操作,因而也就防止了原本用于執(zhí)行SELECT命令的地方卻被用
于執(zhí)行INSERT、UPDATE或DELETE命令。
? ⑵ 用存儲(chǔ)過(guò)程來(lái)執(zhí)行所有的查詢。SQL參數(shù)的傳遞方式將防止攻擊者利用單引號(hào)和連字符實(shí)施攻擊。
此外,它還使得數(shù)據(jù)庫(kù)權(quán)限可以限制到只允許特定的存儲(chǔ)過(guò)程執(zhí)行,所有的用戶輸入必須遵從被調(diào)用的
存儲(chǔ)過(guò)程的安全上下文,這樣就很難再發(fā)生注入式攻擊了。
? ⑶ 限制表單或查詢字符串輸入的長(zhǎng)度。如果用戶的登錄名字最多只有10個(gè)字符,那么不要認(rèn)可表單中
輸入的10個(gè)以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
? ⑷ 檢查用戶輸入的合法性,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)。數(shù)據(jù)檢查應(yīng)當(dāng)在客戶端和服務(wù)器端都
執(zhí)行——之所以要執(zhí)行服務(wù)器端驗(yàn)證,是為了彌補(bǔ)客戶端驗(yàn)證機(jī)制脆弱的安全性。
? 在客戶端,攻擊者完全有可能獲得網(wǎng)頁(yè)的源代碼,修改驗(yàn)證合法性的腳本(或者直接刪除腳本),然后將
非法內(nèi)容通過(guò)修改后的表單提交給服務(wù)器。因此,要保證驗(yàn)證操作確實(shí)已經(jīng)執(zhí)行,唯一的辦法就是在服
務(wù)器端也執(zhí)行驗(yàn)證。你可以使用許多內(nèi)建的驗(yàn)證對(duì)象,例如RegularExpressionValidator,它們能夠自
公眾號(hào):DotNet開(kāi)發(fā)跳槽
動(dòng)生成驗(yàn)證用的客戶端腳本,當(dāng)然你也可以插入服務(wù)器端的方法調(diào)用。如果找不到現(xiàn)成的驗(yàn)證對(duì)象,你
可以通過(guò)CustomValidator自己創(chuàng)建一個(gè)。
? ⑸ 將用戶登錄名稱、密碼等數(shù)據(jù)加密保存。加密用戶輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)
比較,這相當(dāng)于對(duì)用戶輸入
? 的數(shù)據(jù)進(jìn)行了“消毒”處理,用戶輸入的數(shù)據(jù)不再對(duì)數(shù)據(jù)庫(kù)有任何特殊的意義,從而也就防止了攻擊者注
入SQL命令。System.Web.Security.FormsAuthentication類(lèi)有一個(gè)
HashPasswordForStoringInConfigFile,非常適合于對(duì)輸入數(shù)據(jù)進(jìn)行消毒處理。
? ⑹ 檢查提取數(shù)據(jù)的查詢所返回的記錄數(shù)量。如果程序只要求返回一個(gè)記錄,但實(shí)際返回的記錄卻超過(guò)
一行,那就當(dāng)作出錯(cuò)處理。
? (7)使用預(yù)處理語(yǔ)句
8.你可以用什么來(lái)確保表格里的字段只接受特定范圍里的值?? ? ? ? ? ? ? ??
master 主要保存系統(tǒng)級(jí)的信息,比如本數(shù)據(jù)庫(kù)實(shí)例都有哪些數(shù)據(jù)庫(kù) ,都有哪些賬號(hào)等,需備份;
model 模板,每創(chuàng)建一個(gè)數(shù)據(jù)庫(kù) ,都會(huì)根據(jù)這個(gè)庫(kù)的結(jié)構(gòu)來(lái)創(chuàng)建,如果改過(guò)此庫(kù),建議備份;
msdb 保存計(jì)劃任務(wù),作業(yè)之類(lèi)的信息,需備份,否則會(huì)丟失作業(yè)和備份計(jì)劃;
tempdb 用戶對(duì)sqlserver操作時(shí)產(chǎn)生的臨時(shí)數(shù)據(jù)依賴于此庫(kù),最常見(jiàn)的是臨時(shí)表,不許備份;
9.有哪些操作會(huì)使用到TempDB;如果TempDB異常變大,可能的原
因是什么,該如何處理;
?
每個(gè)sqlserver運(yùn)行時(shí)所產(chǎn)生的臨時(shí)數(shù)據(jù)都會(huì)用到tempdb,最常見(jiàn)的是執(zhí)行sql腳本需要返回的記錄集;
異常變大的原因是執(zhí)行的操作返回的記錄集過(guò)大造成,找出該語(yǔ)句優(yōu)化,減少數(shù)據(jù)范圍,或者分批操作
這些數(shù)據(jù)
10.Index有哪些類(lèi)型,它們的區(qū)別和實(shí)現(xiàn)原理是什么,索引有啥優(yōu)點(diǎn)
和缺點(diǎn);如何為SQL語(yǔ)句創(chuàng)建合適的索引,索引創(chuàng)建時(shí)有哪些需要,注
意的項(xiàng),如何查看你創(chuàng)建的索引是否被使用;如何維護(hù)索引;索引損
壞如何檢查,怎么修復(fù);T-SQL有更好的索引存在,但是運(yùn)行,時(shí)并沒(méi)
有使用該索引,原因可能是什么;
?
聚集索引,非聚集索引;聚集索引只能有一個(gè),非聚集可有多個(gè),數(shù)據(jù)依賴于聚集索引來(lái)保存,如果沒(méi)
有聚集索引,數(shù)據(jù)是一個(gè)亂序的堆;
優(yōu)點(diǎn):合適的索引可有效提高查詢效率;缺點(diǎn):過(guò)多的索引,在insert、update 和 delete 的時(shí)候增加
索引的維護(hù)成本,降低并發(fā)量;
一般索引的創(chuàng)建要依賴于 where 和 order by 這兩個(gè)關(guān)鍵字,執(zhí)行計(jì)劃可以看出是否用到了索引;
還沒(méi)遇到過(guò)索引損壞的情況,如果損壞,重建之;
用不到索引可能是索引碎片過(guò)多 ,可進(jìn)行碎片整理,若不行可加強(qiáng)制索引with(index( 索引名 ))
11.Job信息我們可以通過(guò)哪些表獲??;系統(tǒng)正在運(yùn)行的語(yǔ)句可以通過(guò)
哪些視圖獲取;如何獲取某個(gè)T-SQL語(yǔ)句的IO、Time等信息;
?
sql2000下是通過(guò) master.dbo.sysjobs 來(lái)查看作業(yè)信息;系統(tǒng)正在運(yùn)行的語(yǔ)句可通過(guò)?
master.dbo.sysprocesses 結(jié)合 dbcc inputbuffer 來(lái)查看,IO,在sql2000下我本人都是通過(guò)profiler
看reads,duration,sql2005下有了動(dòng)態(tài)視圖(dmv);
公眾號(hào):DotNet開(kāi)發(fā)跳槽
版權(quán)申明:本文來(lái)源于網(wǎng)友收集或網(wǎng)友提供,如果有侵權(quán),請(qǐng)轉(zhuǎn)告版主或者留言,本公眾號(hào)立即刪除。
右下角,您點(diǎn)一下在看圖片
小微工資漲1毛
商務(wù)合作QQ:185601686
