(三)SQL语句

来源:互联网 发布:宇喜多秀家数据 编辑:程序博客网 时间:2024/06/06 21:00

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 IF(ISNULL(SUM(g)), 0, SUM(g)) FROM table;

4:使用ISNULL()来判断是否为NULL值。说明:NULL与任何值的直接比较都为null。

    1:NULL<>NULL的返回结果是NULL,而不是false。

    2:NULL=NULL的返回结果是NULL,而不是true。

    3:NULL<>1的返回结果是NULL,而不是true。

5:在代码中使用分页查询逻辑时,若count为0时应该直接返回,避免执行后面的分页语句。

6:不得使用外键与级联,一切外键概念必须在应用层解决。

    说明:以学生和成绩为例,学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合于分布式,高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

7:进制使用存储过程,存储过程难易调试和扩展,更没有移植性。

8:数据订正时,删除和修改记录时,要先select,避免出现误删除,确认无误才能执行更新语句。

9:in操作能避免就避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个以内。

10:如果有全球化需要,所有的字符和存储表示,均已 utf-8编码。

11:TRUNCATE TABLE比DELETE速度快,且实用的系统和事物日志资源较少,但TRUNCATE无事物且不触发trigger,有可能造成事故,故不建议在代码中使用此语句。TRUNCATE TABLE与不带where字句的delete功能相同。

原创粉丝点击