泰山版Java开发手册
《Java开发手册》始于阿里内部规约,在全球 Java 开发者共同努力下,已成为业界普遍遵循的开发规范。今年是手册上线第四年,推出全新泰山版免费下载,涵盖三大更新亮点,直接下载一睹为快:泰山版Java开发手册
Java七天学习训练营Day2
Java七天学习训练营是由泰山版《Java开发手册》的作者亲自出题,每天学习一个知识点,写一份小作业,帮助你不仅是阅读,更能透彻理解泰山版《Java开发手册》的重要知识。
活动时间:5月15日截止提交完成打卡的同学名单
完成七天打卡挑战的少侠即有机会获得精美的阿里云开发者社区周边礼品,包含阿里云ET公仔、超大社区鼠标垫、卫衣、背包等等。
提示:每天需要从泰山版Java开发手册 进入,按照下方图示点击才算打卡成功哦!
奖品说明:
同学们获取奖品的顺序,以阿里妹收到同学完成打卡后填写的表单序号为主。
第1名和第100、200、300等100的倍数打卡的同学送一个阿里云ET公仔(限量10个)
第10、20、30名等10的倍数打卡的同学送一张超大鼠标垫(限量50个)
第6名、第66名、第666名(以此类推)打卡同学送一个阿里云双肩包
第8名、第88名、第888名(以此类推)打卡的同学送一件阿里云定制卫衣
第1000名打卡的同学送上一个机械键盘!
除此之外,打卡完成编号是质数的同学可以获得一份笔记本+贴纸的纪念品(限量30份)
(部分奖品展示)
阿里云ET公仔
超大开发者社区鼠标垫
阿里云定制双肩包
今日学习内容:SQL规约
阅读前需了解:
1.每日学习的知识点都节选自泰山版《Java开发手册》,如想完整阅读电子书的所有内容,请到专题页下载。
2.根据约束力强弱,规约依次分为强制、推荐、参考三大类:
【强制】必须遵守。是不得不遵守的约定,违反本约定或将会引起严重的后果。
【推荐】尽量遵守。长期遵守这样的规定,有助于系统稳定性和合作效率的提升。
【参考】充分理解。技术意识的引导,是个人学习、团队沟通、项目合作的方向。
1.【强制】不要使用count(列名)或count(常量)来替代count(*),count(*)
就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。
说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。
2.【强制】count(distinct col) 计算该列除NULL之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。
3.【强制】当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时需注意NPE问题。
正例:可以使用如下方式来避免sum的NPE问题:SELECT IFNULL(SUM(column), 0) FROM table;
4.【强制】使用ISNULL()来判断是否为NULL值。
说明:NULL与任何值的直接比较都为NULL。
1) NULL<>NULL的返回结果是NULL,而不是false。
2) NULL=NULL的返回结果是NULL,而不是true。
3) NULL<>1的返回结果是NULL,而不是true。
反例:在SQL语句中,如果在null前换行,影响可读性。select * from table where column1 is null and column3 is not null; 而ISNULL(column)是一个整体,简洁易懂。从性能数据上分析,ISNULL(column)执行效率更快一些。
5.【强制】对于数据库中表记录的查询和变更,只要涉及多个表,都需要加表名(或别名)进行限定。
说明:多表join后作为条件进行查询记录、更新记录、删除记录时,如果出现没有限定表名(或别名)的列名在多个表中均有存在,那么会抛出异常。
正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id;
反例:在某业务中,由于多表关联查询语句没有加表名(或别名)的限制,正常运行两年后,最近在某个表中增加一个同名字段,在预发布环境做数据库变更后,线上查询语句全部出现出1052异常:Column 'name' in field list is ambiguous,导致票务交易下跌。
6.【强制】在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
7.【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,则为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
8.【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
9.【强制】IDB数据订正(特别是删除或修改记录操作)时,要先select,避免出现误删除,确认无误才能提交执行。
10.【推荐】SQL语句中表的别名前加as,并且以t1、t2、t3、...的顺序依次命名。
说明:1)别名可以是表的简称,或者是根据表出现的顺序,以t1、t2、t3的方式命名。2)别名前加as使别名更容易识别。
正例:select t1.name from table_first as t1, table_second as t2 where t1.id=t2.id;
今日作业
关于sql语句表的join,你有什么心得体会,之前有遇到过哪些坑?
同学们请把作业写在评论区里,如果出现了优秀作业,将再给该同学送出额外的礼品!同学们的分享将在明天的打卡页中公布。
上期答案
正确答案a,每年的天数千万不能写死365或者366,闰年的情况也要考虑。
b的错误原因:应该用System.currentTimeMillis(),查看Date()构造函数源码,可以看到是调用了System.currentTimeMillis()方法,如果仅仅是需要获取毫秒数,那么使用
System.currentTimeMillis(),效率上会高一点。
c的错误原因:YYYY代表是weekinwhichyear,意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的就是下一年。
d的错误原因:getHours方法在jdk1.2之后就Deprecated了,调用的话会直接抛
IllegalArgumentException
阿里妹温馨提示:恭喜你完成了第二天的学习打卡!建议收藏专题页,每天记得上线打卡哦。只有连续七天坚持打卡,才有机会领取到奖品!