<b>Microsoft SQL Server 2008 All-in-One Desk Reference For Dummies </b><b>讀書筆記之三</b>
SQL Server 2008是一個重大的産品版本,它推出了許多新的特性和關鍵的改進,使得它成為至今為止的最強大和最全面的 SQL Server 版本。《Microsoft SQL Server 2008 All-in-One Desk Reference For Dummies》包括了9本書,分别介紹了SQL Server 2008的一些特性和技術,内容圖文并茂、非常直覺、淺顯易懂。本系列讀書筆記分9篇,分别介紹每本書的一些值得關注的内容。
<a href="http://blog.entlib.com/EntLib/archive/2009/03/03/microsoft-sql-server-2008-all-in-one-desk-reference-for-dummies.aspx"><b>Book I – Essential Concepts </b><b>基本概念</b></a>
<b></b>
<b>Book III – Interacting with Your Data </b><b>操作資料</b>
首先,本節第一步就介紹了<b>資料庫的範式</b>,資料庫的設計範式是資料庫設計所需要滿足的規範,避免資料庫存儲大量不需要的備援資訊。
第一範式(1NF,First Normal Form: No Repeating Groups)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關系。
第二範式(2NF,Second Normal Form: Dependent on the Whole Key)是在第一範式(1NF)的基礎上建立起來的,即滿足第二範式(2NF)必須先滿足第一範式(1NF)。第二範式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。
滿足第三範式(3NF)必須先滿足第二範式(2NF)。簡而言之,第三範式(3NF)要求每一個非主關鍵字段必須直接且僅依賴主關鍵字字段。換句換說,如果任何一個非主關鍵字段(non-primary column)是直接依賴于其他非主關鍵字段(non-primary column),則這個表的設計不符合第三範式。
第二範式和第三範式的最大差別是:第二範式強調非主關鍵字段必須依賴于整個主關鍵字段(組合關鍵字段清單,composite key),而不是部分關鍵字段清單。而第三範式強調的是:非主關鍵字段必須依賴于主關鍵字,而不是其他非主關鍵字段。也就是說,每一個字段或列必須依賴于整個主關鍵字段列(第二範式),且僅僅主關鍵字段列(第三範式)。
當然,我們為了提高系統的性能,必要時違反範式(Denomalizing your database),增加備援資料到資料庫。
接下來第二章介紹了SQL Server的優化,包括使用執行計劃、建立和維護統計資訊等。介紹的比較簡單,值得看一下。
後面的章節介紹了查詢設計器(Query Designer)、更新資料、視圖等等,比較簡單,可以很快跳過去。
最後一部分,介紹了進階查詢主題,包括事務、全文檢索(Full-text Search)、Outer Joins和查詢XML資料等等。
Microsoft 在最近的SQL Server的版本中增加了對XML 的重大支援,XML 資料可以存放在XML資料類型的列中,或者nvarchar(MAX) 資料類型中。在SQL Server 2008中,提供了如下的XML 方法,用來查詢和更新XML資料。
Query – 該方法用來從XML文檔中查詢單一節點。
Value – 該方法用來從XML文檔中檢索單一值。
Exist – 該方法用來檢查一個特定的值是否存在于XML文檔中。
Nodes – 該方法用來從XML文檔中檢索多個值,通常用來以table的格式顯示XML資料。
Modify – 該方法更新XML文檔的資料。
<b>關于XML</b><b>資料的查詢,這裡簡單示範其中相關的SQL</b><b>腳本:</b>
--Declare the variable for the XML instance
DECLARE @myXML xml
--Create the XML instance
SET @myXML = '
<Root>
<Contact ContactID=''101'' ContactName=''Homer Simpson''>
<ContactInformation>
<email>[email][email protected][/email]</email>
<Cell>1-123-555-1234</Cell>
</ContactInformation>
</Contact>
<Contact ContactID=''102'' ContactName=''Marge Simpson''>
<email>[email][email protected][/email]</email>
<Cell>1-123-555-5678</Cell>
</Root>'
--Use the query method to query the XML instance
SELECT @myXML.query('/Root/Contact/ContactInformation/email/text()')
DECLARE @ContactID int
--Retrieve value of ContactID for the 2nd row [2]
SET @ContactID = @myXML.value('(/Root/Contact/@ContactID)[2]', 'int')
--Display the value
SELECT @ContactID
DECLARE @dataExists bit
--See if Homer Simpson exists in the XML instance
SET @dataExists = @myXML.exist('/Root = (''Homer Simpson'')')
SELECT @dataExists
--Retrieve the nodes
SELECT
MyTable.cols.value('@ContactName', 'varchar(35)') AS Name,
MyTable.cols.query('ContactInformation/email') AS [Email],
MyTable.cols.query('ContactInformation/Cell') AS [CellPhone]
FROM @myXML.nodes('/Root/Contact') MyTable(cols)
本文轉自 entlib.com 51CTO部落格,原文連結:http://blog.51cto.com/entlib/136695,如需轉載請自行聯系原作者