基础必备:
在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