1 目的
本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦;同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保证。
2 适用范围
本规划的适用人员范围包括涉及数据库设计与开发的相关技术人员。
3 术语约定
本规范采用以下术语描述:
★规则:也称为强规范是编程时必须强制遵守的原则
★建议:编程时必须加以考虑的原则
★说明:对此规则或建议进行必要的解释
★示例:对此规则或建议从正、反两个方面给出
4 规范及建议
4.1 书写规范
4.1.1 SQL书写规范
规则1: 数据库代码中,关键字大写,其他内容小写;
示例:
如下代码不符合规范:(关键字未大写)
select last_name ,job_id
from employees;
如下代码符合规范:
SELECT last_name, job_id
FROM employees;
规则2:程序块应采用缩进风格书写,保证代码可读,风格一致,缩进格数统一为4格;
规则3:代码中需要空位时,统一采用英文空格键输入,不允许用TAB键产生空位;
说明:不同的编辑器对TAB的空位格数设置不一致,会导致使用TAB键产生空位的代码格式混乱;
规则4:同一条语句占用多行时,每一行的开始应是关键字,且关键字应和第一行左对齐,如确实不能从关键字分行,则分行处应对其上一行被分行的同类代码的最左边;
示例:
如下代码不符合规范(分行书写时,其余行未和第一行左对齐)
SELECT last_name,
job_id
FROM employees;
如下代码也不符合规范(分行时,不是从关键字分行)
SELECT last_name,
job_id FROM employees;
如下代码符合规范
SELECT last_name, job_id
FROM employees;
如下代码符合规范
SELECT last_name,
first_name,
job_id
FROM employees;
规则5:查询数据时,尽量不使用SELECT *,而是给出明确的字段,但该规则不包括SELECT COUNT()语* 句;
示例
如下语句不符合规范(SELECT操作未给出字段)
SELECT *
FROM employees;
如下语句符合规范
SELECT last_name, first_name
FROM employees;
规则6:INSERT语句应该给出字段列表;
示例
如下语句不符合规范(INSERT操作未给出字段名称)
INSERT INTO employees
VALUES
(
'GUO',
'DAVID',
100
);
如下语句符合规范
INSERT INTO employees
(
last_name,
first_name,
job_id
)
VALUES
(
'GUO',
'DAVID',
100
);
规则7:从表中同一笔记录中获取记录的字段值,须使用一SQL语句得到,不允许分多条SQL语句;
示例
如下语句不符合规范(从同一个表中取出记录,分成两条语句分别扫描)
UPDATE employees_new
SET last_name=
(
SELECT last_name
FROM employees
WHERE job_id = 100
)
WHERE job_id = 100;
UPDATE employees_new
SET first_name =
(
SELECT first_name
FROM employees
WHERE job_id = 100
)
WHERE job_id = 100;
如下语句符合规范
UPDATE employees_new
SET first_name =
(
SELECT last_name
FROM employees
WHERE job_id = 100
),
last_name =
(
SELECT first_name
FROM employees
WHERE job_id = 100
)
WHERE job_id = 100;
规则8:SQL语句中的逗号后面应增加一个空格,以使得代码清晰;
示例
如下代码不符合规范(逗号后面没有空格)
SELECT last_name,job_id
FROM employees;
如下代码符合规则
SELECT last_name, job_id
FROM employees;
规则9:不允许将SQL语句写成一行,再短的SQL也应该在谓词处分行;
示例
如下代码不符合规范(未在谓词部分进行分行)
SELECT last_name, job_id FROM employees WHERE job_id = 1;
如下代码符合规范
SELECT last_name, job_id
FROM employees
WHERE job_id = 1;
规则10:运算符以及比较符左边或者右边只要不是括号,则空一格;
示例
如下代码不符合规范(运算符没有空格)
SELECT CURRENT_DATE+INTERVAL 1 DAY
FROM dual;
如下代码符合规范
SLEECT CURRENT_DATE + (INTERVAL 1 DAY)
FROM dual;
规则11:不同类型的操作符混合使用时,应使用括号明确的表达运算的先后关系;
示例
如下代码不符合规范(运算优先级关系易混淆)
SELECT a*b/c+d*e
FROM dual;
如下代码符合规范
SELECT ((a * b) / c) + (d * e)
FROM dual;
规则12:任何SQL书写单行不得超过120字符(含左边的缩进);
建议1:对于INSERT…VALUES和UPDATE语句,一行写一个字段,每个字段相对于INSERT语句空4格,字段后面紧跟注释(注释语句左对齐),VALUES和INSERT左对齐,左括号和右括号与INSERT、VALUES左对齐;
示例:
如下代码不符合建议(字段未和INSERT语句空格)
INSERT INTO sm_user
(
user_id, --用户ID,主键
user_name, --用户名
login_name --登录名
)
VALUES
(
p_user_id,
p_user_name,
p_login_name
);
如下代码符合建议
INSERT INTO sm_user
(
user_id, --用户ID,主键
user_name, --用户名
login_name --登录名
)
VALUES
(
p_user_id,
p_user_name,
p_login_name
);
建议2:INSERT…SELECT 语句时,应使每行的字段顺序对应,以每行最多不超过4个字段,以方便代码阅读,括号的内容另起一行缩进4格开始书写,关键字单词左对齐,左括号、右括号另起一行与左对齐;
示例
如下代码不符合建议(字段未和括号分行)
INSERT INTO sm_duty_bak(duty_id, duty_name, created_by, creation_date,
last_updated_by, last_update_date, disable_date)
SELECT duty_id, duty_name, created_by, creation_date,
last_updated_by, last_update_date, disable_date
FROM sm_duty
WHERE duty_id=88;
如下代码符合建议
INSERT INTO sm_duty_bak
(
duty_id, duty_name, created_by, creation_date,
last_updated_by, last_update_date, disable_date
)
SELECT
duty_id, duty_name, created_by, creation_date,
last_updated_by, last_update_date, disable_date
FROM sm_duty
WHERE duty_id = 88;
说明:
1.SELECT 语句中每行的字段应与INSERT 语句对应。
2.INSERT 语句中换行的字段名应缩进并与上一行的第一个字段名对齐。
3.SELECT 语句中换行的字段名应缩进并与上一行的第一个字段名对齐。