为了账号安全,请及时绑定邮箱和手机立即绑定

SQL语句中的1

标签:
Oracle

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的效果也一样。

测试:

  1. select 1 from table 增加临时列,每行的列值是写在select后的数。这条sql语句中是1
  2. select count(1) from table 不管count(a) 的 a值如何变化,得出的值总是table表的行数
  3. select sum(1) from table 计算临时列的和

在Oracle中用 1 测试了一下,发现结果如下:

  1. 测试结果,得出一个行数和table表行数一样的临时列,每行的列值是1;
  2. 得出一个数,该数是table表的行数;
  3. 得出一个数,该数是table表的行数;

然后又用“2”测试,结果如下:

  1. 得出一个行数和table表行数一样的临时列,每行的列值是2;
  2. 得出一个数,该数是table表的行数;
  3. 得出一个数,该数是table表的行数×2的数

再用不同的数测试

  1. 得出一个行数和table表行数一样的临时列,每行的列值是写在select后的数;
  2. 还是得出一个数,该数是table表的行数;
  3. 得出一个数,该数是table表的行数×写在select后的数

综上所述:第一种的写法是增加临时列,每行的列值是写在select后的数;第二种是不管count(a)的a值如何变化,得出的值总是table表的行数;第三种是计算临时列的和。

count( 列名 ) 、count( 常量 ) 、count( * )

【强制】不要使用 count( 列名 ) 或 count( 常量 ) 来替代 count( * ) , count(\ * ) 是 SQL 92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
说明: count( * ) 会统计值为 NULL 的行,而 count( 列名 ) 不会统计此列为 NULL 值的行。
【强制】 count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct
col 1, col 2 ) 如果其中一列全为 NULL ,那么即使另一列有不同的值,也返回为 0。
【强制】当某一列的值全是 NULL 时, count(col) 的返回结果为 0,但 sum(col) 的返回结果为NULL ,因此使用 sum() 时需注意 NPE 问题。
正例:可以使用如下方式来避免 sum 的 NPE(NullPointerException) 问题:
select if ( isNull ( sum(g) ) ,0, sum(g) ) from table;

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
37
获赞与收藏
353

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消