sql规范
- 格式:docx
- 大小:45.46 KB
- 文档页数:10
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注入攻击。
SQL规范(整理)尽量不在数据库做运算,复杂的运算移到程序端CPU,尽可能简单应用MySql一年内的单表数据量预估:纯int不超过1000万,含char不超过500万合理分表:userId、date、area,建议单个数据库不超过300-400张表表字段数量少而精:IO高效、全局遍历、表修复快、提高并发、alter table,单表字段上限控制在20-50尽量满足三范式,适当时牺牲范式、加入冗余尽量少的或者避免使用:大SQL、大事务、大批量tinyint(1byte)smallint(2byte)mediumint(3byte)int(4byte)bigint(8byte)float(4byte)double(8byte)糟糕的用法:int(1)、bigint auto_increment、decimal(18,0)数字型比字符串型索引:更高效、查询更快、占用空间更小举个栗子:复选个人喜好时,可用喜好索引作为二进制数转十进制数存数据库优先使用枚举类型enum(可能值一直或者有限),enum占用1byte,tinyint也不错避免使用null字段,null列加索引需要额外的空间、含null复合索引无效尽量不用并拆分text/blob。
text类型效率远远低于varchar若必须使用可拆分到单独表中举个栗子:id int,data text避免在数据库存储图片谨慎合理使用索引:改善查询、减慢更新、索引不是越多越好不在索引列进行数学运算或者函数运算:where id+1=123 改成where id=123-1主键值不应该更新或者修改,忌用字符串作为主键,推荐使用独立业务的auto_increment 列或全局ID生成器做代理主键(oracle的sequence)尽量不用外键,由程序保证约束大SQL拆分为几个小SQL:小SQL缓存命中率更高,减少锁表时间特别是MyISAM,可能一条大SQL就能把整个数据库堵死保持事务(连接)短小精悍:即开即用、用完即关,与事务无关的操作放到事务外面、减少锁资源的占用,不破坏一致性的前提下、使用多个短事务代替长事务举个栗子:发帖时文件先上传,返回文件名称再提交表单数据尽可能少用存储过程、尽可能少用触发器、减少使用MySQL函数对结果进行处理,由代码处理尽量不用select *,只取需要的数据列,使用select/join减少临时表生成改写or为in:or效率O(n)、in效率O(Log n),注意控制n个数,建议小于200改写or为union:减少对不用字段的or查询举个栗子:where id=1 or cid=2 改成where id=1 union where cid=2避免负向查询:not in、<>、not like避免%前缀模糊查询:使用不了索引、导致全表扫描count(*)资源占用大,尽量少用推荐使用分页语句:limit 10,10 改成where id>10 limit 10同数据类型列值比较:where remark=123 改成where remark=‘123’避免在程序端对数据库显示加锁:外部锁对数据库不可控、高并发是灾难、极难调试和排查。
【转】sql表及字段命名规范1.数据库表命名规范:(1)表名前应该加上前缀,表的前缀⼀个⽤系统或模块的英⽂名称缩写,前缀全部⼤写或⾸字母⼤写,表名中包含的单词⾸字母⼤写。
(2)数据库表名应该有意义,并且易于理解,最好使⽤可以表达功能的英⽂单词或缩写,如果⽤英⽂单词表⽰,建议使⽤完整的英⽂单词。
(3)表名不可以太长,最好不要超过3个英⽂单词长度(22个字母)。
(4)在数据库表命名时应该⽤英⽂单词的单数形式,如员⼯表命名:应该为Employee⽽不是Employees .(5)如果是后台表命名时应该在表名基础上加上后缀_b(back ⾸字母 )(6)在表创建完成前,应该为表添加表的注释。
2.表字段命名规范:(1)数据库表字段应该是有意义⽽且易于理解的,最好是能够表达字段含义的英⽂字母(有⼈认为如果⽤英⽂单词作为字段,因为翻译⼯具不同,⽽字段不统⼀建议使⽤汉语拼⾳⾸字母缩写;有⼈认为⽤汉语拼⾳缩写看起来不直观,⽼半天也不知道到底这个字段是⼲什么的)(2)系统中所有属于内码,即仅⽤于标识唯⼀性和程序内部⽤到的标识性字段,字段名称建议取为 ID,采⽤类型为整型或长整型.(3)系统中属于是业务内的编号字段,代表⼀定业务信息,建议字段命名为code , 如⼯作单编号wf_code .(4) 不要在数据库表字段(列名)中包含数据类型,如:datetime(5)不要在数据库表字段(列名)命名时重复表名,可以使⽤表名⾸字母(不包含数据库表名前缀)注意:不要在数据库表字段(列名)命名时不建议使⽤数据库关键字,如:name,time ,datetime password 等3.表设计规范:(1)所有字段在设计时,除以下数据类型timestamp、image、datetime、smalldatetime、uniqueidentifier、binary、sql_variant、binary、varbinary外,必须有默认值。
一、SQL书写规范1、语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留字大写。
2、连接符or、in、and、以及=、=等前后加上一个空格。
3、对较为复杂的sql语句加上注释,说明算法、功能。
注释风格:注释单独成行、放在语句前面。
(1) 应对不易理解的分支条件表达式加注释;(2) 对重要的计算应说明其功能;(3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明;(4) 每条SQL语句均应有注释说明(表名、字段名)。
(5) 常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)(6) 可采用单行/多行注释。
(-- 或/* */ 方式)4、SQL语句的缩进风格(1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进(2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。
5、多表连接时,使用表的别名来引用列。
6、供别的文件或函数调用的函数,绝不应使用全局变量交换数据;7、变量令名不能超出ORACLE的限制(30个字符),令名要规范,要用英文令名,从变量上能看到变量的作用,如g名称全局变量m名称局部变量c名称光标p名称参数8、查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有列名。
要清楚明白地使用列名,而不能使用列的序号。
9、功能相似的过程和函数,尽量写到同一个包中,加强管理。
如例(1)二、书写优化性能建议1、避免嵌套连接。
例如:A = B and B = C and C = D2、where条件中尽量减少使用常量比较,改用主机变量3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。
4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。
如必须使用排序操作,请遵循如下规则:(1) 排序尽量建立在有索引的列上。
sql语言的标准一、概述SQL(StructuredQueryLanguage)是一种用于管理关系数据库系统的标准语言。
它被广泛用于各种数据库管理系统,如MySQL、Oracle、SQLServer等。
本标准旨在规范SQL语言的使用和行为,以确保在不同的数据库管理系统之间的一致性和互操作性。
二、语法规则1.语句结构:SQL语句通常以一个或多个关键字开头,后面跟着表名、列名、条件、操作符和值等元素。
语句以分号结尾。
2.关键字:SQL关键字用于指定操作类型,如SELECT、INSERT、UPDATE、DELETE等。
3.表格和列:表格是SQL中的基本数据结构,由列和行组成。
列名是表格中每个单元格的名称,行是表格中的数据单元。
4.条件:条件用于筛选表格中的数据。
常用的条件包括等于、不等于、大于、小于、包含等。
5.操作符:操作符用于执行各种数据操作,如加法、减法、乘法、除法等。
6.排序和分组:SQL支持对表格数据进行排序和分组,以便对数据进行更高级的查询和分析。
三、标准内容1.语法规则:详细描述SQL语句的语法结构,包括关键字、表格和列的命名规则、条件和操作符的使用方法等。
2.数据类型:定义SQL支持的数据类型,包括数字、字符串、日期等。
3.查询语句:规定如何使用SELECT语句从表格中检索数据,包括通配符的使用、聚合函数的使用等。
4.插入语句:规定如何使用INSERT语句向表格中插入数据。
5.更新语句:规定如何使用UPDATE语句修改表格中的数据。
6.删除语句:规定如何使用DELETE语句删除表格中的数据。
7.事务处理:规定如何使用事务来确保数据库操作的原子性、一致性和隔离性。
8.安全性:规定如何使用SQL语句来保护数据库的安全性,包括用户身份验证、权限管理等。
9.性能优化:提供一些优化SQL语句的建议,以提高查询性能和响应速度。
四、标准实施1.数据库管理系统开发商:数据库管理系统开发商应遵循本标准,确保其产品支持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 = D2、where条件中尽量减少使用常量比较,改用主机变量3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。
4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。
如必须使用排序操作,请遵循如下规则:(1) 排序尽量建立在有索引的列上。
(2) 如结果集不需唯一,使用union all代替union。
5、索引的使用。
(1) 尽量避免对索引列进行计算。
如对索引列计算较多,请提请系统管理员建立函数索引。
(2) 尽量注意比较值与索引列数据类型的一致性。
(3) 对于复合索引,SQL语句必须使用主索引列(4) 索引中,尽量避免使用NULL。
SQL及其规范SQL及其规范SQL(Structured Query Language结构化查询语⾔)是⼀种数据库查询语⾔和程序设计语⾔,主要⽤于管理数据库中的数据,如存取数据、查询数据、更新数据等。
SQL是专为数据库⽽建⽴的操作命令集,是⼀种功能齐全的数据库语⾔。
在使⽤它时,只需要发出"做什么"的命令,"怎么做"是不⽤使⽤者考虑的。
SQL功能强⼤、简单易学、使⽤⽅便,已经成为了数据库操作的基础,并且现在⼏乎所有的数据库均⽀持SQL。
<1> 在数据库系统中,SQL语句不区分⼤⼩写。
但字符串常量区分⼤⼩写。
建议命令⼤写,表名库名⼩写;<2> SQL语句可单⾏或多⾏书写,以";"结尾。
关键词不能跨多⾏或简写。
<3> ⽤空格和缩进来提⾼语句的可读性。
⼦句通常位于独⽴⾏,便于编辑,提⾼可读性。
SELECT * FROM tb_tableWHERE NAME="YUAN";<4> 注释:单⾏注释:--多⾏注释:/*......*/<5>SQL语句可以折⾏操作<6>SQL语⾔由DDL,DML,DQL和DCL组成(1)数据库定义语⾔(Data Definition Language,DDL)数据库定义语⾔主要⽤于定义数据库、表等,其中包括CREATE语句、ALTER语句和DROP语句。
CREATE语句⽤于创建数据库、数据表等,ALTER语句⽤于修改表的定义等,DROP语句⽤于删除数据库、删除表等。
(2)数据库操作语⾔(Data Mabipulation Language,DML)数据库操作语⾔主要⽤于数据库进⾏添加、修改、删除操作,其中包括INSERT语句、UPDATE语⾔和DELETE语句。
INSERT语句⽤于插⼊数据,UPDATE语句⽤于修改数据,DELETE语句⽤于删除数据。
标准化sql语言
标准化SQL语言通常是指对SQL语言进行规范化,使之符合SQL标准。
SQL(Structured Query Language)是一种用于管理和操作关系型数据库的语言,它定义了一套规范和语法来执行数据库操作。
以下是一些常见的标准化SQL语言规范:
1. SQL语句大小写不敏感:标准化的SQL语言通常不区分大小写。
例如,SELECT和select被视为相同的关键字。
2. 关键字的使用:标准化SQL语言中,关键字应使用大写。
例如,SELECT、INSERT、UPDATE等关键字必须大写。
3. 函数和操作符的使用:标准化SQL语言中,函数和操作符的名称应使用小写。
例如,sum、avg、count等函数应使用小写字母。
4. 表和列的命名:标准化SQL语言中,表和列的命名应使用小写字母,并使用下划线分隔单词。
例如,employee_details 表和first_name列。
5. 语句的分隔符:标准化SQL语言中,语句的分隔符通常是分号(;),表示一个语句的结束。
6. 缩进和格式化:标准化SQL语言中,使用缩进和适当的格式化来增加查询的可读性。
7. SQL注释:标准化SQL语言中,使用双横线(--)或/* ... */表示注释。
注释可以提供对查询的解释和说明。
总之,标准化SQL语言的目的是增加代码的可读性,并使其符合SQL标准。
这可以提高代码的维护性,并使其在不同的数据库管理系统中具有更好的兼容性。
sql规则的定义SQL(Structured Query Language)规则是用于管理关系型数据库的一套标准语言和语法。
以下是SQL 规则的一些关键定义:1. 语法结构:SQL 语句通常由关键字、操作符、标识符、常量和变量组成。
关键字用于指定语句的类型和功能,如`SELECT`、`INSERT`、`UPDATE`和`DELETE`。
操作符用于连接和操作数据,如`+`、`-`、`*`、`/`等。
标识符用于引用数据库对象,如表名、列名。
常量和变量用于表示固定值和可变化的值。
2. 数据类型:SQL 定义了多种数据类型,以表示不同类型的数据,例如整数、浮点数、字符串、日期等。
每种数据库管理系统可能会有自己特定的数据类型,但通常都会遵循类似的基本类型。
3. 语句类型:SQL 包括多种语句类型,用于对数据库进行操作。
常见的语句类型包括:- 查询语句(SELECT):用于从数据库中检索数据。
- 插入语句(INSERT):用于将新数据插入到数据库表中。
- 更新语句(UPDATE):用于修改数据库表中的现有数据。
- 删除语句(DELETE):用于从数据库表中删除数据。
- 创建语句(CREATE):用于创建数据库对象,如表、索引等。
- 修改语句(ALTER):用于修改数据库对象的结构。
- 控制语句(CONTROL):如`IF`、`WHILE`等,用于控制程序流。
4. 完整性约束:SQL 支持定义数据库表的完整性约束,以确保数据的一致性和正确性。
常见的完整性约束包括主键约束、唯一约束、外键约束、非空约束等。
5. 表达式和函数:SQL 允许使用表达式和函数来操作和计算数据。
表达式可以包括常量、变量、操作符和函数调用。
SQL 还提供了许多内置函数,用于执行各种数据操作和计算。
6. 事务管理:SQL 支持事务,它是一组相关操作的集合,要么全部成功,要么全部失败。
事务可以确保数据的一致性和可靠性。
这些是SQL 规则的一些基本定义,但具体的SQL 语言和数据库管理系统可能会有自己的特定规则和扩展。
sql表命名规则SQL表命名规则是数据库设计中的重要部分,它有助于保持数据的清晰、一致和易于理解。
一个好的表名应该简洁、有意义,并且遵循一定的命名规范。
以下是一个关于SQL 表命名规则的介绍,涵盖了常见的命名约定、最佳实践以及一些示例。
一、命名约定1. 使用小写字母:大多数数据库系统对大小写敏感,因此建议使用小写字母来命名表。
这样可以避免在不同系统之间出现大小写不一致的问题。
2. 使用下划线分隔单词:为了提高可读性,建议使用下划线(_)来分隔多个单词。
例如,`users_profile`。
3. 避免使用特殊字符:避免在表名中使用特殊字符,如空格、标点符号等。
特殊字符可能会引起查询错误或混淆。
4. 避免使用保留字:避免使用数据库系统的保留字作为表名。
保留字是数据库系统预定义的、具有特殊意义的词汇,如`SELECT`、`FROM`等。
5. 使用前缀或后缀:为了区分不同的表或表类型,可以使用前缀或后缀来命名表。
例如,`tbl_users`(前缀)或`users_tbl`(后缀)。
二、最佳实践1. 保持简洁:表名应该简洁明了,避免使用过长的名称。
过于复杂的名称会使查询和维护变得困难。
2. 使用有意义的名称:表名应该描述表中存储的数据内容或相关属性。
避免使用无意义或抽象的名称。
3. 避免使用数字或符号:避免在表名中使用数字或符号,除非有特殊需求。
数字和符号可能会使查询变得复杂,并且难以阅读和理解。
4. 使用单数或复数形式:根据数据库系统的语法规则和编程语言的约定,选择使用单数或复数形式来命名表。
确保在整个数据库设计中保持一致。
5. 避免使用下划线开头的名称:在某些数据库系统中,以下划线开头的名称可能会被视为私有字段或隐藏字段。
因此,避免在表名中使用下划线开头。
三、示例以下是一些示例,展示了符合SQL表命名规则的表名:1. 用户信息表:`users_info`2. 产品分类表:`products_categories`3. 订单明细表:`orders_details`4. 员工薪资表:`employees_salaries`5. 客户反馈表:`customer_feedback`这些示例遵循了上述的命名约定和最佳实践,使得表名简洁明了、有意义且易于理解。
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标准分为三个主要部分:一级、二级和三级范式。
1. 一级范式(1NF):这是最基础的范式,要求表中的每个列都是不可分割的最小单元,并且每个表都必须有一个唯一的主键。
2. 二级范式(2NF):在满足一级范式的基础上,要求表中的每个非主键列完全依赖于主键。
换句话说,一个表应该具有一个唯一的主键,并且所有其他列都直接依赖于主键。
例如,一个订单表有订单号、产品ID、数量和价
格等列,其中价格是根据产品ID从另一个表中获取的。
在这种情况下,价
格列不直接依赖于主键订单号,而是依赖于非主键列产品ID,违反了二级
范式。
要满足二级范式,可以将价格这一非主键列分离出来,创建一个产品表,其中包含产品ID和价格,然后通过产品ID将两个表关联起来。
3. 三级范式(3NF):在满足二级范式的基础上,要求消除表中的传递依赖。
换句话说,这意味着任何非主键列都不能依赖于其他非主键列。
以上内容仅供参考,可以查阅SQL相关的书籍或咨询专业的技术人员,获
取更全面准确的信息。
SQL编写规范SQL编写规范1 DML语句1. 【强制】SELECT语句必须指定具体字段名称,禁⽌写成*。
因为select *会将不该读的数据也从MySQL⾥读出来,造成⽹卡压⼒。
且表字段⼀旦更新,但model层没有来得及更新的话,系统会报错。
2. 【强制】insert语句指定具体字段名称,不要写成insert into t1 values(…),道理同上。
3. 【建议】insert into…values(XX),(XX),(XX)…。
这⾥XX的值不要超过5000个。
值过多虽然上线很很快,但会引起主从同步延迟。
4. 【建议】SELECT语句不要使⽤UNION,推荐使⽤UNION ALL,并且UNION⼦句个数限制在5个以内。
因为union all不需要去重,节省数据库资源,提⾼性能。
5. 【建议】in值列表限制在500以内。
例如select… where userid in(….500个以内…),这么做是为了减少底层扫描,减轻数据库压⼒从⽽加速查询。
6. 【建议】事务⾥批量更新数据需要控制数量,进⾏必要的sleep,做到少量多次。
7. 【强制】事务涉及的表必须全部是innodb表。
否则⼀旦失败不会全部回滚,且易造成主从库同步终端。
8. 【强制】写⼊和事务发往主库,只读SQL发往从库。
9. 【强制】除静态表或⼩表(100⾏以内),DML语句必须有where条件,且使⽤索引查找。
10. 【强制】⽣产环境禁⽌使⽤hint,如sql_no_cache,force index,ignore key,straight join等。
因为hint是⽤来强制SQL按照某个执⾏计划来执⾏,但随着数据量变化我们⽆法保证⾃⼰当初的预判是正确的,因此我们要相信MySQL优化器!11. 【强制】where条件⾥等号左右字段类型必须⼀致,否则⽆法利⽤索引。
12. 【建议】SELECT|UPDATE|DELETE|REPLACE要有WHERE⼦句,且WHERE⼦句的条件必需使⽤索引查找。
sql创建规则SQL创建规则一、概述SQL(Structured Query Language)是一种用于管理和操作关系型数据库的语言,它具有创建、查询、更新和删除数据库中数据的能力。
在使用SQL创建规则时,需要遵循一定的规范和约束,以确保数据库的结构和数据的完整性。
二、表的创建规则1. 表名:表名应具有描述性,能够清晰地表达表的含义和作用。
表名应使用大写字母和下划线组成,避免使用特殊字符和空格。
2. 字段名:字段名应具有描述性,能够清晰地表达字段的含义和作用。
字段名应使用小写字母和下划线组成,避免使用特殊字符和空格。
3. 字段类型:根据数据的实际需求,选择合适的字段类型,如整数型、字符型、日期型等。
应避免使用过长或过短的字段类型,以节省存储空间和提高查询效率。
4. 主键:每个表应设置一个主键,用于唯一标识表中的每条记录。
主键应选择字段的唯一且不可更改的属性,如自增长的整数型字段。
5. 约束:根据实际需求,可以为表和字段设置约束,如唯一约束、非空约束等。
约束可以确保数据的完整性和一致性。
三、索引的创建规则1. 索引字段:选择适合作为索引的字段,通常是经常被查询或排序的字段。
应避免过长的字段或含有大量重复值的字段作为索引字段。
2. 索引类型:根据查询需求和数据特点,选择合适的索引类型,如普通索引、唯一索引、组合索引等。
不同的索引类型有不同的使用场景和效果。
3. 索引覆盖:尽可能使用索引覆盖查询,即通过索引就能获取到查询结果,而不需要再访问数据表。
这样可以提高查询效率和减少IO 开销。
四、视图的创建规则1. 视图名称:视图名称应具有描述性,能够清晰地表达视图的含义和作用。
视图名称应使用大写字母和下划线组成,避免使用特殊字符和空格。
2. 视图查询:视图的查询语句应尽量简洁明了,避免使用复杂的连接操作和子查询。
视图的查询结果应与相关数据表的字段对应,确保数据的一致性。
3. 视图更新:视图可更新性应根据实际需求进行设置,可以选择允许或禁止对视图进行更新操作。
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、索引规范在设计阶段,可以根据功能和性能的需求进行初步的索引设计,这里需要根据预计的数据量和查询来设计索引。
➢根据数据量决定哪些表需要增加索引,数据量小的可以只有主键➢在合适的列上创建索引根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、排序的字段作为索引的候选字段。
优化器查找到WHERE子句或连接条件列上的索引,如果可用,可避免全表扫描➢使用窄索引对表编制大量索引会影响 INSERT、UPDATE、DELETE 和 MERGE 语句的性能,因为当表中的数据更改时,所有索引都须进行适当的调整。
例如如果某个列在几个索引中使用且您执行修改该列数据的UPDATE 语句,则必须更新包含该列的每个索引以及基础的基表(堆或聚集索引)中的该列。
总结A、避免对经常更新的表进行过多的索引,并且索引应保持较窄,就是说,列要尽可能少。
B、使用多个索引可以提高更新少而数据量大的查询的性能。
大量索引,可以提高不修改数据的查询(例如 SELECT 语句的性能)单表索引不能超过六个➢检查索引的数据类型索引列的数据类型也是很重要的。
例如在一个整数键值上的索引查询是非常快的,这是因为int数据类型的尺寸很小,而且算数操纵很容易二、程序书写规范2.1、大小写风格2.2 、注释规范注释总是加在程序的需要一个概括性说明或不易理解或易理解错的地方。
注释应语言简炼、易懂而又准确。
2.2.1、注释的书写规范可采用单行/多行注释。
(-- 或 /* */ 方式)2.2.2、源代码文件的注释✧在文件的头部必须标明程序名称,它所完成的主要功能。
✧文件的作者,及完成时间。
✧文件的状态:测试/未测试。
✧主要修改活动的修改人、时间、简单原因说明列表、版本号。
✧维护过程中需要修改程序时,应在被修改语句前面注明修改时间和原因说明。
例如:/**文件名:功能描述:状态:作者:完成时间:修改时间:修改:修改原因:**/2.2.3、语句注释✧应对不易理解的分支条件表达式加注释;✧不易理解的循环,应说明出口条件(有GOTO的程序还应说明入口条件);✧对重要的计算应说明其功能;✧过长的函数实现,应将其语句按实现的功能分段加以概括性说明;✧供别的文件或函数调用的函数,绝不应使用全局变量交换数据;✧每条SQL语句均应有注释说明2.2.4、常量和变量的注释注释说明放在常量和变量定义语句的后面2.3、缩进规则2.3.1、sql语句的缩进风格✧查询列表的书写风格一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进SELECT col1,col2,....colm,coln,...✧WHERE 子句的书写规范①每个条件占一行②嵌套查询条件书写规范WHERE con1AND con2AND col3NOT IN(SELECT col3FROM t2WHERE......);✧SET/SELECT子句的书写规范每个表达式占一行select@sdate=convert(nvarchar(10),getdate()-1,120)+' 00:00:00', @edate=convert(nvarchar(10),getdate()-1,120)+' 23:59:59',@database='[jumipay_device_dx].[dbo]',@database1='[jumipay_base_dx].[dbo]',2.3.2、控制结构的缩进程序应以缩进形式展现程序的块结构和控制结构。
✧下列保留字的下一行缩进三格BEGIN、THEN、ELSE、ELSIF、LOOP✧下列保留字所在行前移三格END、ELSE、ELSIF、END IF、END LOOP2.4、例子/**文件名:ChageOrder功能描述:在订单支付失败时修改订单状态状态:已测试作者:XX完成时间:2016-10-28修改时间:修改:修改原因:**/create proc[dbo].[ChageOrder]ASDECLARE@sql nvarchar(4000)--执行语句set@sql='update [jmp_order]set o_state=-1-- dateadd(n,-30,getdate()) 获取当前时间减去30分钟的时间 where o_ctime < dateadd(n,-30,getdate())and o_state=0 '-- 修改订单生成日期小于当前时间(减去分钟)以及未支付的订单beginSET NOCOUNT ON;BEGIN tran ok--开始一个事务OKEXEC (@sql)if@@error<>0 --判断修改数据有没有出错begin--如果出错rollback tran-- 回滚事务到endelse--没有出错begincommit tran ok--提交事务endEND;GO三、sql 编程优化规则使用select的时候,避免使用*在解析的时候会将 *,依次转换为所有的列名。
如不需要查询所有的列名应明确列出所需要查询的列名✧COUNT(1) 、COUNT(*)、COUNT(col)A、Count(1)和Count(*) 实际的意思是:评估count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数表上没有主键或者唯一索引,两者都是全表扫描表上有主键或者唯一键索引,两者都是走主键或者唯一索引并没有区别B、Count(col)则是统计 col 列中不为空的总行数,如果没有索引则全表扫描✧Union 和Union ALLUnion:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;Union All:对两个结果集进行并集操作,包括重复行,不进行排序;✧尽量避免在where子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描例如:SELECT a_id,a_user_id,a_nameFROM jmp_appWHERE a_user_id is null可以在 a_user_id 上设置默认值0 ,确保表中a_user_id表没有用 null值然后可以这样查询SELECT a_id,a_user_id,a_nameFROM jmp_appWHERE a_user_id=0即:在where子句中使用is null 或 is not null的语句,引擎将放弃索引✧应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
✧避免使用or 做为索引条件,可以使用UNION代替例如:SELECT a_id,a_user_id,a_name,a_stateFROM jmp_appWHERE a_user_id=65 or a_name='益智乐园'可用下面语句替换SELECT a_id,a_user_id,a_name,a_stateFROM jmp_appWHERE a_user_id=65UNIONSELECT a_id,a_user_id,a_name,a_stateFROM jmp_appWHERE a_name='益智乐园'✧避免在索引列上使用计算和函数WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描例如:SELECT a_id,a_user_id,a_name,a_stateFROM jmp_appWHERE a_id*10>200可以这样写SELECT a_id,a_user_id,a_name,a_stateFROM jmp_appWHERE a_id>200/10即:任何对索引列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
✧In 与between andin会使系统无法使用索引,而只能直接搜索表中的数据如对于连续的数值可以用 between andSELECT a_id,a_user_id,a_name,a_stateFROM jmp_appWHERE a_user_id in(1,2,3,4,5,6,7,8,9,10)可换成SELECT a_id,a_user_id,a_name,a_stateFROM jmp_appWHERE a_user_id between 1 and 10✧In 与EXISTSEXISTS只返回TRUE和False,不返回列表的值。