有如下程序段:
DECLARE @text1 char(20)
SET @text1='平均成绩高于75.'
IF ( SELECT AVG(成绩)
FROM XS,XS_KC,KC
WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号
AND KC.课程名=’数据库原理’ ) <75
SELECT @text1='平均成绩低于75.'
ELSE
SELECT @text1如果SELECT 查询查出来是个NULL值,那和75比较是个什么样的结果呢?我运行的结果是平均成绩高于75,NULL和数值比较遵循什么规则?
DECLARE @text1 char(20)
SET @text1='平均成绩高于75.'
IF ( SELECT AVG(成绩)
FROM XS,XS_KC,KC
WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号
AND KC.课程名=’数据库原理’ ) <75
SELECT @text1='平均成绩低于75.'
ELSE
SELECT @text1如果SELECT 查询查出来是个NULL值,那和75比较是个什么样的结果呢?我运行的结果是平均成绩高于75,NULL和数值比较遵循什么规则?
true
false
unknownNULL和数值比较=unknownif 5>null print 'true'
if 5<null print 'true'
if 5=null print 'true'
FROM XS,XS_KC,KC
WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号
AND KC.课程名=’数据库原理’ ) <75 如果‘成绩’字段会影响到其平均值的计算
对于空值有两种处理方法
1 isnull(avg(成绩),0)
2 avg(isnull(成绩,0))
或 avg(isnull(成绩,75))这样不影响平均值的计算
DECLARE @text1 char(20)
SET @text1='平均成绩高于75.'
if (SELECT isnull(AVG(成绩),0)
FROM XS,XS_KC,KC
WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号
AND KC.课程名='数据库原理' )<75 SELECT @text1='平均成绩低于75.'
ELSE
SELECT @text1如果加了这个函数
提示错误
警告: 聚合或其它 SET 操作消除了空值。
指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时,这些运算符的 SQL-92 遵从行为。语法
SET ANSI_NULLS {ON | OFF}注释
SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。建议 isnull(n,0)
用isnull()函数,因为null和任何值比较都是为null DECLARE @text1 char(20)
SET @text1='平均成绩高于75.'
IF ( SELECT isnull(AVG(成绩),0)
FROM XS,XS_KC,KC
WHERE XS.学号= XS_KC.学号 AND XS_KC.课程号=KC.课程号
AND KC.课程名=’数据库原理’ ) <75
SELECT @text1='平均成绩低于75.'
ELSE
SELECT @text1