第一次见到select 1和select null,有些好奇,在网上找了下相关资料,特此记录研究一下。
假设现在有两张表test和seckill,test是一张没有记录的空表,seckill表里则有4条记录;我是在MySQL 5.0的环境下测试的。
select 1
可以发现,如果表里有记录,select 1语句就会返回相应的记录行数的结果集,并且列名为1,每一行的值也都是1。这里的1并不是指的第一个字段,它可以替换成任意的常量,此时返回的列名和值都是该常量。比如select 2,如下:
那么这个select 1究竟有什么用?
可以用来查询表中是否有符合条件的记录(比如
select 1 from seckill where id = 1001;
),select 1一般用来当作条件使用,比如exists( select 1 from 表名)等。select 1的效率比select 列名
和select*
快,因为不用查字典表。
select 1配合count()、sum()函数
select 1还可以使用count()、sum()函数,如下:
可以看出,count()对select 1返回的行数进行了计数,所以没有记录行的test表返回的是0;而有4条记录行的seckill表则返回了4。如果把select count(1)改成select count(2),也只会改变结果集里的列名(从count(1)变成count(2))。
和之前使用select 1一样,从效率上看,select count(1) > select count(列名) > select count(*)。
下边是select 1配合sum()函数:
可以看出,该语句是对所有行的值计算总和,所以没有记录行的test表返回NULL,而seckill表则返回了4;如果换成select sum(2)呢?test表依然是返回NULL,而seckill表就是返回8。
注意:NULL是空值,表示不确定的值,即未知的数据,并不等于空字符。
select null
select null 和select 1类似,只是返回的列名和值变成了NULL;不过不同的是,select null 不可以配合使用count()和sum()函数。