Oracle-4-2自连接、层次查询和分析函数

合集下载

Oracle分析函数用法详解

Oracle分析函数用法详解

Oracle分析函数Oracle分析函数实际上操作对象是查询出的数据集,也就是说不需二次查询数据库,实际上就是oracle实现了一些我们自身需要编码实现的统计功能,对于简化开发工作量有很大的帮助,特别在开发第三方报表软件时是非常有帮助的。

Oracle从8.1.6开始提供分析函数。

一、基本语法oracle分析函数的语法:function_name(arg1,arg2,...)over(<partition-clause> <order-by-clause ><windowing clause>)说明:1.partition-clause 数据记录集分组2.order-by-clause 数据记录集排序3.windowing clause 功能非常强大、比较复杂,定义分析函数在操作行的集合。

有三种开窗方式: range、row、specifying。

二、常用分析函数1. avg(distinct|all expression) 计算组内平均值,distinct 可去除组内重复数据select deptno,empno,sal,avg(sal) over (partition by deptno) avg_sal from t;DEPTNO EMPNO SAL AVG_SAL---------- ---------- ---------- ----------10 7782 2450 2916.666677839 5000 2916.666677934 1300 2916.6666720 7566 2975 21757902 3000 21757876 1100 21757369 800 21757788 3000 217530 7521 1250 1566.666677844 1500 1566.666677499 1600 1566.666677900 950 1566.666677698 2850 1566.666677654 1250 1566.666672.count(<distinct><*><expression>) 对组内数据进行计数3.rank() 和dense_rank()dense_rank()根据 order by 子句表达式的值,从查询返回的每一行,计算和其他行的相对位置,序号从 1 开始,有重复值时序号不跳号。

Oracle中分组和多表查询

Oracle中分组和多表查询

Oracle中分组和多表查询⼀、分组查询 1.语法:select 列名 from 表名 group by 列名; 2.举例:各个部门总⼯资:select deptno, ename , avg(sal) from emp group by deptno ; 3.对⾏筛选⽤where,对组筛选⽤having4.举例:各个部门中各个⼯作的平均⼯资:select deptno,job,avg(sal) from emp group by deptno ,job ;⼆、多表连接查询 1.交叉连接(笛卡尔积):所有情况的组合,不推荐使⽤,select * from emp,dept; 2.内连接:多张表通过相同的字段进⾏匹配,只显⽰匹配成功的数据 a. 查询员⼯信息与各个部门的所在的⼯作地址:select * from emp e, dept d where e.deptno = d.deptno; b.select * from emp e inner join dept d on e.deptno = d.deptno; 不等值连接(⼀般不使⽤):select * from emp e , dept d where e.deptno <=d.deptno; 3.外连接 左外连接:以左表为基准(左表数据全部显⽰),去匹配右表数据,如果匹配成功,则全部显⽰;匹配不成功,显⽰部分(⽆数据部分⽤NULL填充) a.(Oracle独有) select * from student s, sub b where s.stuid = b.sid(+); b. select * from student s left outer join sub b on s.stuid = b.sid; 右外连接:以右表为基准(右表数据全部显⽰),去匹配左表数据,如果匹配成功,则全部显⽰;匹配不成功,显⽰部分(⽆数据部分⽤NULL填充) a.(Oracle独有) select * from student s,sub b where s.stuid(+) = b.sid; b. select * from student s right outer join sub b on s.stuid = b.sid; 全外连接:左表和右表都不做限制,所有的记录都显⽰,两表不⾜的地⽅均为NULL;a. select * from student s full join sub b on s.stuid =b.sid; b. select * from student s full outer join sub b on s.stuid = b.sid; ⾃连接:将⼀张表通过别名“视为”不同的表 查询员⼯姓名,以及该员⼯的领导姓名:select e.ename, b.ename from emp e, emp b where e.mgr = b.empno;三、优化 层次连接:查询上级为空的员⼯信息(即最⾼的职位) select level, empno, ename, mgr from emp connect by prior empno = mgr --下层等于上层 start with mgr is null --当前节点的上层节点的值 = x; order by level;。

自助关联分析方案

自助关联分析方案

宽表 将多表事先关联好形成逻辑或物理单表自动关联 用户选择字段后,自动完成关联。

由用户指定关联 将表间关系暴露给用户,让用户自行关联。

自助关联分析是什么?多维分析通常针对单个表(CUBE),但实际业务常常会涉及多表关联。

那么如何让多维分析支持有JOIN关联的情况?宽表——维度层次多,造成冗余(逻辑数量可多至无穷),经常重新建模自动关联——仅适用于简单的情况,遇到同维字段或自关联时不能正确匹配由用户指定关联——面对复杂的表间关系会使业务用户比较“晕”多维分析基于DQL Server,首次解决业务人员实施多表关联自助分析的难题。

DQL(Dimensional Query Language,一种以维度为核心的类似SQL查询语言)——仅需一次性建模,将数据表的结构及表间关联关系保存于元数据文件中。

有新关联查询需求时无需更新模型,只有数据库中表及字段以及关联发生了改变才要再次改造模型。

常规关联分析的弊端DQL关联分析对比SQL优势12基本外键关联多层分析同维关联方案概述02030401CONTENT目录汇总表05大数据跨库分析06Dashboard分析07方案概述DQL(将元数据信息返回给目标应用控件)DQL Service 加载元数据(.lmd)Oracle数据库DQL Service加载元数据(.lmd)Mysql数据库DQL Service 加载元数据(.lmd)各种数据库… …语义层设计器生成与数据库对应的语义层元数据文件(.lmd)、面向业务人员重新描述数据库的字典文件(.dct)数据库JDBC数据库JDBC数据库JDBC自助报表控件DQL JDBC目标应用Dashboard分析控件应用方案结构图DQL数据关联•表中字段(可能多个)与另一个表(可能是本身)主键关联,构成外键的字段称为外键字段。

•外键指向记录可看作本表子属性引用。

外键属性化可以使多表关联查询转化成单表查询。

并且允许多层和递归引用。

start with在mysql中的用法

start with在mysql中的用法

mysql中如何实现start with的层次查询功能start with是Oracle数据库中的一个关键字,用于实现层次查询,即根据一个根节点,查询出其所有的子节点和后代节点。

mysql 数据库中没有start with这个关键字,但是可以通过其他的方法来模拟层次查询的功能。

本文将介绍三种在mysql中实现层次查询的方法,分别是使用递归函数、使用临时表和使用变量循环赋值。

这三种方法各有优缺点,适用于不同的场景和需求。

一、层次查询的概念和示例层次查询是一种根据数据之间的父子关系,从一个或多个根节点开始,查询出其所有的子节点和后代节点的查询方式。

层次查询常用于处理具有树状结构的数据,例如组织机构、产品分类、目录树等。

为了方便说明,我们使用一个简单的组织机构表作为示例,表结构如下:id name parent_id1A null2B13C14D25E26F37G null8H7其中,id字段是主键,name字段是组织名称,parent_id字段是父组织的id,如果为null表示没有父组织。

这个表可以表示如下的树状结构:A├─B│ ├─D│ └─E└─C└─FG└─H如果我们想要从A节点开始,查询出其所有的子节点和后代节点,即B、C、D、E、F,我们可以使用Oracle数据库中的start with和connect by关键字来实现,语法如下:select*from orgstart with id =1-- 根节点条件connect by prior id = parent_id -- 连接条件其中,start with指定了根节点的条件,connect by指定了连接条件,prior表示上一条记录。

这条语句的执行过程大致如下:1. 先从表中找出满足start with条件的记录,即id = 1的记录,作为第一层结果。

2. 然后根据connect by条件,找出与第一层结果相关联的记录,即parent_id等于第一层结果的id的记录,作为第二层结果。

基于OCI技术的Oracle数据库连接

基于OCI技术的Oracle数据库连接

收稿日期:2003-12-03基金项目:广东省科技计划项目资助项目(2003C101037);广东省自然科学基金重点资助项目(010421)作者简介:曾志聪(1979 ),男,广东韶关人,硕士研究生,研究方向为计算机网络。

基于OCI 技术的Oracle 数据库连接曾志聪,姚国祥(暨南大学网络中心,广东广州510632)摘 要:Oracle 数据库是目前应用最广泛的数据库之一,基于Oracle 数据库的大型应用对系统响应时间提出了越来越高的要求,如何有效地提高Oracle 数据库的访问效率,减少系统等待时间成为一个热门的研究问题。

文中介绍了Oracle Call In ter face(OCI)技术及其新特性,并通过分析和对比ODBC,JDBC 的实现机理,表明了OCI 技术在访问Oracle 数据库上性能的优越性。

最后描述了OCI 技术的编程机制,用OCI 技术实现了访问Oracle 数据库的典型应用,为OCI 技术的应用提供了技术参考。

关键词:Oracle 调用接口;JDBC 驱动接口;ODBC 驱动接口;Oracle 数据库;数据库接口中图分类号:T P311.138 文献标识码:A 文章编号:1005-3751(2004)08-0011-03Oracle Database Connection Based on OCI TechnologyZENG Zhi cong ,YAO Guo x iang(N etw ork Center of Jinan University,Guang zhou 510632,China)Abstract:Oracle i s one of the most popular databases.As the demand for a shorter response ti m e in large applicati ons based on Oracle database is i ncreasing,how to shorten the response time and effectivel y acces s an Oracle database become a hot topic and gain our research interest.In this paper Oracle call i nterface (OCI )technology and its new features are introduced.T he implementing mechanism of ODBC,JDBC and OC I are compared to show the better performance of OC I on accessing an Oracle database.Finally,the mechanism of OCI programming is particularly described and some typical functions implemented with OC I for accessing Oracle databases are provided for references.Key words:OCI;JDBC;ODBC;Oracle;database API0 引 言Oracle Call Interface(OCI)是Ora cle 的数据库调用接口。

28款经典数据库管理工具

28款经典数据库管理工具

28款经典数据库管理工具1、MySQL WorkbenchMySQL Workbench是一款专为MySQL设计的ER/数据库建模工具。

它是著名的数据库设计工具DBDesigner4的继任者。

你可以用MySQL Workbench设计和创建新的数据库图示,建立数据库文档,以及进行复杂的MySQL 迁移MySQL Workbench是下一代的可视化数据库设计、管理的工具,它同时有开源和商业化的两个版本。

该软件支持Windows 和Linux系统,下面是一些该软件运行的界面截图:2、数据库管理工具Navicat LiteNavicatTM是一套快速、可靠并价格相宜的资料库管理工具,大可使用来简化资料库的管理及降低系统管理成本。

它的设计符合资料库管理员、开发人员及中小企业的需求。

Navicat是以直觉化的使用者图形介面所而建的,让你可以以安全且简单的方式建立、组织、存取并共用资讯。

界面如下图所示:Navicat 提供商业版Navicat Premium 和免费的版本Navicat Lite 。

免费版本的功能已经足够强大了。

Navicat 支持的数据库包括MySQL、Oracle、SQLite、PostgreSQL 和SQL Server 等。

3、开源ETL工具KettleKettle是一款国外开源的etl工具,纯java编写,绿色无需安装,数据抽取高效稳定(数据迁移工具)。

Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。

&#183;授权协议:LGPL&#183; 开发语言:Java&#183; 操作系统:跨平台4、Eclipse SQL ExplorerSQLExplorer是Eclipse集成开发环境的一种插件,它可以被用来从Eclipse连接到一个数据库。

SQLExplorer插件提供了一个使用SQL语句访问数据库的图形用户接口(GUI)。

2022年闽南理工学院信息管理与信息系统专业《数据库概论》科目期末试卷B(有答案)

2022年闽南理工学院信息管理与信息系统专业《数据库概论》科目期末试卷B(有答案)

2022年闽南理工学院信息管理与信息系统专业《数据库概论》科目期末试卷B(有答案)一、填空题1、数据管理技术经历了______________、______________和______________3个阶段。

2、数据库管理系统的主要功能有______________、______________、数据库的运行管理以及数据库的建立和维护等4个方面。

3、视图是一个虚表,它是从______导出的表。

在数据库中,只存放视图的______,不存放视图对应的______。

4、设某数据库中有商品表(商品号,商品名,商品类别,价格)。

现要创建一个视图,该视图包含全部商品类别及每类商品的平均价格。

请补全如下语句: CREATE VIEW V1(商品类别,平均价格)AS SELECT商品类别,_____FROM商品表GROUP BY商品类别;5、以子模式为框架的数据库是______________;以模式为框架的数据库是______________;以物理模式为框架的数据库是______________。

6、在RDBMS中,通过某种代价模型计算各种查询的执行代价。

在集中式数据库中,查询的执行开销主要包括______和______代价。

在多用户数据库中,还应考虑查询的内存代价开销。

7、设某数据库中有作者表(作者号,城市)和出版商表(出版商号,城市),请补全如下查询语句,使该查询语句能查询作者和出版商所在的全部不重复的城市。

SELECT城市FROM作者表_____SELECT城市FROM出版商表;8、主题在数据仓库中由一系列实现。

一个主题之下表的划分可按______、______数据所属时间段进行划分,主题在数据仓库中可用______方式进行存储,如果主题存储量大,为了提高处理效率可采用______方式进行存储。

9、关系数据库中基于数学的两类运算是______________和______________。

10、在一个关系R中,若每个数据项都是不可再分割的,那么R一定属于______。

oracle数据库的with as用法-概述说明以及解释

oracle数据库的with as用法-概述说明以及解释

oracle数据库的with as用法-概述说明以及解释1.引言1.1 概述概述Oracle数据库是一种关系型数据库管理系统,具有高性能、可靠性和安全性等优势。

在Oracle数据库中,WITH AS子句是一种强大的查询工具,它可以简化复杂查询的编写过程,并提高查询的可读性和可维护性。

通过使用WITH AS子句,我们可以创建临时表达式或视图,然后在主查询中引用这些临时结果。

在本文中,我们将重点介绍Oracle数据库中WITH AS子句的用法。

首先,我们将了解WITH AS的基本概念和作用,然后探讨它的语法和用法。

最后,我们将讨论WITH AS的优点和应用场景,并进行总结。

通过本文的阅读,读者将能够更好地理解和应用Oracle数据库中的WITH AS子句,从而提高查询的效率和灵活性。

1.2文章结构【1.2 文章结构】本文将按照以下结构来介绍和讲解Oracle 数据库中的WITH AS 用法。

首先,在引言部分将对本文进行概述,然后介绍文章的目的。

接着,在正文部分,我们会详细讲解WITH AS 的概念和作用,并提供其语法和用法的实际示例。

最后,在结论部分,我们将重点强调WITH AS 的优点和应用场景,并对全文进行总结。

通过这样的结构安排,读者将能够逐步了解并掌握WITH AS 在Oracle 数据库中的使用方法和实际应用价值。

1.3 目的本文的目的是介绍和探讨Oracle数据库中的WITH AS用法。

通过深入理解WITH AS的概念、语法和用法,读者能够更加全面地了解该特性的作用和优势,并能够在实际的数据库开发过程中灵活地运用它。

在实际的数据库操作中,我们经常需要处理复杂的查询和数据操作。

这些操作可能需要使用到多个子查询或临时表,而WITH AS就是为了简化这种复杂查询和操作而设计的。

使用WITH AS可以将一个或多个子查询定义为一个临时的命名查询块,然后在主查询中使用这个命名查询块。

它的优势在于可以提高查询的可读性和可维护性,减少了重复的代码,同时也可以提升查询性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2013年10月25日
Oracle 10g SQL使用
9
层次搜索从顶到底的搜索:
– 例1:EMP 表每一条记录都有一个唯一标识当前雇员的 empno和标识这个雇员的经理的mgr列。如果mgr 为空表示 该雇员是该机构最顶级:
select LPAD(' ',4*(LEVEL-1)) ||ename name ,empno,mgr, LEVEL from emp start with mgr is null connect by prior empno=mgr;
2013年10月25日
Oracle 10g SQL使用
5
层次检索(查询)
SELECT [LEVEL], column, expr... FROM table [WHERE condition(s)] [START WITH condition(s)] [CONNECT BY PRIOR condition(s)]
2013年10月25日
Oracle 10g SQL使用
13
层次查询样例 例子3-CONNECT BY PRIOR:
– 如果mgr 为空,则该雇员是该机构的最顶级。现在要列 出每个雇员的层次结构(从顶到底):
SQL> select lpad(' ',4*(LEVEL-1)) ||ename name ,empno,mgr, LEVEL 2 from emp start with mgr is null 3 connect by prior empno=mgr; NAME EMPNO MGR LEVEL -------------------- ---------- ---------- ---------KING 7839 1 JONES 7566 7839 2 SCOTT 7788 7566 3 ADAMS 7876 7788 4 FORD 7902 7566 3 SMITH 7369 7902 4 BLAKE 7698 7839 2 ALLEN 7499 7698 3 WARD 7521 7698 3 MARTIN 7654 7698 3 TURNER 7844 7698 3 JAMES 7900 7698 3 CLARK 7782 7839 2 MILLER 7934 7782 3
2013年10月25日
14 rows selected.
Oracle 10g SQL使用
10
层次搜索-遍历方向 从底到顶的搜索(遍历至树根 ):
– 例2:现在要从某个雇员往他的上级列出该雇员的层次结构(
从底到顶):
SQL> col ename for a30 SQL> select lpad(' ',4*(level-1))||ename ename,mgr,empno from emp start with mgr=7788 connect by prior mgr= empno ; ENAME MGR EMPNO ---------------------------------ADAMS 7788 7876 SCOTT 7566 7788 JONES 7839 7566 KING 783 10g SQL使用
8
层次搜索-遍历方向 连接条件:
– CONNECT BY PRIOR column1 = column2 – 从顶到底(topdown),方法是: • Top down => Column1 = Parent Key • Column2 = Child Key • 对于emp表来说是:... CONNECT BY PRIOR employee_id = manager_id (见例子1) – 从底到顶 (BottomUp),方法是: • Bottom up =>Column1 = Child Key • Column2 = Parent Key
层次查询和分析函数
EMP PK EMPNO ENAME JOB DEPTNO=DEPTNO MGR HIREDATE SAL COMM DEPTNO DEPT PK DEPTNO DNAME LOC
FK2
FK1
EMPNO=MGR
查询emp表的样例 SCOTT模式下的emp表:
SELECT empno,ename,mgr FROM emp WHERE mgr IN(SELECT empno FROM emp WHERE mgr IS NULL); EMPNO ENAME MGR ---------- ---------- ---------7566 JONES 7839 7698 BLAKE 7839 7782 CLARK 7839 SELECT empno,ename,mgr FROM emp WHERE mgr=7566; EMPNO ENAME MGR ---------- ---------- ---------7788 SCOTT 7566 7902 FORD 7566 SELECT empno,ename,mgr FROM emp WHERE mgr=7782; EMPNO ENAME MGR ---------- ---------- ---------7934 MILLER 7782
2013年10月25日
Oracle 10g SQL使用
7
层次检索-编历树
树根的行由START WITH子句确定,它可用作任何有效性条件连接; 比如EMP表中用start with KING(因为他是公司总经理),如: START WITH mgr IS NULL EMP表,可用start with emp_id Kochhar做为条件,如:…START WITH emp_id=(SELECT emp_id FROM emp Where last_name=‘Kochhar’ ) 如果省略START WITH 子句,表示从树根搜索所有行。如果有一个Where 子 句被使用,则从该指定的行搜索所有行,这不会反应真正的层次。 CONNECT BY PRIOR和START WITH 不是ANSI(美国国家标准局 )标准.
SELECT 是一个标准的 SELECT 语句 LEVEL 是层次查询所返回的值:1 为根(root) ;2 表示根的分枝(孩 子),等等 FROM 后可以是表、视图、快照,只选择一个 WHERE 限制行的返回;condition 表达式 START WITH指定从根的何处开始搜索
2013年10月25日
Oracle 10g SQL使用
16
层次查询样例
例子5-从根开始,从顶到底,消除Higgins, 及子行:
SQL> 2 3 4 5 SELECT deptno, empno,ename, job , sal FROM emp START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr AND ename != 'Higgins'; JOB SAL --------- ---------PRESIDENT 5000 MANAGER 2975 ANALYST 3000 CLERK 1100 ANALYST 3000 CLERK 800 MANAGER 2850 SALESMAN 1600 SALESMAN 1250 SALESMAN 1250 SALESMAN 1500 CLERK 950 MANAGER 2450 CLERK 1300
自然的树结构(EMP表)
emp表本身的数据存在树型关系:
emp表的树型结构是按照empno和mgr的关系而建立 这样的关系可在开发时的自我连接时使用
mgr行包含有他所雇佣的员工的编号 这样的父子关系使你可以控制:
直接的搜索 从层次的某个点开始
emp表 在该表中,你可查询出表中行与行之间的关系 关系数据库并不将这些关系存储在数据库里,然 而表里可存在树型走向问题(tree walking) 而层次查询是按照树型分枝查询的一种方法 可想象与一个家族树一样,最年长为树干,最年 轻者就是分枝的成员 层次查询可按照任何层次迚行搜索
2
3
根节点的孩子
孩子的孩子,等…
2013年10月25日
Oracle 10g SQL使用
12
层次搜索-LEVEL&LADP
LPAD关键字:
– LPAD 是一个字符函数,表示在左加字符:
COLUMN org_chart FORMAT A12 SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)2,’_’) AS org_chart FROM emp START WITH last_name=’King’ CONNECT BY PRIOR employee_id=manager_id
2013年10月25日
14 rows selected.
Oracle 10g SQL使用
14
修剪枝
使用 WHERE 子句 可消除某个节点,如 WHERE last_name != ’Higgins’
Kochhar
使用 CONNECT BY子句 可消除一个分枝. CONNECT BY PRIOR employee_id = manager_id Kochhar AND last_name != ’Higgins’
DEPTNO EMPNO ENAME ---------- ---------- ---------10 7839 KING 20 7566 JONES 20 7788 SCOTT 20 7876 ADAMS 20 7902 FORD 20 7369 SMITH 30 7698 BLAKE 30 7499 ALLEN 30 7521 WARD 30 7654 MARTIN 30 7844 TURNER 30 7900 JAMES 10 7782 CLARK 10 7934 MILLER
相关文档
最新文档