Oracle-4-2自连接、层次查询和分析函数
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中分组和多表查询⼀、分组查询 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中的用法
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数据库连接
收稿日期: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款经典数据库管理工具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则完成整个工作流的控制。
·授权协议:LGPL· 开发语言:Java· 操作系统:跨平台4、Eclipse SQL ExplorerSQLExplorer是Eclipse集成开发环境的一种插件,它可以被用来从Eclipse连接到一个数据库。
SQLExplorer插件提供了一个使用SQL语句访问数据库的图形用户接口(GUI)。
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用法-概述说明以及解释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可以将一个或多个子查询定义为一个临时的命名查询块,然后在主查询中使用这个命名查询块。
它的优势在于可以提高查询的可读性和可维护性,减少了重复的代码,同时也可以提升查询性能。
oracle中的左右连接
oracle中的左右连接(一)在oracle中左右连接省去了sql server中复杂的连接语句,就用一个“(+)”表示。
例:select a.aaa,b.bbb from a,b where c(+)=c上面的语句执行完后,将完返回b中所有的记录,不论c能否与c匹配。
-------------右连接,(+)在左边select a.aaa,b.bbb from a,b where c=c(+)上面的语句执行完后,将完返回a中所有的记录,不论c能否与c匹配。
-------------左连接,(+)在右边总结:(+)在哪一边,则返回另一边所有的记录。
(二)数据表的连接有:1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现2、外连接: 包括(1)左外连接(左边的表不加限制)(2)右外连接(右边的表不加限制)(3)全外连接(左右两表都不加限制)3、自连接(连接发生在一张基表内)select a.studentno, a.studentname, b.classnamefrom students a, classes bwhere a.classid(+) = b.classid;STUDENTNO STUDENTNAM CLASSNAME---------- ---------- ------------------------------1 A 一年级一班2 B 一年级二班一年级三班以上语句是右连接:即"(+)"所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配。
也就是说上例中,无论会不会出现某个班级没有一个学生的情况,这个班级的名字都会在查询结构中出现。
反之:select a.studentno, a.studentname, b.classnamefrom students a, classes bwhere a.classid = b.classid(+);STUDENTNO STUDENTNAM CLASSNAME---------- ---------- ------------------------------1 A 一年级一班2 B 一年级二班3 C则是左连接,无论这个学生有没有一个能在一个班级中得到匹配的部门号,这个学生的记录都会被显示。
oracle递归函数
oracle递归函数oracle start with connect by 使⽤⽅法oracle中 connect by prior 递归算法Oracle中start with...connect by prior⼦句使⽤⽅法 connect by 是结构化查询中⽤到的,其基本的语法是:select ... from tablename start with 条件1connect by 条件2where 条件3;例:select * from tablestart with org_id = 'HBHqfWGWPy'connect by prior org_id = parent_id;简单说来是将⼀个树状结构存储在⼀张表⾥,⽐⽅⼀个表中存在两个字段:org_id,parent_id那么通过表⽰每⼀条记录的parent是谁,就能够形成⼀个树状结构。
⽤上述语法的查询能够取得这棵树的全部记录。
当中:条件1 是根结点的限定语句,当然能够放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,当中⽤PRIOR表⽰上⼀条记录,⽐⽅ CONNECT BY PRIOR org_id = parent_id就是说上⼀条记录的org_id 是本条记录的parent_id,即本记录的⽗亲是上⼀条记录。
条件3 是过滤条件,⽤于对返回的全部记录进⾏过滤。
简介例如以下:早扫描树结构表时,须要依此訪问树结构的每⼀个节点,⼀个节点仅仅能訪问⼀次,其訪问的过程例如以下:第⼀步:从根节点開始;第⼆步:訪问该节点;第三步:推断该节点有⽆未被訪问的⼦节点,若有,则转向它最左側的未被訪问的⼦节,并运⾏第⼆步,否则运⾏第四步;第四步:若该节点为根节点,则訪问完成,否则运⾏第五步;第五步:返回到该节点的⽗节点,并运⾏第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程。
1.树结构的描写叙述树结构的数据存放在表中,数据之间的层次关系即⽗⼦关系,通过表中的列与列间的关系来描写叙述,如EMP表中的EMPNO和MGR。
联合查询语句
联合查询语句联合查询(JOIN)是数据库查询的一种方式,用于从两个或多个表中基于相关列将行组合起来。
联合查询在处理涉及多个表的数据时非常有用,特别是当你需要根据一个表中的值来检索另一个表中的数据时。
以下是几种常见的联合查询类型:1.内连接(INNER JOIN): 返回两个表中匹配的行。
sql复制代码SELECT column_name(s)FROM table1INNER JOIN table2ON table1.column_name = table2.column_name;2.左连接(LEFT JOIN 或LEFT OUTER JOIN): 返回左表中的所有行,以及右表中匹配的行。
如果右表中没有匹配的行,结果中将为NULL。
sql复制代码SELECT column_name(s)FROM table1LEFT JOIN table2ON table1.column_name = table2.column_name;3.右连接(RIGHT JOIN 或RIGHT OUTER JOIN): 与左连接相反,返回右表的所有行和左表中的匹配行。
sql复制代码SELECT column_name(s)FROM table1RIGHT JOIN table2ON table1.column_name = table2.column_name;4.全连接(FULL JOIN 或FULL OUTER JOIN): 返回左表和右表中的所有行。
如果某侧没有匹配的行,结果中将为NULL。
sql复制代码SELECT column_name(s)FROM table1FULL JOIN table2ON table1.column_name = table2.column_name;5.交叉连接(CROSS JOIN): 返回左表和右表中所有可能的组合。
sql复制代码SELECT column_name(s)FROM table1CROSS JOIN table2;6.自连接(Self-Join): 一个表与其自身进行连接。
Oracle Spatial 空间数据库教程
m_session.Open(); // 打开一个会话 m_database.Open(m_session, dbaseName, userName, password) ; // 建立数据库连接, dbaseName是数据库名称
(4)SDO_ELEM_INFO
SDO_ELEM_INFO是一个可变长度的数组,每3个数作为一 个元素单位,用于解释坐标是如何存储在SDO_ORDINATES 数组中的。本文把组成一个元素的3个数称为3元组。一个3 元组包含以下3部分的内容: l SDO_STARTING_OFFSET
SDO_STARTING_OFFATES数组中的存储位置。它的值从1开始, 逐渐增加。
元数据表说明
Oracle Spatial的元数据表存储了有空间数据的数据表名称、 空间字段名称、空间数据的坐标范围、坐标参考信息以及坐 标维数说明等信息。用户必须通过元数据表才能知道 ORACLE数据库中是否有Oracle Spatial的空间数据信息。一般 可以通过元数据视图(USER_SDO_GEOM_METADATA)访 问元数据表。元数据视图的基本定义为:
(2)SDO_SRID SDO_SRID也是一个NUMBER型的数值,它用于标识与几 何对象相关的空间坐标参考系。如果SDO_SRID为空 (null),则表示没有坐标系与该几何对象相关;如果该 值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段 的一个值,在创建含有几何对象的表时,这个值必须加入 到描述空间数据表元数据的 USER_SDO_GEOM_METADATA视图的SRID字段中。 Oracle Spatial规定,一个几何字段中的所有几何对象都必 须为相同的SDO_SRID值。
VALUES ('GEOD_CITIES', 'LOCATION',
数据库系统原理教程(第七章)清华大学
SYBASE关系数据库产品(续)
Sybase System 11.5 – SQLServer,关系数据库管理系统,专门负 责高速计算、数据管理、事务管理
ORACLE的Internet解决方案(续)
Oracle WebServer 2.0 增加了JAVA解释器和
LiveHTML解释器,使其能支持多种语言 由Web Request Broker(WRB), WebServer SDK 和 Webserver管理工具组成 – WRB是一个多线索多进程的HTTP服务器 – WebServer SDK 是一个开放的应用开发环境, 封装了WRB应用编程接口,允许用户使用 JAVA, LiveHTML, C++等web应用开发工 具
ORACLE工具(续)
Designer/2000 – CASE工具,帮助用户对复杂系统进行建模、 分析和设计 – 完成概要设计后,可以用来帮助绘制E-R 图、功能分层图、数据流图和方阵图,自动 生成数据字典、数据库表、应用代码和文档 – 由BPR, Modellers, Generators等组成
ORACLE工具(续)
Developer/2000(续) – ORACLE Forms 是快速生成基于屏幕的复 杂应用的工具,所生产的应用程序具有查询 和操纵数据的功能,可以现实多媒体信息, 具有GUI界面 – ORACLE Reprots是快速生产报表工具,如 普通报表、主从式报表、矩阵报表 – ORACLE Graphics是快速生产图形应用的 工具 – ORACLE Books用于生成联机文档
7. ORACLE的Internet解决方案
Oracle WebServer 1.0 主要由Oracle
WebListener, Oracle WebAgent和ORACLE7 服务器部分组成
Oracle面试题及答案
Oracle⾯试题及答案模块⼀ SQL(DQL)l 基本SQL 查询l 运算符与函数l ⼦查询l 连接查询建表语句emp.sqlPart I(第⼀天)01. 查询员⼯表所有数据, 并说明使⽤*的缺点答:select * from emp;使⽤*的缺点有a) 查询出了不必要的列b) 效率上不如直接指定列名02. 查询职位(JOB)为'PRESIDENT'的员⼯的⼯资答:select * from emp where job = 'PRESIDENT';03. 查询佣⾦(COMM)为0 或为NULL 的员⼯信息答:重点是理解0 与null 的区别select * from emp where comm = 0 or comm is null;04. 查询⼊职⽇期在1981-5-1 到1981-12-31 之间的所有员⼯信息答:通过此题掌握常⽤⽇期函数select * from emp where hiredatebetween to_date('1981-5-1','yyyy-mm-dd') and to_date('1981-12-31','yyyy-mm-dd');05. 查询所有名字长度为4 的员⼯的员⼯编号,姓名答:select * from emp where length(ename) = 4;06. 显⽰10 号部门的所有经理('MANAGER')和20 号部门的所有职员('CLERK')的详细信息答:select * from emp where deptno = 10 and job = 'MANAGER' or deptno = 20 and job ='CLERK';07. 显⽰姓名中没有'L'字的员⼯的详细信息或含有'SM'字的员⼯信息答:考察知识点模糊查询select * from emp where ename not like '%L%' or ename like '%SM%';08. 显⽰各个部门经理('MANAGER')的⼯资答:select sal from emp where job = 'MANAGER';09. 显⽰佣⾦(COMM)收⼊⽐⼯资(SAL)⾼的员⼯的详细信息答:select * from emp where comm > sal;10. 把hiredate 列看做是员⼯的⽣⽇,求本⽉过⽣⽇的员⼯(考察知识点:单⾏函数)答:select * from emp where to_char(hiredate, 'mm') = to_char(sysdate , 'mm');11. 把hiredate 列看做是员⼯的⽣⽇,求下⽉过⽣⽇的员⼯(考察知识点:单⾏函数)答:select * from emp where to_char(hiredate, 'mm') = to_char(add_months(sysdate,1) , 'mm'); 12. 求1982 年⼊职的员⼯(考察知识点:单⾏函数)答:select * from emp where to_char(hiredate,'yyyy') = '1982';13. 求1981 年下半年⼊职的员⼯(考察知识点:单⾏函数)答:select * from emp where hiredatebetween to_date('1981-7-1','yyyy-mm-dd') and to_date('1982-1-1','yyyy-mm-dd') - 1;14. 求1981 年各个⽉⼊职的的员⼯个数(考察知识点:组函数)答:select count(*), to_char(trunc(hiredate,'month'),'yyyy-mm')from emp where to_char(hiredate,'yyyy')='1981'group by trunc(hiredate,'month')order by trunc(hiredate,'month');Part II(第⼆天)01. 查询各个部门的平均⼯资答:考察知识点:分组select deptno,avg(sal) from emp group by deptno;02. 显⽰各种职位的最低⼯资答:考察知识点:分组select job,min(sal) from emp group by job;03. 按照⼊职⽇期由新到旧排列员⼯信息答:考察知识点:排序select * from emp order by hiredate desc;04. 查询员⼯的基本信息,附加其上级的姓名答:考察知识点:⾃连接select e.*, e2.ename from emp e, emp e2 where e.mgr = e2.empno;05. 显⽰⼯资⽐'ALLEN'⾼的所有员⼯的姓名和⼯资答:考察知识点:⼦查询select * from emp where sal > (select sal from emp where ename='ALLEN');分析:当查询结果是⼀⾏⼀列时,可以将此结果看做⼀个值,参与条件⽐较。
oracle数据库关联查询语句
oracle数据库关联查询语句关联查询是在多个表之间进行数据关联的一种查询方式。
在Oracle数据库中,可以使用JOIN子句来进行关联查询。
JOIN 子句可以将两个或多个表中符合指定条件的行组合在一起,返回查询结果。
以下是一些常见的Oracle数据库关联查询的写法和相关参考内容:1. 内连接查询:内连接查询是在两个表中只返回匹配的行。
常见的内连接方式包括等值连接和非等值连接。
内连接查询的语法如下:```SELECT column_name(s)FROM table1INNER JOIN table2ON table1.column_name = table2.column_name;```2. 外连接查询:外连接查询将返回两个表中的匹配行,以及不匹配的行。
外连接分为左外连接和右外连接,分别表明查询结果中包括左表的所有行或右表的所有行。
左外连接查询的语法如下:```SELECT column_name(s)FROM table1LEFT JOIN table2ON table1.column_name = table2.column_name;```右外连接查询的语法如下:```SELECT column_name(s)FROM table1RIGHT JOIN table2ON table1.column_name = table2.column_name;```3. 自连接查询:自连接是指在同一个表中进行连接查询。
通过自连接可以实现在同一个表中比较不同列的值。
自连接查询的语法如下:```SELECT column_name(s)FROM table1 t1, table1 t2WHERE t1.column_name = t2.column_name;```4. 子查询关联:子查询关联是指在一个查询中使用另一个查询的结果作为条件进行关联查询。
子查询关联查询的语法如下:```SELECT column_name(s)FROM table1WHERE column_name IN (SELECT column_name FROMtable2);```5. 多表关联查询:多表关联查询是指同时查询多个表的数据进行关联查询。
Oracle树形结构查询(递归)
Oracle树形结构查询(递归)oracle树状结构查询即层次递归查询,是sql语句经常⽤到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的。
概要:树状结构通常由根节点、⽗节点、⼦节点和叶节点组成,简单来说,⼀张表中存在两个字段,dept_id,par_dept_id,那么通过找到每⼀条记录的⽗级id即可形成⼀个树状结构,也就是par_dept_id(⼦)=dept_id(⽗),通俗的说就是这条记录的par_dept_id是另外⼀条记录也就是⽗级的dept_id,其树状结构层级查询的基本语法是: SELECT [LEVEL],* FEOM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDER BY 排序字段 说明:LEVEL---伪列,⽤于表⽰树的层次 条件1---根节点的限定条件,当然也可以放宽权限,以获得多个根节点,也就是获取多个树 条件2---连接条件,⽬的就是给出⽗⼦之间的关系是什么,根据这个关系进⾏递归查询 条件3---过滤条件,对所有返回的记录进⾏过滤。
排序字段---对所有返回记录进⾏排序 对prior说明:要的时候有两种写法:connect by prior dept_id=par_dept_id 或 connect by dept_id=prior par_dept_id,前⼀种写法表⽰采⽤⾃上⽽下的搜索⽅式(先找⽗节点然后找⼦节点),后⼀种写法表⽰采⽤⾃下⽽上的搜索⽅式(先找叶⼦节点然后找⽗节点)。
树状结构层次化查询需要对树结构的每⼀个节点进⾏访问并且不能重复,其访问步骤为: ⼤致意思就是扫描整个树结构的过程即遍历树的过程,其⽤语⾔描述就是: 步骤⼀:从根节点开始; 步骤⼆:访问该节点; 步骤三:判断该节点有⽆未被访问的⼦节点,若有,则转向它最左侧的未被访问的⼦节,并执⾏第⼆步,否则执⾏第四步; 步骤四:若该节点为根节点,则访问完毕,否则执⾏第五步; 步骤五:返回到该节点的⽗节点,并执⾏第三步骤。
oracle子查询与节点查询
最近项目中用到了很多ORACLE的查询语句,尤其是各种连接查询和子查询,现在就总结下这些语句的用法和部分效率相关内容.首先是连接查询.当我们所需要的数据存在于两张不同的表中时,这个时候就需要用到表连接查询.1. select d.deptno,d.dname,e.empno,e.ename,e.salfromdept d join emp e on d.deptno=e.deptno;--这是在做一个连接查询,连接的条件就是以表emp别名e和表dept别名d的deptno字段相等为条件做的一个表连接查询当emp表中的deptno字段与dept 中的deptno字段能一一对应的时候,就现在在结果集中2. select d.deptno,d.dname,e.empno,e.ename,e.salfrom dept d , emp ewhere d.deptno=e.deptno;--这个其实做得是和上面一样的一个连接查询,功能完全一样,如果前一个写法是现代写法,那么这个写法就算是古典写法吧3. select d.deptno,d.dnam e,e.empno,e.ename,e.salfromdept d left join emp e on d.deptno=e.deptno;--这是左连接查询,就是第一种查询里加了一个关键字left, 这种查询的结果于第一种不同,左边的表dept 中所有的记录都会显示在结果集中,无论emp表中是否有与之对应的对应left还有right,那么就是连接时,右边表的结果集全都显示在表中,叫做右连接4. ORACLE针对左右连接查询,还有特别的符号(+),并且ORALCE针对使用这个符号的连接查询做了特别的优化,select d.deptno,d.dname,e.empno,e.ename,e.salfrom dept d,emp ewhere d.deptno=e.deptno(+);--这个加号写在左边,其查询的结果和使用left的左连接查询效果相同select d.deptno,d.dname,e.empno,e.ename,e.salfrom dept d,emp ewhere d.deptno(+)=e.deptno;--这个加号写在左边,其查询的结果和使用right的右连接查询效果相同5. 最后还有一种全连接,使用full join 关键字select d.deptno,d.dname,e.empno,e.ename,e.salfrom dept d full join emp e on d.deptno=e.deptno;--这种查询效率不高,很少用到,左右表的数据全显示6.自连接,这个就是数据都在一张表中,但是需要根据条件筛选select yg.ename,sj.ename 上级from emp yg,emp sjwhere yg.mgr=sj.empno下面介绍下oracle特有的树形查询语句一般来说,如果数据库本身没有封装树形查询,那么就需要使用JAVA或者其他语言写相应的递归查询,写起来是比较复杂的,用起来效率肯定也没oracle封装后的效率高.先建立一张表,用于保存一个树形结构.create table type_tree(type_id number(5) primary key,type_name varchar2(10),parent_type number(5));也有很多项目使用的两张表或者多张表保存属性结构,这样也是可以保存的,但是这样的设计对于很复杂的树形结构是很不方便的,因为每一个节点都必须要有一张对应的表,当查询涉及多个节点的时候,就需要连接多个表,连接的表越多,效率越低.而且在以后扩展业务需求的时候,节点增加,表也增加.如果项目中不会涉及到很多的树形查询,那么我个人认为这种设计也是可以的接受的.7.使用自链接查询子节点,父节点select s.type_nam e as 节点,p.type_name as 父节点from type_tree s,type_tree pwhere s.parent_type=p.type_idorder by 2--这种查询也可以查处某种成都的树形结构,只不过其缺点是只能知道父节点和子节点两层,更多的需求还是需要使用递归查询.8.使用Oracle提供了递归查询(又叫树型查询)select t.*,level as 层次--level,oracle数据库中的关键字,表示层次from 表twhere 普通条件--也可以用于限制levelstart with 子ID=? --开始的节点connect by prior 子ID=父ID --子ID=父ID 往下查父ID=子ID 往上查例如: 显示每个节点的信息和它所处的层次(level)select t.*,level as 层次from type_tree tstart with t.type_id=100connect by prior t.type_id=t.parent_type9.在网页上实现展示点击一个节点后,展示此节点下面的一层子节点,那么这时就需要用到where条件中过滤levelselect t.*,level as 层次from type_tree twhere level=2 --用到了level,2表示是以此节点为根节点的下一层节点start with t.type_id=100connect by prior t.type_id=t.parent_type10. 对level字段使用max可以获得从每个节点开始,向下(或向上)的层次数量select max(level) as maxlevelfrom type_tree tstart with t.type_id=107 --在此填写不同的开始节点,就可以获得此节点开始的节点数量connect by prior t.type_id=t.parent_type由此可以看出,使用oracle中内置的递归查询,可以很轻松的实现所有的树形查询了.下面介绍下子查询与效率的问题子查询分为相关子查询和非相关子查询非相关子查询是独立于外部的的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询.非相关子查询的子查询部分是可以单独执行的.相关子查询的执行以来于外部查询的数据返回一行,子查询就执行一次.由此也可以看出,相关子查询的效率是不高的,所以很少使用.示例:查询各部门的人数,格式:部门编号,部门名称,人数select deptno,dname,0 as 人数from dept; --计算列子查询,这个查询本身没什么实际意义,就是始终让一列为0select deptno,dname,(select count(*) from emp) as 人数from dept; --非相关子查询,这个查询本身也没什么实际意义,就是始终让一列为emp表中的记录总数select deptno,dname,(select count(*) from emp where emp.deptno=dept.deptno) as 人数from dept;--相关子查询,查询每个部门的人数,子查询中的所用到的where 条件后面的 dept,deptno依靠外部查询传入这样看起来起来,就像没一条dept的记录都会让子查询执行一次.DEPTNO DNAME 人数10 ACCOUNTING select count(*) from emp where emp.deptno=1020 RESEARCH select count(*) from emp where emp.deptno=2030 SALES select count(*) from emp where emp.deptno=3040 OPERATIONS select count(*) from emp where emp.deptno=40如果一张表中的记录条数达到了10000条,而它的每一行某个字段又作为了子查询查询另外一张表(这张表有20000条记录)的一个条件,那么这样计算下来,这条语句一共执行了10000+10000*20000次,效率是相当的低了.。
Oracle经典基本查询实例及详解(强烈推荐)
Oracle经典基本查询实例及详解(强烈推荐)Oracle经典实例查询及详解(强烈推荐)⼀:深⼊浅出⼦查询1. 查询⼯资⾼于500或是岗位为manager的雇员的信息,同时还要满⾜他们的姓名⾸写字母为⼤写J:select * from emp where (sal>500 or job='manager') and ename like 'J%';括号⾥满⾜⾄少满⾜⼀个,并且姓名⾸写字母为⼤写J。
2. 按⼯资由低到⾼的顺序显⽰员⼯信息:select * from emp order by sal desc ;注:desc⾼到低;asc 低到⾼,升序这是默认的。
3.按照部门号升序⽽雇员的⼯资降序排列。
(知道某个部门最⾼⼯资的员⼯最低⼯资的员⼯是谁。
)select * from emp order by deptno,sal desc;(先按部门排再按⼯资排)4.使⽤列的别名排序按升序显⽰员⼯年薪信息。
elect ename,(sal+nvl(comm,0))*12 年薪 from emp order by 年薪5.使⽤⼦查询。
(分组函数:max,min,avg,sum,count.)select min(sal),max(sal)from emp //在这⾥查询的列都必须是分组函数。
6.显⽰⼯资最⾼的员⼯信息(1)这⾥可以分两步⾛:先查询出来最⾼⼯资;select max(sal) from epm (2)select ename ,sal from emp where sal=(select max(sal) from epm);//select max(sal) from emp返回⼀个值。
注:where 后的列如sal不能直接等于分组函数,Sal=max(sal)是错的。
要解决此题就要⽤到⼦查询。
7.⼦查询(分步拆分思想):显⽰与smith同⼀部门的员⼯信息。
oracle语法大全有注解
第一部分基本语法//拼接表字段select id || 'is' || name from adminselect * from emp where ename like'%s%';//模糊查询select * from emp where mgr is null ; //查询表列为空的to_date('2011-12-12','yyyy-mm-dd') //插入时间格式 to_date()//给表字段取别名select id as这是ID , name as "这是名字" from admin//清除重复出现的值select distinct id,name from admin//用户定义降序select * from admin order by id desc //asc升序 //desc降序//查询当前时间select sysdate from admin第二部分字符函数//截取字符串select substr (name,1,1) as用户名from admin //(1,1)表示第一个开始,和第一个数//取出字段的长度select length(name) from admin//取出字符串为’张’当前所在的位置为几,找不到则为0 …区分大小写select name ,instr(name,'张') from admin// lpad左侧补全, rpad右侧补全select lpad(name,10, '-') from adminselect rpad(name,10, '-') from admin//给字段截取前后空格select trim(name) from admin//给字段为张的全部替换为zhangselect name ,replace(name,'张','zhang') from admin第四部分表达式语法//case表达式语句给用户区别名用法,相当与if elseselect id,name,case id when1then'优'when2then'良'when3then'差'else'未知'end部门from admin//decode()函数给用户区别名用法,与上面意思一个样select id,name,decode(id,1,'优',2,'良',3,'差','未知') as成绩from admin//函数嵌套,单行函数可以嵌套使用,嵌套层次无限制select id,name,initcap(trim(rpad(name,10,'-'))) from admin//函数里面可以是字段名,也可以是表达式,日期类型select avg(id) as平均数,max(id) as最大数,min(id) as最小数,sum(id) as总和from admin//查询总数,不能有重复和不能为空的id总数select count(distinct(id)) as总数from admin//求总和,如果id字段为空,则设置字段为0. 然后用总和除以总数最后得出结果select sum(nvl(id,0)) / count(id) as总和除以总数from admin//查询id为1的数量有多少个 , 根据平均分排序select count(id) as记录数from admin where id =1group by id having id=1 order by avg(id)//查询id大于3 having筛选 id<5 之间的数总数select count(id) as记录数from admin where id > 3group by id having id < 5第六部分多表连接//emp表和dep表结构--emp表,create table emp(empNo number,eName varchar2(20), sal number, deptNo number);insert into emp(empNo,eName,sal,deptno) values(7369,'smith',800,20);insert into emp values(7499,'allen',1600,30);insert into emp values(7521,'ward',1250,30);insert into emp values(7566,'jones',2975,20);insert into emp values(7654,'martin',1250,30);insert into emp values(7902,'ford',300,20);insert into emp values(7934,'miller',1300,10);drop table empselect * from emp--dep表create table dep(deptNo number,dName varchar2(20),loc varchar2(20));insert into dep values(10,'accounting','new york')insert into dep values(20,'research','dallas')insert into dep values(30,'sales','chicago')insert into dep values(40,'operations','boston')insert into dep values(50,'advertisement','beijing')drop table depselect * from dep// 根据deptNo编号对应查找出相应的数据select emp.empno,emp.ename,emp.sal,emp.deptno,dep.deptno,dep.dname,dep.loc from emp,depwhere emp.deptno = dep.deptno;// Join字句连接的方法查询两张表数据, using(deptNo)参照列进行连接// right left 左右连接全外连接 full outerselect emp.empno,emp.ename,emp.sal,deptno,deptno,dep.dname,dep.locfrom emp join depusing(deptno);// on字句连接的方法查询两张表数据,On( emp.deptno = dep.deptno and sal > 1000);// 根据deptNo编号对应查找出相应的数据根据sal和loc进行筛选select e.empno,ename,sal,d.deptno,d.deptno,dname,locfrom emp e,dep dwhere e.deptno = d.deptno and ( e.sal > 1000or d.loc='chicago' );// e和d对应 d和l对应的数据进行三表查询,,select e.empno,ename,sal,d.deptno,d.deptno,dname,loc,l.idfrom emp e,dep d,loc lwhere e.deptno = d.deptno and l.id=e.id// Join 进行三表查询,,select e.empno,ename,sal,d.deptno,d.deptno,dname,loc,l.idfrom emp join dep using(deptNo)natural join locatins; //也可以继续 join 表名 using(关联列)第七部分子查询// 简单的子查询语法,,如果有多个返回值select * from emp where sal > ( select sal from emp where sal = 800 )+ ( select sal from emp where sal = 300 )//使用 in等于列表中任何一个 not in 不在这里面的所有列表select * from emp where sal not in (select avg(sal) from emp group by deptno)//使用 any 和子查询返回的任意一个值比较查最小select * from emp where sal > any (select avg(sal) from emp group by deptno)//使用 all和子查询返回的所有值比较查最大select * from emp where sal > all (select avg(sal) from emp group by deptno)//返回前面五条最高记录, rownum相当与 sqlserver里面top rownum也可当虚拟主键select * from (select * from emp order by sal desc) where rownum <=5//分页子查询语句,, rownum定义的虚拟主键,别名myno where 进行筛选select * from (select rownum myno , a.* from (select * from emp order by sal desc) a ) where myno > 4and myno <=7//希望员工scott的岗位,工资,补助与smith员工一样Update emp set (job,sal,comm) = (select job,sal,comm from emp where = 'smith') where ename = 'scott';第八部分DML与事务控制//事物必须满足ACID属性,→原子性(Atomicity):有一个地方出错,前面成功的也撤销..应是一个整体..必须恢复以前数据.要么全部成功,要么全部失败..→一致性(Consistency):数据必须处于一致性,如B级工资300升到500级别也从B升到A,但是数据保持不一致,只上调了级别没上调工资..→隔离性(Isolation):多个事物多个用户操作一个数据, 如修改字段,其他事物不受影响..直到事物都成功了, 要么看到的数据之前和之后的状态中间的被隔离开→持久性(Durability):事物结束后永久保存在数据库中..不能撤销//insert into 插入表中所有的数据Insert into admin(id,name) select id,name from admin;insert into admin values(6,'老百');回滚点savepoint p1;insert into admin values(6,'老千');回滚 rollback p1;提交commit;set autocommit on;set autocommit off;第九部分数据库对象//创建 test 表create table test(id number(10),name varchar2(20),hiredate date default sysdate,salary number(8,2) default0);// 将test 表的字段数据注入到test1里面来create table test1(用户id,用户名字)as select id,name from test// 给test表增加mm gg 两个字段默认值是,,...alter table testadd(gg varchar2(20) default'你是男人',mm varchar2(20) default'你是女人')// 使用modify给字句修改现有字段,包括字段的数据类型,大小和默认值alter table testmodify(gg varchar2(20) default'你是猪',mm varchar2(20) default'你真笨');// 使用drop删除表中字段行 drop table 表名即可删除表alter table testdrop(gg,mm);// 使用truncate清空表所有的记录,不能进行条件的删除,表结构还在create table test1 as (select name,hiredate,salary from test) truncate table test1// 使用rename讲表test1名字替换成testrename test1 to test// 查看当前用户拥有的所有表的名字select * from user_tables;// 查询当前用户可访问的所有表的名字select * from all_tables;// 查询当前用户拥有所有对象的类型select distinct object_type from user_objects;// 查询用户拥有所有对象的类型select * from dba_tables;第十部分表约束create table mg(id number(3) primary key, //主键约束gg number not null unique, //唯一约束mm number constraint mg_mm not null, //非空约束constraint mg_id_fk foreign key(id) references admin(id); //外键约束);//给admin表增加 check约束create table admin(id number(3) check(id>=5and id<=10),name varchar2(20) check(length(name)>4and length(name) <=20))//建好表之后在添加约束和删除约束create table student(sid number(3),sname varchar2(20),saddress varchar2(20),tid number(3))alter table studentadd constraint studetn_pk_sid primary key(sid);alter table studentadd constraint studetn_sname check(length(sname)>4);alter table studentadd constraint studetn_saddress saddress default'湖南岳阳';alter table studentadd constraint studetn_fk_tid foreign key(tid) references tracher(tid);alter table studentdrop constraint studetn_pk_sidcreate table tracher(tid number(3))alter table tracheradd constraint tracher_pk_id primary key(tid);第十一部分视图,索引//添加简单的视图create or replace view v1as select * from empdesc v1drop view v1;//添加简单的索引create index myindex on emp(ename);drop index myindex第十二部分基本数据命令Conn scott/sa //切换用户账户Show user //查询属于那个用户Desc //查看表结构Disconnect //断开数据库连接Password //修改用户密码Exit //断开,退出窗口Start 加路径. //要导入sql文件Edit 加路径 //需要打开的修改的文件Spool 加路径 spool off保存 //把结果保存到文件里面去Setpagesize //一页显示多少条数据Create user (admin)用户名 indentified by (sa)密码 //创建用户和密码Drop user (admin)用户名 //删除用户Grant connect to (admin)用户名 //给用户授予连接权限用户才能进行登录Grant resource to (admin)用户名 //给有用授予创建表的权限才能创建表Grant select on emp to (admin)用户名 //用其他用户登录给admin表授予查询emp表权限Grant update on emp to (admin)用户名 //给用户授予改emp表的权限Grant all on emp to (admin)用户名 //给用户授予增删改emp表的权限Revoke select on emp from admin //收回权限使用 revoke 上面都可收回Grant select on emp to admin with grant option //给admin授予可以给别人授予这张表查询权限Revoke select on emp to admin with grant option //撤销admin授予可以给别人授予这张表查询权限Alter user admin(用户名) account unlock; //给用户解锁第十三部分sequence自增Create sequence myseq //自增Drop sequence myseq //删除自增Insert into test values(myseq.nextval);Insert into test values(myseq.currval)/*创建序列*/ create sequence s_id increment by 1 start with 1 nomaxvalue nocycle; /*创建触发器*/ create or replace trigger myTrigger before insert on myTable referencing old as old_value new as new_value for each row beginnew_erid= s_id.nextval; end;end;oracle都用sequence可以直接用native,hibernate会根据底层数据库自行判断采用sequence。
Oracle OCI(Oracle Call Interface)官方文档翻译
OCI学习资料--Oracle8及以后版本的OCI 1.简介Oracle调用接口(Oracle Call Interface)是一个让我们通过函数调用来访问Oracle数据库和控制SQL语句执行各个阶段的应用程序编程接口(API)。
OCI支持C和C++的数据类型、调用惯例、语法和语义。
1.1创建一个OCI应用程序我们编译和连接一个OCI程序的方法与编译和连接一个非数据库应用程序的方法相同。
不需要独立的预处理或者预编译步骤。
1.2OCI的组成部分OCI具有如下功能:·能够安全地支持大量用户的灵活的、多线程API集合。
·为管理数据库访问、处理SQL语句和管理Oracle数据库对象的SQL访问函数。
·管理Oracle类型的数据属性的数据类型映射和操作函数。
·不经SQL语句直接向数据库加载数据的数据加载函数。
1.3封装的接口所有的OCI函数使用的数据结构都以被称为句柄的不透明的接口之形式封装。
句柄是指向OCI库分配的保存着上下文信息、连接信息、错误信息或者关于SQL及PL/SQL的绑定信息的不透明指针。
客户端分配一定类型的句柄,通过已经定义好的接口来填充一个或者多个句柄,并通过这些句柄向服务器发送请求。
应用程序可以通过访问函数来访问句柄中包含的相关信息。
2.OCI基本编程这部分介绍OCI编程中涉及到的基本概念。
2.1OCI编程概要一个OCI应用程序的基本目标就是代表多个用户进行数据库操作。
OCI使用以下基本编程顺序:1.初始化OCI编程环境和线程。
2.分配必要的句柄,并且设置服务器连接和用户会话。
3.通过在服务器上执行SQL语句来交换数据,并且执行必要的应用程序数据处理。
4.执行准备好的语句或者准备即将要执行的语句。
5.终止用户会话并且断开服务器连接。
6.释放句柄。
图2-1显示了一个OCI应用程序的编程步骤。
图2-1这幅图及其所列出的步骤提供了一个OCI编程步骤的简单概括。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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