select 1 from table; 与 select anycol(目的表集合中的任意一行)from table; 与 select * from table; 从作用上来说是没有差别的,都是查看是否有记录,一般是作条件查询用的。select 1 from table中的1是一常量(可以为任意数值),查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
注意:
当我们只关心数据表有多少记录行而不需要知道具体的字段值时,类似“select 1 from table”是一个很不错的SQL语句写法,它通常用于子查询。 这样可以减少系统开销,提高运行效率。因为这样写的SQL语句,数据库引擎就不会去检索数据表里每条具体的记录和每条记录里每个具体的字段值并将它们放到内存里,而是根据查询到有多少记录行存在就输出多少个“1”,每个“1”代表有1行记录,同时选用数字1还因为它所占用的内存空间最小,当然用数字0的效果也一样。
测试:
- select 1 from table 增加临时列,每行的列值是写在select后的数。这条sql语句中是1
- select count(1) from table 不管count(a) 的 a值如何变化,得出的值总是table表的行数
- select sum(1) from table 计算临时列的和
在Oracle中用 1 测试了一下,发现结果如下:
- 测试结果,得出一个行数和table表行数一样的临时列,每行的列值是1;
- 得出一个数,该数是table表的行数;
- 得出一个数,该数是table表的行数;
然后又用“2”测试,结果如下:
- 得出一个行数和table表行数一样的临时列,每行的列值是2;
- 得出一个数,该数是table表的行数;
- 得出一个数,该数是table表的行数×2的数
再用不同的数测试
- 得出一个行数和table表行数一样的临时列,每行的列值是写在select后的数;
- 还是得出一个数,该数是table表的行数;
- 得出一个数,该数是table表的行数×写在select后的数
综上所述:第一种的写法是增加临时列,每行的列值是写在select后的数;第二种是不管count(a)的a值如何变化,得出的值总是table表的行数;第三种是计算临时列的和。