數據庫基礎知識

1.數據、信息、數據處理、數據管理

數據是對客觀事物特徵的一種抽象的、符號化的表示,即用一定的符號表示那些從觀察或測量中收集的基本事實,採用什麼符號是人爲的規定。

信息是數據有意義的表現。

數據處理是對數據進行收集、組織、存儲、加工、抽取和傳播等一系列活動的總和,目的是從大量的原始數據中推導出對人們有用的信息。

數據管理是對數據的分類、組織、編碼、存儲、查詢、和維護等活動。

三個階段:人工管理、文件系統管理、數據庫系統

2.模型

模型:對現實世界特徵的模擬與抽象。

數據模型:根據實體及其相互聯繫的方法,樹型結構(層次型)、網狀結構(網狀型)、表結構(關係型)

三類數據模型:概念模型、邏輯數據模型、存儲模型

數據模型三要素

(1)數據結構:對實體間聯繫的表達實現

(2)數據操作:一組用於指定數據結構的任何有效實例執行的操作或推導規則。

(3)數據完整性約束:給出數據及其聯繫應具有的制約和依賴規則。

3.E-R圖

屬於概念模型

矩形--實體    橢圓--屬性   菱形--聯繫

雙向單箭頭--一對一    單向單箭頭_單向雙箭頭--一對多    雙向多箭頭--多對多

4.兩級映像與數據獨立性

三種模式:外模式、(概念)模式、內模式

兩級映象:外模式/模式、模式/內模式

映像是一種對應規則,指出映象雙方是如何轉換的。

數據獨立性:應用程序與數據結構之間相互獨立,互不影響。在三層模式體系結構中,指數據庫系統在某一層次上的改變不會使它的上一層發生改變的能力。

邏輯獨立性:一旦模式發生變化,無須改變外模式或應用程序的能力,外模式/模式映象。

物理獨立性:不會因爲內模式改變導致概念模式發生改變的能力,模式/內模式映象。 

數據邏輯獨立性難以測底實現,當前數據庫產品中,模式的改變會引發應用程序的改變。

5.用戶通過DBMS訪問數據庫的過程

DBMS是一個負責數據庫的定義、建立、操作、管理和維護的軟件系統。

(1)接受應用程序數據請求

(2)分析操作請求,轉換爲具體的物理數據處理

(3)DBMS向OS發出操作請求

(4)OS處理數據,結果送到緩衝區,併發出讀完標誌。

(5)DBMS接到讀完信號後,將緩衝區數據經模式映射,變成用戶邏輯記錄送到用戶工作區。

數據字典:描述各級模式的信息,包括數據的結構名、意義、描述定義、存儲模式、完整性約束、使用權限等信息。


範式

1NF 對關係模式R中所有屬性的屬性名和屬性值都不可再分

2NF R屬於1NF,且每一個非主屬性都完全依賴於碼(部分依賴:只依賴於碼的一部分)

3NF R屬於2NF,且不存在傳遞依賴

BCNF 又稱擴展的3NF,R是第一範式,且每個屬性都不傳遞依賴於R的候選鍵,則R爲BCNF

(1)所有非主屬性對碼都是完全函數依賴(2NF)

(2)所有主屬性對每一個不包含它的碼都是完全函數依賴(字段裏可以有多個碼的情況)

(3)沒有任何屬性完全函數依賴於非碼的任何一組屬性

4NF R屬於1NF,若X->->Y是非平凡的多值依賴,且X包含關鍵字,則R屬於4NF

              程序設計    麗麗

              程序設計     Lucy

              程序設計     Tom

    教師多值依賴於課程值,且課程、教師字段共同構成碼

6.事務 Transaction

事務作爲單個邏輯工作單元執行的一系列操作,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。事務可以由用戶顯示控制,否則由DBMS自動劃分事務。

特點:

原子性Atomicity:要麼全做,要麼全不做

一致性Consistency:事務的執行不會影響數據的一致性

獨立性Isolation:兩個以上的事務不會出現交錯執行的狀態

持久性Durability:事務運行成功後,對數據的更新是永久的。

Begin Transaction開始事務

Commit  提交

Rollback 回滾

併發存取:爲充分利用系統資源,改善對事務的響應時間,應允許多個事務在時間上交叉執行,併發的存取數據庫。併發存取必須加以控制,否則會存取錯誤的數據,引發數據不一致。

如果一個事務集的併發調度與某一串行調度是等價的,則稱該併發調度是可串行的。在一般的DBMS中,都以可串行化作爲併發控制的正確性準則。

前驅圖判斷一個調度S是否可串行化

構建前驅圖的方法:滿足下列條件畫一個箭頭

(1)Ti寫在Tj讀之前

(2)Ti讀在Tj寫之前

(3)Ti寫在Tj寫之前

如果構成的前驅圖沒有迴路,則可用拓撲順序活得一個等價的串行調度,否則不可串行調度。

7.基於封鎖的併發控制

寫鎖X(也稱排他鎖):不可再加任何其它鎖

讀鎖S(也稱共享鎖):資源上存在共享 (S) 鎖時,任何其它事務都不能修改數據。

封鎖協議:在數據寫或讀數據時,何時加鎖、封鎖時間,何時釋放的規則。

一級封鎖協議:事務T在修改數據K之前必須加X鎖,直到事務結束時釋放。可防止丟死修改,但不能保證可重複性、不讀髒數據

二級封鎖協議:一級封鎖協議基礎上,事務T在讀數據K前,對K加S鎖,讀完即可釋放。可防止丟死修改,防止讀髒數據,但不能保證可重複性。

三級封鎖協議:一級封鎖協議基礎上,事務T在讀數據K前,對K加S鎖,直到事務結束時釋放。可防止丟死修改,防止讀髒數據,保證可重複性。


兩段鎖協議:TPL協議,Two-Phase Locking Protocol

(1)在任何數據對象進行讀寫操作前,事務要對數據對象加鎖

(2)在釋放一個鎖後,就不可再加其它鎖

這樣,鎖會不斷增加,然後不但減少。


8.死鎖

預防死鎖

一次申請法:一次申請請全部鎖,否則一個鎖也不佔有。會限制併發數,降低資源使用效率,會引發活鎖。

順序申請法:將數據對象按序編號,事務按順序申請加鎖,這樣只有請求低序號的數據對象的事務等待佔有高序號數據對象的事務,而不會出現循環等待。順序標號很困難,因爲數據對象很多,且不斷變動。


實用的方法:時間標記法,記錄事務的運行時間

等待死亡測量:年輕回滾,以當前時間標記開始重新運行

傷害等待策略:年輕等年老,年輕等待,年老回滾。


死鎖監測

超時法:

等待圖法:出現迴路時死鎖


9.觸發器

事前觸發:運行於觸發事件發生之前

事後觸發:運行於觸發事件發生之後

語句級觸發:在語句執行前觸發

行級觸發:在觸發器所影響的每一行觸發一次。


SQL語句

select * from 學生 where 學號<any(~)

any 與 all : any是單個值,小於其中一個值即可,all是全部值

權限管理

grant select,insert on table 學生 to user1 with grant option

revoke select on table 學生 from user1

權限會級聯收回,user1授給user2的此權限,會被級聯收回。

表格修改

alter table t2 add construction id unique  爲id字段增加unique屬性

alter table t2 add construction id primary key 爲id字段增加主鍵屬性

top

select top 1 * into # from a     // #表示臨時表,把a的第一行賦值到臨時表#中

truncate table a   // 截斷表a,即清空

insert a select * from #      //把臨時表內容複製到表a中


10.SQL注入攻擊

指攻擊者把SQL命令插入到Web表單或頁面請求的查詢字符串中,欺騙服務器執行惡意的SQL命令。

用戶輸入的內容可能被用來構造SQL語句,或作爲存儲過程的參數,這是SQL注入攻擊的原因。

預防方法:

(1)替換單引號:把所有單獨出現的單引號改成兩個單引號

(2)刪除用戶輸入內容中的連字符,防止攻擊者獲得訪問權限

(3)所用帳號權限控制

(4)檢查用戶輸入的合法性

(5)將用戶登錄帳號、密碼等加密保存

(6)用存儲過程執行查詢,這樣用戶輸入必須遵從存儲過程的安全上下文。


11.存儲過程與函數

存儲過程是用戶定義的一系列SQL語句的集合,涉及特定表或其它對象的任務,用戶可以調用存儲過程。

函數是數據庫已定義的方法,它接受參數並返回某種類型的值,不涉及特定用戶表。


12.遊標的作用,如何知道遊標到了最後?

遊標用於定位結果集的行,通過判斷全局變量@@FETCH_STATUS可以判斷是否到了最後,變量不等於0表示出錯或到了最後。

13.聚集索引與非聚集索引

聚集索引的順序就是數據的物理存儲順序,因此一個表只能有一個聚集索引,但該索引可以包含多個列(組合索引,姓氏、名字)

非聚集索引的索引順序與物理排列順序無關

在SQLServer中,索引是通過二叉樹的數據結構來描述的。聚集索引中,二叉樹的葉節點就是數據節點,而非聚集索引的葉節點仍然是索引節點,但有一個指針指向對應的數據塊。

聚集索引對於那些經常要搜索範圍值的列特別有效,因爲找到包含第一個值的行,便可以確保包含後續索引值的行在物理近鄰。

非聚集索引中項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規定)。


有索引未必檢索得快。比如檢索全部數據的情況。


14.SQL語句實例

select n(n爲任意常量,浮點數,負數,字符串也可以)只是爲了判斷select的對象表中是否存在滿足條件的記錄,存在記錄就返回一行。

上述select語句還可以加入where子句,比如select 1 from t where t.B = 3; 
滿足條件的記錄有多少條,結果就返回多少行,行值都爲n所對應的常量值;如果沒有符合條件的記錄,則提示 no rows returned

如 select 1 from t;

如果t中只有1條記錄

title: 1

value:1

如果t中有3條記錄,則有3行value

title:1

value: 1

            1

            1

(1)找出表ppp中最小的num值,不用min函數

select * from ppp where num <= all(select num from ppp)

slect top 1 num from ppp order by num

(2)找出表ppp中最小的num值,用min函數

select min(num) from ppp

select num from ppp where num=(select min(num) from ppp)     //如果要求這條記錄的話,就得用第二種這種寫法了

(3)選擇表PPP中重複的記錄

select * from ppp

where num in(select num from ppp group by num having(count(num)>1))

(4)寫出複製表、拷貝表、和四表聯查的SQL語句

複製表(只結構,無數據):select * into B from A where 1=0

拷貝表(拷貝數據):select * into B from A

四表聯查:select * from A,B,C,D where ..

(5)在SQL Server中用SQL語句建立一張表

create table #Temp(字段1 類型, 字段2 類型, ..)       臨時表要在表名前加#

(6)表T2只有一列,共有1000個相同記錄,想出方法把第5行到第7行記錄取出來,不要使用航標和索引

select top 3 userid from T where userid not in(select top 4 userid from T order by userid) order by userid

select top 7 userid from T where userid > all(select top 4 userid from T order by userid ) order by userid

(7)查數據表中第30到40條記錄,有字段ID,但ID並不連續

select * from T where id in(select top 10 id from(select top 40 id from T order by id desc))

select * from T a where exists (select 1 from (select top 10 id from (select top 40 id from T order by id desc) as c)) as b where b.id = a.id

第二句是用exists的一種方法,後面需加where b.id = a.id條件,exists的效率比in要高

(8)如何把時間顯示成"20051110 14: 444 : 17"格式

select to_char(sydate,'yyyymmdd hh24:mi:ss') from T

(9)刪除重複記錄,下面是藉助了rowid字段

delete from table1 t1
  where t1.rowid > (select min(t2.rowid) from table1 t2 where t1.id = t2.id);

(10)表T中有10條重複的記錄,如何刪除其中9條?

答案1:

select top 1 * into # from a

truncate table a

insert a select * from #

答案2:

select distinct * into #tb_tmp from a

drop table a

exec sp_rename 'tb_tmp', 'a'

11.有這樣一張表,

id revtime  channel   val

1  2007-5-1   1        79
1  2007-5-1   2        46
1  2007-5-1   3       265
2  2007-6-1   1        80
2  2007-6-1   2        40
2  2007-6-1   3       266
要顯示成下面的形式,怎麼寫SQL語句?
id revtime  channel1data     channel2data  channel3data
1  2007-5-1    79                 46            265
2  2007-6-1    80                 40            266

說明
//根據channel通道號顯示出對應通道的數據,用id號聚集
select id,revtime,
max(case channel when 1 then val end) as channel1data
max(case channel when 2 then val end) as channel2data
max(case channel when 3 then val end) as channel3data
from T
group by id,revtime

12.對當前正在運行的數據庫改名:sp_renamedb

sp_renamedb  'oldname', 'newname'

對數據表改名

exec sp_rename 'oldname', 'newname'

13.寫一個SQL語句,找出修2-3門的學生名字

Study表結構  stu_id, CouseID

Student表結構 Stu_id, Stu_name

 select * from Student as tmp

where (select count(*) from Study where stu_id=tmp.Stu_id) between 2 and 3    //竟然可以這樣寫,很新奇


發佈了143 篇原創文章 · 獲贊 11 · 訪問量 77萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章