开发过程中编写SQL语句需要注意的事项,其实都是一些细节点,但开发过程中使用不当会造成意想不到的后果
-
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
。
-
count(col)、sum(col)的使用
【强制】当某一列的值全是
NULL
时,
count(col)
的返回结果为
0
,但
sum(col)
的返回结果为
NULL
,因此使用
sum()
时需注意
NPE
问题。
正例:
可以使用如下方式来避免
sum
的
NPE
问题:
SELECT IF(ISNULL(SUM(g))
,0,
SUM(g))
FROM table;
-
NULL 值
【强制】使用
ISNULL()
来判断是否为
NULL
值。
说明:
NULL
与任何值的直接比较都为
NULL
。
1
)
NULL<>NULL
的返回结果是
NULL
,而不是
false
。
2
)
NULL=NULL
的返回结果是
NULL
,而不是
true
。
3
)
NULL<>1
的返回结果是
NULL
,而不是
true
。
-
外键与级联
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
说明:
以学生和成绩的关系为例,学生表中的
student
_
id
是主键,那么成绩表中的
student
_
id
则为外键。如果更新学生表中的
student
_
id
,同时触发成绩表中的
student
_
id
更新,即为
级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群
;
级联更新是强阻
塞,存在数据库更新风暴的风险
;
外键影响数据库的插入速度。