⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12697.htm

📁 一本很基础的SQL讲解
💻 HTM
字号:
<link href="./dzs_cs.css" rel="stylesheet" type="text/css" /><table width="96%" border="0" align="center" cellpadding="0" cellspacing="0">      <tr>        <td>&nbsp;</td>      </tr>      <tr>        <td height="24" align="center" valign="bottom" class="d_font3">SQL Server的空值处理策略</td>      </tr>      <tr>        <td height="3" bgcolor="#E3E3E3"></td>      </tr>      <tr>        <td>&nbsp;</td>      </tr>      <tr>        <td class="d_font4"><P>数据完整性是任何数据库系统要保证的重点。不管系统计划得有多好,空数据值的问题总是存在。本文探讨了在SQL Server中处理这些值时涉及的3个问题:计数、使用空表值以及外键处理。</P>
<P><B>用COUNT(*)处理空值<BR></P></B>
<P>大多数集合函数都能在计算时消除空值;COUNT函数则属于例外。对包含空值的一个列使用COUNT函数,空值会从计算中消除。但假如COUNT函数使用一个星号,它就计算所有行,而不管是否存在空值。</P>
<P>如果希望COUNT函数对给定列的所有行(包括空值)进行计数,请使用ISNULL函数。ISNULL函数会将空值替换成有效的值。<BR></P>
<P>事实上,对集合函数来说,如果空值可能导致错误结果,ISNULL函数就非常有用。记住在使用一个星号时,COUNT函数会对所有行进行计算。下例演示了空值在AVG和COUNT集合函数中的影响: <BR><PRE>    SET NOCOUNT ON<BR></PRE>
<P>GO<BR>CREATE TABLE xCount<BR>(pkey1 INT IDENTITY NOT NULL<BR>&nbsp;&nbsp;&nbsp; CONSTRAINT pk_xCount PRIMARY KEY,<BR>Col1 int NULL)<BR>GO<BR>INSERT xCount (Col1) VALUES (10)<BR>GO<BR>INSERT xCount (Col1) VALUES (15)<BR>GO<BR>INSERT xCount (Col1) VALUES (20)<BR>GO<BR>INSERT xCount (Col1) VALUES (NULL)<BR>GO<BR>SELECT AVG(Col1) AvgWithoutIsNullFunctionOnCol1,<BR>AVG(ISNULL(Col1,0)) AvgWithIsNullFunctionOnCol1,<BR>COUNT(Col1) NoIsNullFunctionOnCol1 ,<BR>COUNT(ISNULL(Col1,0)) UsingIsNullFunctionOnCol1,<BR>Count(*) UsingAsterisk<BR>FROM xCount<BR>GO<BR>DROP TABLE xCount<BR>GO<BR><BR>OUTPUT:<BR>AvgWOIsNullFnctnCol1 AvgWIsNullFnctnCol1 WOIsNullFnctnCol1<BR><BR>WIsNullFnctnCol1 UsingAsterisk<BR>---------------- ------------- -------------- ------------ ---------<BR>15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</P><PRE></PRE>
<P><B>恰当使用空表值</B></P>
<P>SQL Server可能出现一种特殊情况:在引用父表的一个表中,因为不允许空值,所以“声明引用完整性”(DRI)可能不会得到强制。即使父表不包含空值,在子表引用了父表主键约束或惟一约束的列中,也可能包含空值。<BR></P>
<P>假如来自父表的值目前未知,就不会有任何问题。例如,父表可能是一个地址表,而子表可能包含联系信息。由于许多原因,可能暂时不知道要传给父表的联系地址。这是一种基于时间的问题,空值在其中或许是合适的。</P>
<P>如下例所示,我们创建父表,并在其中插入两个值。</P><PRE>&nbsp;SET NOCOUNT ON<BR>
    GO<BR>CREATE TABLE Parent<BR>(pkey1 INT IDENTITY NOT NULL<BR>&nbsp;&nbsp;&nbsp; CONSTRAINT pkParent PRIMARY KEY,<BR>col1 INT NULL)<BR>GO<BR>INSERT Parent (col1) VALUES (284)<BR>GO<BR>INSERT Parent (col1) VALUES (326)<BR>GO<BR>&nbsp;
</PRE><BR>以下代码则创建子表,并在引用父表的列中插入一个空值。 
<P></P><PRE>&nbsp;CREATE TABLE Child<BR>
    (pkey1 INT IDENTITY<BR>CONSTRAINT pkChild PRIMARY KEY,<BR>Parentpkey1 INT NULL<BR>CONSTRAINT fkChildParent FOREIGN KEY<BR>REFERENCES Parent(pkey1),<BR>col1 INT NULL)<BR>GO<BR>INSERT Child (Parentpkey1, col1) VALUES (null,2)<BR>GO<BR></PRE>&nbsp;<BR>但在以下代码中,要同时从父表和子表选择值。虽然父表不包含空值,但在子表引用了父表的那个列中,将允许一个空值。<BR>
<P>然后丢弃所有表,清除这个演示所用的数据库对象。<BR><PRE>&nbsp;SELECT * FROM Child<BR>GO<BR>SELECT * FROM Parent<BR>GO<BR>DROP TABLE Child, Parent<BR>GO</PRE><B>在可以为空的外键中检查数据的有效性</B> 
<P>如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据。可在一个外键列中插入有效的值,但在另一个外键列中插入空值。然后,可添加一个数据表检查约束,在可为空的外键中检查数据的有效性。</P>
<P>任何多列外键都可能遇到同样的问题。所以,你需要添加一个检查约束来检测异常。最初,检查约束将检查构成外键的所有列中可能为空的值。检查约束还要检查这些列中不能为空的值。如两个检查都通过,问题就解决了。</P>
<P>以下示范脚本展示了这样的一个异常,以及如何用检查约束来纠正它。<PRE>SET NOCOUNT ON<BR>GO<BR>CREATE TABLE parent (pkey1 INT IDENTITY NOT NULL, pkey2 INT
NOT NULL, col1 INT NULL,<BR>CONSTRAINT pk_parent PRIMARY KEY NONCLUSTERED ( pkey1, pkey2))<BR>GO<BR>INSERT parent (pkey2) VALUES ( 2 )<BR>INSERT parent (pkey2) VALUES ( 85 )<BR>INSERT parent (pkey2) VALUES ( 41 )<BR>INSERT parent (pkey2) VALUES ( 11 )<BR>GO<BR>SELECT * FROM parent<BR>GO<BR>CREATE TABLE child (cpkey1 INT IDENTITY NOT NULL<BR>CONSTRAINT pk_child PRIMARY KEY NONCLUSTERED (cpkey1),<BR>pkey1 INT NULL, pkey2 INT NULL, col1 INT NULL,<BR>CONSTRAINT fk_parent_child FOREIGN KEY (pkey1, pkey2)<BR>REFERENCES parent (pkey1, pkey2))<BR>GO<BR>INSERT child (pkey1, pkey2) VALUES ( null, 85 )<BR>GO<BR>SELECT * FROM child<BR>GO<BR>DELETE child<BR>GO<BR>ALTER TABLE child WITH NOCHECK<BR>ADD CONSTRAINT ck_fk_parent_child CHECK<BR>((pkey1 IS NOT NULL AND pkey2 IS NOT NULL) OR<BR>(pkey1 IS NULL AND pkey2 IS NULL) )<BR>GO<BR>INSERT child (pkey1, pkey2) VALUES ( null, 11 )<BR>GO<BR>DROP TABLE child, parent<BR>GO
</PRE>
<P>空值是所有数据库开发者和管理员都要遇到的。所以,要想开发成功的应用程序,必须知道如何处理这些值。本文和你分享了空值处理的一些技巧和技术。</P></td>      </tr>      <tr>        <td class="d_font4">&nbsp;</td>      </tr>    </table>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -