SQL Server中处理空值时涉及的三问题

数据完整性是任何数据库系统要保证的重点。不管系统计划得有多好,空数据值的问题总是存在。本文探讨了在SQL Server中处理这些值时涉及的3个问题:计数、使用空表值以及外键处理。

用COUNT(*)处理空值

大多数集合函数都能在计算时消除空值;COUNT函数则属于例外。对包含空值的一个列使用COUNT函数,空值会从计算中消除。但假如COUNT函数使用一个星号,它就计算所有行,而不管是否存在空值。

如果希望COUNT函数对给定列的所有行(包括空值)进行计数,请使用ISNULL函数。ISNULL函数会将空值替换成有效的值。

事实上,对集合函数来说,如果空值可能导致错误结果,ISNULL函数就非常有用。记住在使用一个星号时,COUNT函数会对所有行进行计算。下例演示了空值在AVG和COUNT集合函数中的影响:

SET NOCOUNT ON
  GO
  CREATE TABLE xCount
  (pkey1 INT IDENTITY NOT NULL
    CONSTRAINT pk_xCount PRIMARY KEY,
  Col1 int NULL)
  GO
  INSERT xCount (Col1) VALUES (10)
  GO
  INSERT xCount (Col1) VALUES (15)
  GO
  INSERT xCount (Col1) VALUES (20)
  GO
  INSERT xCount (Col1) VALUES (NULL)
  GO
  SELECT AVG(Col1) AvgWithoutIsNullFunctionOnCol1,
  AVG(ISNULL(Col1,0)) AvgWithIsNullFunctionOnCol1,
  COUNT(Col1) NoIsNullFunctionOnCol1 ,
  COUNT(ISNULL(Col1,0)) UsingIsNullFunctionOnCol1,
  Count(*) UsingAsterisk
  FROM xCount
  GO
  DROP TABLE xCount
  GO
  
OUTPUT:
AvgWOIsNullFnctnCol1 AvgWIsNullFnctnCol1 WOIsNullFnctnCol1
WIsNullFnctnCol1 UsingAsterisk
---------------- ------------- -------------- ------------ 
15       11        3      4     4

时间: 2024-09-20 01:05:50

SQL Server中处理空值时涉及的三问题的相关文章

C#向Sql Server中插入记录时单引号的处理

server|插入 ASP.Net种使用C#, 向CoreDB.myBBS表中插入记录值(Title, Content)[文章的标题和内容],由于Content, Title中可能包含单引号,直接使用sql的insert命令会报错,对此有两种处理方法,一种将单引号替换成两个单引号,第2种方法是使用存储过程. 表myBBS的格式定义如下:CREATE TABLE [dbo].[myBBS] ( [ID] [bigint] IDENTITY (1, 1) NOT NULL , [Title] [ch

SQL Server中date、datetime、smalldate三种数据类型的区别

环境:SQLServer 2008 R2 问题:SQLServer date.datetime.smalldate区别 解决: datetime 从1753年1月1日到9999年12月31日的日期和时间数据,精确度为百分之三秒(等于   3.33毫秒或0.00333秒).如下表所示,把值调整到.000..003.或.007 秒的增量. 日期和 时间部分,可以表示的日期范围从公元1753年1月1日00:00:00.000 到9999年12月31日23:59:59.997 ,精确到 3.33毫秒,它

.NET和SQL Server中“空值”辨析

server 初学数据库编程我们可能会有一些对"空值"的疑问,比如通过编程新建的一个表中所有数据皆显示为<NULL>,手动添加并删除文字后又变成了空白:一个字符串类型的字段,明明没有填值,却不等于"":用ADO.NET从数据库中取值,每遇到有<NULL>的就出错--这需要我们正确认识.NET和SQL Server中几种不同的"空值".1.真正的空值,也就是"没有输入的值",可以出现在大多数类型的字段中(

如何捕获和记录SQL Server中发生的死锁

方法一:利用SQL Server代理(Alert+Job)具体步骤如下:1.首先使用下面的命令,将有关的跟踪标志启用.SQL code DBCC TRACEON (3605,1204,1222,-1) 说明:3605 将DBCC的结果输出到错误日志. 1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令. 1222 返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML 格式的受影响的当前命令(比1204更进一步,SQL 2005及以上可用). -1 以全局方式打开指

如何捕获和记录SQL Server中发生的死锁_Mysql

方法一:利用SQL Server代理(Alert+Job)具体步骤如下:1.首先使用下面的命令,将有关的跟踪标志启用.SQL code DBCC TRACEON (3605,1204,1222,-1)  说明:3605 将DBCC的结果输出到错误日志.1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令.1222 返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML 格式的受影响的当前命令(比1204更进一步,SQL 2005及以上可用).-1 以全局方式打开指定的

EXCEL数据上传到SQL SERVER中的简单实现方法_Mysql

EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下:  if (FileUpload1.HasFile) //如果用户确实选择了上传控件的浏览按钮,浏览文件成功. { this.FileUpload1.SaveAs("E:\\Temp\\" + FileUpload1.FileN

SQL Server中多表连接时驱动顺序对性能的影响

原文:SQL Server中多表连接时驱动顺序对性能的影响   本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)   最近在SQL Server中多次遇到开发人员提交过来的有性能问题的SQL,其表面的原因是表之间去的驱动顺序造成的性能问题,具体表现在(已排除其他因素影响的情况下),存储过程偶发性的执行时间超出预期,甚至在调

sql server 2014附加数据库时出错,有关详细信息,请单击“消息”列中的超链接

问题描述 sql server 2014附加数据库时出错,有关详细信息,请单击"消息"列中的超链接 百度上改属性权限之类的都试了,还是不行! 请大神些帮帮忙呀.. 解决方案 他说要你点击超链接,你将附加的左右滚动条滑到最右边,点击就会有错误原因,一般附加报错一个是没有权限,还有可能是版本不兼容,微软都是向下兼容的,比如用2012版本的文件附加到2014就会报错 解决方案二: 标题: Microsoft SQL Server Management Studio -------------

漫谈SQL Server中的标识列(一)

server 漫谈SQL Server中的标识列(一) 一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3.列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列. 由于以上特点,使得标识列在数据库的设计中得到广泛的使用. 二.标识列的组成创建一个标识列,通常要指定三个内容:1.类型(type)在SQL Ser