基础必备:

      在MySQL中,0或 NULL意味着假(0)而其它值意味着真(1)。布尔运算(age = 4 或者 age is null都是布尔运算)的默认真值是1。不能使用算数运算符与null做运算,其结果都是null:

      select   1 + null,1 - null, 1 * null, 1 / null, 1 % null, 1 = null, 1 <> null,  1 > null , 1 < null; ---结果都是null

但是 :

      

可这样理解:1 or null 因为前面1为真,所以没必要往后运算了,结果就是1

0 or null 因为前面0为假,所以要接着往后看才能知道结果,又由于后面是null,任何表达式与null运算都是null

     

 

可这样理解:1 and null 因为前面1为真,继续往后看,后面为null, 任何数与null运算都是null

0 and null 因为前面0为假,and运算就没必要往后看了,所以结果是0

 

count函数有两种形式 

1.count(expr):返回SELECT语句检索到的行中非NULL值的数目。

2.count(distinct  expr,[expr....]):返回不同的非NULL值的行的数目。

 select  distinct  name,age from  t1;  --查询t1表中name和t1都不相同的行。前面加上count()就是求一共有多少行name和age不同。

        在t1表中有如下数据:

             

 

 select count(*),count(age),count(age=21),count(age = 21 or null),count(age is null),count(age is  not null),count(null)  from t1;

 

 

查询结果是:7,6,7,3,7,7,0

分析:

count(*):很明显是结果集的行数

        count(age):age不为空的行数

        count(age=21):第一行和第二行age都是21,所以表达式age=21的值为1;而第四行age为22,所以age=21的布尔值为0,但是不管age=21的结果是0还是1,这两种结果都不是null,所以答案是7.

        count(age=21  or  null):第一行和第二行age都是21,所以表达式age=21 or null的值为1;而第四行age为22,所以表达式age=21 or null的值为null,那么这一行在count计算的时候就不会被包括在内了。

        count(age  is null):age is null的结果0或者1(select  age  is null ;)这两种结果都不是null值,所以答案还是7

        count(age  is not null):同上

        count(null):因为count统计的是expr不为null的行数,很明显答案是0

 

 

Logo

更多推荐