資料庫常見面試題,資料庫試題

來源:互聯網
上載者:User

資料庫常見面試題,資料庫試題

第一範式:資料庫表中的每一列都是不可再分的基本資料項目,值或者不能有重複的屬性 ,比如說在一個表中有電話這個欄位,其值既有手機號,又有有線電話號,這就不符合了。
總結:欄位不能再分。

第二範式:在第一範式的基礎上建立起來的,即滿足第二範式必須要先滿足第一範式,第二範式要求資料庫表中的每個執行個體或行必須可以被惟一的區分 為實現區分通常需要為表加上一個列 以儲存各個執行個體的惟一標識。
總結:不能部分依賴,就是說當一個表有組合主鍵時,其他非主鍵的欄位必須完全依賴於主鍵。

第三範式:第三範式是要符合第二範式,第三範式就是一個資料表中不能存在其他資料表中的非主鍵欄位,比如說表中a,b,c三個欄位,a->b,b->c那麼c與a就是傳遞依賴,不符和。
總結:不可以有傳遞依賴,也就是說主鍵以外的欄位必須完全依賴於主鍵,而不能依賴其他欄位。

sql的最佳化問題(其實也就是索引的最佳化,因為我們不可能修改資料結構的情況下,提高資料庫的查詢效率似乎也只能用索引了)

1,建立索引:對於查詢佔主要的應用來說,索引顯得尤為重要,可以有效地避免每次查詢都全表掃描的情況出現,如果表的資料很大,而合格資料又很少,那麼不加索引就會引起效能下降。

2,複合索引
比如有一條語句是這樣的:select * from users where area=’beijing’ and age=22;如果我們是在area和age上分別建立單個索引的話,由於mysql查詢每次只能使用一個索引,所以雖然這樣已經相對不做索引時全表掃描提高了很多效率,但是如果在area、age兩列上建立複合索引的話將帶來更高的效率。

3,索引不會包含有NULL值的列,

4,使用短索引, 對串列進行索引,如果可能應該指定一個前置長度。例如,如果有一個CHAR(255)的 列,如果在前10 個或20 個字元內,多數值是惟一的,那麼就不要對整個列進行索引。

5,不要在列上進行運算,在列上進行運算將會導致索引失效,進行全盤掃描。

6,不使用NOT IN和<>操作,將會導致索引失效,進行全盤掃描。

事務是一種機制、是一種操作序列,它包含了一組資料庫操作命令,這組命令要麼全部執行,要麼全部不執行.

事務的四大屬性:

1 原子性(Atomicity):事務是一個完整的操作。
2 一致性(Consistency):當事務完成時,資料必須處於一致狀態。
3 隔離性(Isolation):對資料進行修改的所有並發事務是彼此隔離的。
4 持久性(Durability):事務完成後,它對於系統的影響是永久性的。

三、建立事務
T-SQL中管理事務的語句:
1 開始事務:begin transaction
2 提交事務:committransaction
3 復原事務:rollback transaction

事務分類:
1 明確交易:用begin transaction明確指定事務的開始。
2 隱性事務:開啟隱性事務:set implicit_transactions on,當以隱性事務模式操作時,SQL Servler將在提交或復原事務後自動啟動新事務。無法描述事務的開始,只需要提交或復原事務。
3 自動認可事務:SQLServer的預設模式,它將每條單獨的T-SQL語句視為一個事務。如果成功執行,則自動認可,否則復原。

樣本:張三轉800元到李四帳戶上。
use stuDB
go
–建立帳戶表bank–
if exists(select* from sysobjects where name=’bank’)
drop table bank
create table bank
(
customerName char(10), –顧客姓名
currentMoney money –當前餘額
)
go
/*//–添加約束,帳戶不能少於元–*/
alter table bank add
constraint CK_currentMoneycheck(currentMoney>=1)
/*//–插入測試資料–*/
insert into bank(customerName,currentMoney)
select ‘張三’,1000union
select ‘李四’,1

select * from bank
go

/*//–使用事務–*/
use stuDB
go
–恢複原來的資料
–update bank set currentMoney=currentMoney-1000 where customerName=’李’
set nocount on –不顯示受影響的行數
print ‘查看轉帳事務前的餘額’
select * from bank
go

/*//–開始事務–*/
begin transaction
declare @errorSum int –定義變數,用於累計事務執行過程中的錯誤
/*//–轉帳–*/
update bank set currentMoney=currentMoney-800 where customerName=’張三’
set @errorSum=@errorSum+@@error –累計是否有錯誤
update bank set currentMoney=currentMoney+800 where customerName=’李四’
set @errorSum=@errorSum+@@error –累計是否有錯誤

print ‘查看轉帳事務過程中的餘額’
select * from bank

/*//–根據是否有錯誤,確定事務是提交還是復原–*/
if @errorSum>0
begin
print ‘交易失敗,復原事務.’
rollback transaction
end
else
begin
print ‘交易成功,提交事務,寫入硬碟,永久儲存!’
commit transaction
end
go

print ‘查看轉帳後的餘額’
select * from bank
go

索引定義:SQL Server允許使用者在表中建立索引,指定按某列預先排序,從而大大提高查詢速度(類似於漢語詞典中按照拼音或者字畫尋找)。

索引作用:通過索引可以大大的提高資料庫的檢索速度,提高資料庫的效能。

索引的類型:

1:唯一索引:唯一索引不允許兩行有相同的索引值(其實也就是說唯一索引的這一列,每個值都是唯一的);

例如,如果在stuInfo表中的學員員社會安全號碼(stuID) 列上建立了唯一索引,則所有學員的社會安全號碼不能重複。

2:主鍵索引:定義表主鍵的時候,會自動建立主鍵索引(其實主鍵索引就是唯一索引的特例),主鍵索引要求每一個值都是唯一的且非空。

主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當在查詢中使用主鍵索引時,它還允許快速存取資料。

3:叢集索引:表中各行的物理順序與索引值的邏輯順序相同,每個表只能有一個。

在叢集索引中,表中各行的物理順序與索引值的邏輯(索引)順序相同。表只能包含一個叢集索引。例如:漢語字(詞)典預設按拼音排序編排字典中的每頁頁碼。拼音字母a,b,c,d……x,y,z就是索引的邏輯順序,而頁碼1,2,3……就是物理順序。預設按拼音排序的字典,其索引順序和邏輯順序是一致的。即拼音順序較後的字(詞)對應的頁碼也較大。如拼音“ha”對應的字(詞)頁碼就比拼音“ba” 對應的字(詞)頁碼靠後。

4:非叢集索引:非叢集索引指定表的邏輯順序,資料存放區在一個位置,索引儲存在另一個位置,索引中包含指向資料存放區位置的指標。

如果不是叢集索引,表中各行的物理順序與索引值的邏輯順序不匹配。叢集索引比非叢集索引(nonclustered index)有更快的資料訪問速度。例如,按筆畫排序的索引就是非叢集索引,“1”畫的字(詞)對應的頁碼可能比“3”畫的字(詞)對應的頁碼大(靠後)。

提示:SQL Server中,一個表只能建立1個叢集索引,多個非叢集索引。設定某列為主鍵,該列就預設為叢集索引

索引的優缺點:

優點:加快訪問速度;

加強行的唯一性

缺點:帶索引的表在資料庫中的儲存需要更多的空間;

建立索引的原則:

下列情況下可以使用索引:

該列頻繁用於搜尋;

該列用於對資料進行排序;

下列情況下避免使用索引:

列中僅僅包含幾個不同的值;

表中僅包含幾行。為小型表建立索引可能不太划算,因為SQLServer在索引中搜尋資料所花的時間比在表中逐行搜尋所花的時間更長。

hashtable和hashset的區別:

這兩個從不同的介面繼承下來的,兩者完全不一樣,前者資料以

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.