一些SQL的小技巧
工作中总结了一些SQL的技巧,请大家看看
1、CASE中使用范围
我写了这样的一个查询:
SELECT
CASE Avalue
WHEN Avalue = 0 THEN ‘没数据’
WHEN Avalue > 100 THEN ‘超出范围’
WHEN Avalue < 50 THEN ‘太小’
ELSE ‘其他’
END
FROM ATable
|
这个查询是错误的,因为CASE中不能使用比较运算符。但是,我们可以使用一些技巧达到选择范围的作用:
SELECT
CASE Avalue
WHEN 0 THEN ‘没数据’
ELSE
(
CASE SIGN(100- Avalue)
WHEN –1 THEN ‘超出范围’
ELSE
(
CASE SIGN(50- Avalue)
WHEN 1 THEN ‘太小’
ELSE ‘其他’
END
)
END
)
END
FROM ATable
|
可以用需要判断范围的数减去判断的值,并取其符号来进行判断。
虽然长了点,但毕竟在一个表达式中实现了,有的情况下可参考使用,本技巧也适用于decode函数。
2、使用CASE将同一列的统计分成多列
有这样一个表:
userid
|
Number(10)
|
用户编号
|
account
|
Number(10)
|
用户金额
|
usertype
|
Number(5)
|
用户类型,1普通用户,2 VIP用户
|
现在用户需要显示这样一个报表
可以使用CASE将一列显示在多列上:
SELECT
UserID AS “用户编号”,
SUM(CASE usertype WHEN 1 THEN account ELSE 0 END) AS “普通用户金额”,
SUM(CASE usertype WHEN 2 THEN account ELSE 0 END) AS “VIP用户金额”
FROM Atable
GROUP BY UserID
|
3、存储过程中使用临时表
对于大量的中间数据,使用临时表能大大提高性能。
注意:临时表和普通表一样,在使用前一定要预先创建,不能动态创建。
--创建临时表
Create Global Temporary Table Temp_UserName
(
UserName varchar2(100)
) on Commit Preserve Rows;
--创建一个索引便于提高查询速度
create index Temp_UserName_IDX1 on Temp_UserName (UserName);
|
本例中的临时表使用会话级的临时表,每个用户每次连接数据库的时候起作用,用户会话结束后会自动删除数据,而且多个用户之间不会有影响。
--插入数据到临时表:
INSERT INTO Temp_UserName
SELECT UserName
FROM Atable;
|
4、一个用UPDATE和INSERT代替游标的例子
发现一个存储过程效率很差,发现原来是使用了游标来处理大量数据。
处理的流程大概如下:
·用一个查询定义一个游标
·打开游标
·读一条记录
·判断该记录在A表中是否存在
·存在则更新A表
·不存在则插入记录到A表
·循环读取下一条记录
·关闭游标
其实,这样的处理过程用三条SQL语句就能够完成:
INSERT INTO Temp_UserName -- Temp_UserName是一个临时表,这条语句也可以省略
SELECT UserName
FROM User_Info
WHERE –一些过滤条件;
--先更新存在的记录
UPDATE A
SET (Field1, Field2) = (SELECT Field3, Field4 FROM User_Info WHERE EXISTS(SELECT 1 FROM User_Info WHERE UserName=A.UserName))
WHERE EXISTS(SELECT 1 FROM Temp_UserName WHERE UserName=A.UserName)
--插入不存在的记录
INSERT INTO A (Field1, Field2, UserName)
SELECT u.Field3, u.Field4, UserName
FROM User_Info u LEFT OUTER JOIN A ON u.UserName=A.UserName AND A.UserName IS NULL
WHERE EXISTS(SELECT 1 FROM Temp_UserName WHERE UserName=A.UserName)
|
分享到:
相关推荐
接下来,我们将围绕这一主题展开深入探讨,包括Oracle SQL的基本概念、本书的主要内容以及学习Oracle SQL的一些关键知识点。 ### Oracle SQL简介 Oracle SQL是一种标准化的数据查询语言,用于与Oracle数据库进行...
以下是一些关于Oracle常用SQL技巧的经典要点: 1. **避免在SELECT子句中使用“*”**:在SQL查询中,使用通配符“*”代表选择所有列,虽然方便但效率低下。Oracle在解析时需要查询数据字典获取所有列名,增加了额外...
本节将详细探讨Oracle SQL的高级特性、优化技巧以及最佳实践。 一、子查询与连接操作 Oracle SQL支持嵌套子查询,允许在SELECT、FROM和WHERE子句中使用子查询来获取更复杂的数据。同时,通过JOIN操作(如INNER JOIN...
Oracle SQL性能优化是数据库管理中的关键环节,它涉及到多个层面,包括数据结构设计、应用程序结构、SQL语句、服务器内存分配、硬盘I/O以及操作系统参数的调整。这些方面都直接影响到Oracle数据库系统的运行效率和...
尽管这些知识源于2004年的资料,但Oracle SQL调优的基本原则和许多技巧至今仍有效。随着Oracle数据库版本的更新,新的特性和工具不断出现,不过,理解和掌握了这些基础,将使你能够更好地适应和利用新版本的功能。
Oracle SQL语法大全是一个重要的学习资源,它涵盖了在Oracle数据库管理系统中进行数据查询、操作和管理时所需的各种SQL语句和技巧。SQL(Structured Query Language)是用于与关系型数据库交互的语言,而Oracle作为...
- 本章的主要目标是帮助学习者熟悉Oracle SQL的基础知识,包括如何编写基本的SQL SELECT语句,理解SQL语句的基本结构及其功能,以及掌握基本的SQL编辑技巧。 **1.3 SQL SELECT语句的功能** - SQL SELECT语句是用于...
Oracle SQL性能优化是数据库管理中的关键环节...通过理解和应用这些技巧,数据库管理员和开发人员可以有效地优化ORACLE SQL查询,提升系统整体性能。记住,每个数据库环境都有其独特性,最佳实践需要根据实际情况调整。
Oracle SQL 性能优化是数据库管理员和开发人员关注的核心领域,因为高效的SQL查询能够显著提升应用的响应速度和整体性能。以下是对标题和描述中提到的一些关键知识点的详细解释: 1. **选择合适的优化器** - ...
除此之外,还有其他一些优化技巧,比如使用绑定变量以减少硬解析,使用适当的索引类型(如位图索引、函数索引),考虑使用索引合并策略,以及监控和调整表的分区策略等。同时,定期分析数据库的性能瓶颈,通过...
以下是一些常用的Oracle SQL查询,这些查询涵盖了从基础的表空间信息到复杂的数据库对象状态和性能监控。 1. **查看表空间的名称及大小**: 这个查询通过`dba_tablespaces`和`dba_data_files`视图获取每个表空间的...
Oracle SQL是用于管理和操作...Oracle SQL的学习涵盖了数据库管理的基础和高级技巧,理解并熟练掌握这些概念对于数据库管理员和开发人员来说至关重要。通过不断的练习和应用,可以更有效地管理和维护Oracle数据库。
《Oracle SQL性能优化》这本书是数据库管理员和开发人员的重要参考资料,它深入探讨了如何提高Oracle数据库的SQL查询性能。在数据库系统中,SQL查询的速度直接影响到应用的响应时间和整体性能,因此,理解并掌握SQL...
总结,Oracle SQL性能优化是一个涉及多个层面的过程,包括选择合适的查询结构、优化器策略、索引管理和SQL编写技巧。遵循这些规范,可以显著提升Oracle数据库的响应速度,降低系统资源消耗,从而提升整体应用性能。
以上就是Oracle SQL基础查询语句的一些关键知识点。通过这些内容,你应该能够开始编写简单的SQL查询,从Oracle数据库中获取所需的信息。随着对SQL的深入学习,你将掌握更复杂的查询技巧,如联接(JOIN)、分组...
为了更好地诊断并解决这些问题,本文将分享一系列关于Oracle数据库维护的小技巧,特别是针对Unix环境下的维护实践。 #### 二、操作系统层面的监控与调优 ##### 1. 检查操作系统IO问题 - **工具选择**:`sar`是一个...
2. **SQL语句的优化**:遵循一些基本规则可以显著提升SQL性能。首先,避免大表和全表扫描,尽可能利用索引来减少I/O操作。其次,检查并优化索引的使用,以加速查询。同时,评估并重写子查询,可能的话,用简单连接...
本文档将介绍一些针对Oracle SQL的性能优化的方法和技巧,并在实际操作中如何根据服务器的实际情况做出调整。 一、Oracle优化器的选取 Oracle优化器共有三种类型:基于规则(RULE)、基于成本(COST)和选择性(CHOOSE)...