Microsoft SQL Server 2008 All-in-One Desk Reference For Dummies
读书笔记之三
SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的 SQL Server 版本。《Microsoft SQL Server 2008 All-in-One Desk Reference For Dummies》包括了9本书,分别介绍了SQL Server 2008的一些特性和技术,内容图文并茂、非常直观、浅显易懂。本系列读书笔记分9篇,分别介绍每本书的一些值得关注的内容。
Book III – Interacting with Your Data
操作数据
首先,本节第一步就介绍了
数据库的范式,数据库的设计范式是数据库设计所需要满足的规范,避免数据库存储大量不需要的冗余信息。
第一范式(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文档的数据。
关于XML
数据的查询,这里简单演示其中相关的SQL
脚本:
--Declare the variable for the XML instance
DECLARE
@myXML xml
--Create the XML instance
SET
@myXML = '
<Root>
<Contact ContactID=''101'' ContactName=''Homer Simpson''>
<ContactInformation>
<Cell>1-123-555-1234</Cell>
</ContactInformation>
</Contact>
<Contact ContactID=''102'' ContactName=''Marge Simpson''>
<ContactInformation>
<Cell>1-123-555-5678</Cell>
</ContactInformation>
</Contact>
</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)