NCSql规范
sql规范
sql规范SQL(Structured Query Language)是一种用于管理关系数据库的计算机语言。
虽然SQL是一种标准的语言,但是在实际应用中,不同的数据库管理系统可能会有一些差异。
为了提高代码的可读性和可维护性,制定了一些SQL规范。
下面是一个涵盖了SQL规范的大致指南,旨在帮助开发人员编写高质量的SQL代码。
1. 格式化代码:- 使用统一的缩进,通常是4个空格。
- 在代码中适当空格,使代码更易读。
- 使用大写字母或小写字母编写关键词,以提高可读性。
2. 使用明确的表别名:- 在SQL查询中,如果涉及多个表,为每个表使用明确的别名。
- 别名应该具有描述性,以便更好地理解查询意图。
3. 使用JOIN语句:- 避免使用传统的WHERE语句来连接表,而是使用JOIN语句。
- JOIN语句可以更清晰、更有效地表示表之间的关系。
4. 避免使用SELECT *:- 在查询中,尽可能明确地列出需要的列,而不是使用通配符*。
- 这样可以减少数据传输量,提高查询效率,并且使查询意图更加明确。
5. 避免使用子查询:- 子查询会增加查询的复杂性和执行时间。
- 尽量使用JOIN语句来代替子查询,以提高查询性能。
6. 使用合适的数据类型:- 在创建表时,选择适当的数据类型和长度。
- 这样可以减少存储空间的使用,并提高查询性能。
7. 对于NULL值的处理:- 在查询中,使用IS NULL或IS NOT NULL来测试NULL 值,而不是使用等号(=)。
- 这样可以更明确地表示查询的意图,并且使代码更易读。
8. 使用事务:- 当执行多个SQL操作时,将它们放在一个事务中。
- 这样可以确保数据的一致性,并提供可靠的回滚机制。
9. 编写注释:- 在代码中加入注释,解释SQL的意图和目的。
- 这样可以让其他开发人员更容易理解代码,并且在维护代码时更加方便。
10. 安全性考虑:- 在查询中,避免将用户输入直接插入SQL查询中,以免遭受SQL注入攻击。
NC SQL规范及效率优化知识分享
SQL 规范——书写风格
避免隐含的类型转换。例如在where子句中String型和Number型的列的 比较或相加; 例: create table t(id varchar2(10),name varchar2(10),sal number); create index t_idx on t(id);
Yonyou Software Corporation
SQL 规范——高效SQL
合理使用索引提高效率 索引可以提高检索数据的效率。通常在大型表中使用索 引特别有效; 虽然使用索引能得到查询效率的提高,但是我们也必须 注意到它的代价: 索引需要空间来存储,也需要定期维护,每当有记录在 表中增减或索引列被修改时,索引本身也会被修改; 这意味 着每条记录的INSERT、DELETE、UPDATE将为此多付出4、5次 的磁盘I/O。 因为索引需要额外的存储空间和处理,所以那些不必要 的索引反而会使查询反应时间变慢; 另外,不正确的索引使用方法可能会导致索引无效
Yonyou Software Corporation
概述——执行计划
嵌套循环 读取row source1中的每一行 然后在row sourc2中检查是否有匹配的行,所有被匹配的 行都被放到结果集中 然后处理row source1中的下一行 哈希连接 较小的row source被用来构建hash table与bitmap 第2个row source被用来被hash 第一个row source生成的hash table进行匹配,以便进行进 一步的连接
2 3
1
Yonyou Software Corporation
SQL规范
Yonyou Software Corporation
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、索引规范在设计阶段,可以根据功能和性能的需求进行初步的索引设计,这里需要根据预计的数据量和查询来设计索引。
SQL的使用规范
SQL的使用规范:1.尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。
2.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。
3.注意表之间连接的数据类型,避免不同类型数据之间的连接。
4.注意where字句写法1).必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。
2) 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
3)尽量使用“>=”,不要使用“>”。
4)也不要在Where字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代.还可以变通写法:Where SUBSTRING(firstname,1,1) = 'm'改为Where firstname like 'm%'(索引扫描),一定要将函数和列名分开。
并且索引不能建得太多和太大。
5)Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围。
用查询优化器可见到差别。
select * from chineseresume where title in ('男','女')Select * from chineseresume where between '男' and '女' 是一样的。
Select * FROM PersonMember (INDEX = IX_Title) Where processid IN ('男','女') 6)如果Group BY的目的不包括计算,只是分组,那么用Distinct更快。
SQL语言的规则与规范
SQL语⾔的规则与规范SQL语⾔的规则与规范规则:必须遵守。
规范:建议遵循。
1. 基本规则SQL 可以写在⼀⾏或者多⾏。
为了提⾼可读性,各⼦句分⾏写,必要时使⽤缩进每条命令以 ; 或 \g 或 \G 结束关键字不能被缩写也不能分⾏关于标点符号必须保证所有的()、单引号、双引号是成对结束的必须使⽤英⽂状态下的半⾓输⼊⽅式字符串型和⽇期时间类型的数据可以使⽤单引号(' ')表⽰列的别名,尽量使⽤双引号(" "),⽽且不建议省略as2. SQL⼤⼩写规范MySQL 在 Windows 环境下是⼤⼩写不敏感的MySQL 在 Linux 环境下是⼤⼩写敏感的数据库名、表名、表的别名、变量名是严格区分⼤⼩写的关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略⼤⼩写的。
推荐采⽤统⼀的书写规范:数据库名、表名、表别名、字段名、字段别名等都⼩写SQL 关键字、函数名、绑定变量等都⼤写3. 命名规则数据库、表名不得超过30个字符,变量名限制为29个必须只能包含 A–Z, a–z, 0–9, _共63个字符数据库名、表名、字段名等对象名中间不要包含空格同⼀个MySQL软件中,数据库不能同名;同⼀个库中,表不能重名同⼀个表中,字段不能重名必须保证你的字段没有和保留字、数据库系统或常⽤⽅法冲突。
如果坚持使⽤,请在SQL语句中使⽤`(着重号)引起来保持字段名和类型的⼀致性,在命名字段并为其指定数据类型的时候⼀定要保证⼀致性。
假如数据类型在⼀个表⾥是整数,那在另⼀个表⾥可就别变成字符型了4. 注释单⾏注释:#注释⽂字(MySQL特有的⽅式)单⾏注释:-- 注释⽂字(--后⾯必须包含⼀个空格。
)多⾏注释:/* 注释⽂字 */。
SQL语句的规范
SQL语句的规范SQL语句的规范:
1、mysql对于SQL语句不区分⼤⼩写,SQL语句关键字尽量⼤写
show databases;
SHOW DATABASES;
⾄于表中的数据是否区分⼤⼩写,和字符编码,和数据类型,和校对规则有关。
ci:不区分⼤⼩写
cs:区分⼤⼩写
bin:最严格,区分⼤⼩写,以⼆进制值存储
2、在sql语句中的值,除了数值类型(整数、⼩数),其他的类型,都使⽤''引起来。
例如:select * from t_employee where gender ='男';
3、如果在SQL中需要给字段取别名时,可以给别名加""。
如果别名中间没有空格,""可以省略,如果有空格,不能使⽤""
4、所有标点符号使⽤英⽂状态下的半⾓输⼊⽅式
5、必须保证所有(),单引号,双引号是成对结束的
6、可以使⽤(1)#单⾏注释(2)--空格单⾏注释(3)/* 多⾏注释 */
命名规范:
1、必须只能包含 A–Z, a–z, 0–9, _共63个字符
2、不能在对象名的字符间留空格
例如:create database 0513 db; #错误的
3、避免重名
同⼀个DB数据库中,表不能重名,
同⼀张表中,字段不能重名
同⼀个DBMS数据库管理软件中,数据库不能重名
4、命名时不要使⽤关键字
create database database; #错误的。
sql 规则和范式
sql 规则和范式
SQL规则和范式是数据库设计和管理中非常重要的概念。
首先,让我们来谈谈SQL规则。
SQL是结构化查询语言的缩写,它是一种
用于管理关系型数据库的标准化语言。
SQL规则是指在编写SQL语
句时需要遵循的一系列规则和约定,以确保数据库操作的准确性和
一致性。
这些规则包括语法规则、数据类型规则、约束规则等。
例如,SQL语句必须按照特定的语法结构编写,数据类型必须与字段
定义一致,约束条件必须满足数据库设计的要求等。
接下来是范式的概念。
范式是用来规范化数据库设计的一组原则,旨在减少数据冗余和提高数据的一致性。
常见的范式包括第一
范式(1NF)、第二范式(2NF)、第三范式(3NF)等。
第一范式要求每个字段具有原子性,不可再分;第二范式要求每个非主键字段
完全依赖于全部主键而不是部分主键;第三范式要求每个字段都直
接依赖于主键,而不是依赖于其他非主键字段。
在SQL中,范式的应用可以提高数据库的性能和可维护性,减
少数据冗余和提高数据的完整性。
但是,过度范式化也可能导致查
询性能下降,需要在设计数据库时权衡范式化和性能之间的关系。
总的来说,SQL规则和范式是数据库设计和管理中非常重要的概念,它们能够帮助我们设计出高效、可靠的数据库结构,提高数据的一致性和完整性。
在实际应用中,需要根据具体的业务需求和性能要求来灵活运用这些原则。
sql标准 内容
SQL标准是指结构化查询语言(Structured Query Language)的标准规范,它定义了SQL 语言SQL标准是指结构化查询语言(Structured Query Language)的标准规范,它定义了SQL语言的语法、语义和操作方式。
SQL标准由国际标准化组织(ISO)和美国国家标准学会(ANSI)共同制定和维护,目前最新的版本是SQL:2016。
SQL标准主要包括以下几个方面的内容:
1. 数据定义语言(DDL):用于定义和管理数据库中的对象,包括表、视图、索引等。
2. 数据操作语言(DML):用于对数据库中的数据进行增删改查操作,包括SELECT、INSERT、UPDATE、DELETE等语句。
3. 数据控制语言(DCL):用于控制数据库中的访问权限和完整性约束,包括GRANT、REVOKE 等语句。
4. 事务控制语言(TCL):用于管理数据库中的事务,包括COMMIT、ROLLBACK等语句。
5. 函数和过程语言(FPL):用于编写和调用数据库中的函数和过程。
除了以上核心内容外,SQL标准还包括一些辅助性的内容,如注释、标识符命名规则、错误处理机制等。
SQL标准的制定和推广对于促进数据库技术的发展和应用具有重要意义。
通过遵循统一的标准规范,不同的数据库管理系统可以实现互操作性和兼容性,使得用户能够更加方便地使用和管理各种类型的数据库。
同时,SQL标准的不断完善和发展也为数据库技术的进一步创新提供了基础和支持。
SQL编程规范整理
SQL编程规范整理⼀、排版规范1.代码缩进对于判断、循环等处理使⽤字符缩进缩进的空格最好不要使⽤TAB键2.空格及换⾏变量定义、相对独⽴的程序块等要单独成⾏,便于阅读太长的程序(超过110列)应做换⾏处理操作符前后加⼊空格3.书定习惯不同操作类型的操作符⽤括号隔离表、字段别名⽤意义的名称替代所有书写使⽤⼤写,⽅⾯移植⼆、命名规范1.存储过程”SP_“作为前缀2.函数“F_”作为前缀3.触发器“TR_”作为前缀4.视图“V_”作为前缀5.链接服务“LNK_”作为前缀6.主键“PK_”作为前缀,表名在后,如:PK_表名7.外键“FK_”作为前缀,主表名,从表名,如:FK_主表_从表8.索引“ID_”作为前缀,列名在后,如:ID_COLNAME9.序列“SEQ_”作为前缀三、通⽤SQL性能优化1.索引使⽤尽量使⽤“>=”或,不要使⽤“>”LIKE尽量前端匹配尽量不要使⽤“<>”条件中不要使⽤函数条件中不要使⽤计算条件中尽量不要使⽤NOT尽量避免使⽤OR合理利⽤复合索引2.SQL优化避免使⽤复合SQL语句(如:SELECT A,B FROM TABLE1 WHERE A IN )(SELECT A1 FROM TABLE2))尽量避免使⽤DISTINCT尽量避免直接使⽤⾃定义函数对于查询⽐较复杂,数据量较⼤的查询,可以使⽤⼯具进⾏查询计划检测,调整语句性能不要在存储过程或函数中反复访问同⼀张表,如果需要,可以将数据放在临时表中使⽤。
应尽量减少控制语句的检查次数,以提⾼执⾏效率如果能从⼀条SQL语句中获取多个想要的数据,就不要分多条SQL语句分分次获取在长度和精度和精度允许的情况下,建议⽤INTERGE代替NUMERIC,在可以提⾼性能的情况下,使⽤EXISTS代替IN,NOT EXISTS 代替NOT IN查询的WHERE过滤原则,应使过滤记录数最多的条件多表连接查询时,可以先按条件过滤在进⾏连接select、insert⼦句的代码中不允许出现“*”以代替查询所有字段,必须⽤实际的字段名代替提⾼GROUP BY的执⾏效率,在进⾏GROUP BY 之前将不需要条件过滤掉。
SQL语句的编写规范及最佳实践
SQL语句的编写规范及最佳实践当今数据驱动的时代,SQL语言作为数据库操作的标准,被广泛应用于各类应用程序中。
但是,由于编写SQL语句的灵活性,很容易导致代码混乱、性能低下等问题。
为了更好地利用和优化数据库,本文将探讨SQL语句的编写规范及最佳实践。
一、规范书写规则在编写SQL语句时,遵循一定的规范书写规则是非常重要的。
下面是一些常见的规范:1. 语句格式化:为了提高可读性,每个关键字和操作符都应该单独一行,并且适当缩进。
这样做可以使语句更易于阅读和理解。
2. 表和字段命名:表名和字段名应具备描述性,尽量避免使用缩写或简写,保证可读性。
例如,使用"order_items"代替"oi"。
3. 大小写一致性:虽然SQL语言中不区分大小写,但是为了增强可读性,建议关键字、表名和字段名都使用相同的大小写规则。
4. 逗号的位置:当列名或表名超过一行时,逗号应该放在每一行的开头,在每个逗号后面添加一个空格。
5. 字符串引号:使用单引号来表示字符串值。
二、查询的最佳实践1. 使用JOIN代替子查询:在编写多表关联查询时,使用JOIN语句比子查询更高效。
JOIN操作可以减少查询次数,提高性能。
2. 减少SELECT中的列数:只选择需要的列,避免一次性选择所有列。
当表里的列很多时,选择性选择列可以提高查询性能。
3. 合理使用索引:索引可以大大提高查询性能,但过多的索引会降低插入、更新和删除的性能。
因此,需要根据实际情况选择合适的字段作为索引。
4. 使用INNER JOIN而不是OUTER JOIN:INNER JOIN只返回两个表中都有的匹配行,而OUTER JOIN会返回所有匹配行和未匹配行。
在性能要求较高的情况下,使用INNER JOIN可以提高查询效率。
5. 避免多次嵌套子查询:多次嵌套的子查询会导致查询性能下降。
可以考虑使用关联子查询或临时表替代。
6. 使用WHERE子句进行过滤:在查询中使用WHERE子句进行过滤可以减少返回结果集的大小,提高性能。
sql书写规范
sql书写规范SQL(结构化查询语言)是一种用于处理关系型数据库的标准化语言。
在编写SQL查询语句时,遵循一定的书写规范可以提高代码的可读性、可维护性和可扩展性。
下面是SQL书写规范的一些基本原则和建议。
一、命名规范:1. 数据库、表、列的命名应具有描述性,能够清晰表达其含义。
2. 使用小写字母和下划线作为命名的分隔符,避免使用特殊字符和空格。
3. 命名要保持一致,避免使用缩写和简写,使用完整的单词。
二、缩进和空格:1. 使用适当的缩进,增加代码的可读性,通常每个缩进层级使用4个空格或一个制表符。
2. 在关键字、表名、列名、运算符等之间使用适当的空格,使其更易读。
如:SELECT column1, column2 FROM table_name WHERE condition。
三、注释:1. 在SQL语句中适时添加注释,解释代码的作用和意图,方便维护和理解。
2. 注释符号根据数据库的不同而异,通常是"--"和"/* */"。
如:SELECT column1, column2 -- 这是一个注释 FROM table_name;四、代码格式化:1. 使用大写字母表示SQL关键字,如SELECT、FROM、WHERE等。
2. 每个SQL语句都应该单独一行,并以分号结尾。
3. 当一行代码过长时,可以在适当的地方进行换行,增加代码的可读性。
4. 在二元运算符(如=、<>、<、>等)两边添加适当的空格,使其更易于阅读。
五、表达式和函数:1. SQL语句中的表达式和函数的书写应该尽可能简洁和清晰。
2. 使用括号明确表达式和函数的优先级。
3. 尽量避免在WHERE子句中使用函数,以提高查询性能。
六、SELECT语句:1. SELECT子句中应该指定查询的具体列,而不是使用通配符(*),这样可以减少不必要的数据量。
2. SELECT子句中的列应该按照一定的逻辑顺序排列,可以按照业务逻辑或者字母顺序排列。
sql语法标准
SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言。
SQL语法标准是由美国国家标准协会(ANSI)和国际标准化组织(ISO)所定义的,并且被广泛接受和使用。
以下是SQL语法标准的一些基本组成部分:1. 数据库对象命名:在SQL中,数据库对象(如表、视图、列等)需要使用标识符来命名。
标识符可以由字母、数字、下划线和美元符号组成,并且必须以字母开头。
例如,`employees` 表。
2. 数据类型:SQL支持多种数据类型,包括整数、浮点数、字符串、日期和时间等。
在创建表时,需要指定列的数据类型,以确保数据的正确性和完整性。
3. 创建表:使用`CREATE TABLE`语句创建表,指定表的名称和列的名称、数据类型以及其他约束条件(如主键、唯一性约束等)。
4. 插入数据:使用`INSERT INTO`语句将数据插入到表中,指定要插入的表名、要插入的数据行和每列的值。
5. 查询数据:使用`SELECT`语句从表中检索数据。
可以指定要选择的列、过滤条件、排序规则等。
6. 更新数据:使用`UPDATE`语句更新表中的数据,指定要更新的表名、要更新的列名、更新的值以及过滤条件。
7. 删除数据:使用`DELETE FROM`语句从表中删除数据,指定要删除的表名和过滤条件。
8. 连接表:使用`JOIN`语句将多个表连接起来,以执行更复杂的查询和操作。
连接可以基于列之间的关系进行。
9. 聚合函数:SQL提供了一些聚合函数,如`SUM`、`COUNT`、`A VG`等,用于对数据进行计算和统计。
10. 约束:使用约束来确保数据的完整性和一致性,包括主键约束、唯一性约束、外键约束等。
这只是SQL语法标准的一些基本概念和组成部分,实际的SQL 语法比这要复杂得多,并且有很多不同的方言和扩展。
不同的数据库管理系统(如MySQL、Oracle、SQL Server等)可能支持不同的特性和语法细节。
NC数据库设计规范
数据库设计规范----NC数据库小组----版本V5注意:标有★的条目表示强制性规范。
变更记录一、概述本手册涉及两个方面的内容:A、指导软件开发过程中对数据库设计文档的管理。
数据库设计文档主要包括以下部分:●数据库设计的概念数据模型,即CDM文档●数据库设计的物理数据模型,即PDM文档●由PDM生成的数据库建库脚本。
●其他不在PDM文档中表达的数据库脚本,比如视图、触发器、索引等。
B、规范数据库设计文档中的内容,如命名规则、数据类型的使用等。
本手册会随着NC的发展、开发技术的提高、各种系统平台的更新而逐步调整。
二、支持数据库及版本★目前主要支持ORACLE,DB2,SQLSERVER三种数据库.三、数据库文档的管理★1、采用PowerDesigner 8.0作为数据库设计工具。
2、使用ClearCase作为数据库设计文档的版本控制工具。
3、凡是用在PDM里面表达的数据库设计,统一由配置管理员产生厂商数据库的建库脚本。
不在PDM中表达的SQL语句需要设计人员自己翻译为不同厂商数据库的建库脚本。
4、PDM里面有关各种数据库对象的comment 字段不能为空,必须对各种数据库对象作出有助与理解的注释。
四、命名规范★1.模块名称规则表,一般数据库表设计的前缀默认采用以下规则,以下表的详细信息请参考NC规范中的NC产品形态文档.2.所有表、视图、触发器、索引、函数、约束、主外键必须指定名称,规则如下:对于各种数据库对象的命名规则,目前的NC系统中存在两种风格,采用拼音和采用英(*)注:由于数据库对象之间的命名规则与最大长度限制可能造成命名存在冲突。
如存在,可以通过缩减表名或字段字符来实现。
3.所有的外键、约束、索引、函数、触发器、存储过程名不允许重复。
4.业务中主子表的命名规则:系统规则名_名称或主表:系统规则名_名称_h5.子表:系统规则名_英文名称_b。
业务中主子子表的命名规则:主表:系统规则名_英文名称_h子表:系统规则名_英文名称_b子子表:系统规则名_英文名称_bs五、数据类型★2.业务数据类型规范这个规范需要落实到CDM/PDM的domain的标准化上,尽量使用已经定义好的域,如UFPK、UFDate等,参见pdm手册。
NC SQL规范及效率优化知识分享
Yonyou Software Corporation
SQL 规范——高效SQL
使用表的别名
例: 下面两个Sql执行效果哪个更好?(字段a,b,c是表table1的字段,x,y 是table2的字段) #SQL一 Select a,b,x from table1,table2 where a>100 and c=y #SQL二 Select t1.a,t1.b,t2.x from table1 t1,table2 t2 where t1.a>100 and t1.c = t2.y 使用表的别名(Alias),当在SQL语句中连接多个表时,请使用表的别 名并把别名前缀于每个Column上,这样可以 1)减少解析的时间 2)减少那些由Column歧义引起的语法错误
2 3
1
Yonyou Software Corporation
SQL规范
Yonyou Software Corporation
SQL 规范——书写风格
SQL语句全部使用小写(目前NC的整体习惯); 引用字符时用单引号。如:update testable set idcol=’abcd’。 连接符或运算符or、in、and、=、<=、>=,+,- 等前后加上一个空格; 在子查询中前后必须加上括号, select col1, col2 from tablea where col3 in ( select col4 from tableb where col4>0); 当SQL语句含有运算符时,运算符需与其他字符串用空格区分(或者用
1、select * from t where id=7369;
2、select * from t where id='7369';
Sql代码规范说明
Sql代码规范说明对于程序⼯作者来说,代码的阅读必不可少,好的代码让⼈读起来⼀⽬了然、神清⽓爽,做代码调试也可以很开的捋顺逻辑定位问题,但是如果遇到⼀些可读性较差,毫⽆规矩可⾔的代码,那真的⽐吃了翔都难受啊,如果再让你在这个基础上做点东西或者持续维护这些代码,真的能让⼈憋屈死,所以代码的书写必须条理清晰,遵循规矩,虽说SQL 的代码语法相⽐其他的java、python 等⾼级语⾔要差了⼏个档,但是对于⼀门数据查询语⾔来说,语法简答并不意味着没有结构可⾔,接下来我们共同学习⼀下SQL 的代码规范。
我们分别从代码的注释、主体结构和最终的脚本命名三个⽅⾯讨论SQL 的规范:代码的注释:1、代码块的注释使⽤ " /* .... */“ 每个SQL 查询代码的开始段,必须对整个代码进⾏简单的说明,说明内容包括:书写⼈、业务内容、书写时间、注意事项等;2、不换⾏的简单注释,在注释⽂字前⽤" -- “ 1)针对字段的解释,放到这个字段后⾯; EG:count(distinct salesNo) as CustNum -- 统计是客流量 2)针对⾏的解释,⼀般会单独取⼀⾏,避免某⾏代码过长; EG :-- 2017年7⽉2号计算每个会员购买⾦额占总体⾦额的⽐ 主体结构规范: 1、查询相关关键字单独再起⼀⾏;select /from /where/group by /having/order by; 2、select 之后的字段之间使⽤ ‘,’分隔,逗号统⼀放到各字段的前⾯或者后⾯; 3、select 的相关字段,⼀般是缩进4个空格或者6个空格; 4、代码的分号⼀般放到代码的结尾; 5、对于⼦查询嵌套使⽤规则: 1)⼦查询语句使⽤()进⾏包裹,⼦查询语句单独另起⼀⾏; 2)同⼀级别的⼦句内部要对齐; 6、表别名命名规则: 1)表⼀定要有别名例如:单个字母,字母加数字; 2)多个表(t特别是有⼦查询嵌套查询)在关联的时候有相应临时表命名有顺序,例如:t1,t2,t3;A,B,C;脚本命名 1)代码开发完成后,及时进⾏代码保存; 2)⽂件格式:.sql 结尾脚本命名; 3)名字缩写+内容+⽇期;。
SQL标准和规范1
SQL标准和规范1SQL标准和规范一、名称与数据元素 (2)二、字体、标点和间距 (3)三、数据定义语言 (5)四、尺度与测量 (6)五、数据编码方案 (6)六、编码选择 (7)七、如何使用视图 (9)八、如何编写存储过程 (10)九、优化性能建议 (12)一、名称与数据元素1.名称1.1标识符最大长度为18个字符1.2名称中避免使用特殊字符名称的第一个字符必须是字母,其后的字符可以是字母、数字、下划线1.3避免使用引号分割标识符1.4实施大写规则以避免大小写区分问题除非小写看上去很奇怪,否则使用小写。
2. 遵循ISO-11179标准命名规范2.1标量数据元素应当满足条件1)(在它出现的任何一个数据字典中)是唯一的2)以单数形式表达3)说明概念是什么,而不仅仅说明它不是什么4)以描述性短语或者语句表达5)不使用其他数据元素或者底层概念的嵌套定义表达6)表、集合、其他集合应当以集合、类或者复数名称命名7)过程名称中应当有一个动词8)表的副本(别名)应当同时包括基表名称和它当时所起的作用2.2避免使用描述性前缀:tbl-前缀等2.3制定标准化的后缀常见的后缀有:_id 标识符_date 日期、时间维度_num 标签号,用来命名某些事物的一串数字_name 用字母表示的名称_code 编码_size 业界标准或尺度_tot 总和_seq 顺序、顺序编号_tally 一组值的计数也称为绝对尺度_type 一种内部和外部均有公共含义的编码机制_status 一个反映状态的内部编码_addr 一个实体的地址或者位置_img 图像数据类型2.5 相关名(别名)基本上也要遵循与其他名称相同的命名规则。
表达式的别名应当从表达式的逻辑含义中派生处理,并且短小而简单。
2.6关系表名应当是常用描述术语表和视图可以为关系建模,通常是一对多或者对对多,如果关系有一个在上下文中易于理解的常用名称,就可以使用。
2.8命名数据元素时遇到的问题1)避免模糊名称①名称过于宽泛,如date(日期),说明不了实际是什么日期②名称是一串相互矛盾的限定符2)避免名称在不同的地方改变二、字体、标点和间距1.1名称中只使用大小写字母、数字和下划1.2 列名、参数和变量等标量小写1.3 模式对象名首字母大写模式对象包括表、视图和存储过程等。
NC常用表以及SQL
NC 常用表以及SQL[复制链接]x11494 4880会计员魅力9推广26金币794威望9帖子12电梯直达1#发表于 2009-10-14 11:24:29 |只看该作者|倒序浏览//检查审批流是否定义select pk_wf_def, fatherpk, processDefID, node_name, node_type, billmaker, billmaker_name, billmaker_type, createdate,version, workflow_type from pub_wf_def where validation = 1 and pk_corp = '1001' and busitype = 'KHHH0000000000000001'andbilltype = 'ZG54' and ( node_type = '2' or node_type = '3' )----------------------------------------------------------------------------//单据类型管理表,手工设置4位类型代码select * From bd_billtype where pk_billtypecode='TB'update bd_billtype set pk_billtypecode='TB10' wherepk_billtypecode='TB'----------------------------------------------------------------------------//手工做vo对照_主表insert intopub_votable(approveid, billid, billno, billvo, bus itype, def1,def2,def3,dr, headbodyflag,headitemvo, itemc ode, operator, pk_billtype,pk_corp,pkfiel d,votable, pk_votable, ts)values('vapproveid','pk_apply','vbillco de','nc.vo.trade.pub.HYBillVO','pk_busitype',NULL,NULL,NULL,NULL,'Y', 'nc.vo.shsh.stock.tb1010.StockApplyVO','shsh_sto ck_apply', 'voperatorid','TB10', NULL,'pk_apply','shsh_stock_apply','0001AA10000000001RK3','2007-09-2 7 16:59:14')//手工做vo对照_子表insert intopub_votable(approveid,billid,billno,billvo,busitype,def1,def2,def3,dr, headbodyflag,headitemvo, itemcode , operator,pk_billtype,pk_corp,pkfield, v otable,pk_votable, ts)values('', '', '','nc.vo.trade.pub.HYBillVO','', NULL,NULL,NULL,NULL,'N','nc.9积分1592 阅读权限20 UID15220 •串个门•加好友•打招呼•发消息vo.shsh.stock.tb1010.StockApplyBVO','shsh_stock_apply_b','', 'TB10' , NULL,'pk_apply','shsh_stock_apply_b','0001AA10000000001RK4','2007-09 -27 17:12:01')------------------------------------------------------------------------------自动生成单据编码insert intopub_billcode_rule(billcodeshortname,controlpara,day,dr,isautofill,is check,ishaveshortname,ispreserve,lastsn,month,object1,object2,pk_billcoderule,pk_billtypecode,snnum,snresetflag,ts ,year)values('ZA','Y',20,0,'Y','Y','Y','Y','0000',12,NULL,NULL,'smTB100000 0000000001','TB10',4,0,'2007-09-27 18:55:32','07')----------------------------------------------------------------------------//操作员人员关联关系select psn.psnname from bd_psndoc psn inner join sm_userandclerk on sm_userandclerk.pk_psndoc = psn.pk_psndocinner join sm_user on sm_user.cuserid = sm_erid----------------------------------------------------------------------------//查询模板的单据状态下列值初始化update pub_query_condition set consult_code='I,,审批不通过,审批通过,审批进行中,提交态,作废态,冲销态,终止(结算)态,冻结态,自由态,待经办,已经办,已核查,已作废'where field_code like '%billstatus' and pk_templet in(select id from pub_query_templet where model_code in ('91012010')) ----------------------------------------------------------------------------//复制数据库里的类似数据,声称INSERT语句select 'insert dap_defitemvalues('+attrname+','+CONVERT(char(1),dr)+','+headflag+','+itemname+ ','+CONVERT(char(1),itemtype)+','+pk_billtype+','+pk_voitem+','','+ts+')' from dap_defitem where pk_billtype='TB52'--------------------------------------------------------------------//手动增加打印模板中的项insert into PUB_PRINT_DATAITEM (DR, IDATATYPE, ITYPE, PK_CORP,PK_VARITEM, PREPARE1, RESID, TS, USERDEFFLAG, VNODECODE,VTABLECODE, VTABLENAME, VVAREXPRESS, VVARNAME)values (0, null, null, [email=]'@@@@'[/email], '0001AA10000000ZY1220',null, null, '2007-01-21 15:23:37', null, 'TC0106', null, null,'t_pk_psndoc', '报销人(表尾)');----------------------------------------------------------------------------//修改单据模板模板的字段类型update pub_billtemplet_b set reftype='5'where pk_billtemplet in(select pk_billtemplet from pub_billtemplet where nodecode like 'TD%')and datatype=2 and (reftype is null or reftype='3' or reftype='2') and(defaultshowname like '%费%' or defaultshowname like '%额%'or defaultshowname like '%金%' or defaultshowname like '%价%')----------------------------------------------------------------------------//参照的表和字段select pk_refcolumn, fieldname, fieldshowname, ishiddenfield,isblurfield, ismnecode,ispkfield, iscolumnshow, islocateshow, columnshowindex,locateshowindex,bd_refcolumn.pk_reftable,datatype,tablename frombd_refcolumn inner join bd_reftable on bd_refcolumn.pk_reftable =bd_reftable.pk_reftablewhere bd_refcolumn.pk_reftable = '0001AA1000000000P4LA' order bycolumnshowindex//查询有节点权限的人员-----------------------------------------------------------------------------select * from sm_funcregisterselect user_name from sm_user where cuserid in(select userid from sm_appuserpower where funid='0001AA10000000000UDO')//查询有节点权限的用户组select group_name,* from sm_group where cgroupid in(select groupid from sm_usergrouppower wherefunid='0001AA1000000000LL7G')//审批流相关表----------------------------------------------------------------------------select * from pub_wf_instance where billid='' and billno='' select * from pub_wf_task where pk_wf_instance=''select * from pub_wf_actinstance where pk_wf_instance='' select * from pub_workflownote where billid='' and billno='' select * from pub_wf_actinstancesrc wheretarget_actinstance=pub_wf_actinstance.pk_wf_actinstance//由于各表外键约束,自行调节删除顺序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• substring函数中起始位置为1,表示从 头开始
• 对于一些char/varchar的字段的值,即 使是0,1,2…等值,也必须表达 为’0’,’1’,’2’
• 在cast和convert语句中只支持到转换到 字符型、日期型和数字型的转换,且日 期型只支持UFDate的格式,即’YYYY’‘MM’-‘DD’
• 避免隐含的类型转换。例如在where子句 中数值型和字符型的比较。 eg where f_varchar=1
where to_number(f_varchar)=1
• 在子查询中前后必须加上括号, select col1, col2 from tablea where col3 in ( select col4 from tableb where col4>0)
NCSQL开发规范
刘建波
目标
• 重视SQL的开发规范 • 熟悉SQL开发规范
概述
• 书写风格 • 性能优化 • 多数据适配
书写风格
• SQL语句全部使用小写。
• 引用字符时用单引号。如:update testable set idcol=’abcd’。
• 严禁使用select * …….形式的语句,必须 指出select的具体字段,即select col1, col2,… from tablea where …
• 任何对列的操作都将导致表扫描,所以 应尽量将数据库函数、计算表达式不要 出现在操作符的左边。
• Eg.rtrim(a)=:a
• 尽量避免使用order by和group by排序操 作,因为大量的排序操作影响系统性能。 如必须使用排序操作,尽量建立在有索 引的列上
• 对索引列的比较,尽量避免使用NOT 或 !=,可以考虑拆分为几个条件。如 col1 是索引列,条件col1 !=0 可以拆分为 col1 >0 or col1 <0
• 建议每条SQL 语句中in中的元素个数在 1000以下,如果个数超过时候使用临时 表。
• 尽量不使用外连接
• 禁止在一条SQL语句中使用3层以上的嵌 套查询,如果有,请考虑使用临时表或 中间结果集。
• 尽量避免在一条SQL语句中从>5个表中 同时取数,对于仅是作为过滤条件关联, 但不涉及取数的表,不参与表个数计算;
• 避免在where使用'1=1','1=2'这种表达式作 为部分条件,如 select col1, col2 from tablea where 1=1 and col1 >0。
• 禁止使用视图
性能方面
• 尽量使用prepareStatement,利用预处理修改、删除时, 建议使用批处理功能,批处理的次数以 整个SQL语句不超过相应数据库的SQL语 句大小的限制为准。
• 不能通过来percent n 限制查询结果集 的记录数,也不能使用 select top n 的语句
• join 与on 必须严格匹配,不允许出现 没有on的join
• join…on 后面慎用 or,如果用到,请把 or的范围用( )括起来
• 不能使用select into 的格式
•
• 如果有多表连接时,应该有主从之分, 并尽量从一个表取数, 如select a.col1, a.col2 from a join b on a.col3=b.col4 where b.col5 = ‘a’
多数据库的考虑
• 字符串连接必须用“||”符号,不使用 “+”
• 通配符不能使用‘[a-c]%’这种形式,应 写成如:select col1, col2 from table_name where col1 like ‘a%’ OR col1 like ‘b%’ OR col1 like ‘c%’ 。
• 左连接的写法必须带“outer”关键字。 例如: select f1 from t1 left outer join t2 on t1.f1 = t2.f1;而不是: select f1 from t1 left join t2 on t1.f1 = t2.f1。
• 只能使用以下函数,如要使用新的函数 必须申报,审批后才能使用。函数: coalesce, cast, len, left, replace, right, substring, lower, upper, ltrim, rtrim, abs, acos, asin, atan, cos, ceiling, exp, floor, log, power, round, sign,sin, square, sqrt, tan, count, max, min, sum, avg。
• • • • • • • • • • • •
在Case when语句中只能出现 =、>=、<= 以及is null运算符,不能出 现 <、>、<>、!=、以及is not null运算符。 否则在Oracle的decode函 数无法表达。 当必须使用 <, >, != ,is not null时,建议采用如下变通方法: 1)使用 !=时:例如 case when A!=B then e, 可改为 : case A=b then e1 else e (间接实现 A!=B) 2)使用 < 时:例如 case when A<B then e, 可改为 : case A<=b then case A=B then e1 else e (间接 实现 A<B) 或 case A>=b then e1 else e (间接实现 A<B) 3)使用 > 时:例如 case when A>B then e, 可改为 : case A>=b then case A=B then e1 else e (间 接实现 A>B) 或 case A<=b then e1 else e (间接实现 A>B) 4)使用 is not null 时:例如 case when A is not null then e, 可改为: case A is null then e1 else e (间接实现 A is not null) 特别说明:当执行大数据量的操作时,sql Server 对 case when 的 执行效率极低,甚至可能会死机,因此希望大家尽量不要使用case when。
谢 谢!
• 严禁使用 insert into table values(?,?,?),必 须指出具体要赋值的字段,即 insert into tablea (col1, col2,…) values(?,?,…)
• SQL语句包含多表连接时,建议对每个 表命名别名,对每个字段的使用都要带 上表别名,即 select a.col1, a.col2, b.col3 from tablea a, tableb b where a.col4=b.col5