第一篇:湖北电信Oracle数据库的优化浅探
湖北电信Oracle数据库优化浅探
叶小敏 湖北电信随州分公司 企业信息化部(441300)
摘要:在目前的湖北电信计费系统中,所有的账务稽查都是通过编写SQL语句向数据库提交需求的,面对全省同时提交的数百个数据需求,服务器接收的任务过多,往往会出现任务被吊起,长时间不响应的现象,甚至影响了账务结算工作。经过核查,造成死锁的原因很多时候是因为提交的语句存在各种语法或者逻辑问题,易造成死锁,极大的浪费了系统资源。
本文作者根据多年计费工作经验提出了一种优化Oracle数据库的方法。Oracle中SQL语句的执行过程可分为解析(Parse)、执行(Execute)和提取结果(Fetch)三步,该方法是通过对SQL语句在Oracle数据库中优化执行的三个过程来提高Oracle数据库的性能。减少系统资源被无效占用和损耗,这是提高湖北电信计费账务结算稽核效率、按期完成工作的有力保证。
关键词:数据库; 扫描; 多表联结; 子查询
1.如何优化Parse 1.1 SQL语句的Parse处理步骤:
1)计算语句值
2)共享池中有无与此语句值相同的语句?
3)共享池中有与此语句字符完全匹配的语句? 4)准备要运行的SQL语句
5)为新语句在共享池中创建空间 6)将语句存放在共享池中
7)修改共享池图,标明语句的值和在共享池中的位置 8)执行准备好的SQL语句
最理想的是,语句只执行1、2、3和8步来进行处理。不经过2、3步来测试被传给Oracle的语句要使用1~8步进行处理。只经过1、2、3、8的SQL语句要比经过1~8步的语句更为有效。
1.2 在共享池中重用SQL语句
当SQL语句被传递给Oracle处理时,其秘诀是重复使用已经在共享池中的语句,而不是让Oracle在接受语句时去准备新的语句。
Oracle提供在数据库中存储代码的能力,当应用系统开始运行时,从数据库中读取代码传递到共享池中去处理。从数据库中取出的代码是编译过的并驻留在共享池中。当SQL语句被传递给Oracle处理是,如果Oracle接受了一个与共享池中语句一致的语句。就重用共享池中的语句。两条SQL语句必须是语法、文本完全相同,才能市委可以共享的SQL,利用Oracle共享区。
湖北电信账务稽核工作由全省各本地网人员共同参与,人员较多且语句编写思想均存在差异,但最终的需求是一致的,依据共享原则,由省公司账务处理部门按照稽核要求和内容,规定稽核点和稽核方法,下发经过整理的具有标准格式、大小写以及相同变量等遵循规定的稽核语句和过程,从而可以最大限度的重用共享池中的语句和过程,从而可以最大限度的重用共享池中的SQL语句。如何优化Execute和Fetch 2.1避免无计划的全表扫描
全表扫描连续从表读取所有数据,而不管数据是否与查询有关。避免不必要的全表扫描有两个充足理由:1全表扫描没有选择性。2通过全表扫描读取的数据很快从SGA的缓冲区移走(如果正在扫描的表不是“高速存储”的表)
在基于规则优化的情况下,如果下列任何条件在SGA语句出现,就要对一个表进行全表扫描。1)该表无索引
2)对返回的行无任何限定条件(如无Where语句)
3)对数据表与任何索引主列相对应的行无限定条件。例如,在City-State-Zip列上创建了三列复合索引,那么仅对State列有限定条件的查询不能使用这个索引,因为State不是索引的主列。
4)对索引主列的行有限定条件,但条件或者是NULL或者是不相等。例如,City列上存在索引,在所有下列情况下都不会使用索引。Where city is null Where city is not null Where city!= ‘jilin’
5)对索引主列的行有限定条件,但条件在表达式里使用。例如,如果在City列上索引,那么限定条件
Where City = ‘jilin’
可以使用索引。然而,如果限定条件是 Where UPPER(City)=’liaoning’
那么不会使用City列上的索引,因为City列在UPPER函数里。如果将City列与文本字符串联结在一起,也不会使用索引。例如,如果限定条件是 Where City||’x’ like ‘jilin%’
那么不会使用City列上的索引。
6)对索引主列的行有限定条件,但条件使用Like操作以及值以‘%’开始或者值是一个赋值变量。例如,在所有下列情况下都不会使用索引: Where City like ‘%aonin%’
Where City like :City_Bind_Variable 如果表小、索引列无选择性,基于开销的优化器可能决定使用全表扫描。2.2只使用选择性索引
索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是1.0。依据非空值列的唯一索引,通常其选择性为1.0。
如果使用基于开销的最优化,优化器不应该使用选择性不好的索引。
索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是1.0。依据非空值列的唯一索引,通常其选择性为1.0。
2.3管理多表联结
Oracle提供了3个联结操作:NESTED LOOPS、HASH JOIN和MERGE JOIN。MERGE JOIN是一组操作,在所有行被处理完之前,它不返任何记录给下一操作。NESTED LOOPS和HASH JOIN是行操作,因此会很快将第一批记录返回给下一个操作。
在每个联结选项里,必须执行一些步骤以获取最好的联结性能。如果没有适当地优化联结操作,那么联结所需的时间也许随着表的增长而呈指数级地增长。
2.4管理包含视图的SQL语句
如果查询包含视图,优化器有两种执行查询的方法:首先解决视图然后执行查询,或者把视图文本集成到查询里去。如果首先执行视图,那么首先完成全部的结果集,然后用其余的查询条件做过滤器。
首先解决视图会导致查询性能下降的问题,这取决于所涉及表的相对大小。如果视图被集成到查询里,那么查询的条件也可以应用于视图里,并且可以使用一个小一些的结果集。然而在一些情况下,也许可以通过视图分离组操作提高查询性能。
如果一个视图包含集合的操作(如Group by、SUM、COUNT或者DISTINCT),那么视图不能被集成到查询里去。不使用组或者没有集合操作的视图的SQL语法可以被集成到大的查询里去。
2.5优化子查询
当使用自查询时,也许会碰到几个独特的问题。涉及子查询的查询潜在问题如下: a)也许在执行完查询的剩余部分前执行子查询(与执行分组功能的视图相似)。b)子查询也许要求特定的提示,但这些提示不直接与调用该子查询的查询有关。c)可以作为单个查询执行的子查询也许被代替写成几个不同的子查询。
d)也许在使用not in子句或者not exists子句时,不能在最有效的方式下进行子查询的存在查询。
1)当执行子查询时
如果一个查询包含子查询,那么优化器有两种完成查询的方法:首先完成子查询,然后完成查询(“视图的方法”),或者将子查询集成到查询里去(“联结”的方法)。如果首先解决子查询,那么整个子查询的结果集将首先被计算,并且用查询条件的剩余部分做过滤器。如果没有使用子查询去进行存在检查,那么“联结”方法将通常要比“视图”方法完成得好 2)如何组合子查询
一个查询可以包含多个子查询,使用的子查询越多,集成或者重写它们到大的联结里就越困难。既然有多个子查询使集成困难,就应该尽可能地组合多个子查询。3)怎样进行存在检查
有时子查询不返回行(记录),但可以进行数据正确性检查。在相关表里的记录或者存在或者不存在的逻辑检查,称为存在检查。可以使用exists和not exists子句提高存在检查的性能。
2.6管理对非常巨大的表的访问
随着表增长到比SGA的数据块高速缓冲区存储器的空间显著大时,需要从另一些角度优化对这个表的查询。
1)当表和它的索引小的时候,在SGA里可以有高度的数据共享。多用户读表或索引范围扫描可以反复使用同一个块。随着表的增长,表的索引也在增长。随着表和它的索引增长到比SGA里提供的空间大时,范围扫描需要的下一行将在SGA里找到的可能性变小,数据库的命中率将减小。最后,每一个逻辑读将要求一个单独的物理读。对使用非常大的表的优化方法着眼于特别的索引技术和有关索引的选择。
2)管理数据接近,在访问非常大的表期间,如果倾向于继续使用索引,那么应该关注数据接近,即逻辑相关记录的物理关系。为了使数据最大限度地接近,应该连续往表里插入记录。记录按通常在表的范围扫描里使用的列排序。
3)避免没有帮助的索引扫描,如果要对大表使用索引扫描,那么不能假定索引扫描将比全表扫描执行得更好。不紧跟表访问的索引唯一扫描或范围扫描执行得比较好,但紧跟通过RowID的表访问的索引范围扫描也许执行得差。随着表增长到比数据块高速缓冲存储器大得多,最终,索引扫描和全表扫描间的平衡点打破。
4)创建充分索引的表,如果表中的数据相当稳定,充分索引一个表是很有用的。创建一个复合索引,它包括所有在查询期间通常选择的列。在查询期间,查询要求的所有数据可以通过索引访问提供,不需要任何表访问。5)并行选项,可以把一个数据库任务,比如Select语句,分为多个单元的工作,由多个Oracle进程同时执行。这种能够允许数据库的单个查询活动由多个协调的进程透明地进行处理的能力,称为并行查询选项(PQO)。并行选项调用多个进程来利用空闲的系统资源,以减少完成任务所需要的时间。并行选项并不减少处理过程所要求的资源数量,而是把处理的任务分散给多个CPU。
2.7使用UNION ALL而不是UNION 在湖北电信账务稽核中,往往需要把符合条件的几部分数据汇总,形成一个新的结果表。
最常用的集操作是UNION操作,UNION操作使多个记录集联结成为单个集。UNION操作的数学定义是返回记录的单个集并且没有重复的行,所以在合并结果集里,Oracle只返回不同的记录。
当UNION操作用作SQL语句的一部分时,唯一性要求强迫Oracle移走重复的记录。Oracle的移走重复记录的功能是SORT UNIQUE操作,它与使用DISTINCT子句时执行的操作类似。
UNION ALL操作允许重复。UNION ALL不要求SORT UNIQUE操作,从而节省了开销。UNION ALL是一个行操作,所以当其变为有效就返回给用户。而UNION包括SORT UNIQUE集操作,在全部记录的集的排序结束前,不返回任何记录给用户。
当UNION ALL操作产生巨大的结果集时,不需要任何排序便返回记录给应用的事实意味着第一行检索的响应时间更快,并且在许多情况下,可以不用临时段完成操作。
在有些情况下,UNION ALL和UNION不返回同样的结果。如果在应用环境中,结果集并不包含任何重复的记录,则可以把UNION转换成UNION ALL。
经过笔者实际账务工作验证,采用UNION ALL操作往往能获得更快的响应速度。
2.8避免在SQL里使用PL/SQL功能调用
对于增加PL/SQL的使用,许多用户试图利PL/SQL功能的优势产生可重复使用的代码。其中一个强迫重复使用PL/SQL功能的方法是在SQL语句里使用。例如,可以创建一个将国际货币转换为US$的函数。这个函数称为US$。示例如下:
select transaction_type, US$(amount, currency)from international_transaction where US$(amount, currency)> 1000;执行前面的SQL语句没有所期望的那样好。在测试时,它的性能大约比下面得出相同结果的SQL语句慢大约几十倍。
select transaction_type,amount*exchange_rate US$ from exchange_rate er, international_transaction it where er.currency = it.currency and amount*exchange_rate > 1000;响应时间不同的原因是混合PL/SQL和SQL时,Oracle使用的机制不同。在SQL查询里嵌入PL/SQL功能时,在执行时,Oracle将调用分成两部分:用带有赋值变量的SQL语句代替功能调用以及对每一个函数调用的无名PL/SQL块。
select transaction_type, :a1 from international_transaction where :a1 > 1000 和 BEGIN :a1 := US$(:amount, :currency);END 对在international_transaction表里的每一行,将执行在前面示例里显示的无名块两次。无名块调用导致查询响应时间的剧增。应该避免在SQL语句里使用PL/SQL功能调用。
3.结语
本文依据作者在湖北电信计费系统多年工作经验,结合ORACLE数据库,简单论述了一些Oracle数据库优化的一些操作方法,为湖北电信计费工作同仁提供了一些Oracle数据库优化查询和运行的解决方案,希望籍此对湖北电信账务和计费处理工作带来具体的帮助。
参考文献
[1] 瓮正科,王新英著.Oracle8.X For Windows NT实用教程[M].北京:清华大学出版社,1999.[2] 萨师萱,王珊著.数据库系统概论[M].北京:高等教育出版社,2000.2.[3] Eyal Aronoff,Kevin Loney,Noorali Sonawalla著, 李逸波、王华驹、马赛红、曲宁等译.Oracle8性能优化和管理手册[M].北京:电子工业出版社,2000.1.[4] Peter Koletzke,Dr.Paul Dorsey著, 刘晓霞、孙登峰、曲京、何粼等译.Oracle Designer信息系统开发[M].北京:机械工业出版社,1999.8
第二篇:Oracle DBA优化数据库性能心得体会
Oracle DBA优化数据库性能心得体会
很多的时侯,做Oracle DBA的我们,当应用管理员向我们通告现在应用很慢、数据库很慢的时侯,我们到数据库时做几个示例的Select也发现同样的问题时,有些时侯我们会无从下手,因为我们认为数据库的各种命种率都是满足Oracle文档的建议。实际上如今的优化己经向优化等待(waits)转型了,实际中性能优化最根本的出现点也都集中在IO,这是影响性能最主要的方面,由系统中的等待去发现Oracle库中的不足、操作系统某些资源利用的不合理是一个比较好的办法,下面把我的一点实践经验与大家分享一下,本文测重于Unix环境。
一、通过操作系统的一些工具检查系统的状态,比如CPU、内存、交换、磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲这也可能不是一个正常的状态,因为cpu可能正等待IO的完成。除此之外我们还应观注那些占用系统资源(cpu、内存)的进程。
1、如何检查操作系统是否存在IO的问题?使用的工具有sar,这是一个比较通用的工具。
Rp1#sar-u 2 10
即每隔2秒检察一次,共执行20次,当然这些都由你决定了。
示例返回:
HP-UX hpn2 B.11.00 U 9000/800 08/05/03
18:26:32 %usr %sys %wio %idle
注:我在redhat下查看是这种结果,不知%system就是所谓的%wio。
Linux 2.4.21-20.ELsmp(YY075)05/19/2005
10:36:07 AM CPU %user %nice %system %idle
10:36:09 AM all 0.00 0.00 0.13 99.87
10:36:11 AM all 0.00 0.00 0.00 100.00
10:36:13 AM all 0.25 0.00 0.25 99.49
10:36:15 AM all 0.13 0.00 0.13 99.75
10:36:17 AM all 0.00 0.00 0.00 100.00
10:36:17 AM CPU %user %nice %system %idle
10:36:19 AM all 0.00 0.00 0.00 100.00
10:36:21 AM all 0.00 0.00 0.00 100.00
10:36:23 AM all 0.00 0.00 0.00 100.00
10:36:25 AM all 0.00 0.00 0.00 100.00
其中的%usr指的是用户进程使用的cpu资源的百分比,%sys指的是系统资源使用cpu资源的百分比,%wio指的是等待io完成的百分比,这是值得我们观注的一项,%idle即空闲的百分比。如果wio列的值很大,如在35%以上,说明你的系统的IO存在瓶颈,你的CPU花费了很大的时间去等待IO的完成。Idle很小说明系统CPU很忙。像我的这个示例,可以看到wio平均值为11说明io没什么特别的问题,而我的idle值为零,说明我的cpu已经满负荷运行
了。
当你的系统存在IO的问题,可以从以下几个方面解决:
*联系相应的操作系统的技术支持对这方面进行优化,比如hp-ux在划定卷组时的条带化等方面。
*查找Oracle中不合理的sql语句,对其进行优。
*对Oracle中访问量频繁的表除合理建索引外,再就是把这些表分表空间存放以免访问上产生热点,再有就是对表合理分区。
常用的工具便是vmstat,对于hp-unix来说可以用glance,Aix来说可以用topas,当你发现vmstat中pi列非零,memory中的free列的值很小,glance,topas中内存的利用率多于80%时,这时说明你的内存方面应该调节一下了,方法大体有以下几项。
*划给Oracle使用的内存不要超过系统内存的1/2,一般保在系统内存的40%为益。
*为系统增加内存。
*如果你的连接特别多,可以使用MTS的方式。
*打全补丁,防止内存漏洞。
3、如何找到点用系用资源特别大的Oracle的session及其执行的语句。
Hp-unix可以用glance,top,IBM AIX可以用topas,此外可以使用ps的命令。通过这些程序我们可以找到点用系统资源特别大的这些进程的进程号,我们就可以通过以下的sql语句发现这个pid正在执行哪个sql,这个sql最好在pl/sql developer,toad等软件中执行, 把<>中的spid换成你的spid就可以了。
SELECT a.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text from v$session a,v$process b,v$sqltext c WHERE b.spid='ORCL' AND b.addr=a.paddr AND
a.sql_address=c.address(+)order BY c.piece
我们就可以把得到的这个sql分析一下,看一下它的执行计划是否走索引,对其优化避免全表扫描,以减少IO等待,从而加快语句的执行速度。
提示:我在做优化sql时,经常碰到使用in的语句,这时我们一定要用exists把它给换掉,因为Oracle在处理In时是按Or的方式做的,即使使用了索引也会很慢。
比如:
SELECT col1,col2,col3 FROM table1 a
WHERE a.col1 not in(SELECT col1 FROM table2)
可以换成:
SELECT col1,col2,col3 FROM table1 a
WHERE not exists
(SELECT 'x' FROM table2 b
WHERE a.col1=b.col1)
4、另一个有用的脚本:查找前十条性能差的sql。
SELECT * FROM(select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea
order BY disk_reads DESC)where ROWNUM<10;
二、迅速发现Oracle Server的性能问题的成因,我们可以求助于v$session_wait这个视图,看系统的这些session在等什么,使用了多少的IO。以下是我提供的参考脚本:
脚本说明:查看占io较大的正在运行的session。
SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,se.program,se.MODULE,、se.sql_address,st.event,st.p1text,si.physical_reads,si.block_changes FROM v$session se,v$session_wait st,v$sess_io si,v$process pr WHERE st.sid=se.sid AND st.sid=si.sid AND se.PADDR=pr.ADDR AND se.sid>6 AND st.wait_time=0 AND st.event NOT LIKE '%SQL%' ORDER BY physical_reads DESC
对检索出的结果的几点说明:
1、我是按每个正在等待的session已经发生的物理读排的序,因为它与实际的IO相关。
2、你可以看一下这些等待的进程都在忙什么,语句是否合理?
Select sql_address from v$session where sid=;
Select * from v$sqltext where address=;
执行以上两个语句便可以得到这个session的语句。你也以用alter system kill session 'sid,serial#';把这个session杀掉。
3、应观注一下event这列,这是我们调优的关键一列,下面对常出现的event做以简要的说
明:
a、buffer busy waits,free buffer waits这两个参数所标识是dbwr是否够用的问题,与IO很大相关的,当v$session_wait中的free buffer wait的条目很小或没有的时侯,说明你的系统的dbwr进程决对够用,不用调整;free buffer wait的条目很多,你的系统感觉起来一定很慢,这时说明你的dbwr已经不够用了,它产生的wio已经成为你的数据库性能的瓶颈,这时的解决办法如下:
a.1增加写进程,同时要调整db_block_lru_latches参数。
示例:修改或添加如下两个参数
db_writer_processes=4
db_block_lru_latches=8
a、2开异步IO,IBM这方面简单得多,hp则麻烦一些,可以与Hp工程师联系。
b、db file sequential read,指的是顺序读,即全表扫描,这也是我们应该尽量减少的部分,解决方法就是使用索引、sql调优,同时可以增大db_file_multiblock_read_count这个参数。
c、db file scattered read,这个参数指的是通过索引来读取,同样可以通过增加db_file_multiblock_read_count这个参数来提高性能。
d、latch free,与栓相关的了,需要专门调节。
e、其他参数可以不特别观注。
其他的优化手段似乎主要集中在SQL查询语句上面,Oracle本身也提供了优化器。看来DBA的学问不少啊。
第三篇:Oracle数据库实验报告
中南林业科技大学
实验报告
课程名称:
Oracle数据库 专业班级: 姓名:
学号:
****年**月**日
实验一
安装和使用Oracle数据库
【实验目的】
1.掌握Oracle软件安装过程,选择安装组件 2.掌握建立Oracle数据库,配置网络连接 3.掌握Oracle企业管理器的基本操作 4.使用SQL*Plus,登录到实例和数据库 5.掌握命令方式的关闭和启动实例及数据库 【实验内容】
1.查看已安装的Oracle组件
2.查看服务,记录下和数据库有关的服务名,将他们设为手动方式,启动相关服务。
3.配置监听器,查看是否在服务中有LISTENER,是否能启动。4.配置本地net服务,提示:设置正确的服务器地址和端口号。5.打开SQL*Plus,用SYS和SYSTEM用户名和密码登录。6.思考题:有几种打开SQL*Plus的方法?分别是什么? 7.用命令关闭实例和数据库,记录命令
8.用命令以NOMOUNT的方式启动实例,再加载数据库,打开数据库。
【实验结论】
1.查看已安装的Oracle组件
2.查看服务,记录下和数据库有关的服务名,将他们设为手动方式,启动相关服务。
3.配置监听器,查看是否在服务中有LISTENER,是否能启动。
4.配置本地net服务,提示:设置正确的服务器地址和端口号。
5.打开SQL*Plus,用SYS和SYSTEM用户名和密码登录。
6.思考题:有几种打开SQL*Plus的方法?分别是什么?(1)直接打开 sql plus 即窗口方式(2)cmd 命令行方式
(3)WEB 页面中 iSQL*Plus 方式 7.用命令关闭实例和数据库,记录命令 SQL>shutdown immediate
8.用命令以NOMOUNT的方式启动实例,再加载数据库,打开数据库。
sql>startup nomount sql>alter database mount;sql>alter database open;sql>startup
(1).用SQLplus 命令:show parameters参数名
(2).用select [列名] from 表名
2.初始化文件有几种?默认的保存位置在哪里?
初始化文件有三种:数据文件,日志文件,控制文件; 默认的保存位置E:oracleproduct10.2.0oradataorcl
4.打开OEM,查看三类物理文件信息
三类物理文件:数据文件、控制文件、日志文件 数据文件:.DBF存储表、索引及数据结构信息
日志文件:.LOG记录对数据库的所有修改信息,用于恢复
控制文件:.CTL二进制文件,记录数据库名、文件标识、检查点
5.分别用select命令查询V$parameter动态性能视图,用show命令查看全局数据库名、实例名、是否启动自动归档、标准数据块大小这四个参数的值,记录命令和结果。用select命令查询V$parameter动态性能视图
用show命令查看全局数据库名、实例名
用show命令查看是否启动自动归档、标准数据块大小
6.如何用命令查看数据文件、控制文件的文件名、存储位置和状态信息?
(1).查看数据文件的文件名、存储位置和状态信息
(2).查看控制文件的文件名、存储位置和状态信息
0
和服务器型文件都要找到),查看各类默认位置并记录下来(包括物理文件所在目录,该数据库相关的各个目录等),登录到mydb数据库。
2.用命令方式手工创建数据库testorcl
(1)创建批处理文件,建立必需的各级目录,参考第一题MYDB数据库的默认目录。
(4)运行数据库建立脚本,更改相关服务为手动启动方式
(5)运行数据字典等创建脚本
3.在DBCA中删除MYDB数据库。
Enter valuefor 4:runner Specify log path as parameter 5: Enter valuefor 5: D:oracleproduct10.2.0db_2RDBMSlog
二、完成下面的查询,记录查询命令和结果。1.查询HR方案种有哪些表,列出表名 2.设置行宽为160,每页行数为40 3.查询employees表中所有薪水在3000到6000元之间的员工编号、姓、名、受聘日期、工作代号、薪水、经理代号、部门号,按部门号升序排列,同一部门按员工编号降序排列
4.查询每个部门的人数、平均薪水、最高薪水、最低薪水,按部门编号升序排列
5.查询first_name的第三个字母是t的员工编号,first_name,电话号码,部门编号,部门名称
6.在job_history表中查询任职时间超过1年的员工编号,任职历时月份(保留整数),工作代号,部门代号。
7.查询每个部门经理的员工编号、姓名、薪水、部门号。
【实验结论】
一、需要访问HR示例方案中的表,如果机器上没有该示例方案,则运行相关包和相应配置装入HR方案。
1.将hr.rar解压到D:oracleproduct10.2.0db_2demoschema human_resources目录下,然后在SQL*PLUS 中执行 hr_main.sql
二、完成下面的查询,记录查询命令和结果。1.查询HR方案种有哪些表,列出表名
5.查询first_name的第三个字母是t的员工编号,first_name,电话号码,部门编号,部门名称
738
实验五
PL/SQL编程
【实验目的】
1.熟悉PL/SQL的数据类型和书写规则 2.熟悉控制结构和游标的使用 3.编写和运行函数、过程和触发器 【实验内容】
编写脚本文件,调试运行脚本文件,并记录结果。
1.在SQL*Plus中编写一个PL/SQL块,功能用于打印学生信息 在DECLARE部分完成:
(2)建立学生信息记录类型stu_record_type,包括学号,姓名,性别,籍贯,学习成绩和活动成绩。均为可变长字符类型(3)编写本地子过程:学生信息打印过程PrintStuRecord,把(1)中定义的记录类型作为参数(4)定义学生信息记录变量stu_record 在BEGIN…END部分完成:
(1)为stu_record变量的各个元素赋值如下: 学号:‘2001001’ 姓名:’李新’
性别:‘m’
籍贯:‘黑龙江省哈尔滨市’ 学习成绩:‘Excellent’
0
(1)建立学生信息记录类型stu_record_type,包括学号,姓名,性别,籍贯,学习成绩和活动成绩。均为可变长字符类型
set serveroutput on declare type stu_record_type is record
(s_no varchar2(8), s_name varchar2(10), s_sex varchar2(2), s_address varchar2(20), s_studyscore varchar2(10), s_activescore varchar2(10));(2)编写本地子过程:学生信息打印过程PrintStuRecord,把中定义的记录类型作为参数
procedure PrintStuRecord as begin dbms_output.put_line('学号:'|| stu_record.s_no);dbms_output.put_line('姓名 :'|| stu_record.s_name);dbms_output.put_line('性别:'|| stu_record.s_sex);dbms_output.put_line('籍贯:'|| stu_record.s_address);dbms_output.put_line('学习成绩:'|| stu_record.s_studyscore);dbms_output.put_line('活动成绩:'|| stu_record.s_activescore);end PrintStuRecord;(3)定义学生信息记录变量stu_record stu_record stu_record_type;在BEGIN…END部分完成:
(4)为stu_record变量的各个元素赋值如下: 学号:‘2001001’ 姓名:’李新’
性别:‘m’
籍贯:‘黑龙江省哈尔滨市’
2.建立对bookinfo表的DML触发器,一旦bookinfo表发生了任何变化,立即触发,对bookinfo表的数据进行统计,结果存储在数据统计表中
(1)如果没有则建立bookinfo表,选择建立在scott用户下,表结构为(bookno varchar2(36)Primary key, bookname varchar2(40)not null, authorname varchar2(10)not null, publishtime date, bookprice float)
create table bookinfo(bookno varchar2(36)Primary key,4
Selectcount(bookno),count(distinct authorname)from bookinfo;end;/
(4)在bookinfo表中插入、删除和更新信息,再查看major_stats表中数据的变化 <1>插入
647
实验六
模式对象管理与安全管理
【实验目的】
1.了解模式对象的类型
2.掌握在OEM中操作模式对象的方法
3.掌握命令方式建立表、视图、索引等常见对象的方法 4.熟悉Oracle中权限分类和设置,理解系统提供用户的角色和权限
5.熟练使用建立用户、角色,为用户授权、授予角色的命令
【实验内容】
1.创建一个TESTUSET用户,密码为test,默认表空间为user表空间
2.创建用户后为其授予登录数据库和创建数据库对象的权限 3.用TESTUSER用户登录数据库
4.创建学生信息表(学号,姓名,性别,入学成绩),定义主键和输入数据(至少5条数据),提交添加的数据。并完成下面的题目:
(1)再继续添加2条数据,设置一个保存点savepoint,再添加1条数据,执行回退到保存点的回退命令。查看此时表中数据(2)查询入学成绩大于480的学生信息(3)建立男生信息视图
(4)在“成绩”字段上建立B-树索引
5.创建一个表簇,名为empl_dep,容纳empl表和dep表,有公
第四篇:ORACLE数据库学习心得
ORACLE数据库结课论文
一个好的程序,必然联系着一个庞大的数据库网路...今年我们学习了 oracle数据库这门课程,起初的我,对这个字眼是要多陌生有多陌生,后来上课的时候听一会老师讲课,偶尔再跟上上机课,渐渐的学会了不少东西,但我感觉,我学到的仍是一些皮毛而已,怀着疑惑和求知的心态,我在网上搜索了关于 oracle数据库的一些知识。
1.ORACLE的特点: 可移植性 ORACLE采用C语言开发而成,故产品与硬件和操作系统具有很强的独立性。从大型机到微机上都可运行ORACLE的产品。可在UNIX、DOS、Windows等操作系统上运行。可兼容性 由于采用了国际标准的数据查询语言SQL,与IBM的SQL/DS、DB2等均兼容。并提供读取其它数据库文件的间接方法。
可联结性 对于不同通信协议,不同机型及不同操作系统组成的网络也可以运行ORAˉCLE数据库产品。
2.ORACLE的总体结构
(1)ORACLE的文件结构 一个ORACLE数据库系统包括以下5类文件:ORACLE RDBMS的代码文件。
数据文件 一个数据库可有一个或多个数据文件,每个数据文件可以存有一个或多个表、视图、索引等信息。
日志文件 须有两个或两个以上,用来记录所有数据库的变化,用于数据库的恢复。控制文件 可以有备份,采用多个备份控制文件是为了防止控制文件的损坏。参数文件 含有数据库例程起时所需的配置参数。
(2)ORACLE的内存结构 一个ORACLE例程拥有一个系统全程区(SGA)和一组程序全程区(PGA)。
SGA(System Global Area)包括数据库缓冲区、日志缓冲区及共享区域。
PGA(Program Global Area)是每一个Server进程有一个。一个Server进程起动时,就为其分配一个PGA区,以存放数据及控制信息。
(3)ORACLE的进程结构ORACLE包括三类进程: ①用户进程 用来执行用户应用程序的。
②服务进程 处理与之相连的一组用户进程的请求。
③后台进程 ORACLE为每一个数据库例程创建一组后台进程,它为所有的用户进程服务,其中包括: DBWR(Database Writer)进程,负责把已修改的数据块从数据库缓冲区写到数据库中。LGWR(Log Writer)进程,负责把日志从SGA中的缓冲区中写到日志文件中。
SMON(System Moniter)进程,该进程有规律地扫描SAG进程信息,注销失败的数据库例程,回收不再使用的内存空间。PMON(Process Moniter)进程,当一用户进程异常结束时,该进程负责恢复未完成的事务,注销失败的用户进程,释放用户进程占用的资源。ARCH(ARCHIVER)进程。每当联机日志文件写满时,该进程将其拷贝到归档存储设备上。另外还包括分布式DB中事务恢复进程RECO和对服务进程与用户进程进行匹配的Dnnn进程等。
3.ORACLE的逻辑结构
构成ORACLE的数据库的逻辑结构包括:(1)表空间
(2)5种类型的段(segment)
①数据段;②索引段;③回滚(rollbock)段;④临时段;⑤自举(bootstrap)段。
段的分配单位叫范围(Extent)
表空间(Tablespace)一个数据库划分成的若干逻辑部分称为表空间。一个数据库可以有一个或多个表空间,初始的表空间命名为SYSTEM,每一个逻辑表空间对应于一个或多个物理文件。DBA使用表空间做以下工作: 控制数据库对象,如表、索引和临时段的空间分配。为数据库用户设置空间配额。
利用个别表空间的在线或离线,控制数据的可用性。后备或恢复数据。
通过分配空间,以改进性能。
在每个数据库中都存在SYSTEM表空间,它在建立数据库时自动建立。在该表空间中,包含数据库的数据字典,其中存储全部数据库对象的名字和位置。SYSTEM表空间总是在线的,像其它表空间一样,可以通过增加新的数据库文件来扩大。一个表空间可包含许多表和索引。但一个表和索引不能跨越表空间,可跨越组成表空间的文件。在DB的打开的情况下,DBA利用ALTER TABLESPACE语句,可以实施表空间的在线或离线。SYSTEM表空间必须在线。表空间离线有下列原因: 一般为了使部分数据库不能使用,而允许正常存取数据库其余部分。执行表空间离线备份。
一个离线的表空间,不能被应用用户读或编辑。
可以增加数据文件扩大已有的表空间,也可增加新的表空间使数据库容量增大,或分配空间给某个应用。使用ALFER TABLESPACE ADD FILE语句将另一个数据文件加入到已存在表空间中。使用CREATE TABLESPACE语句可建立一个新的表空间。段(segment)表空间中的全部数据存储在以段划分的数据库空间中。一个段是分配给数据库用于数据存储的范围的集合。数据可以是表、索引或RDBMS所需要的临时数据。段是表空间的下一个逻辑存储的级别。一个段不能跨越一个表空间,但可跨越表空间内的文件。一个数据库最多需要五种段类型: 数据段 一个包含一个表(或聚集)的全部数据,一个表(或聚集)总有一个单个数据段。
索引段 一个索引段包含对一个表(或聚集)建立的一个索引的全部索引数据。一个表可以有一个、多个或者没有索引段,取决于它所拥有的索引个数。一个聚集必须至少有一个索引段,即在聚集码上建立聚集索引。
回滚段 每个DB有一个或多个回滚段。一个回滚段是DB的一部分,它记录在某一情况下被撤消的动作。回滚段用于事务控制和恢复。
临时段 在处理查询时,ORACLE需要临时工作空间,用于存储语句处理的中间结果,这个区称为临时段。
自举段 自举段在SYSTEM表空间中,在数据库建立时建立。它包括数据字典定义,在数据库打开时装入。
4.用户数据库对象
由用户建立的对象驻留在表空间中,含有真正的数据。数据库对象有表、视图、聚集、索引、伪列和序号生成器。
(1)聚集(Cluster)聚集是存储数据的一种可选择的方法。聚集包括存储在一起的一组表,它们共享公共列并经常一起使用。由于内容相关并且物理地存储在一起,存取时间得到改进,存储空间可以减少。聚集是一种优化措施。
聚集对性能的改进,依赖于数据的分布和SQL操作的内容。特别是使用聚集对连接非常有利。可以明显地提高连接的速度。建立聚集命令的基本格式: SQL>CREATE CLUSTER〈聚集名〉(列定义[,…]);利用聚集建立表命令基本格式: SQL>CREATE TABLE〈新表名〉(列定义[,…]CLUSTER〈聚集名〉(聚集列);在聚集码上必须建立一个聚集索引,对于每一数据块上每个聚集码值有一索引项。这个索引必须在DML语句对聚集表操作前建立。建立索引的语句是:CREATE INDEX索引名ON CLUSTER聚集名;(2)序号生成器 序号(SEQUENCE)生成器为表中的单列或多列生成顺序号。利用序号可自动地生成唯一主码。使用SQL语句定义序号,给出一些信息(如序号名、是升序或降序、每个序号间的间隔和其它信息)。所有序号存储在数据字典表中。
所有序号定义存储在数据字典的SEQUENCE表中。用户可以通过字典视图
USER-SE-QUENCES、ALL-SEQUENCES
和DBA-SEQUENCES查询和存取。建立序号生成器的语句是: CREATE SEQUENCE序号生成器名 其它选项。
一旦序号生成器S被定义。可用S.Currval来引用S序号生成器的当前值。用S.nextval产生下一个新的序号并加以引用。
(3)伪列 伪列的行为像表的一列,但不真正存在于表中,在查询时可引用伪列,但伪列不能插入、删除或修改。
5.数据字典
数据字典ORACLE RDBMS最重要的部分之一。数据字典含有一组系统定义的表,只能读,是关于数据库的引用指南。它可提供以下信息:ORACLE用户的用户名;每个用户被授予的权限和角色;实体的名字和定义;完整性约束 为数据库实体分配的空间;通用的数据库结构;审计信息;触发子程序等的存储。数据字典是以表和视图构成的,像其它数据库数据一样,可用SQL语言查询数据字典。
数据字典在DB建立时建立。每当DB进入操作,数据字典就由ORACLE RDBMS负责修改。数据库建立时有两个默认DBA用户:SYS、SYSTEM。SYS持有基本表中的数据。数据字典包含一组基表和相关的视图,可分为以下几类: 类
描 述
DBA-××× 只有DBA可存取的视图,给出数据库中定义的任何实体的信息
USER-××× 对任何用户可用的视图,给出他们自己的实体的信息
ALL-×××
对任何用户可用的视图,给出用户可存取的所有实体的信息
其中×××代表表名或视图名
下面列出的是一些常用的表或视图的名称。(1)DTAB 描述了组或数据字典的所有表。(2)TAB 用户建的所有基本表、视图和同义词。(3)COL 用户创建基本表的所有列的信息。
(4)SYNONYMS 用户可存取的同义名词、专用名和公用名。(5)CATALOG 用户可存取的表、视图、同义词、序列。(6)CONSTRAINTS 用户可存取的约束。(7)INDEXES 用户可存取的表和聚集的序列。(8)OBJECTS 用户可存取的对象。(9)TABLES 用户可存取的表。(10)USERS 查看当前全部用户。(11)VIEWS 查看用户可存取的视图。
(12)SYSTABAUTH 用户对数据对象的使用权限。可以用SQL>SELECT*FROM〈字典表名或视图名〉WHERE〈条件〉来读取有关信息。
可以用SQL>DESCRIBE〈表名〉来查看表的结构定义。但是数据库字典的结构不可改。用DESCRIBE命令还可以查看视图及过程的定义。
6.ORACLE的SQL、PL/SQL与SQL*PLUS 作为ORACLE数据库核心的SQL语言是ANSI和ISO的标准SQL的扩充。用来存储、检索和维护数据库中的信息,并控制对数据库的存取事务。由于RDBMS执行SQL语句时,是一次只执行一条语句,它是非过程化的。这就使得单条的SQL语句使用方便,功能强大。用户只需说明操作目的,不必关心具体操作的实现方法。
但在实际数据库应用开发中,往往要依据前一步对数据库操作的结果或上一个事务提交的情况来确定下一步的操作。故ORACLE推出了一种PL/SQL工具,它扩充了SQL语句,使之具有可进行过程化编程的能力,如循环、分支功能。PL/SQL可支持变量和常量的使用。例如在SELECT查询语句的where子句中可以使用变量来书写条件表达式。SQL*PLUS是ORACLE用来存储、查询、操纵、控制和报告数据库中信息的一个交互式工具。它是一种集编辑、调试、运行于一体的开发环境。在SQL*PLUS的这种运行环境下,既可以使用SQL命令、PL/SQL语句、及SQL*PLUS自己提供的命令,又可以运行由上述三类命令(或语句)编辑而成的命令文件。SQL*PLUS提供的附加命令主要用来编辑、运行上述三类命令及命令文件和对查询结果进行格式化输出等功能。
7.数据库系统的管理
ORACLE作为一个大型的数据系统,通常包含很多用户的数据。在应用开发过程中,有许许多多的各类人员进行开发和应用。所以必须要求有人对数据库系统进行临时管理,并进行数据的备份等工作。这种人被称为数据库管理员(Data Base Administrator)。他们必须理解数据库系统管理,清楚数据库包含的数据内容、运行状况等。
一般说来,DBA不是指具体的人,而是指对数据库可以行使DBA特权的用户。DBA具有如下责任:(1)ORACLE服务器和客户工作站软件的安装和升级;(2)创建基本的数据库存储结构(表空间);(3)创建基本的数据库客体(表、视图、索引);(4)修改数据库结构;(5)给用户授权,维护系统安全;(6)控制和管理用户对数据库的访问;(7)监视和优化数据库的性能;(8)计算数据库信息的后备和恢复;(9)后备和恢复数据库;(10)构造ORACLE服务器,如创建数据库链、客体同义词等。而应用开发人员须完成:(1)应用程序设计;(2)应用的数据库结构设计和修改;(3)为DBA提供必要的信息;(4)完成应用程序的开发。
看了许多关于ORACLE的知识论坛,总算是对ORACLE有个整体的认识,不仅仅是拘泥于课堂上学习的知识而已,虽然自己对ORACLE学习并不是多么的透彻,但是总归多接触点新的东西总是好的。
这一个学期,也是临近毕业的时候了,很感谢贾老师的严格要求,让我在学习上有了很大的进步,同时也改掉了一些惰性,能积极的投入到学习中去了,不懂就大胆的问同学,请学习好的同学帮助讲解,最后,真心的祝福贾老师工作顺利,身体健康!
第五篇:Oracle数据库总结范文
创建表及命名规则?
表名和列名:
必须以字母开头 必须在1–30个字符之间
必须只能包含A–Z, a–z, 0–9, _, $, 和# 必须不能和用户定义的其他对象重名 必须不能是Oracle 的保留字 Oracle默认存储是都存为大写
增删改查语法?
增加: 例如:使用INSERT语句往customers表中插入数据,指定相关列和值 INSERT INTO customers(customer_id, first_name, last_name, dob, phone)VALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
如果为表所有列都指定值,那么可以忽略列清单
INSERT INTO customersVALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
可以使用NULL为某些列指定空值
INSERT INTO customersVALUES(8, 'Sophie', 'White', NULL, NULL);
查询:select * fromcustomers;或者select字段 fromcustomerswhere条件 删除:deletefromcustomerswhere条件
更改:update customersset name = 'xiaoming',age = ‘16’(更改多个字段时候用逗号隔开)where 条件
对查询结果进行排序?
语句:select * fromcustomersorderby字段 desc;
(asc(升序),desc(降序)如果不写,默认升序)
NULL值了解么?
NULL值表示未知的值。它是一个特殊的值,但并不是空字符串,NULL值表示该列是未知的。当某些查询语句在输出结果列上看不到值的时候,可能就是NULL值
NVL()和NVL2():
NULL值被查询出来的时候没有显示信息,如何告知用户这是空字符串还是NULL,这可以通过NVL()函数来进行处理
NVL(x,value)是有value显示本身,null显示为替换的value NVL2(x,value1,value2)是如果x不为NULL值,返回value1,否则返回value2 例程:
select name,nvl2(email,'已知','未知')from student;【代码含义:代表如果email字段中有值,则显示已知,null则显示未知,如果想显示本来的查询结果select name,nvl(email,'未知')from student;】 update student set name = replace(name,'小','大');【代码含义:代表将STUDENT表中NAME 字段中如果含有小字,那么就将小字替换为大字(操作的不是显示结果,而是将表中数据进行更改)】
Oracle中的简单函数?
字符串函数
concat:将x和y拼接起来,并返回新字符串
例程:
select concat(first_name,'-'||last_name)姓名 from customers; Instr字符查找,从1开始。
select instr('asdbcrdbewqrbmde','b')from dual;select instr('asdbcrdbewqrbmde','b',5,2)from dual;【代表从第5个字符开始,第二个b所在的位置】
Ltrim : LTRIM(x,[trim_string])从x字符串左侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除左侧空白字符
Rtrim RTRIM(x,[trim_string])从x字符串右侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除右侧空白字符 Trim TRIM(trim_string FROM x)从x字符串两侧去除trim_string字符串
Replace REPLACE(x, search_string, replace_string)从字符串x中搜索search_string字符串,并使用replace_string字符串替换。用select执行并不会修改数据库中原始值,但是用update执行可以修改。
Substr SUBSTR(x, start,[length])返回字符串中的指定的字符,这些字符从字符串的第start个位置开始,长度为length个字符;如果start是负数,则从x字符串的末尾开始算起;如果length省略,则将返回一直到字符串末尾的所有字符
例程:
select substr('abcd月fg',4,2)from dual;(结果:d月)select substr('abcdefg',-2)from dual;(结果:fq)
日期函数
Sysdate 例程:
Selectsysdatefromdual;
Select to_char(sysdate, 'yyyy-mm-dd-hh-mm-ss')from dual;
Add_months(d1,n1) last_day():
转换函数
To_char TO_CHAR(x,[ format])将x转化为字符串。format为转换的格式,可以为数字格式或日期格式
select to_char(sysdate,'yyyy-mm-dd')from dual;【一般在查询时候使用,使返回的值成为指定格式】
to_date TO_DATE(x,[format])将x字符串转换为日期
insert into student values(seq_stu.nextval,'小明',to_date('1992-2-18','yyyy-mm-dd'),default,'北京',null);【一般在添加使用】 返回所查询的值中最后一个日期数据。
聚合函数
Avg:平均数 Sum:求和 Max:最大值 Min:最小值 Count:返回统计的行数 Round:四舍五入
例程:
select round(avg(bid),1)from bug;分组了解么?
有时需要对表中的行进行分组,然后统计每组的信息,可以使用GROUP BY进行分组,然后再对每组进行统计。
(1)可以使用GROUP BY对多个列进行分组
例:
SELECT product_id, avg(customer_id)FROM purchases GROUP BY product_id;
(2)可以对分组后的行使用聚集函数,聚集函数会统计每组中的值,对于每组分别统计后返回一个值 例:
SELECT
product_type_id,BY
COUNT(ROWID)FROM
BY
productsGROUP product_type_id;注意:
product_type_idORDER a)如果查询中使用了聚集函数,被查询的列未使用聚集函数处理,那么这些列必须出现在GROUP BY子句后,否则,会提示ORA-00937错误
b)不能使用聚集函数作为WHERE子句的筛选条件,否则,会提示ORA-00934错误
c)可以使用HAVING子句过滤分组后的行
SELECT...FROM...WHERE GROUP BY...HAVING...ORDER BY...;(GROUP BY使用时可以不使用HAVING,但是使用HAVING时必须有GROUP BY才有意义)
(3)同时使用WHERE, GROUP BY和HAVING
a)首先,执行WHERE筛选掉不符合条件的行 b)然后,将符合条件的行使用GROUP BY进行分组 c)最后,使用HAVING对分组统计的结果进行再次筛选 例:
SELECT product_type_id, AVG(price)FROM products
WHERE price < 15
GROUP BY product_type_id HAVING AVG(price)> 13 ORDER BY product_type_id;
表的约束条件?
目的:
确保表中数据的完整性。
常用的约束类型: 主键约束(PRIMARY KEY):要求主键列数据唯一,并且不允许为空 非空约束(NOT NULL):指定的列的值不允许为空
唯一键约束(UNIQUE):要求该列唯一,允许为空,但只能出现一个空
值
检查约束(CHECK):指定表中一列或多列可以接受的数据值格式 默认约束(DEFAULT):指定某列的默认值
外键约束(FOREIGN KEY):用于建立和加强两个表数据之间连接的一
列或多列。通过将表中的主键列添加到另一个表中。可以创建两个表之间的连接。这个主键的列就称为第二个表的外键。外键约束就可以确保添加到外键表中的任何行都在主表中都存在相应的行
多表查询?
不同的数据存储在不同的表中,通常要查询多张表才能找到需要的数据
例程: SELECT products.name, product_types.name FROM products, product_types WHERE
products.product_type_id
= product_types.product_type_id AND products.product_id = 3;
products表和product_types表相关字段会用在SELECT语句及WHERE子句上,可以给表起别名,提高代码可读性、降低书写难度 例程:
SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 3 注意:
如果查询两张表,并且没有定义连接条件,那么查询的结果集是两表相乘的结果,这样的情况称之为笛卡尔乘积。总结:多表查询WHERE时,连接次数=查询时连接表的数量-1
常见的三种连接类型:
内连接:
内连接返回的行只有满足连接条件才会返回。如果连接条件的列中有NULL值,那么该行则不会返回 外连接:
外连接返回的行满足连接条件,也包括在连接条件的列包含空值的行
自连接:
连接的表为同一张表
子查询?
子查询是嵌入到另一个SELECT语句中的一个SELECT语句。通过使用子查询,可以使用简单的语句组成强大的语句。当需要从表中选择行,而选择条件却取决于该表自身中的数据时,子查询非常有用。
单行子查询:(1)可以将另外一个查询作为WHERE子句的子查询
例:查询尾名是‘Brown’的首名和尾名
SELECT first_name, last_name FROM customers
WHERE customer_id =
(SELECT customer_id FROM customers WHERE last_name = 'Brown');(2)在单行子查询还可以使用其他比较运算符,如<>、<、>、<=和>= 例:查询价格大于平均价格的商品编号、名称及价格
WHERE子句中使用>,以及子查询中使用AVG()聚集函数
SELECT product_id, name, price FROM products WHERE price >(SELECT AVG(price)FROM products);(3)在HAVING子句中使用子查询
HAVING是在分组统计后用于过滤行,同样在HAVING子句后面可以跟子查询。单行子查询将返回结果用于HAVING子句过滤分组统计的行
例如:查询平均价格小于最大平均值的商品编号及平均值
SELECT product_type_id, AVG(price)FROM products GROUP BY product_type_id HAVING AVG(price)<(SELECT MAX(AVG(price))FROM products GROUP BY product_type_id)ORDER BY product_type_id;
分页查询?
可以通过ROWNUM来实现。
序列?
序列是一个数据库对象,用于生成一系列的整数。
索引?
索引是与表关联的可选结构。可以创建索引以加快对表执行SQL语句的速度。就像书的索引可以帮助我们更快速的查找信息一样,Oracle中的索引也提供了一种更快地访问表数据的途径。
视图?
视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。数据库中只在数据字典中存储对视图的定义。