SQL书写规范

SQL书写规范
SQL书写规范

SQL 书写规范

1 SQL书写规范 (2)

1.1 选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)

1.2 where子句中的连接顺序 (3)

1.3 @Select子句中避免使用'*' (3)

1.4 减少访问数据库的次数 (4)

1.5 使用decode函数来减少处理时间 ........................................... 错误!未定义书签。

1.6 用where子句替换having子句 (4)

1.7 减少对表的查询 (5)

1.8 使用表的别名(alias) (6)

1.9 @用exists替代in (6)

1.10 @用not exists替代not in (7)

1.11 @用表连接替换exists (8)

1.12 @用exists替换distinct (8)

1.13 @使用union-all和union (9)

1.14 用索引提高效率 (9)

1.14.1 索引的操作 (10)

1.14.2 建立索引 (11)

1.14.3 索引失效: (12)

1.14.3.1 IN、OR子句常会使用工作表,使索引失效。 (12)

1.14.3.2 使用IS NULL 或IS NOT NULL (12)

1.14.3.3 @条件字段使用函数和表达式 (13)

1.14.3.4 @比较不匹配的数据类型 (13)

1.14.3.5 带通配符(%)的like语句 (13)

1.14.3.6 Order by语句 (14)

1.14.3.7 >及<操作符(大于或小于操作符) (14)

数据库的优化通常可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。最常见的优化手段就是对硬件的升级。根据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来只占数据库系统性能提升的40%左右,其余的60%系统性能提升来自对应用程序的优化。许多优化专家认为,对应用程序的优化可以得到80%的系统性能的提升。因此,在此整理一些SQL书写规范,以期通过优化SQL达到提升系统性能的目的。

1SQL书写规范

1.1 选择最有效率的表名顺序(只在基于规则的优化

器中有效)

MYSQL的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM 子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当MYSQL处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.

例如:

表 TAB1 16,384 条记录

表 TAB2 1 条记录

选择TAB2作为基础表 (最好的方法)

select count(*) from tab1,tab2 执行时间0.96秒

选择TAB1作为基础表 (不佳的方法)

select count(*) from tab2,tab1 执行时间26.09秒

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.

例如:

EMP表描述了LOCATION表和CATEGORY表的交集.

SELECT *

FROM LOCATION L ,

CATEGORY C,

EMP E

WHERE E.EMP_NO BETWEEN 1000 AND 2000

AND E.CAT_NO = C.CAT_NO

AND E.LOCN = L.LOCN

将比下列SQL更有效率

SELECT *

FROM EMP E ,

LOCATION L ,

CATEGORY C

WHERE E.CAT_NO = C.CAT_NO

AND E.LOCN = L.LOCN

AND E.EMP_NO BETWEEN 1000 AND 2000

1.2 where子句中的连接顺序

MySQL采用自下而上的顺序解析where子句

根据这个原理,表之间的连接必须写在其他where条件之前,那些可以过滤掉最大数量记录的条件必须写在where子句的末尾

例如:

(低效,执行时间156.3秒)

select *

fromemp e

wheresal> 50000

and job = 'manager'

and 25 < (select count(*) from emp where mgr=e.empno);

(高效,执行时间10.6秒)

select *

from emp e

where 25 < (select count(*) from emp where mgr=e.empno)

and sal > 50000

and job = 'manager';

1.3 @Select子句中避免使用'*'

当你想在select子句中列出所有的column时,使用动态sql列引用'*'是一个方便的方法,不幸的是,这是一个非常低效的方法

实际上,MySQL在解析的过程中,会将'*'依次转换成所有的列名

这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间

1.4 减少访问数据库的次数

当执行每条sql语句时,MySQL在内部执行了许多工作:解析sql语句,估算索引的利用率,绑定变量,读数据块等等

由此可见,减少访问数据库的次数,就能实际上减少MySQL的工作量

例如:

以下有两种方法可以检索出雇员号等于0342或0291的职员

方法1 (低效)

selectemp_name, salary, grade

fromemp

whereemp_no = 342;

selectemp_name, salary, grade

fromemp

whereemp_no = 291;

方法2 (高效)

selecta.emp_name, a.salary, a.grade,

b.emp_name, b.salary, b.grade

fromemp a, emp b

wherea.emp_no = 342

and b.emp_no = 291;

1.5 用where子句替换having子句

避免使用having子句,having只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序、统计等操作

如果能通过where子句限制记录的数目,那就能减少这方面的开销

例如:

低效

select region, avg(log_size)

from location

group by region

having region != 'sydney'

and region != 'perth'

高效

select region, avg(log_size)

from location

where region != 'sydney'

and region != 'perth'

group by region

1.6 减少对表的查询

在含有子查询的sql语句中,要特别注意减少对表的查询例如:

例如:

低效

SELECT TAB_NAME

FROM TABLES

WHERE TAB_NAME = ( SELECT TAB_NAME

FROM TAB_COLUMNS

WHERE VERSION = 604) AND DB_VER= ( SELECT DB_VER

FROM TAB_COLUMNS

WHERE VERSION = 604)

高效

SELECT TAB_NAME

FROM TABLES

WHERE (TAB_NAME,DB_VER)

= ( SELECT TAB_NAME,DB_VER

FROM TAB_COLUMNS

WHERE VERSION = 604)

Update 多个Column 例子:

UPDATE EMP

SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES), SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES) WHERE EMP_DEPT = 0020;

高效:

UPDATE EMP

SET (EMP_CAT, SAL_RANGE)

= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)

FROM EMP_CATEGORIES)

WHERE EMP_DEPT = 0020;

1.7 使用表的别名(alias)

当在sql语句中连接多个表时,请使用表的别名并把别名前缀于每个column 上

这样可以减少解析的时间并减少那些由column歧义引起的语法错误

1.8 @用exists替代in

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.

低效:

SELECT *

FROM EMP (基础表)

WHERE EMPNO > 0

AND DEPTNO IN (SELECT DEPTNO

FROM DEPT

WHERE LOC = ‘MELB’)

高效:

SELECT *

FROM EMP (基础表)

WHERE EMPNO > 0

AND EXISTS (SELECT ‘X’

FROM DEPT

WHERE DEPT.DEPTNO = EMP.DEPTNO

AND LOC = ‘MELB’)

1.9 @用not exists替代not in

在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

例如:

SELECT …

FROM EMP

WHERE DEPT_NO NOT IN (SELECT DEPT_NO

FROM DEPT

WHERE DEPT_CAT=’A’);

为了提高效率.改写为:

(方法一: 高效)

SELECT ….

FROM EMP A,DEPT B

WHERE A.DEPT_NO = B.DEPT(+)

AND B.DEPT_NO IS NULL

AND B.DEPT_CAT(+) = ‘A’

(方法二: 最高效)

SELECT ….

FROM EMP E

WHERE NOT EXISTS (SELECT ‘X’

FROM DEPT D

WHERE D.DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A’);

1.10 @用表连接替换exists

通常来说 , 采用表连接的方式比EXISTS更有效率

SELECT ENAME

FROM EMP E

WHERE EXISTS (SELECT ‘X’

FROM DEPT

WHERE DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A’);

(更高效)

SELECT ENAME

FROM DEPT D,EMP E

WHERE E.DEPT_NO = D.DEPT_NO

AND DEPT_CAT = ‘A’ ;

1.11 @用exists替换distinct

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换

例如:

低效:

SELECT DISTINCT DEPT_NO,DEPT_NAME

FROM DEPT D,EMP E

WHERE D.DEPT_NO = E.DEPT_NO

高效:

SELECT DEPT_NO,DEPT_NAME

FROM DEPT D

WHERE EXISTS ( SELECT *

FROM EMP E

WHERE E.DEPT_NO = D.DEPT_NO);

EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.

1.12 @使用union-all和union

当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNIO N-ALL的方式被合并, 然后在输出最终结果前进行排序.

如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.

举例:

低效:

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = ’31-DEC-95’

UNION

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = ’31-DEC-95’

高效:

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = ’31-DEC-95’

UNION ALL

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = ’31-DEC-95’

需要注意的是,union all将重复输出两个结果集合中相同记录,因此还是要从业务需求分析使用union all的可行性

关于索引下列经验请参考:

1).如果检索数据量超过30%的表中记录数,使用索引将没有显著的效率提高

2).在特定情况下,使用索引也许会比全表扫描慢,但这是同一个数量级上的差距;而通常情况下,使用索引比全表扫描要快几倍乃至几千倍!

1.13 用索引提高效率

索引是表的一个概念部分,用来提高检索数据的效率. 实际上,MYSQL使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当M

YSQL找出执行查询和Update语句的最佳路径时, MYSQL优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.

除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率.

虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.

1.13.1索引的操作

MYSQL对索引有两种访问模式.

●索引唯一扫描 ( INDEX UNIQUE SCAN)

大多数情况下, 优化器通过WHERE子句访问INDEX.

例如:

表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_P K和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.

SELECT *

FROM LODGING

WHERE LODGING = ‘ROSE HILL’;

在内部 , 上述SQL将被分成两步执行, 首先 , LODGING_PK 索引将通过索引唯一扫描的方式被访问 , 获得相对应的ROWID, 通过ROWID访问表的方式执行下一步检索.

如果被检索返回的列包括在INDEX列中,MYSQL将不执行第二步的处理(通过ROW ID访问表). 因为检索数据保存在索引中, 单单访问索引就可以完全满足查询

结果.

下面SQL只需要INDEX UNIQUE SCAN 操作.

SELECT LODGING

FROM LODGING

WHERE LODGING = ‘ROSE HILL’;

●索引范围查询(INDEX RANGE SCAN)

适用于两种情况:

1.基于一个范围的检索

2.基于非唯一性索引的检索

例1:

SELECT LODGING

FROM LODGING

WHERE LODGING LIKE ‘M%’;

WHERE子句条件包括一系列值, MYSQL将通过索引范围查询的方式查询LODGIN G_PK . 由于索引范围查询将返回一组值, 它的效率就要比索引唯一扫描

低一些.

例2:

SELECT LODGING

FROM LODGING

WHERE MANAGER = ‘BILL GATES’;

这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值. 由于LODGING $MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描.

由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作.

WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用.

SELECT LODGING

FROM LODGING

WHERE MANAGER LIKE ‘%HANMAN’;

在这种情况下,MYSQL将使用全表扫描.

1.13.2建立索引

?表的主键、外键必须有索引;

?经常与其他表进行连接的表,在连接字段上应该建立索引;

?索引应该建立在查询条件中进行比较的字段上,而不是建立在我们要找出来并且显示的字段上;

?在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引;

比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要

建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更

新速度。

组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

1.13.3索引失效:

1.13.3.1 IN、OR子句常会使用工作表,使索引失效。

如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。例子如下:

如果在fields1和fields2上同时建立了索引,fields1为主索引

以下sql会用到索引

select * from tablename1 where fields1=’value1’ and fields2=’value2’

以下sql不会用到索引

select * from tablename1 where fields1=’value1’ or fields2=’value2’

1.13.3.2 使用IS NULL 或IS NOT NULL

使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引。

避免在索引中使用任何可以为空的列,MySQL将无法使用该索引

对于单列索引,如果列包含空值,索引中将不存在此记录;

对于复合索引,如果每个列都为空,索引中同样不存在此记录。如果至少有一个列不为空,则记录存在于索引中

如果唯一性索引建立在表的a列和b列上,并且表中存在一条记录的a,b值为(123,null),

MySQL将不接受下一条具有相同a,b值(123,null)的记录插入

如果所有的索引列都为空,MySQL将认为整个键值为空,而空不可能等于空,因此你可以插入1000条具有相同键值的记录,当然它们都是空!

因为空值不存在于索引列中,所以where子句中对索引列进行空值比较将使MySQL停用该索引

低效(索引失效)

select …

from department

wheredept_code is not null

1.13.3.3 @条件字段使用函数和表达式

如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询不会使用索引(只要它不是基于函数的索引)

selectempno,ename,deptno

fromemp

where trunc(hiredate)='01-MAY-81';

把上面的语句改成下面的语句,这样就可以通过索引进行查找。selectempno,ename,deptno

fromemp

where hiredate<(to_date('01-MAY-81')+0.9999);

请务必注意,检索中不要对索引列进行处理,如:trim,to_date,类型转换等操作,破坏索引,使用全表扫描,影响sql执行效率

1.13.3.4 @比较不匹配的数据类型

比较不匹配的数据类型也是比较难于发现的性能问题之一。注意下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。下面的语句将执行全表扫描。

select bank_name,address,city,state,zip

from banks

where account_number = 990354;

MySQL可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:

selectbank_name,address,city,state,zip

from banks

where account_number ='990354';

特别注意:不匹配的数据类型之间比较会让MySQL自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次“全表扫描”。

1.13.3.5 带通配符(%)的like语句

同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查

询名字中包含cliton的人。可以采用如下的查询SQL语句:

select * from employee where last_name like '%cliton%';

这里由于通配符(%)在搜寻词首出现,所以MySQL系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:

select * from employee where last_name like 'c%';

1.13.3.6 Order by语句

ORDER BY语句决定了MySQL如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。

1.13.3.7 >及<操作符(大于或小于操作符)

大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时MYSQL会先找出为2的记录索引再进行比较,而A>=3时MYSQL则直接找到=3的记录索引。

SQL书写规范

SQL编程规范 一、sql书写规范: 二、书写优化性能建议 三、其他经验性规则 一、sql书写规范: 1、sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。 2、连接符or、in、and、以及=、<=、>=等前后加上一个空格。 3、对较为复杂的sql语句加上注释,说明算法、功能。 注释风格:注释单独成行、放在语句前面。 (1) 应对不易理解的分支条件表达式加注释; (2) 对重要的计算应说明其功能; (3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明; (4) 每条SQL语句均应有注释说明(表名、字段名)。 (5) 常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选) (6) 可采用单行/多行注释。(-- 或/* */ 方式) 4、SQL语句的缩进风格 (1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进 (2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。 5、多表连接时,使用表的别名来引用列。 6、供别的文件或函数调用的函数,绝不应使用全局变量交换数据; 如例(1)

二、书写优化性能建议 1、避免嵌套连接。例如:A = B and B = C and C = D 2、where条件中尽量减少使用常量比较,改用主机变量 3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。 4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。 如必须使用排序操作,请遵循如下规则: (1) 排序尽量建立在有索引的列上。 (2) 如结果集不需唯一,使用union all代替union。 5、索引的使用。 (1) 尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。 (2) 尽量注意比较值与索引列数据类型的一致性。 (3) 对于复合索引,SQL语句必须使用主索引列 (4) 索引中,尽量避免使用NULL。 (5) 对于索引的比较,尽量避免使用NOT=(!=) (6) 查询列和排序列与索引列次序保持一致 6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析。 7、尽量使用共享的SQL语句。 8、查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面。 9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。 10、in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

SQL编码规范

车联网技术SQL编码规范 1、严谨使用标量子查询(分页可以使用) select (select ... from a where a.id=b.id) from b 2、不要使用INSERT INTO table VALUE(?,?,?,?,?)格式,要指出 具体要赋值的字段,INSERT的效率会有提高。 3、SELECT与FROM语句之间只定义返回的字段名,除非返回所 有的字段,尽量不要使用* ,字段提取要按照“需多少、提多 少”的原则(因为大批量数据的抽取会影响SQL缓存的效率)4、避免使用COUNT(*),因为COUNT(*)会对全字段做聚集,建 议使用COUNT (0)或COUNT(1)这样的查询语句,有主键ID,尽量使用count(id) 5、使用OR 会引起全表扫描,比较影响查询效率,尽可能少用或 不用,实在不行可以用UNION ALL代替。NULL的检索要回避 一下。 6、使用DISTINCT是为了保证在结果集中不出现重复值,但是 DISTINCT会产生一张工作表,并进行排序来删除重复记录, 这会大大增加查询和I/O的操作次数。因此应当避免使用 DISTINCT关键字 7、负逻辑如!=、<>、not in等,都会导致全表扫描来完成查询。 当表较大时,会严重影响系统性能,可以用别的操作来代替。 8、join 与on 必须严格匹配,不允许出现没有on的join 9、Where 子句中的连接顺序:数据库采用自下而上的顺序解析

where子句,根据这个原理,表之间的连接必须写在其他where 条件之前,那些可以过滤掉大量记录的条件必须写在where子句的末尾。如: 低效:select * from emp e where sal>5000 and job = ‘manager’ and 25< (select count (*)from emp where mgr=e.empno); 高效:select * from emp e where 25<(select count(*) from emp where mgr=e.empno) and sal>5000 and job=’manager’; 10、在使用UNION或UNION ALL 的前后的两个SQL需要加( )。 11、避免使用IN和NOT IN ,使用EXIST和NOT EXIST代替。 12、将计算从等号左边移到右边,例如:把a*2>4改为a>4/2;把TO_CHAR(zip) = ‘94002’ 改为zip = TO_NUMBER('94002')。 13、不要使用NOT,如Goods_no != 2,要改为: where Goods_no>2 or Goods_no<2 14、不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改为: WHERE DEPT_CODE >=0; 15、尽量把循环的操作封装到SQL写的存储过程里,因为存储过程都在服务端执行,所以没有数据往返的消耗。有机会,将一些查询封装到函数里,而在普通SQL里使用这些函数,同样是很有效的优化。 16、索引列上>= 代替> 如: 高效:select * from emp where deptno >=4

sql规范

Sql规范 一、数据库设计规范 设计阶段可以说是系统性能的关键阶段 1.1、数据库逻辑设计的规范化 遵守数据的设计规范3NF 规定 ?无重复的列 要求表中的每一列只包含一个实例信息 例如: 员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示; 员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。 ?表内的每一行都应该被唯一的标识(有唯一键) 例如: 员工信息表中加上了员工编号(UserId)列,因为每个员工的员工编号是唯一的,因此每个员 工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码。 ?表内不应该存储依赖于其他键的非键信息。 要求一个数据库表中不包含其他表中的非主键信息 例如: 一个部门信息表,其中每个部门有部门编号(DeptId)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。 1.2、合理的冗余 没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提 高运行效率,就必须降低范式标准,适当保留冗余数据 例如: 商品的基本表,如下所示“金额”这个字段的存在,表明该表的设计不满足第三范式,因为

“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额” 这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。 1.3、字段规范 字段是数据库最基本的单位,其设计对性能的影响是很大的 一行记录必须表内唯一,表必须有主键 用尽量少的存储空间来存数一个字段的数据. 数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下。 例如 能用int的就不用char或者varchar 能用nvarchar(20)就不用nvarchar(500) 字段必须定义合适的数据类型,以减少使用过程中的数据类型转换 例如 日期类型应用datetime 禁止用nvarchar 尽量不要允许NULL,除非必要,可以用默认值代替 尽量少用TEXT和IMAGE,二进制字段的读写是比较慢的 枚举类型的字段,需要有comment 中文注释 例如 用户表中的用户状态用1、2、需要注释1:正常、2:禁止 1.4、索引规范 在设计阶段,可以根据功能和性能的需求进行初步的索引设计,这里需要根据预计的数据量和查询

PLSQL编写规范v

3. 基本策略 3.1 设计策略 分类拆分数据量大的表。 对于经常使用的表(如某些参数表或代码对照表),由于其使用频率很高,要尽量减少表中的记录数量。例如,银行的户主账表原来设计成一张表,虽然可以方便程序的设计与维护,但经过分析发现,由于数据量太大,会影响数据的迅速定位。如果将户主账表分别设计为活期户主账、定期户主账及对公户主账等,则可以大大提高查询效率。 分区策略 在拥有数500行以上的表时,采用分区策略。 索引设计。 对于大的数据库表,合理的索引能够提高整个数据库的操作效率。在索引设计中,索引字段应挑选重复值较少的字段;在对建有复合索引的字段进行检索时,应注意按照复合索引字段建立的顺序进行。例如,如果对一个5万多条记录的流水表以日期和流水号为序建立复合索引,由于在该表中日期的重复值接近整个表的记录数,用流水号进行查询所用的时间接近3秒;而如果以流水号为索引字段建立索引进行相同的查询,所用时间不到1秒。因此在大型数据库设计中,只有进行合理的索引字段选择,才能有效提高整个数据库的操作效率。 有时候为了提高性能。减少表的关联,恰当的数据冗余是允许的。 索引对新增,删除,更新的性能影响比较大,对相关的表的索引使用要权衡为表和索引建立不同的表空间,禁止在系统表空间中放入非核心oracle系统成分的对象,确保数据表空间和索引表空间位于不同的磁盘磁盘驱动器上。 对于经常发生同时查询或频繁查询的表,最好把他放到不同的磁盘空间上 4. 逻辑设计规范 4.1 范式 如果没有性能上的原因,应该使用关系数据库理论,达到较高的范式,避免数据冗 余。 如果在数据量上与性能上无特别要求,考虑到实现的方便性可以有适当的数据冗 余,但基本上要达到3NF。 4.2 表设计 对于数据量比较大的表,根据表数据的属性进行分区,以得到较好的性能。如果表 按某些字段进行增长,则采用按字段值范围进行范围分区;如果表按某个字段的几

SQL开发规范

SQL开发规范

目录 命名规则 (3) P ASCAL命名 (3) 表名和字段 (3) 存储过程 (3) 视图 (3) 其他 (3) 设计规范 (4) 规范约定 (4) 字段规范 (4) 使用规范 (4) 查询语句 (4) 数据修改 (4) 综合使用 (4)

命名规则 Pascal命名 1.每一个单词的第一个字母大写,例如:B ank N ame 2.常用单词缩写三个字母以下字母都大写,例如:SP、PG 3.常用单词缩写三个字母以上第一个字母大写,例如:Xml 表名和字段 1.使用英文单词或词组作为表名,不得使用汉语拼音 2.如有必要,建立一个中英文对照字典 3.用名词和名词短语作表名 4.不使用复数,除非与数据库保留字冲突 5.用Pascal 命名规则 6.尽量谨慎地使用缩写 7.尽量不要和关键字重合 8.必要时,使用下划线分割单词 示例 ProductName 存储过程 命名规则为TableName_action或前缀_ActionName,作业调度使用Job前缀,action或ActionName为存储过程含义用动词或动词短语来命名 1.使用常见的缩写,尽量不要和关键字重合 2.适当的使用下划线分割过长的名称 3.当操作依赖条件时,结尾使用By+条件 4.过长的SQL语句需要手工折行 示例: AdminUser_ins Job_Dowork 视图 视图的命名采用V_ViewName的格式,其中V_前缀表示视图,ViewName部分表示视图的含义。 1.使用英文单词或词组作为视图名,不得使用汉语拼音 2.用名词和名词短语作视图名 3.不使用复数,除非与数据库保留字冲突 4.用Pascal 命名规则 5.尽量谨慎地使用缩写 6.尽量不要和关键字重合 7.必要时,使用下划线分割单词 视图正确的命名,例如: V_UserInfo 其他 1.使用英文单词或词组作为数据库对象名,不得使用汉语拼音

SQL编写规范分解

湖北电信经营分析与决策支持系统项目 SQL编写规范 2007年3月 本文档及其所含信息为机密材料 并且由湖北电信和NCR共同拥有 本文档中的任何部分都不得以任何手段任何形式进行复制与传播未经湖北电信和NCR书面授权,不得将材料泄露给第三方Copyright ? 2007 Hubei Telecom & NCR版权 保留所有的权利

文档控制文件准备资料 HBDX意见 客户签收

目录 1前言 (2) 1.1边界定义 (2) 1.2原则定义 (2) 2格式编排约定 (3) 2.1基本要求 (3) 2.2编写规范 (3) 2.2.1字段排列要求 (3) 2.2.2字段分割符’,’点书写位置要求 (3) 2.2.3字段别名‘AS’ 语句编写要求 (3) 2.2.4SELECT子句排列要求 (4) 2.2.5运算符前后间隔要求 (4) 2.2.6CASE语句的编写 (4) 2.2.7子查询嵌套编写规范 (5) 2.2.8表别名定义约定 (5) 2.2.9变量引用 (6) 3语法及数据操作约定 (6) 3.1JOIN操作语法要求 (6) 3.2INSERT语句编写规范 (7) 3.3DELETE语句编写规范 (8) 3.4NULL值处理约定 (8) 3.4.1数字型字段NULL值的处理 (8) 3.4.2字符型字段NULL值的处理 (8) 3.4.3提取日期型字段的处理 (8) 3.5除法运算被0除的处理 (8) 3.6比较逻辑运算处理约定 (9) 3.6.1字符型比较的处理 (9) 3.6.2日期型比较的处理 (9) 3.7注释约定 (9) 3.8其它 (10) 4常用Teradata SQL知识介绍 (10) 4.1NOT IN与MINUS (10) 4.2取字符串长度 (11) 4.3多表连接中的条件限制(WHERE AND ON) (11)

SQLserver数据库设计及开发规范

LMS项目数据库设计 及使用规

在本项目中,数据库的设计和使用必须遵循以下原则: 1命名原则 1.1约定: Pascal Casing命名方式: 1.每一个单词的第一个字母大写,例如:B ank N ame。 2.常用单词缩写三个字母以下字母都大写,例如:SP、PG 3.常用单词缩写三个字母以上第一个字母大写,例如:Xml 1.2表名和字段 规则如下: ?使用英文单词或词组作为表名,不得使用汉语拼音,建立一个中英文对照字典。 ?用名词和名词短语作表名 ?不使用复数,除非与数据库保留字冲突 ?用Pascal 命名规则 ?尽量谨慎地使用缩写 ?尽量不要和关键字重合 ?不要用任何名前缀(例如U,B) ?数据库对象名称不使用下划线 正确的命名,例如: Users Order Product 1.3存储过程 规则如下: 命名规则为up_xxx_StoredProcedureName,up表示User Procedure,用来区分它和系统存储过程,xxx表示子系统的名称,由三个字母构成,各个子系统参见下表,StoredProcedureName为存储过程含义 StoredProcedureName规则如下: ?用动词或动词短语来命名,并带有宾语 ?需要符合用Pascal 命名规则。 ?尽量谨慎地使用缩写 ?尽量不要和关键字重合

?不要用任何名前缀(例如U,B) ?StoredProcedureName不使用下划线 ?当操作依赖条件时,一般结尾使用By+条件 存储过程正确的命名,例如: Up_Usr_InsertUser Up_Usr_SearchUserByUserID Up_Usr_DeleteUserByUserID 各个子系统的缩写如下: 1.4视图 规则如下: ?视图的命名采用vw ViewName的格式,其中vw前缀表示视图,ViewName部分表示视图的含义。 ViewName规则如下: ?用名词和名词短语, ?不使用复数 ?用Pascal 命名规则 ?尽量谨慎地使用缩写 ?尽量不要和关键字重合 ?不要用任何名前缀(例如U,B) ?ViewName中不使用下划线 视图正确的命名,例如: vwUser vwUserOrder vwTranscation 视图错误的命名,例如: UserView vw_Transcation_View

SQLServer数据库设计命名规范

SQLServer数据库设计规范 1 相关的设计规范 1.1 采用有意义的字段名 尽可能地把字段描述的清楚些。当然,也别做过头了,比如CustomerShippingAddressStreetLine1 虽然很富有说明性,但没人愿意键入这么长的名字,具体尺度就在你的把握中。每个单词的首个字母要求用大写!!!不要用下划线来连接每个单词。 1.2 遵守3NF 标准3NF 规定: A.表内的每一个值都只能被表达一次。 B.表内的每一行都应该被唯一的标识(有唯一键)。 C.表内不应该存储依赖于其他键的非键信息。 1.3 小心保留词 要保证你的字段名没有保留词、数据库系统或者常用访问方法冲突,比如,写的一个ODBC 连接程序里有个表,其中就用了DESC 作为说明字段名。后果可想而知!DESC 是DESCENDING 缩写后的保留词。表里的一个SELECT *语句倒是能用,但我得到的却是一大堆毫无用处的信息。 1.4 保持字段名和类型的一致性 在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做“AgreeMentNumber”,你就别在另一个表里把名字改成“ref1”。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。记住,你干完自己的活了,其他人还要用你的数据库呢。

2 命名规则: 2.1 数据库(Database)的定义 数据库名称= 数据库内容标识(首字大写) 2.2 表(Table)的定义 命名应尽量反映存储的数据内容。 表名前缀:以该表及与该表相关联的一系列表的内容而得到一个代表统一的标识 表名称= 表名前缀+ 表内容标识(首字大写) 如ClientInfo相关联的一系的表以ci作为前缀, 即有表名:ciHistory,ciContact,ciBusiness 2.3 字段(Field)的定义 字段是数据库中的用途最广泛的,它的类型非常多,所以必须加类型前缀来标示它的类型。 字段名称= 字段类型前缀+ 字段内容标识(首字大写) 2.4 视图名 视图的名称= "vw" + 视图内容标识(首字大写) 如vUserPerm 2.5 触发器名 触发类型触发标识 ----------------------------------- Insert i Delete d Update u

MSSQLServer命名及编码规范

MS SQL Server命名及编码规范 文件类型:项目管理(标准/规范/模板) 文件编号: 版本: 1.0 A 版权声明 本文件版权属于XXXXX,保留所有权利。 本文件中包含的信息属于XXXXX的资产及机密,文件中的任何部分未经授权不得以任何形式复制(包括复印及以电子文本的形式传播)。 B 版本历史 C 分发范围 本文档分发范围包括:XXXXXX管理人员、开发人员、项目管理人员。

1编写目的 编写本文档的目的是在使用MS SQL Server数据库的过程中,使用统一的命名和编码规范,使数据库命名及编码风格标准化,以便于阅读、理解和继承。 2适用范围 本规范适用于公司范围内所有以SQL SERVER 2000/2005 作为后台数据库的应用系统和项目开发工作。 3对象命名规范 3.1 通用规则 Pascal 规则 每个单词开头的字母大写(如: TestCounter)。 Camel 规则 除了第一个单词外的其他单词的开头字母大写. 如:testCounter。 Upper 规则 仅用于被广泛认可的缩写命名(一般不超过四个字符,超过四个字符长度应该应用Pascal规则)。如:OLAP、PIN。 3.2 数据库名 数据库名定义为系统名_模块名,如“crm_customer”表示CRM系统的cust omer处理模块数据库。 数据库名全部采用小写。

3.3 数据库文件 数据文件命名采用数据库名+_+文件类型+[文件序号]+文件后缀,[文件序号]为1、2、3…9 等数值,当数据库中某一文件类型的文件有多个时加上文件序号以区别。只有一个时可不加。 文件后缀:主数据文件为.mdf,其它数据文件为.ndf,日志文件为.ldf。 文件名全部采用小写。 比如系统名为“crm_customer”,则数据库数据文件命名为“crm_customer_ data.mdf”,日志文件命名为“crm_customer_log.ldf”。 3.4 表 表命名要遵循以下原则: 直接使用表义名,不使用任何前缀。 整个表名的长度不要超过30 个字符。 表义名需遵循[3.1]表述的规则,尽量以英文命名,也可使用汉语拼音的首字符命名。表义名中汉语拼音均采用小写,且字符间不加分割符;单 词命名的表义名采用名词性质的单词,各单词的首字符大写,其它字符 小写。多个单词间不加任何分割符,如果整个单词太长,则使用完整的 第一音节或经过仔细选择的缩写词。名词全部采用单数形式。 表别名取表义名的前3 个字符加最后一个字符。 如果存在冲突,适当增加字符(如取表义名的前4 个字符加最后一个字符等)。 关联表命名为“Re_表A_表B”形式,Re 是Relative的缩写,表A 和表B均采用其表义名或缩写形式。 3.5 属性(列或字段) 属性命名遵循以下原则: 采用有意义的列名,尽量使用英文,或有实际含义的汉语拼音的首字符,且字符间不加任何分割符。 如果字段为bool型,则使用"IsShow", "IsValid", "HasPassed", "Ha sExamined", "IgnoreCase"这种形式表示。

sql语句书写规范

竭诚为您提供优质文档/双击可除 sql语句书写规范 篇一:标准sql语句的写法 有次面试非得让我写3表连接查询的标准sql语句,可是我不知道,我们一般都是直接写而不考虑是否遵循标准,能用即可的。所以检查了一下。 具体的如下: (https://www.360docs.net/doc/723273965.html,/u/22313/showart.phpid=21 4419) 一、简单查询 简单的transact-sql查询只包括选择列表、FRom子句和wheRe子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。 selectnickname,email FRomtesttable wheRename=张三 (一)选择列表

选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列 例如,下面语句显示testtable表中所有列的数据: select* FRomtesttable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如: selectnickname,email FRomtesttable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:select昵称=nickname,电子邮件=email FRomtesttable 4、删除重复行 select语句中使用all或distinct选项来显示表中符

SQL语句编写与优化规范

SQL语句编写与优化规范 1用SELECT查询用具体字段代替“*”,且尽可能只查询需要的字段。 SELECT * FROM DEMO_TABLE; SELECT FIELD1,FILED2 FROM DEMO_TABLE; 2多表查询时,使用表的别名,就可以减少解析的时间并减少那些由列名歧义引起的语法错误 SELECT FIELD1,FILED2 FROMDEMO_TABLE1,DEMO_TABLE2 WHERE T1_ID=T2_ID; SELECT t1.T1_ID=t2.T2_ID; 3用EXISTS替代IN,用NOT EXISTS替代NOT IN SELECT * FROM EMP ( FROM DEPT WHERE LOC = 'MELB'); SELECT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'MELB') 4WHERE条件连接顺序,把表关系写在最前 例如Oracle采用自下而上的顺序解析WHERE子句,表之间的条件连接必须写在其他条件之前,把可以过滤掉大量数据的条件写在WHERE子句的最后,按照过滤记录数量的多少 SELECT * FROM A a, B b WHERE a.num>3000 and b.state=2 AND a.ID=b.ID; SELECT * FROM A a, B b WHERE a.ID=b.ID and b.state=2and a.num>3000 5删除全表时,用TRUNCATE替代DELETE 当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.

SQL编写规范

SQL编写规范

**公司ERP组SQL编写规范 Author by DB小组

1.写SQL注意事项 1.1书写规范: 1)S QL语句大小写: 所有数据库关键字和保留字 均使用大写 2)不允许把多个语句写在一行中,一行只写一 条语句 3)避免将复杂的SQL 语句写到同一行,建议要 在关键字和谓词处换行 4)相对独立的程序块之间必须加空行。 5)I NSERT语句中必须指定字段列表,防止表结 构变化导致的错误 1.2命名规范: 1)不要使用数据库关键字和保留字创建对象名 (如select 等) 2)命名中不要使用中文和特殊字符,下划线可以 使用. 3)严禁使用空格给表和字段来命名 4)创建对象时,对象名注意不要加双引号 5)对象名称不要超过30个字符 6)变量命名规定如下:

i.函数或过程中所接收变量名称以P_开头,如 create proc aaa(P_branchid in varchar2) ii.过程中所定义变量以V_开头,如declare v_branchid varchar2(3) 7)E RP数据库对象命名必须加前缀以标识对象类 型,规范如下: 表(table)tb_ 视图(view) vw_ ` 序列(sequence) seq_ 簇(cluster) c_ 触发器(trigger) trg_ 存储过程(procedure) sp_ 函数(function) fun_ 物化视图(materialized view) mv_ 包和包体(package & package body) pkg_ 类和类体(type & type body) typ_ 主键(primary key) pk_ 外键(foreign key) fk_ 唯一索引(unique index) uk_ 普通索引(normal index) ix_ 位图索引(bitmap index) bi_ 同义词(synonym)依据所分配的表所属模块 数据库链接(database link)根据所连接服务器特点指定名称 1.3注释规范: 1)在一般情况下,源程序有效注释量必须在30% 左右,注释不宜太多也不能太少,注释语言需 准确、易懂、简洁、精炼。 2)尽量使用中文进行注释,对内容描述应该准确 完整 3)避免在一行代码中间或表达式中间加入注释

SQL Server数据库规范

数据库设计规范 1.简介 数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求。数据库设计过程中命名规范很是重要,命名规范合理的设计能够省去开发人员很多时间去区别数据库实体。 最近也因为工作需要所以整理出了这个word文档,望大家指正。 2数据库设计 数据库规划→需求分析→数据库设计→应用程序设计→实现→测试→运行于维护 2.1数据库规划 定义数据库应用系统的主要目标,定义系统特定任务,包括工作量的估计、使用资源、和需求经费,定义系统的范围以及边界。 2.2需求分析 2.1.1需求分析步骤与成果 涉及人员:用户和分析人员 任务:对现实世界要处理的对象进行详细的调查,收集基础数据及处理方法,在用户调查的基础上通过分析,逐步明确用户对系统的需求,包括信息的要求及处理的要求。 方法与步骤:1.通过与用户的调查,对用户的信息需求进行收集。 2.在收集数据的同时,设计人员要对其进行加工和整理,以数据字典和数据流图的形式描述出来,并以设计人员的角度向用户讲述信息,根据用户的反馈加以修改并确定(该过程是反复的过程) 成果:数据流图,数据字典,各种说明性表格,统计输出表以及系统功能结构图。 2.1.2数据流图基本元素与数据流图 外部实体:存在于软件系统之外的人员或组织(正方形或立方体表示)。 加工:数据处理,表示输入数据在此进行变换,产生输出数据(圆角巨型或圆形表示)。数据流:表示流动着的数据(箭头线表示)。 数据存储:用来表示要存储的数据(开门矩形或两条平行横线表示)。 订单处理系统顶层流程图:

0层数据流图:

sql语句书写规范

sql语句书写规范 篇一:标准Sql语句的写法 有次面试非得让我写3表连接查询的标准SQL语句,可是我不知道,我们一般都是直接写而不考虑是否遵循标准,能用即可的。所以检查了一下。 具体的如下:(22313/?id=214419) 一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。 SELECT nickname,email FROM testtable WHERE name='张三' (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变

量)等构成。 1、选择所有列 例如,下面语句显示testtable表中所有列的数据: SELECT * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如: SELECT nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:SELECT 昵称=nickname,电子邮件=email

FROM testtable 4、删除重复行 SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。 例如: SELECT TOP 2 * FROM testtable SELECT TOP 20 PERCENT * FROM testtable (二)FROM子句 FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之

编程规范(T-SQL)

技术文件 技术文件名称:编码规范-TSQL 技术文件编号:TECH-0002 版本:V0.1 共14 页 (包括封面) 拟制 审核 会签 标准化 批准 互动时代科技有限公司技术部

1. 概述 1.1. 基本原则 以大小写敏感编写SQL语句。 尽量使用Unicode 数据类型。 优先使用连接代替子查询或嵌套查询。 尽量使用参数化SQL查询代替语句拼接SQL查询。 禁止使用[拼音]+[英语]的方式来命名SQL对象或变量。 尽量使用存储过程代替SQL语句。 1.2. 基本规范 建议采用Pascal样式或Camel样式命名数据库对象。 大写T-SQL语言的所有关键字,谓词和系统函数。 2. 命名规范 在一般情况下,采用Pascal样式或Camel样式命名数据库对象,使在开发基于数据库应用程序的时候通过ORM工具生成的数据访问代码不需要调整就符合程序开发语言(比如C #)命名规范。另外,关系型数据库同Xml结合得越来越紧密,规范的命名越来越重要。 在实际数据库开发过程中,如果需求方已经提供数据库设计方案,建议以提供的方案为准;在原有数据库上进行升级开发时,在可行的情况下可适当做出设计调整以符合编程规范。 1.3. 对象命名 1.3.1. 数据库 第一种方式,采用Pascal样式命名,命名格式为[项目英文名称]。 示例:AdventureWorks 第二种方式,采用Pascal样式命名,命名格式为[项目英文名称] + Db。 示例:AdventureWorksDb BizTalkRuleEngineDb 建议采用第一种方式。 1.3. 2. 数据库文件 数据文件:[数据库名称] + _Data.mdf 日志文件:[数据库名称] + _Log.ldf

SQL代码编写指导规范

SQL代码编写指导规范Array SQL代码编写指导规范

目录 1 简介 (2) 1.1 目标 (2) 1.2 范围 (2) 1.3 基本依据 (2) 1.4 使用约定 (2) 1.4.1 规则 (2) 1.4.2 建议 (2) 1.5 术语和缩略语 (2) 1.6 参考 (3) 2 通用规则 (3) 3 配置约定 (3) 4 格式约定 (3) 5 命名约定 (4) 5.1 一般规则 (4) 5.2 命名规则 (4) 5.3 常用规则 (5) 5.4 约定规则 (6) 5.4.1 表名采用前缀+表名的方式,前缀定义如下: (6) 6 注释 (7) 6.1 SQL代码注释 (7) 6.2 对象注释 (7) 7 嵌入式代码 (8)

1 简介 开发小组在进行SQL 编程时常常会忽略所谓的编码标准,但这些标准却是开发小组顺利开展工作的关键工具。这里介绍的编码标准是经整理出来的开发成果。它们当然还没有得到普遍接受,而且不可否认,有些标准带有主观色彩。整理出此规范实际上更多的是为了提高大家的意识,而不是吹捧每个人是SQL 编写方面的仲裁者:最重要的是要建立某些合理的编码标准并遵循这些标准。您在这篇文章中会发现有关SQL 编程的一系列不同的编码标准、技巧和提示。它们并未以任何特定的优先级或重要性顺序列出。 1.1 目标 本主题提供SQL编程语言的命名指南。希望能对下述情况有积极的作用: 避免Errors/Bugs ,特别是难以查询的Errors/Bugs 规范不良的编码习惯 提高程序的可读性、可维护性和可移值性 1.2 范围 规范只针对SQL Server数据库中的SQL编程语言。 1.3 基本依据 本文档主要依据一位具有超过25 年经验的数据库管理员和应用程序开发员Brian Walker 提出的开发成果。 同时也可参考MSDN文档中相应的规范。 1.4 使用约定 1.4.1 规则 本文档表明没有特别的理由必须要遵守的要求。违反规则的编码人员必须至少同有经验的同事商量并取得违反规则的理由共识后才能实施。必须对违反规则的代码进行注解。 1.4.2 建议 正常情况下优先考虑,如果有违反建议的编码,应该同有经验的同事商量并取得违反建议的理由共识后才能实施,推荐对违反建议的代码进行注解。 1.5 术语和缩略语 如下表所示:

MySQL数据库设计SQL规范

MySQL数据库设计SQL规范 1 命名规范 1、库名、表名、字段名必须使用小写字母并采用下划线分割; 2、库名、表名、字段名支持最多32个字符,易于辨识以及减少传输量不要超过32; 3、库名、表名、字段名禁止使用MySQL保留关键字; 4、临时库、临时表名必须以tmp为前缀并以日期为后缀; 5、备份库、备份表名必须以bak为前缀并以日期为后缀; ---------------------------------------------------------------- 2 基本规范 1、使用INNODB存储引擎 5.5以后的默认引擘,支持事务,行级锁,更好的恢复性,高并发下性能更好,对多核,大内存,ssd等硬件支持更好; 2、表字符集使用UTF8 使用utf8字符集,如果是汉字,占3个字节,但ASCII码字符还是1个字节;统一,不会有转换产生乱码风险; 3、所有表都需要添加注释; 4、不在数据库中存储图片、文件等大数据; 5、禁止在线上做数据库压力测试; 6、禁止从测试、开发环境直连线上数据库; ----------------------------------------------------------------- 3 库表设计规范 1、尽量避免使用分区表 MySQL的分区表实际性能不是很好。 2、拆分大字段和访问频率低的字段,分离冷热数据 3、采用合理的分库分表策略,推荐使用HASH进行分表,表名后缀使用十进制数,下标从0开始 首次分表尽量多的分,避免二次分表,二次分表的难度和成本较高 4、按日期时间分表需符合YYYY[MM][DD][HH]格式 5、单表字段数控制在20个以内 6、一条完整的建表语句中应包含必要的字段、主键、合理的索引(综合代码中所有的条件语句创建合理的索引,主键必须要有) ------------------------------------------------------------------- 4 索引设计规范 索引是一把双刃剑,它可以提高查询效率但也会降低插入和更新的速度并占用磁盘空间 1、单张表中索引数量不超过5个; 2、单个索引中的字段数不超过5个;

TSQL命名规则

Transact-SQL编程规范 1. 概述 1.1. 基本原则 以大小写敏感编写SQL语句。 尽量使用Unicode 数据类型。 优先使用连接代替子查询或嵌套查询。 尽量使用参数化SQL查询代替语句拼接SQL查询。 禁止使用[拼音]+[英语]的方式来命名SQL对象或变量。 尽量使用存储过程代替SQL语句。 1.2. 基本规范 建议采用Pascal样式或Camel样式命名数据库对象。 大写T-SQL语言的所有关键字,谓词和系统函数。 2. 命名规范 在一般情况下,采用Pascal样式或Camel样式命名数据库对象,使在开发基于数据库应用程序的时候通过ORM工具生成的数据访问代码不需要调整就符合程序开发语言(比如C#)命名规范。另外,关系型数据库同Xml结合得越来越紧密,规范的命名越来越重要。 在实际数据库开发过程中,如果需求方已经提供数据库设计方案,建议以提供的方案为准;在原有数据库上进行升级开发时,在可行的情况下可适当做出设计调整以符合编程规范。

1.3. 对象命名 1.3.1. 数据库 第一种方式,采用Pascal样式命名,命名格式为[项目英文名称]。 示例:AdventureWorks 第二种方式,采用Pascal样式命名,命名格式为[项目英文名称] + Db。示例:AdventureWorksDb BizTalkRuleEngineDb 建议采用第一种方式。 1.3. 2. 数据库文件 数据文件:[数据库名称] + _Data.mdf 日志文件:[数据库名称] + _Log.ldf 示例:AdventureWorks_Data.mdf AdventureWorks_Log.ldf 1.3.3. 关系型数据仓库 采用Pascal样式命名,命名格式为[项目英文名称] + DW。 示例:AdventureWorksDW 1.3.4. 数据架构 除SQL Server 系统定义的数据架构外,新建架构采用Pascal样式命名,命名格式为[架构名]。 示例:HumanResources Production

依据SQL编写的规范标准说明

SQL编写规范 1.书写格式 示例代码: 存储过程SQL文书写格式例 select c.dealerCode, round(sum(c.submitSubletAmountDLR + c.submitPartsAmountDLR + c.submitLaborAmountDLR) / count(*), 2) as avg, decode(null, 'x', 'xx', 'CNY') from ( select a.dealerCode, a.submitSubletAmountDLR, a.submitPartsAmountDLR, a.submitLaborAmountDLR from SRV_TWC_F a where (to_char(a.ORIGSUBMITTIME, 'yyyy/mm/dd') >= 'Date Range(start)' and to_char(a.ORIGSUBMITTIME, 'yyyy/mm/dd') <= 'Date Range(end)' and nvl(a.deleteflag, '0') <> '1') union all select b.dealerCode, b.submitSubletAmountDLR, b.submitPartsAmountDLR, b.submitLaborAmountDLR from SRV_TWCHistory_F b where (to_char(b.ORIGSUBMITTIME, 'yyyy/mm/dd') >= 'Date Range(start)' and to_char(b.ORIGSUBMITTIME,'yyyy/mm/dd') <= 'Date Range(end)' and nvl(b.deleteflag,'0') <> '1') ) c group by c.dealerCode order by avg desc; Java source里的SQL字符串书写格式例 strSQL = "insert into Snd_FinanceHistory_Tb " + "(DEALERCODE, " + "REQUESTSEQUECE, " + "HANDLETIME, "

相关主题
相关文档
最新文档