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标准的不断完善和发展也为数据库技术的进一步创新提供了基础和支持。
- 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