数据库开发规范
阿里数据库开发规约

阿里数据库开发规约摘要:1.阿里数据库开发规约概述2.数据库架构设计3.数据库表设计4.数据库索引设计5.数据库存储过程和触发器设计6.数据库性能优化7.数据库安全管理8.数据库开发规范正文:阿里数据库开发规约概述阿里数据库开发规约是阿里巴巴针对数据库开发过程中所涉及的各个方面制定的一套规范。
旨在提高数据库开发的效率、保障数据安全、优化数据库性能以及降低维护成本。
本文将从数据库架构设计、数据库表设计、数据库索引设计、数据库存储过程和触发器设计、数据库性能优化、数据库安全管理以及数据库开发规范等方面进行详细阐述。
1.数据库架构设计在数据库架构设计阶段,需要遵循以下原则:- 选择合适的数据库类型,如关系型数据库、NoSQL 数据库等;- 根据业务需求,规划数据库的分布式架构;- 设计合理的数据分区、分表策略,以应对海量数据存储需求;- 确保数据一致性、可用性和可扩展性。
2.数据库表设计在数据库表设计阶段,需要遵循以下原则:- 合理规划表结构,遵循规范化设计原则;- 选择合适的字符集、存储类型等参数;- 设计合适的主键、外键约束,确保数据完整性;- 使用合适的索引策略,提高查询效率。
3.数据库索引设计在数据库索引设计阶段,需要遵循以下原则:- 选择合适的索引类型,如B+树索引、哈希索引等;- 设计合理的索引列顺序,降低查询成本;- 避免过多的索引,以免影响写操作的性能;- 定期分析索引使用情况,进行优化。
4.数据库存储过程和触发器设计在数据库存储过程和触发器设计阶段,需要遵循以下原则:- 使用存储过程封装复杂业务逻辑,提高代码可维护性;- 使用触发器实现数据约束、数据同步等需求;- 避免存储过程和触发器过于庞大,影响性能;- 定期审查存储过程和触发器,进行优化。
5.数据库性能优化在数据库性能优化阶段,需要遵循以下原则:- 对数据库进行定期的性能分析,发现性能瓶颈;- 合理调整数据库参数,提高数据库性能;- 对数据库进行定期的物理优化,如碎片整理、表重组织等;- 优化SQL 语句,提高查询效率。
数据库开发安全规范

数据库开发安全规范1. 密码安全- 使用强密码:密码应包含大小写字母、数字和特殊字符,并且长度应不少于8位。
- 定期更换密码:为了保持数据库的安全性,管理员应定期更换数据库密码。
- 不保存明文密码:开发人员不得将用户密码以明文形式存储在数据库中。
2. 数据备份和恢复- 定期备份数据:管理员应定期备份数据库中的重要数据,以防止数据丢失或损坏。
- 离线备份:备份数据应存储在不同物理位置的离线设备上,以防止数据丢失或被未经授权的访问者篡改。
- 定期测试数据恢复:管理员应定期测试数据库备份的可恢复性,以确保在发生数据丢失时能够快速进行恢复操作。
3. 访问控制- 最小权限原则:管理员应为开发人员分配最小必要权限,以降低数据泄露和滥用的风险。
- 严格权限控制:数据库用户应仅被授予其工作所需的权限,以防止未经授权的访问和数据泄露。
- 监控和审计:管理员应实施日志监控和审计机制,以便及时检测和响应异常访问行为。
4. 网络安全- 防火墙配置:数据库服务器应配置防火墙,限制从外部网络访问数据库的连接。
- 加密通信:数据库的网络通信应使用加密协议,如SSL/TLS,以确保数据在传输过程中的安全性。
- 远程访问限制:禁止未经授权的远程访问数据库,仅允许经过身份验证的用户进行远程访问。
5. 安全审计- 定期安全审计:管理员应定期进行数据库安全审计,包括检查权限配置、访问日志、异常行为等,以发现潜在的安全隐患。
- 及时处理安全漏洞:一旦发现数据库安全漏洞,管理员应立即采取措施进行修复,以防止被黑客利用。
以上是数据库开发安全规范的主要内容。
管理员和开发人员应严格遵守这些规范,以保护数据库中的数据安全和用户隐私。
数据库的设计原则与规范

数据库的设计原则与规范随着信息化的发展,数据库成为了处理和管理数据的重要工具。
在进行数据库设计时,遵循一定的原则和规范可以提高数据库的效率、可靠性和可维护性。
本文将介绍数据库设计的原则与规范,旨在帮助读者建立一个高质量的数据库系统。
一、原则:1. 数据库设计原则的第一个目标是满足用户需求。
在设计数据库时,要深入了解和分析用户的需求,确保数据库可以提供准确、全面和及时的数据,以支持用户的业务需求。
2. 数据库设计原则的第二个目标是简化和标准化。
数据库设计应遵循简单和标准化的原则,避免冗余和重复的数据。
通过正规化过程,将数据拆分为更小的、相互关联的实体,以减少数据存储和维护的开销。
3. 数据库设计原则的第三个目标是保证数据完整性。
数据完整性是指数据库中的数据准确性和一致性。
通过定义适当的主键、外键和约束条件,限制数据的插入、更新和删除操作,确保数据的完整性。
4. 数据库设计原则的第四个目标是提高性能。
在设计数据库时,应考虑通常的查询需求和频率,合理选择和优化索引、视图和查询语句,以提高数据库的查询和处理性能。
5. 数据库设计原则的第五个目标是考虑安全性。
保护数据的安全性是数据库设计不可忽视的方面。
通过权限控制、数据加密和备份策略等措施,保护敏感数据的安全性和机密性。
二、规范:1. 表命名规范:表名应具备描述性,使用英文单词或缩写,避免使用特殊字符和关键词,尽量使用小写字母,可使用下划线分隔单词。
例如,学生表可以命名为 "students"。
2. 字段命名规范:字段名应具备描述性,使用英文单词或缩写,避免使用特殊字符和关键词,尽量使用小写字母,可使用下划线分隔单词。
例如,学生的姓名字段可以命名为 "student_name"。
3. 数据类型规范:选择合适的数据类型来存储不同类型的数据,以节省空间和提高查询性能。
例如,使用整数类型来存储整数值,使用字符类型来存储文本值。
数据库标准规范(两篇)2024

数据库标准规范(二)引言:数据库是当代信息系统中关键的存储和管理数据的工具,数据库标准规范的制定对于确保数据的一致性、完整性和可靠性至关重要。
本文将详细阐述数据库标准规范的五个大点,包括数据库设计、数据模型、数据操作、数据存储和数据安全。
概述:在数据库标准规范中,数据库设计是基础,决定了整个数据库系统的架构和功能。
数据模型定义了数据的结构和属性,数据操作确定了对数据库的增删改查操作,数据存储指定了数据的物理存储方式,数据安全保证了数据库的安全性和可用性。
正文内容:一、数据库设计1. 定义数据库设计的目标和要求,包括数据的一致性、可扩展性和易用性。
2. 建立数据库的概念模型,包括实体关系模型、关系模型和层次模型。
3. 制定数据库设计的规范和准则,确保数据库结构的一致性和易维护性。
4. 设计数据库的表结构,包括表的字段、属性和约束等。
5. 定义数据库的索引和视图,提高数据库的查询和操作效率。
二、数据模型1. 介绍常用的数据模型,包括层次模型、网络模型、关系模型和面向对象模型。
2. 选择合适的数据模型,根据数据库的特点和应用需求进行权衡。
3. 设计数据模型的实体和属性,确保数据的准确性和完整性。
4. 定义数据模型之间的关系,包括一对一、一对多和多对多关系。
5. 使用标准的建模工具和方法,对数据模型进行建模和验证。
三、数据操作1. 定义数据操作的目标和要求,包括数据的增加、删除、修改和查询。
2. 设计数据操作的接口和功能,提供简单易用的操作方式。
3. 制定数据操作的规范和约束,确保数据的一致性和安全性。
4. 优化数据操作的性能,提高查询和更新的效率。
5. 实现数据操作的事务管理和并发控制,确保数据的一致和可靠。
四、数据存储2. 设计数据的物理存储结构,包括数据文件、表空间和数据块等。
3. 制定数据存储的规范和准则,确保数据的安全和可靠。
4. 实施数据存储的备份和恢复策略,保护数据的完整性和可用性。
5. 优化数据存储的性能,提高数据访问的效率和响应速度。
数据库规范的说明书

数据库规范的说明书一、引言数据库规范是为了保证数据在数据库中的存储、检索和管理过程中的一致性、有效性和安全性。
本文档旨在说明数据库规范的相关内容,包括数据库设计、命名规范、数据类型、索引、约束和备份等。
二、数据库设计规范1. 数据表设计原则- 保持表的简洁性,每个表只包含一类相关数据- 使用主键来唯一标识每个表中的记录- 避免使用过多的冗余字段- 使用关联表来处理多对多的关系2. 数据表命名规范- 表名应以可读性强、描述性好的词语命名- 使用小写字母和下划线来分隔单词- 避免使用保留字或关键字作为表名3. 字段命名规范- 字段名应具有描述性,能够清晰表达字段所代表的含义- 使用小写字母和下划线来分隔单词- 避免使用缩写或无意义的字段名4. 数据类型选择- 根据数据的性质选择适当的数据类型,避免过度浪费存储空间 - 使用整型或日期时间类型来存储数值和日期时间数据- 使用字符类型来存储文本数据,考虑字符集和长度限制三、索引规范1. 索引的选择原则- 对于经常需要进行查询或排序的字段,考虑创建索引以提高检索效率- 避免在更新频繁的字段上创建索引,以减少索引维护开销- 在联合查询中,根据查询条件的频率和选择性来选择合适的索引类型2. 索引的创建和维护- 对于大型表,避免创建过多的索引,以减少磁盘空间占用- 定期对索引进行优化、重建和碎片整理,以保持索引的高效性四、约束规范1. 主键和唯一约束- 每个表应有唯一的主键来标识记录- 对于唯一性要求的字段,使用唯一约束来确保数据的唯一性2. 外键约束- 对于存在关联关系的表,使用外键来建立表之间的关联- 定义外键时,确保在相关表中存在对应的主键或唯一约束3. 检查约束- 使用检查约束来限制字段取值的范围或满足特定条件五、备份和恢复规范1. 定期备份数据- 根据数据的重要性和变动频率,制定备份策略(如每日全量备份和定期增量备份)2. 测试备份和恢复过程- 定期测试备份文件的完整性和可用性- 针对数据库故障情况,进行恢复的演练和测试六、安全规范1. 用户权限管理- 分配合适的权限给不同的用户,确保数据的安全性- 定期审查和更新用户权限,避免权限滥用2. 数据备份和恢复的安全- 将备份文件存储在安全的位置,防止数据泄露或损坏- 加密敏感数据,确保数据在备份和恢复过程中的安全性七、总结本文档详细说明了数据库规范的相关内容,包括数据库设计、命名规范、数据类型、索引、约束和备份等。
阿里数据库规范

阿里数据库规范阿里数据库规范是阿里巴巴集团内部制定的一套数据库设计和管理的规范,旨在提高数据库的性能、可伸缩性和可靠性。
以下是阿里数据库规范的主要内容:1. 数据库设计规范:- 表结构规范:规定表名、字段名的命名规范,避免使用保留字和特殊字符,命名应清晰易懂。
- 数据类型规范:选择适合业务的数据类型,减少存储空间和提高查询性能。
- 索引规范:根据查询需求和数据访问模式,合理设计索引以提高查询效率。
- 主键规范:每个表必须有主键,且主键应简单、稳定、唯一。
- 外键规范:明确外键关系,保持数据的完整性。
- 视图规范:视图应尽量避免复杂计算,以提高查询性能。
2. 数据库操作规范:- SQL编写规范:SQL语句应简洁明了,避免使用SELECT *,尽量减少IO次数。
- 事务规范:合理划分事务边界,减少事务锁竞争,尽量缩短事务执行时间。
- 并发控制规范:选择合适的事务隔离级别,避免死锁和性能问题。
- 锁规范:减少锁的数量和持有时间,以提高并发性和数据库性能。
- 存储过程规范:存储过程应尽量简单,避免过多的逻辑和计算。
3. 数据库连接规范:- 连接池规范:使用连接池管理数据库连接,减少连接的创建和销毁开销。
- 连接参数规范:合理配置数据库连接参数,包括连接数、超时时间等。
- 连接关闭规范:及时关闭无用的数据库连接,避免连接泄漏和资源浪费。
4. 数据库备份和恢复规范:- 定期备份规范:按照业务需求制定备份策略,包括全量备份和增量备份。
- 备份校验规范:定期验证备份文件的完整性和可恢复性。
- 灾备规范:建立灾备机制,保证数据的容灾和可用性。
5. 监控和优化规范:- 监控规范:实时监控数据库的性能指标,包括CPU使用率、磁盘使用率、内存使用率等。
- 优化规范:根据实际情况,进行索引优化、查询优化、存储优化等工作。
- SQL审查规范:定期审查和优化慢查询语句,排除性能问题。
总结起来,阿里数据库规范是一套包括数据库设计、操作、连接、备份恢复、监控和优化等方面的规范。
oracle数据库开发规范

编程规范1:所有数据库关键字和保留字都大写;字段、变量的大小写2:程序块采用缩进风格书写,保证代码清晰易读,风格一致,缩进格数统一为2/4个。
必须使用空格,不允许使用【tab】键。
3:当同一条语句暂用多于一行时,每行的其他关键字与第一行的关键字进行右对齐。
4:不允许多个语句写到一行,即一行只写一条语句。
5:避免把复杂的SQL语句写到同一行,建议要在关键字和谓词处换行。
6:相对独立的程序块之间必须加空行。
BEGIN、END独立成行。
7:太长的表达式应在低优先级操作符处换行,操作符或关键字应放在新行之首。
不同类型的操作符混合使用时,用括号隔离,使得代码清晰。
8: 不同类型的操作符混合使用时,应使用括号明确的表达运算的先后关系。
9:运算符以及比较符左边或者右边只要不是链接的括弧,则空一格。
10:if 后的条件要用括号括起来,括号内每行最多两个条件。
11:减少控制语句的检查次数,如在else( if..else)控制语句中,对最常用符合条件,尽量往前被检查到。
尽量避免使用嵌套的if 语句,在这种情况应使用多个if 语句来判断其可能。
命名规范1:不使用数据库关键字和保留字,为了避免不必要的冲突和麻烦。
2:严禁使用带空格的名称来给字段和表命名,会出错误而终止。
3:用户自定义数据库对象:表,视图,主外键,索引,触发器,函数,存储过程,序列,同义词,数据库连接,包,包体风格要保持一致。
数据库名称1-8个字符,其他对象1-30个字符,数据库连接不操过30个字符。
使用英文字母、数字、下划线。
除表外,其他对象命名最好用不同的前缀来区别。
表tbl_/t_视图v_序列seq_簇c_触发器trg_存储过程sp_/p_函数f_/fn_物化视图mv_包和包体pkg_类和类体typ_主键pk_外键fk_唯一索引uk_普通索引idx_位图索引bk_4:PL/SQL对象和变量命名规则输入变量i_输出变量o_输入输出变量io_普通变量v_全局变量gv_常量大写游标cur_用户自定义类型type_保存点spt_不允许使用中文和特殊字符用户对象命名应全部为小写,且不允许使用控制符号强制转换对象为小写字符变量命名,要有具体含义,能表明变量类型。
XX集团数据库开发设计规范

xx数据库开发设计规范第一章总则第一条为了规范集团公司数据格式,提高数据库设计的合理性和数据访问高效性,同时便于阅读和理解数据库的结构,以提高各子集团之间数据共享的质量和效率,促进数据库编码的标准化,特制定本规范。
第二条本规范由集团总公司信息管理部负责制定和修改,最终解释权由集团总公司信息管理部所有。
第三条本规范适用于集团总公司及各子集团及其下属子公司所有包含数据库开发的软件开发项目。
第二章设计规范第四条数据库规范:建议使用Oracle,Sql Server等主流的数据库,禁止使用任何开源数据库(MySql等)。
第五条表设计规范:(一)一行记录必须表内唯一,所有表必须必须有主键。
(二)尽量少使用数据库外键,如有外键完整性约束时,尽量使用程序控制)(三)新加的表,所有字段禁止NULL。
(四)在表创建完成前,应该为表添加表的注释,对表中字段也要有相应的注释和说明第六条索引设计规范:(一)表中索引的数量最好控制在5个以内。
(二)一个索引关联的字段在5个以内。
(三)禁止在更新十分频繁、或者区分度不高的属性上建立索引。
(四)建立组合索引,必须把区分度高的字段放在前面。
第七条字符设计规范:(一)字符类型建议采用varchar/nvarchar数据类型(二)手机号采用varchar(20)进行存储(三)金额货币采用money或者number数据类型(四)科学计数采用numeric数据类型(五)自增长标识采用bigint数据类型(数据量一大,用int类型就装不下,那以后改造就麻烦了) (六)时间类型建议为datetime数据类型,对于日期类型的建议采用date数据类型(七)禁止使用text、ntext、image等老的数据类型(八)禁止使用xml数据类型、varchar(max)、nvarchar(max)第八条SQL查询设计规范:(一)禁止在数据库做复杂运算,例如XML解析,字符串相似性比较,字符串搜索等。
(二)禁止使用SELECT *(三)禁止在索引列上使用函数或计算(四)尽量避免使用游标(五)尽量避免使用触发器(六)禁止在查询里指定索引(七)变量/参数/关联字段类型原则上要求与字段类型一致(八)参数化查询(九)限制JOIN个数,单个SQL语句的表JOIN个数不能超过5个。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
项目一部数据库开发规范注:对该文件内容增加、删除或修改均需填写此变更记录,详细记载变更信息,以保证其可追溯性。
1.命名规范1.1.对象新建的表,存储过程,包等要遵循以下规则1.2.表表名不得超过30个字母,全部采用大写字母,表的命名可以如下:模块缩写名_表的名称,如RES_NODE代表资源模块的节点; 值班: DUTY_CALENDAR。
1.3.字段名称字段名不得超过30个字母,必须以英文单词构成,每个单词之间以下划线隔开,全部采用大写字母。
对复杂的大型应用系统而言,必须建立表名和字段名的数据字典,并附于开发规范附录中,在命名时必须严格遵守数据字典。
2.数据库对象管理2.1.一般规定数据库所有对象,包括表、视图、主键、索引、序列、存储过程、包等必须在数据库建模工具中进行管理并保持与数据库完全同步。
2.2.大小写在数据库模型、数据库脚本中,所有对象,包括表、视图、主键、索引、序列、存储过程、包等名称必须大写。
3.语句书写规范3.1.尽量不使用某种数据库的特有功能为了保持可移植性,尽量不使用某种数据库的特有功能,如SQL Server专用的Unique ID, Oracle专用的Sequence的功能;3.2.查询sql语句尽量使用绑定变量3.3.尽最大可能不使用通配符在SQL语句中,LIKE关键字支持通配符匹配,但这种匹配特别耗费时间。
如:SELECT A FROM ABC WHERE A LIKE 'M%' 。
在A字段上建立了索引。
把语句改为SELECT A FROM ABC WHERE A >'M' AND A <'N',在执行查询时会利用索引以提高响应速度。
使用*通配符必须事先征得项目开发负责人同意。
3.3.1Distinct使用distinct会增加查询和I/O的操作次数。
应当避免使用distinct关键字。
3.3.2嵌套查询SELECT A FROM CMS_USER WHERE USER_NAME IN ( SELECTUSER_NAME FROM CMS_DEPARTMENT WHERE DEPARTMENT=’电子办’)如果我们用连接来代替,且表关联放在条件语句的最后部。
即:SELECT A FROM CMS_USER,CMS_DEPARTMENT WHERECMS_DEPARTMENT .DEPARTMENT=’电子办’ ANDCMS_DEPARTMENT .USER_NAME = CMS_ER_NAME 将提高一定的效率。
查询嵌套层次越多,效率越低。
应当尽量避免子查询。
如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
3.3.3排序利用索引自动以适当的次序输出时,可以避免对表中数据排序,当以下的情况发生时,排序就不能省略:➢索引中不包括一个或几个待排序的列;➢group by或order by子句中列的次序与索引的次序不一样;➢排序的列来自不同的表。
正确地增建索引、合理地合并数据库表,可以避免不必要的排序。
如果排序不可避免,那么应当试图简化它,如缩小排序列的范围等。
3.3.4UNION如果不过滤多表中的重复数据,请使用UNION ALL;如果过滤多表中的重复数据,请使用UNION。
3.3.5长语句避免使用很长、很复杂的查询语句,如果有特殊需求必须书写较长的SQL语句,应该把语句分解成若干部分,每一部分形成一个存储过程或函数。
3.3.6大表尽可能使用分区大表分区:超过1G的表尽可能使用分区,分区的原则和尽可能和维护该表的机制结合起来。
比如:保留10天数据,每天删除10天前的一天数据,在删除数据的时候,可以采用采用alter table table_name truncate partition partition_name,而后alter table table_name drop partition partition_name;这里不直接使用drop的原因是减小数据库的开销。
Truncate 是在秒的级别中完成。
3.3.7其他注意事项1)在条件语句中,如 Where a.s=b.c 中将记录少的表放在等号的前部。
表关联条件放在语句的最后部。
2)不使用容易与系统关键字重复的单词来命名,如ID,DATE等,但可以使用如NODEID,BUYDATE等可以来命名;3)SQL语句用大写字母(字段中的内容除外);4)编写ddl和dml时,每个语句后面必须加上分号;5)对于定期增加性的性能数据表,必须建立有效的索引;6)查询语句的Where语句必须落在索引上。
4高效的sql语句4.1Sql优化方法RBO(rule-based optimizer)CBO4.1.1驱动表1)2张行数不一致的表连接表TAB1行数:16,384行表TAB2行数:1行×SELECT COUNT(*) FROM TAB2, TAB1;○SELECT COUNT(*) FROM TAB1, TAB2;2)3张表连接×SELECT *FROM EMP E,LOC L,CAT CWHERE E.emp_no BETWEEN 1000 AND 2000AND E.cat_no = C.cat_noAND E.locn = L.locn;○SELECT *FROM LOC L,CAT C,EMP EWHERE E.emp_no BETWEEN 1000 AND 2000AND E.cat_no = C.cat_noAND E.locn = L.locn;4.1.2Where语句顺序的效率1)使用索引引起的where语句效率使用AND语句时行数多的放在前面×SELECT *FROM emp EWHERE emp_sal > 50000AND emp_type = 'MANAGER'AND 25 < (SELECT COUNT(*) FROM EMP WHERE emp_mgr= E.emp_no);○SELECT *FROM emp EWHERE 25 < (SELECT COUNT(*) FROM EMP WHEREemp_mgr = E.emp_no)AND emp_sal > 50000AND emp_type = 'MANAGER';使用OR语句时,行数多的放在后面×SELECT *FROM emp EWHERE 25 < (SELECT COUNT(*) FROM EMP WHEREemp_mgr = E.emp_no)OR (emp_sal > 50000AND emp_type = 'MANAGER');○SELECT *FROM emp EWHERE (emp_sal > 50000AND emp_type = 'MANAGER')OR 25 < (SELECT COUNT(*) FROM EMP WHERE emp_mgr =E.emp_no);2)ROWID的使用使用ROWID的WHERE语句效率最高。
SELECT ROWID, ...INTO :emp_rowid, ...FROM empWHERE emp.emp_no = 56722FOR UPDATE;UPDATE empSET = ... ,WHERE ROWID = :emp_rowid;3)减少访问次数×SELECT emp_name, sal, gradeFROM empWHERE emp_no = 0342;SELECT emp_name, sal, gradeFROM empWHERE emp_no = 0291;○SELECT A.emp_name, A.sal, A.grade,B.emp_name, B.sal, B.gradeFROM emp A, emp BWHERE A.emp_no = 0342AND B.emp_no = 0291;4)Where语句的索引的使用(1)SUBSTR×SELECT acc_name, trans_date, amountFROM transactionWHERE SUBSTR(account_name,1,7) = 'CAPITAL';○SELECT acc_name, trans_date, amountFROM transactionWHERE account_name LIKE 'CAPITAL%';(2)!=×SELECT acc_name, trans_date, amountFROM transactionWHERE amount != 0;FROM transactionWHERE amount > 0;(3)TRUNC×SELECT acc_name, trans_date, amountFROM transactionWHERE TRUNC(trans_date) = TRUNC(SYSDATE);○SELECT acc_name, trans_date, amountFROM transactionWHERE trans_dateBETWEEN TRUNC(SYSDATE)AND TRUNC(SYSDATE) + .99999;(4)||×SELECT acc_name, trans_date, amountFROM transactionWHERE acc_name || acc_type = 'AMEXA';○SELECT acc_name, trans_date, amountFROM transactionWHERE acc_name = 'AMEX'AND acc_type = 'A';(5)运算×SELECT acc_name, trans_date, amountFROM transactionWHERE amount + 3000 < 5000;○SELECT acc_name, trans_date, amountFROM transactionWHERE amount < 5000 + 3000;4.2SQL命令的使用秘诀4.2.1DECODE的使用×SELECT COUNT(*), SUM(salary)FROM empWHERE dept_no = 0020AND emp_name LIKE 'SMITH%';SELECT COUNT(*), SUM(salary)FROM empWHERE dept_no = 0030AND emp_name LIKE 'SMITH%';○SELECT COUNT(DECODE(dept_no, 0020, 'X', NULL))D0020_count,COUNT (DECODE(dept_no, 0030, 'X', NULL))D0030_count,SUM (DECODE(dept, 0020, salary, NULL)) D0020_sal,SUM (DECODE(dept, 0030, salary, NULL)) D0030_salFROM empWHERE emp_name LIKE 'SMITH%';4.2.2表的别名的使用× SELECT E.emp_no, name, tax_no, p_code, comp_nameFROM company C, emp EWHERE p_code = p_code;○ SELECT E.emp_no, , E.tax_no, p_code, p_nameFROM company C, emp EWHERE p_code = p_code;4.2.3去掉重复行DELETE FROM emp EWHERE E.rowid > ( SELECT MIN(X.rowid)FROM emp XWHERE X.emp_no = E.emp_no );4.2.4表的行计数SELECT COUNT(有索引的列) FROM TRANS;SELECT COUNT(*) FROM TRANS;SELECT COUNT(1) FROM TRANS;4.2.5用WHERE语句替换HAVING语句的使用×SELECT region, AVG(loc_size)FROM locationGROUP BY regionHAVING region != 'SYDNEY'AND region != 'PERTH';○SELECT region, AVG(loc_size)FROM locationWHERE region != 'SYDNEY'AND region != 'PERTH';GROUP BY region4.2.6使用表连接替代EXISTS使用×SELECT emp_nameFROM empWHERE (emp_cat, sal_range) =(SELECT MAX(category), MAX(sal_range) FROM emp_categories) AND emp_dept = 0020;○SELECT emp_nameFROM empWHERE emp_cat = (SELECT MAX(category) FROM emp_categories)AND sal_range = (SELECT MAX(sal_range) FROM emp_categories)AND emp_dept = 0020;4.2.7使用EXISTS替代表连接×SELECT ...FROM dept D, emp EWHERE E.dept_no = D.dept_noAND E.emp_type = 'MANAGER'AND D.dept_cat = 'A';○SELECT ...FROM emp EWHERE EXISTS ( SELECT 'X' FROM deptWHERE dept_no = E.dept_noAND dept_cat = 'A')AND E.emp_type = 'MANAGER';×SELECT ...FROM dept D, emp EWHERE E.dept_no = D.dept_noAND (E.emp_type = 'MANAGER'OR D.dept_cat = 'A');○SELECT ...FROM emp EWHERE E.emp_type = 'MANAGER';OR EXISTS ( SELECT 'X'FROM deptWHERE dept_no = E.dept_noAND dept_cat = 'A');4.2.8使用EXISTS代替DISTINCT语句×SELECT DISTINCT dept_no, dept_nameFROM dept D, emp EWHERE D.dept_no = E.dept_no;○SELECT dept_no, dept_nameFROM dept DWHERE EXISTS ( SELECT 'X'FROM emp EWHERE E.dept_no = D.dept_no);4.2.9使用NOT EXISTS代替NOT IN语句× SELECT ...FROM empWHERE dept_no NOT IN ( SELECT dept_noFROM deptWHERE dept_cat = 'A');○SELECT ...FROM emp EWHERE NOT EXISTS ( SELECT 'X'FROM deptWHERE dept_no = E.dept_noAND dept_cat = 'A');4.2.10使用union all 代替union 语句Union -------- 进行排序Union All -------- 不排序4.2.11使用Union和IN代替OR语句Loc_no, region上有索引× SELECT ...FROM locationWHERE loc_id = 10OR region = 'MELBOURNE';○ SELECT ...FROM locationWHERE loc_id = 10UNION ALLSELECT ...FROM locationWHERE region = 'MELBOURNE';×SELECT ...FROM locationWHERE loc_id = 10OR loc_id = 20OR loc_id = 30;5高效索引5.1索引的使用使用索引时,要考虑以下因素:1)索引列的计算2)索引列的增加3)索引列不要用NOT4)索引中空值的使用IS NULL, IS NOT NULL5)索引列的数据类型的变换EMP_TYPE为varchar2类型,下列语句使用索引SELECT ...FROM empWHERE emp_type = 123;SELECT ...FROM empWHERE TO_NUMBER(emp_type) = 123;SELECT ...FROM empWHERE emp_type = '123';5.2增加索引增加索引要考虑多种因素,要考虑对更新、插入的影响等。