SQL语句编写建议
sql语句的编写思路

sql语句的编写思路编写SQL 语句时,可以遵循以下一般的思路和步骤:1. 确定目标:明确你要从数据库中获取或修改的数据是什么,或者你要执行的操作是什么(如查询、插入、更新、删除等)。
2. 选择适当的表:确定涉及到的数据库表,这些表包含了你需要操作的数据。
了解表结构和关系模式对于编写有效的SQL 语句非常重要。
3. 使用关键字选择操作类型:根据你的目标操作类型,选择适当的SQL 关键字(如SELECT、INSERT、UPDATE、DELETE)。
4. 编写基本的语法结构:根据选定的操作类型,编写基本的语法结构。
例如,SELECT 语句通常包括SELECT、FROM、WHERE、GROUP BY、HAVING 和ORDER BY 子句。
5. 使用条件筛选数据:如果你需要根据特定的条件来检索数据,使用WHERE 子句来添加筛选条件。
条件可以是简单的相等或不等关系,也可以是复杂的逻辑运算。
6. 定义需要返回的列:在SELECT 语句中,使用SELECT 子句来指定需要返回的列。
你可以选择具体的列名,也可以使用通配符* 来返回所有列。
7. 考虑使用聚合函数和分组:如果你需要对数据进行汇总或统计,可以使用聚合函数(如SUM、COUNT、AVG、MIN、MAX)和GROUP BY 子句来分组数据。
8. 考虑排序:如果你希望以特定的顺序返回数据,可以使用ORDER BY 子句来指定排序的列和排序顺序(升序或降序)。
9. 考虑连接多个表:如果你需要从多个表中检索数据,需要使用JOIN 来连接这些表,并在ON 子句中指定连接条件。
10. 考虑数据的插入、更新和删除:如果你的目标是插入、更新或删除数据,根据操作类型编写相应的INSERT、UPDATE 或DELETE 语句,并使用适当的条件进行筛选。
11. 格式化和优化:在编写SQL 语句时,注意格式化代码以提高可读性,并优化语句以提高性能。
这包括使用缩进、换行和注释,并避免不必要的重复或复杂的查询。
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注入攻击。
如何编写易于维护的SQL查询

如何编写易于维护的SQL查询编写易于维护的SQL查询是一项重要的技能,可以提高查询效率、减少代码错误和方便后续维护工作。
下面是一些编写易于维护的SQL查询的建议:1.使用规范的命名规则:为数据库对象(表、列、索引等)和查询语句的别名使用有意义的名称。
这样做可以使代码更易读,也方便后续的维护和理解。
2.使用注释:在查询语句中添加注释,解释查询的目的、逻辑和重要的细节。
这样可以帮助其他开发人员更好地理解和修改查询,并且在后续的维护工作中可以快速定位和解决问题。
3.使用格式化和缩进:对查询语句进行适当的格式化和缩进可以提高代码的可读性。
这样可以更轻松地理解查询的结构和逻辑。
4.分解复杂的查询:将复杂的查询语句拆分成多个简单的部分,每个部分负责一个特定的功能。
这样可以提高代码的可读性和维护性,并且在出现问题时可以更容易地定位和修复。
5.使用标准SQL语法:尽量遵守标准SQL语法,而不是依赖于特定数据库的扩展功能。
这样可以提高代码的可移植性,使其适用于不同的数据库系统。
6.使用表的别名:为查询中涉及的每个表和子查询使用别名,这样可以简化查询语句并使其更易读。
当查询中使用多个表时,使用别名可以避免重复的表名,并且可以减少代码的冗余。
7.使用JOIN语句代替子查询:在可能的情况下,使用JOIN语句代替子查询。
JOIN语句通常比子查询的性能更好,并且更易于理解和维护。
8.使用视图或存储过程来封装复杂查询逻辑:如果查询逻辑非常复杂,可以考虑将其封装在视图或存储过程中。
这样可以减少代码的重复性,提高可读性,并将查询逻辑集中在一处便于维护。
9.使用参数化查询:避免直接在查询语句中拼接参数值,而是使用参数化查询。
参数化查询可以提高查询的安全性,避免SQL注入攻击,并且使查询更易于维护和优化。
10.进行性能优化:在编写查询时,考虑查询的性能优化。
尽量避免使用不必要的JOIN操作、子查询或全表扫描,并使用索引来加快查询速度。
高效SQL语句5篇

高效SQL语句5篇第一篇:高效SQL语句1.SELECT子句中避免使用“*”当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL 列引用…*‟是一个方便的方法.不幸的是,这是一个非常低效的方法.实际上,ORACLE在解析的过程中, 会将“*” 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.2.使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.例如:Sql代码1.SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0020 ANDENAME LIKE …SMITH%‟;2.SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE …SMITH%‟;SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0020 ANDENAME LIKE …SMITH%‟;SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE …SMITH%‟;你可以用DECODE函数高效地得到相同结果:Sql代码1.SELECT COUNT(DECODE(DEPT_NO,0020,‟X ‟,NULL))D0020_COUNT,2.COUNT(DECODE(DEPT_NO,0030,‟X ‟,NULL))D0030_COUNT,3.SUM(DECODE(DEPT_NO,0020,SAL,NUL L))D0020_SAL,4.SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030 _SAL5.FROM EMP WHERE ENAME LIKE …SMITH%‟;SELECT COUNT(DECODE(DEPT_NO,0020,‟X ‟,NULL))D0020_COUNT,COUNT(DECODE(DEPT_NO,0030,‟X ‟,NULL))D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL))D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030_SA L FROM EMP WHERE ENAME LIKE …SMITH%‟;类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.3.删除重复记录最高效的删除重复记录方法(因为使用了ROWID)Sql代码1.DELETE FROM EMP E WHERE E.ROWID >(SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);DELETE FROM EMP E WHERE E.ROWID >(SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);4.用TRUNCATE替代DELETE当删除表中的记录时,在通常情况下,回滚段(rollback segments)用来存放可以被恢复的信息,如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况),而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.5.计算记录条数和一般的观点相反, count(*)比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的.例如 COUNT(EMPNO)6.用Where子句替换HAVING子句避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序、总计等操作,如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销, 例如: Sql代码1.--低效2.SELECT REGION,AVG(LOG_SIZE)FROM LOCATION GROUP BY REGION HAVING REGION REGION!= …SYDNEY‟AND REGION!= …PERTH‟3.--高效4.SELECT REGION,AVG(LOG_SIZE)FROMLOCATION WHERE REGION REGION!= …SYDNEY‟ ND REGION!= …PERTH‟ GROUP BYREGION--低效SELECT REGION,AVG(LOG_SIZE)FROM LOCATION GROUP BY REGION HAVING REGION REGION!= …SYDNEY‟AND REGION!= …PERTH‟--高效SELECT REGION,AVG(LOG_SIZE)FROMLOCATION WHERE REGION REGION!= …SYDNEY‟ ND REGION!= …PERTH‟ GROUP BY REGION7.用EXISTS替代IN在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.Sql代码1.--低效2.SELECT * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = …MELB‟)3.--高效:4.SELECT * FROM EMP WHERE EMPNO > 0 AND EXISTS(SELECT …X‟FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LO C = …MELB‟)--低效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‟)8.用NOT EXISTS替代NOT IN在子查询中,NOT IN子句将执行一个内部的排序和合并.无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历).为了避免使用NOT IN,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.例如:SELECT …FROM EMPWHERE DEPT_NO NOT IN(SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=‟A‟);Sql代码1.--为了提高效率改写为:(方法一: 高效)SELECT ….FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+)AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+)= …A‟2.--(方法二: 最高效)SELECT ….FROM EMP E WHERE NOT EXISTS(SELECT …X‟FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = …A‟);3.--为了提高效率改写为:(方法一: 高效)SELECT ….FROM EMP A,DEPT B WHERE A.DEPT_NO =B.DEPT(+)AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+)= …A‟4.--(方法二: 最高效)SELECT ….FROM EMP E WHERE NOT EXISTS(SELECT …X‟FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = …A‟);9.用EXISTS替换DISTINCT当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT.一般可以考虑用EXIST替换例如: Sql代码1.--低效:2.SELECT DISTINCT DEPT_NO,DEPT_NAMEFROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO3.--高效:4.SELECT DEPT_NO,DEPT_NAMEFROM DEPT D WHERE EXISTS(SELECT …X‟FROM EMP E WHERE E.DEPT_NO =D.DEPT_NO);5.--EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.--低效:SELECT DISTINCT DEPT_NO,DEPT_NAMEFROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO--高效:SELECT DEPT_NO,DEPT_NAMEFROM DEPT D WHERE EXISTS(SELECT …X‟FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);--EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.10.用索引提高效率索引是表的一个概念部分,用来提高检索数据的效率,实际上ORACLE使用了一个复杂的自平衡B-tree结构,通常通过索引查询数据比全表扫描要快,当ORACLE找出执行查询和Update语句的最佳路径时,ORACLE优化器将使用索引,同样在联结多个表时使用索引也可以提高效率,另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证,除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列.通常, 在大型表中使用索引特别有效.当然,你也会发现, 在扫描小表时,使用索引同样能提高效率,虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价.索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改,这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O,因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢注:定期的重构索引是有必要的.11.避免在索引列上使用计算WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描.举例:Sql代码1.--低效:2.SELECT …FROM DEPT WHERE SAL * 12 > 25000;3.--高效:4.SELECT … FROM DEPT WHERE SAL> 25000/12;--低效:SELECT …FROM DEPT WHERE SAL * 12 > 25000;--高效:SELECT … FROM DEPT WHERE SAL> 25000/12;12.用>=替代>Sql代码1.--如果DEPTNO上有一个索引2.--高效:SELECT *FROM EMPWHERE DEPTNO >=43.--低效:SELECT *FROM EMPWHERE DEPTNO >3--如果DEPTNO上有一个索引 4.--高效:SELECT *FROM EMPWHERE DEPTNO >=45.--低效:SELECT *FROM EMPWHERE DEPTNO >3两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.第二篇:高效的SQL语句如何写高效率的SQL语句、Where子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句。
sql 编写复杂语句思路

sql 编写复杂语句思路一、基础查询语句1. 查询所有学生的姓名和年龄:SELECT 姓名, 年龄 FROM 学生表;2. 查询学生表中年龄大于18岁的学生:SELECT * FROM 学生表 WHERE 年龄 > 18;3. 查询学生表中年龄在18岁到20岁之间的学生:SELECT * FROM 学生表 WHERE 年龄 BETWEEN 18 AND 20;4. 查询学生表中姓张的学生:SELECT * FROM 学生表 WHERE 姓名 LIKE '张%';5. 查询学生表中不重复的所有性别:SELECT DISTINCT 性别 FROM 学生表;二、表连接查询6. 查询学生表和成绩表中某学生的姓名、科目和成绩:SELECT 学生表.姓名, 成绩表.科目, 成绩表.成绩FROM 学生表INNER JOIN 成绩表 ON 学生表.学号 = 成绩表.学号WHERE 学生表.姓名 = '张三';7. 查询学生表和班级表中某班级的学生姓名和班级名称:SELECT 学生表.姓名, 班级表.班级名称FROM 学生表INNER JOIN 班级表 ON 学生表.班级编号 = 班级表.班级编号WHERE 班级表.班级名称 = '一年级';三、子查询8. 查询学生表中成绩最高的学生姓名和成绩:SELECT 姓名, 成绩FROM 学生表WHERE 成绩 = (SELECT MAX(成绩) FROM 学生表);9. 查询学生表中选修了所有科目的学生姓名:SELECT 姓名FROM 学生表WHERE NOT EXISTS (SELECT 科目 FROM 科目表WHERE NOT EXISTS (SELECT * FROM 成绩表WHERE 学生表.学号 = 成绩表.学号 AND 成绩表.科目 = 科目表.科目));四、聚合函数10. 查询学生表中每个班级的平均年龄和最高年龄:SELECT 班级编号, AVG(年龄) AS 平均年龄, MAX(年龄) AS 最高年龄FROM 学生表。
variable jobno number;无效sql语句 -回复

variable jobno number;无效sql语句-回复[variable jobno number;无效sql语句]是一条无效的SQL语句,它无法被数据库正确解析和执行。
在本文中,我们将深入探讨为什么这条语句无效,以及如何编写有效的SQL语句。
首先,让我们详细解释一下这条SQL语句中的每个部分。
[variable]是一个变量,而jobno是变量的名称。
number是一个关键词,它表示这个变量的数据类型是数字类型。
在SQL中,我们可以使用变量来代替常量值,以便在查询中动态地传递值。
然而,这条语句中的变量声明部分是不完整的。
在有效的SQL语句中,需要提供变量的初始值或者指定它的数据类型。
接下来,让我们分析为什么这条语句无效。
SQL是一种结构化查询语言,它用于与关系型数据库交互。
有效的SQL语句需要遵循特定的语法规则和命令。
在这条语句中,缺少了必要的语法元素,导致它无法被解析和执行。
在实际情况中,数据库管理系统会报错提示语法错误或者未知标识符。
对于这条无效的SQL语句,我们可以进行以下修正:sqlDECLARE @jobno INT; 声明一个名为jobno的整型变量SET @jobno = 123; 为变量jobno赋初始值SELECT * FROM jobs WHERE job_number = @jobno; 使用变量jobno作为查询条件在修正后的SQL语句中,我们使用DECLARE和SET语句来声明并初始化变量jobno,然后在查询中使用这个变量作为查询条件。
这样,我们可以根据实际需要动态地传递查询条件,增加了SQL语句的灵活性和重用性。
此外,为了写出有效的SQL语句,我们还需要遵循一些编码准则和最佳实践。
以下是一些帮助您在SQL中编写有效代码的建议:1. 使用带有注释的清晰命名的对象和字段名称,以增加代码的可读性和可维护性。
2. 使用参数化查询或存储过程来防止SQL注入攻击和提高性能。
oracle sql标准格式

oracle sql标准格式Oracle SQL的标准格式并没有一个固定的标准,因为SQL的编写风格可以因个人、团队或公司的偏好而异。
然而,有一些通用的最佳实践和格式规范,这些规范可以提高SQL的可读性、可维护性和性能。
以下是一些建议的Oracle SQL标准格式:书写规范大小写一致:关键字、表名、列名等的大小写应保持一致。
通常,表名和列名使用大写,而SQL关键字则使用小写。
关键字单独占一行:例如SELECT, FROM, WHERE, AND, GROUP BY, ORDER BY 等关键字应单独占一行。
行缩进和对齐:建议语句中的关键字右对齐,以提高可读性。
空格使用:在SQL语句的算术运算符、逻辑运算符(如AND, OR, NOT)和比较运算符(如=, <>, <=, >=, BETWEEN, AND)前后应加上空格。
注释:对于复杂的SQL语句,应加上注释以解释算法和功能。
注释应单独成行,并放在语句前面。
单行注释使用--,多行注释使用/* */。
表别名:在多表连接时,使用表的别名来引用列,可以提高查询的可读性。
列和条件单独占行:SELECT 后面的每一列(当列数大于1时)和WHERE 后面的每个条件(当条件数大于1时)应单独占一行。
避免使用SELECT *:应明确指出要查询的字段名,而不是使用*。
性能优化建议简化关键SQL语句:避免包含太多的嵌套,以减少执行计划错误的可能性。
使用表别名:在进行多表连接时,为每个字段的使用都带上表别名。
避免使用INSERT INTO ... VALUES:应指定插入的字段名,而不是直接使用VALUES。
减少不必要的类型转换:避免在WHERE 子句中对索引列进行类型转换。
慎重使用索引:索引可以提高查询性能,但也会降低INSERT 和UPDATE 的性能。
应根据实际情况来创建索引。
避免在WHERE 子句中使用使索引失效的表达式:例如,避免使用<>、NOT、IS NULL、IS NOT NULL、LIKE '%xxxx%' 等。
检查sql 语法-概述说明以及解释

检查sql 语法-概述说明以及解释1.引言1.1 概述SQL(Structured Query Language)是一种用于管理和操作关系数据库的语言,广泛应用于各种数据库管理系统(DBMS),如MySQL、Oracle、SQL Server等。
在数据库开发和管理过程中,编写正确的SQL 语句至关重要,因为它直接影响到数据的查询、更新、删除等操作。
因此,检查SQL语法的准确性和规范性是确保数据操作正确性和系统性能的关键步骤之一。
本文将介绍SQL语法的重要性、SQL语法检查工具以及常见的SQL 语法错误。
通过学习和掌握这些内容,读者将能够编写出更加规范和高效的SQL语句,提高数据库操作的准确性和效率。
1.2文章结构文章结构部分应该包括对整篇文章的大致框架和主要内容进行概述。
这部分应该介绍文章的章节组成和内容安排,让读者对整篇文章的结构有一个清晰的认识。
具体来说,可以包括以下内容:1. 介绍文章的主题和目的,即检查SQL语法的重要性和必要性;2. 阐述文章的组织结构,包括引言、正文和结论三个部分,以及每个部分的主要内容和重点;3. 概述本文将会讨论的内容,例如SQL语法的重要性、SQL语法检查工具以及常见的SQL语法错误;4. 提示读者可以通过本文了解到关于SQL语法检查的基本知识和技巧,以及如何避免常见的错误。
在文章结构部分中,应该尽量简洁明了地表达文章的主题和组织结构,为读者引导进入全文做好铺垫。
1.3 目的SQL语法在数据库管理中起着非常重要的作用,它是数据库系统的核心技术之一。
而在实际应用中,很多程序员在编写SQL语句时会出现语法错误,导致数据库操作失败或者出现意外的结果。
因此,本文的目的就是帮助读者了解SQL语法的重要性,掌握常见的SQL语法错误,以及介绍一些SQL语法检查工具,帮助读者提高SQL语法的编写能力,减少错误发生的可能性,提高数据库操作的效率和准确性。
通过本文的学习,读者可以更加熟练地运用SQL语法进行数据库操作,提升自己的技术水平,为实际工作和项目开发提供更好的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.一规范化要求
略
二.性能建议
1.谓词(如where条件里的=、like等)前面的字段,不要加任何函数或运算。
如下面两种都是应尽量避免的:
select * from dictcalc t where trim(calcname)='西药收入';(应去掉trim)
select count(1) from hosp_pay_history t where t.paydate-sysdate<10; (应改为t.paydate<sysdate+10)
原因是,如果表很大,对字段加索引,谓词前只能是单独的字段名,否则会用不到索引。
2.能用union all的不要用union
原因是,union all不会比对结果集,而union会比对结果集,重复的结果行只取一行
3.分页语句,耗费性能的操作能写到外层的应尽量写到外层
原因是写到外层,只需对当前页运算,写到内层,会对所有的结果集运算
可以改善的一个例子:
Select * From (
select rownum as rowIndex,v.* from
(
SELECT
t1.FPERSONCODE,
t2.FPROVINCE || t2.FCITY || t2.FCOUNTY || t2.FTOWN || t2.FVILAGE as address,
round(months_between(sysdate,t1.FBRITHDAY)/12) as age,
t2.foldcard,
t1.ishgtj,
t1.reason
FROM TJFPERSONINFO t1,TJFRECORD t2
where t1.ffcode = t2.ffcode
and t1.frcode = t2.frcode
and t1.dieflage = 0
) v
where rowNum<=15
) where rowIndex>=1
应把里层的计算address和age放在select的最外层。
4.如果表的字段非常多,行也很多,慎用select *,而应该把所需的字段一个一个写出来
原因是select *在字段和行很多的情况下,非常耗资源
5.where条件里,字符串类型(char,varchar2)必须带单引号,数字类型不能加单引号
原因是类型不匹配,会引起额外的隐含的to_number操作或不应当的全表扫描
6.避免在LIKE函数的起始处使用通配符
如xm like '%张%',这样不会使用索引,应改为like '张%'
7.合理使用子查询
子查询是递归调用,如果行很多,调用的次数就会很多
如果是分页查询建议使用子查询分页查询的行数很少,sql执行子查询是并行执行的,速度较快.取count(*)的时候执行计划会取消改表,对性能有很大提升.
并减少sql复杂性和sql解析难度
三.可读性建议
1.在iBatis里所有的字段,包括select后的字段和where后的条件,都一律用大写,表的别名应小写,传入的参数如果用map的应小写,如果是pojo的不限制。
在PLSQL里的大小写不限制(大部分人习惯用小写)。
2.关联查询,主表应写在第一位,关联条件应写在最前面,表应使用别名,别名用t1,t2标识
4表有分区的,在SQL语句的where条件里要写分区要写常量
5.日期区间查询的写法
以下三种写法,起止时间的区间都是正确的,查询结果都是正确的,但是,性能不一样。
写法一:
select * from dictmedi t
where to_char(inputdate,'yyyy-mm-dd')>='2009-06-01'
and to_char(inputdate,'yyyy-mm-dd')<='2009-07-01'
写法二:
select * from dictmedi t
where trunc(inputdate)>=to_date('2009-06-01','yyyy-mm-dd')
and trunc(inputdate)<=to_date('2009-07-01','yyyy-mm-dd')
写法三:
select * from dictmedi t
where inputdate>=to_date('2009-06-01','yyyy-mm-dd')
and inputdate<to_date('2009-07-01','yyyy-mm-dd')+1
前两种写法,就算在日期字段inputdate上有索引,查询也不会使用该索引(除非是函数索引)
最后一种写法是推荐的写法,注意止日期是小于,而不是小于等于。
四.与程序结合建议
1.在iBatis里,能用#的,不要用$
用#是绑定变量,用$不是,在业务系统里,一般建议使用绑定变量
2.小心大表的where条件isNotNull或isNotEmpty判断,不要出现条件全部不满足的情况
如:
select 字段列表from 大表
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="detailcode">
detailcode = #detailcode#
</isNotEmpty>
<isNotEmpty prepend="AND" property="forgid">
forgid = #forgid#
</isNotEmpty>
</dynamic>
不要出现这两个条件都不满足而触发的大表全表扫描,这个操作是致命的
3.大表的字段运算,比如求最大值,应在业务里提前计算并放到一个字段里
4.根据代码取名称的操作(一般是代码表),在分页里,应在查询列表的外层,用函数取名称
可以改善的一个例子:
Select * From (
select rownum as rowIndex,v.* from
(
SELECT
t1.FPERSONCODE,
t1.FEVENTNAME,
t1.FMANAGERNAME,
t2.FPROVINCE || t2.FCITY || t2.FCOUNTY || t2.FTOWN || t2.FVILAGE as address,
round(months_between(sysdate,t1.FBRITHDAY)/12) as age,
t2.foldcard,
t1.ishgtj,
t1.reason
FROM TJFPERSONINFO t1,TJFRECORD t2
where t1.ffcode = t2.ffcode
and t1.frcode = t2.frcode
and t1.dieflage = 0
) v
where rowNum<=15
) where rowIndex>=1
应在最外层取名称FEVENTNAME和FMANAGERNAME,有一个函数f_get_mc会统一处理根据代码取名称的操作
五.请找DBA给出建议后再操作
1.表的创建(包括临时表)
2.字段的增加、删除、字段类型或长度的修改
3.数据库对象的创建,如函数、存储过程、触发器、作业、type、同义词、序列、链路、用户、表空间、分区等。