常见SQL细节

本文详细解析了SQL中count和sum函数的区别与使用场景,包括它们如何处理null值,以及如何利用coalesce函数进行默认值设定。同时展示了如何在查询结果中设置默认值,并讨论了字符串拼接和保留小数的操作。最后,提供了将时间戳转换为可读时间的实例。

博客主页:http://blog.youkuaiyun.com/minna_d


1. 关于count及sum

count结果用不null,sum可能会出现null的情况
hotel=> select count(0), count(1), count(*) , count(id), sum(1), sum(id) from info_op_log where id = -1;
 count | count | count | count | sum | sum 
-------+-------+-------+-------+-----+-----
     0 |     0 |     0 |     0 |     |    
(1 row)


count结果与count里面的内容并没有关系
hotel=>  select count(0), count(1), count(*) , count(id), sum(1), sum(id) from info_op_log where id = 21494408;
 count | count | count | count | sum |   sum    
-------+-------+-------+-------+-----+----------
     1 |     1 |     1 |     1 |   1 | 21494408
(1 row)


对于jdbctemplate使用的情况,count(1)与sum(1)也没有抛出异常,这与jdbctemplate的版本使用有关

  public  static  void testCountAndSum(){

        try {
            int sum = jdbcTemplate.queryForInt("select sum(1) from hotel_info where id = -1");
            System.out.println("sum(1)未见异常 :" + sum);
        }catch (Exception e){
            e.printStackTrace();
        }

        try {
            int count = jdbcTemplate.queryForInt("select count(1) from hotel_info where id = -1");
            System.out.println("count(1)未见异常 :" + count);
        }catch (Exception e){
            e.printStackTrace();
        }

    }
输出结果:
sum(1)未见异常 :0
count(1)未见异常 :0

在JdbcTemplate的底层实现中:

最终会调用DataAccessUtils.requiredSingleResult(results);

而DataAccessUtils中requiredSingleResult实现为,所以不会抛NPE

public static <T> T requiredSingleResult(Collection<T> results) throws IncorrectResultSizeDataAccessException {
		int size = (results != null ? results.size() : 0);
		if (size == 0) {
			throw new EmptyResultDataAccessException(1);
		}
		if (results.size() > 1) {
			throw new IncorrectResultSizeDataAccessException(1, size);
		}
		return results.iterator().next();
	}



2.为查询结果设置默认值
hotel=>  select coalesce(count(0),10), coalesce(sum(1),10), coalesce(sum(id),10) from info_op_log where id = -1;
 coalesce | coalesce | coalesce 
----------+----------+----------
        0 |       10 |       10




3.字符串的拼接

实验数据
hotel=> select id, grade, name from hotel_info where grade is  null limit 2;
   id   | grade |         name         
--------+-------+----------------------
 250496 |       | Hacienda Hotel Uxmal
 245879 |       | Hotel La Cresta Inn


hotel=> select id, grade, name from hotel_info where grade is not null limit 2;
   id   | grade |        name         
--------+-------+---------------------
 904252 |     1 | 速8奥尼尔东北酒店
 786205 |     3 | The White House B&B
(2 rows)


字符串拼接时有一个为null,拼接结果会返回blank字符串
hotel=> select id, grade||name as grade_name, name||grade as name_grade from hotel_info where id in (904252, 786205, 250496, 245879);
   id   |      grade_name      |      name_grade      
--------+----------------------+----------------------
 904252 | 1速8奥尼尔东北酒店   | 速8奥尼尔东北酒店1
 786205 | 3The White House B&B | The White House B&B3
 250496 |                      | 
 245879 |                      | 

(4 rows)


4.保留小数,及将至1970-1-1 0:0:0 毫秒时间转化为可视时间

hotel=> select *, round(created*1.0/1000,3) , to_timestamp(round(created*1.0/1000,3)) from hotel_mapping limit 10;
 id |   from_seq    |          to_seq          |    created    |     round      |        to_timestamp        
----+---------------+--------------------------+---------------+----------------+----------------------------
  1 | aabenraa_dk_2 | aabenraa_municipality_13 | 1390287539382 | 1390287539.382 | 2014-01-21 14:58:59.382+08
  2 | aabenraa_dk_3 | aabenraa_municipality_12 | 1390287539382 | 1390287539.382 | 2014-01-21 14:58:59.382+08
  3 | aachen_14     | aachen_ac_20             | 1390287539382 | 1390287539.382 | 2014-01-21 14:58:59.382+08
  4 | aachen_16     | aachen_ac_47             | 1392797903788 | 1392797903.788 | 2014-02-19 16:18:23.788+08
  5 | aachen_18     | aachen_ac_37             | 1381464234180 | 1381464234.180 | 2013-10-11 12:03:54.18+08
  6 | aachen_2524   | aachen_ac_37             | 1390287539382 | 1390287539.382 | 2014-01-21 14:58:59.382+08
  7 | aachen_2533   | aachen_ac_6              | 1379065296340 | 1379065296.340 | 2013-09-13 17:41:36.34+08
  8 | aachen_2538   | aachen_ac_7              | 1379065295328 | 1379065295.328 | 2013-09-13 17:41:35.328+08
  9 | aachen_2542   | aachen_ac_38             | 1390287539382 | 1390287539.382 | 2014-01-21 14:58:59.382+08
 19 | aachen_2561   | aachen_28                | 1381394951136 | 1381394951.136 | 2013-10-10 16:49:11.136+08
(10 rows)


乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值