oracle高级查询总结

             oracle与我们常用的sqlserver、mysql相比,有非常多的优势,它可以支持多个实例同时运行,功能非常强大,主要在传统行业的数据化业务中,比如:银行、金融这样的对可用性、健壮性、安全性、实时性要求极高的业务;零售、物流这样对海量数据存储分析要求很高的业务。此外,高新制造业如芯片厂也基本都离不开Oracle;电商也有很多使用者,如京东(正在投奔Oracle)、阿里巴巴(计划去Oracle化)。而且由于Oracle对复杂计算、统计分析的强大支持,在互联网数据分析、数据挖掘方面的应用也越来越多。

            最近一段时间看了一些关于oracle的高级查询资料,主要是在分组函数、连接和子查询方面的一些用法,下面用一张图来概述一下:

            

     一、分组函数

       什么是?

             它是作用于一组函数,并对一组数据返回一个值。

       有哪些?

              常用的分组函数比如AVG(平均值)、SUM(总和)、MIN(最小值)、MAX(最大值)、COUNT(数量)、WM_CONCAT(行转列)

        用一用?

             1、求最大值和平均值

SELECT "AVG"(BID_AMOUNT),"MAX"(BID_AMOUNT) FROM T_LOAN_BID
AVG MAX
929653.75 18004998.61

            
              2、行转列     

SELECT USER_ID,WM_CONCAT(PRO_ID) FROM T_LOAN_BID GROUP BY USER_ID

              

              3、count使用要注意

              count会自动忽略空值,所以为了避免空值,可以使用NVL函数使分组函数无法忽略空值

              如果不加nvl,用count()直接查询:               

SELECT "COUNT"(UNBINDBANK_STATUS) FROM T_CUST_BANK 

               上面得到的结果是31,因为去掉了null值,而如果加上nvl

SELECT "COUNT"("NVL"(UNBINDBANK_STATUS,0)) FROM T_CUST_BANK 

               上面得到结果为76条

             4、group by子句

               这个句子主要需要注意当我们使用时,在select 后查询哪些字段,在group by中就要写上哪些字段,除非把这些函数放到分组函数中

SELECT user_id , bid_status  ,"MAX"(BID_AMOUNT) FROM T_LOAN_BID GROUP BY user_id,bid_status

               如果写成:

               

SELECT user_id , bid_status  ,"MAX"(BID_AMOUNT) FROM T_LOAN_BID GROUP BY user_id

              就会报错:[Err] ORA-00979: 不是 GROUP BY 表达式
            5、having子句

              效率?

             having一般情况下与where子句是一样的,但是如果从效率方面考虑,我们就会优先选择where,因为where是先过滤,再分组,而having是先分组再过滤,比如我们现在要查出所有的女士,如果用where,就会先找出所有的女士,如果是having则会先将男士、女士分开,再查出女士,很显然,where的效率要比having快很多

             where和having的区别?

              不能在where中使用分组函数,但havging中却可以!

     二、连接

        1、等值连接

                等值连接我们经常使用:        

select user.id,cust.name  from t_user user ,t_customer  cust whre user.id=cust.userid

        2、不等值连接

               最经常用到的就是取值范围,比如:between and,< =等

        3、外连接

               外连接分为左外和右外

            左外即不管等号左边的值始终查出来显示,右外即等号右边的值始终查出来

            下面表示右外连接

select user.id,cust.name  from t_user user ,t_customer  cust whre user.id(+)=cust.userid

                下面表示左外连接

select user.id,cust.name  from t_user user ,t_customer  cust whre user.id=cust.userid(+)

                我们可以看出,这两个加号与我们想象中的位置是恰恰相反的。

        4、自连接

                 我们经常遇到一些这样的需求,比如树状结构,这种情况下我们可以通过别名来进行区别,别名就像是我们的小名。

     三、子查询

                  子查询,也可以认为是嵌套查询,通过层层筛选,得到想要的数据,当一个问题不能一步求解时,我们可以用子查询来解决。

                  

SELECT
					t3.USER_ID,
					T4.USER_NAME,
					t3.INVITE_USER_ID,
					t3.BID_AMOUNT,
					T3.operator_,
					t3.PHONECER,
					T3.CERTIFIED_STATUS,
					T3.STATUS,T3."ID"
						FROM
						(
							SELECT
							t1.USER_ID,
							t1.INVITE_USER_ID,
							t1.OPERATOR_,
							t2.TOTAL_BID_AMOUNT AS BID_AMOUNT,
							t1."ID",
							TAP.CERTIFIED_STATUS AS PHONECER,
							TARN.CERTIFIED_STATUS,
							T1.STATUS
							FROM
							T_CUST_USER_INVITE t1
							LEFT JOIN T_CAP_USER_ACCOUNT t2 ON t1.INVITE_USER_ID = t2.USER_ID
							LEFT JOIN T_AUTH_PHONE TAP ON TAP.USER_ID=t1.INVITE_USER_ID
							LEFT JOIN (SELECT * FROM T_AUTH_REAL_NAME WHERE CERTIFIED_STATUS=1) TARN ON TARN.USER_ID=t1.INVITE_USER_ID
						) t3
					LEFT JOIN T_CUST_USER t4 ON t3.USER_ID = t4.ID

                  注意!!

                     1、子查询中的小括号不能丢

                     2、子查询书写要整洁,方便阅读

                     3、子查询使用位置:where from select having ,注:group by不可以使用子查询

                     4、主查询和子查询可以不是同一张表

                     5、子查询中不需要使用排序,即使排序了也会在它的上一层被忽略掉

                  

                   

时间: 2024-11-05 18:53:11

oracle高级查询总结的相关文章

Oracle高级复制

文章摘要: Oracle作为数据库平台,并且有的项目使用到了Oracle的数据库复制技术,其中也遇到了一些问题,因此在这里,我对Oracle的复制技术谈一下我个人的理解,希望能够对采用Oracle数据库的项目组有所帮助.其中在文中使用到的SQL脚本都是经过检验可以运行的.          -------------------------------------------------------------------------------- 正文:     Oracle高级复制 在开始之

Oracle数据库查询响应时间的计算公式问题

问题描述 Oracle数据库查询响应时间的计算公式问题 前提条件 1.一个上亿级的数据表(t1),有字段客户memberid,产品productid. 2.查询语句select memberid,productid from t1 where memberid='' and productid='' 问题 1.没有建index,查询返回结果集时间S,记录条数N的计算公式? 2.建立索引(memberid,productid),那么查询返回结果集时间S,记录条数N的计算公式?

用Oracle并行查询发挥多CPU的威力

在一个单独的服务器中安装更多的CPU成为目前的一个趋势.使用对称多处理服务器(SMP)的情况下,一个Oracle服务器拥有8个.16个或32个CPU以及几吉比特RAM的SGA都不足为奇.     Oracle跟上了硬件发展的步伐,提供了很多面向多CPU的功能.从Oracle8i开始,Oracle在每个数据库函数中都实现了并行性,包括SQL访问(全表检索).并行数据操作和并行恢复.对于Oracle专业版的挑战是为用户的数据库配置尽可能多的CPU.     在Oracle环境中实现并行性最好的方法之

如何解决Oracle分页查询中排序与效率问题

本文将结合作者近日工作中,在ORACLE数据库分页查询时,遇到一个小问题,为大家讲解如何解决Oracle分页查询中排序与效率问题. 原始未分页查询Sql代码如下: select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by ID 结果如下: RN  I

关联-关于oracle中查询sql的优化

问题描述 关于oracle中查询sql的优化 在数据库中的某个表中有几百万条数据,现在要用这张表关联别的表去查询,查询速度很慢,如何优化才能使查询速度快一些. 解决方案 先优化SQL,然后再优化业务逻辑.最后优化数据库数据存储.起码得把SQL贴出来看看吧,几百万的数据不算多呀. 解决方案二: oracle的权值查询 解决方案三: 用一个相关联的ID,直接查那个表,这样就简单了!

LinQ To Objects 高级查询方法

 什么是LinQ To Objects?      用一个例子解释,首先定义一个数组,查询数组中的最大值:   int[] arr = { 123, 2, 3, 45, 654, 2324, 897, 56, 6554, 4, 3, 6, 8, 434 };      旧的方法:    int max=0 ; foreach(int a in arr) { if(a>=max) max=a; } Console.Write("最大值:"+ max);           LinQ

oracle分组查询中 查出的值为空的,用nvl()函数,把为空的填为0 为什么不起作用??

问题描述 oracle分组查询中 查出的值为空的,用nvl()函数,把为空的填为0 为什么不起作用?? 解决方案 不知道具体的情况 不过count(0) 不是null 如果没有值默认也是0 如例 select count(0) from dual where 1=2

DTCC:Oracle高级总监谈职场进阶法则

文章讲的是DTCC:Oracle高级总监谈职场进阶法则,又是一年毕业季,大多数刚走出校园的莘莘学子们也许还处在迷茫期.尤其是在对专业性要求较高的技术领域,虽然网传的资料有很多,但没有系统性的指导,让很多毕业生或是想调整方向的在职人士感觉入行困难.所以,一些圈内论坛和提问平台常能看到相关讨论. 本期采访我们邀请到了Oracle中国数据库技术团队的高级总监李珈,她负责全国Oracle数据库技术的方案咨询工作.作为在Oracle打拼多年的资深专家,李珈有机会见证了中国的信息化建设的飞速前进,与Orac

脚本-oracle条件查询,才能查询时不区分大小写

问题描述 oracle条件查询,才能查询时不区分大小写 Oracle 默认是区分大小写.如果不要区分,就要额外的设置. 下面就是不区分的脚本设置: ALTER SESSION SET NLS_COMP=ANSI; ALTER SESSION SET NLS_SORT=binary_ci;不过这个是在当前会话上,也就是说在每次发起查询的时候都需要执行这个才能起作用的.那么在java中该怎么设置才能得到所需的结果 解决方案 oracle查询区分大小写查询区分大小写查询区分大小写 解决方案二: sql