oracle 数据库基础
sql>select LOGIN_DATE,LOGIN_NAME from BCOL_REG_ACCT 2>where LOGIN_DATE='JUN-20-1998'; 4)查询出所有用户名LOGIN_NAME为abcde 登录日期大于'JUN-20-1998'的所有三列
LOGIN_DATE,LOGIN_NAME,START_TIME,并且按照登录日期的顺序排列: sql>select LOGIN_DATE,LOGIN_NAME,START_TIME from BCOL_REG_ACCT 2>where LOGIN_NAME='abcde' andLOGIN_DATE>'JUN- 20-1998' 3>order by LOGIN_DATE; 5)非等值条件查询
查询出所有用户名以abc开头,登录时间界于JUN-10-1998和JUN-20-1998之间,连接时长不等于
5000的所有列,并以LOGIN_NAME反向排序: sql>select * from BCOL_REG_ACCT 2>where LOGIN_NAME like 'abc%'
3>and LOGIN_DATE between 'JUN-10- 1998' and 'JUN-20-1998' 4>and CONNECT_DUR!=5000 5>order by LOGIN_NAME desc; 6) 使用空值(NULL)查询
查询出LOGIN_NAME,LOGIN_DATE,如果为空值则以JUA-01-1998代替,START_TIME符合LOGIN_NAME不为空,且 START_TIME为空的列。
sql>select LOGIN_NAME,nvl(LOGIN_ DATE,JUA-01-1998),START_TIME 2>from BCOL_REG_ACCT
3>where LOGIN_NAME is not NULL 4>and START_TIME is NULL; 7) 基于值集的查询
查询出用户名LOGIN_ NAME在abcde,abcdf,abcdg,abcdh中,且日期LOGIN_DATE大于 'JUN-20-1998' 和小于'MAY-20-1998'的所有列并且按照LOGIN_DATE的顺序排列,并按照LOGIN_DATE归类,即每天为一 类数据。
Sql>select * from BCOL_REG_ACCT
2>where LOGIN_NAME in ('abcde','abcdf', 'abcdg','abcdh') 3>and (acctdate>='06/20/1998' or acctdate <'05/20/1998') 4>order by acctdate,group by acctdate; (2) 使用表达式
查询出符合留入字节树大于1000的所有连接时长(CONNECT_DUR)和留入字节数与加上1000再除以100的数值:
13
oracle 数据库基础
sql>select CONNECT_DUR,(BYTES_IN+1000)/100 from BCOL_REG_ACCT 2>where BYTES_IN>1000;
查询出BYTES_IN大于100*10即1000且节点号等于10的LOGIN_NAME空格加上NODE_ID加上两个空格再加上(BYTES_IN+1000)/100的值:
sql>select LOGIN_NAME||' '||NODE_ID||' '||(BYTES_IN+1000)/100 2>from BCOL_REG_ACCT where BYTES_IN>100*10 and node_id=10; (3) 使用特殊的伪列
查询1周以后的日期从一个特殊的系统表dual。伪列主要有如下几种:
sequence.CURRVAL:上一次有序列产生器产生的序列名值。只有当前实例会话中从该序列中选择过一次值,这个伪列才会有效。
LEVEL:查询的深度,适用于特殊的树查询。 Sequence.NEXTVAL:使得每次的检索都返回下一个值
ROWID:表示数据行确切的存储位置。其格式是一个三个16进制的结构AAAAAAAA.BBBB .CCCC,AAAAAAA为该行的块 号,BBBB是数据块内部的行号,而CCCC则是数据库中的文件ID
ROWNUM:被检索数据行的序列号 SYSDATE:当前日期和时间 UID:当前用户的标识ID USER:用户登录数据库的用户名 sql>select sysdate + 7 from dual;
sql>select USER.sequence.currval from dual;
(4) 使用列和表的别名、查询中的多表连接以及使用子查询和distinct去掉重复记录查询
查询出BCOL_REG_ACCT表中的LOGIN_NAME,LOGIN_DATE,CONNECT_ DUR列和ANODE_NODEINFO中的NODE_ID列,符合 两个表中的NODE_ID列相等并且LOGIN_NAME在表AUSR_ACCOUNTINFO的列LOGIN_NAME中且名字以abc开头且没有重名的条 件,按照ANODE_NODEINFO表中的NODE_ID排序:
sql>select b.LOGIN_NAME,b.LOGIN_DATE ,c.NODE_ID,b.CONNECT_DUR
2>from BCOL_REG_ACCT b,ANODE_ NODEINFO c 3>where b.NODE_ID=c.NODE_ID 4>and b.LOGIN_NAME in
5>(select distinct LOGIN_NAME from AUSR_ACCOUNTINFO 6>where LOGIN_NAME like 'abc%') 7>order by c.NODE_ID;
(5) Union、Intersect和Minus等操作符连接的多步查询
14
oracle 数据库基础
查询出两各表中满足各自条件的用户名,UNION即两个查询的并集: sql>select LOGIN_NAME from BCOL_ REG_ACCT 2>where CONNECTION_DUR>5000 3>and LOGIN_NAME like 'abc%' 4>UNION
5>select LOGIN_NAME from AUSR_ACCOUNTINFO 6>where LOGIN_NAME like '?c%' 7>and NODE_ID=8;
类似地,INTERSECT返回出现在所有单个查询结果中都存在的数据行(即两个查询结果的交集);MINUS返回只出现在
第一个查询结果中且不出现在第二个查询结果中的数据行(即两个查询的差集)。 (6) 复杂查询
1) 递归查询 构造树的递归查询
树查询是在标准的select语句中增加两个新子句完成。
CONNECT BY子句定义表中的各个行是如何互相联系的,connect by子句中也可以加入更多的条件语句来删除没有必 要的树的分枝。
START WITH子句定义数据行查询的初始起点。可以定义不同的起点来实现向上或者向下浏览。
以下例子connect by 指定半价时间必须等于前面已经选择过的连接时长。Start with子句指定从用户名为abc的用户开始。
Sql>select LOGIN_NAME,CONNECT_DUR, DISCOUNT_DUR 2>from BCOL_REG_ACCT
3>connect by DISCOUNT_DUR=prior CONNECT_DUR 4>start with LOGIN_NAME='abc'; 2) 外连接查询
外连接即是在被连接的表中数据中加入一个空行来匹配没有与其匹配的数据,以下例子中第三行的(+)即是外连接查 询,将没有匹配的行加入一行空行。
sql>select b.LOGIN_NAME,a.NODE_ID
2>from BCOL_REG_ACCT b, ANODE_NODEINFO a 3>where b.NODE_ID(+)=a.NODE_ID 4>order by b.LOGIN_NAME,a.NODE_ID; 3)相关子查询
相关子查询就是在其where条件中引用了主查询中表的子查询: a. 单行条件的相关子查询,以下例子来实现单行子查询的功能:
15
oracle 数据库基础
sql>select a.NODE_ID,b.LOGIN_NAME,
2>nvl(to_char(b.LOGIN_DATE,'DD-MON-YY'),'UNKNOWN') 3>from AUSR_ACCOUNTINFO a,BCOL_REG_ACCT b 4>where b.NODE_ID(+)=a.NODE_ID 5>and (b.LOGIN_DATE is NULL or
6>b.LOGIN_DATE = (select max (c.LOGIN_DATE) from BCOL_REG_ACCT c 7>where c.NODE_ID=a.NODE_ID)) 8>and a.NODE_ID=
9>(select NODE_ID from ANODE_ NODEINFO where ANODE_NAME=aaa');
b. EXISTS和NOT EXISTS条件判断的相关子查询: 以下例子为以EXISTS判断的相关子查询: sql>select a.NODE_ID from ANODE_NODEINFO a 2>where exists (select 'x' from BCOL_ REG_ACCT b 3> where a.NODE_ID=b.NODE_ID 4> and b.CONNECT_ DUR=500) 5>order by a.NODE_ID;
以下例子是以NOT EXISTS判断的相关子查询,在涉及到子查询的条件时,最好用NOT EXISTS判断代替not in判断:
sql>select a.NODE_ID from ANODE_ NODEINFO a 2>where not exists (select 'x' from BCOL_REG_ACCT b 3> where a.NODE_ID=b.NODE_ID 4> and b.CONNECT_DUR!=500) 5>order by a.NODE_ID;
(insert、update、delete语法参考关系数据库SQL语言)
第四部分 Oracle数据库备份与恢复
一、数据库备份
(1) 数据备份形式分为以下两种
1) 实体数据备份:直接备份操作系统数据库文件,通过将数据库文件备份到其它设备如磁带机或磁盘,获得安全保障,需要备份的文件一般包括: 数据文件、联机重做日志文件、数据库控制文件、脱机交易日志文件
16
oracle 数据库基础
2) 逻辑数据备份:指备份数据库系统的逻辑对象,包括对象的定义与其所存储的数据内容,ORACLE提供两个命令:exp和imp实现数据逻辑备份 可以用 exp help=y imp help=y来查看其用法 (2)数据库分为归档日志执行模式和非归档日志执行模式
? 在归档日志执行模式下:数据库后台进程ARCH在每次【Log Switch】事件发生
时,将刚填满的联机重做日志文件备份到disk或tape中成为脱机交易记录文件,当需要恢复数据时,只需要将最近一次的数据库文件的全备份再加上这些脱机重做日志文件即可恢复到问题发生的时间点
? 在非归档日志执行模式下:数据库系统循环使用一组联机重做日志文件(online
redo log files),所以只能保存近期的交易记录,这样的话,要进行数据恢复时,只能恢复近期所做的交易,这样就要求数据经常关闭做数据库全备份,否则数据库恢复就无法进行。
通过以下命令查看数据库当前模式: SVRMGR>archive log list
在Database log mode一栏显示:[No] Archive Mode 从非归档日志执行模式到归档日志模式的切换方式:
1) 修改启动参数文件,设置如下项 log_archive_start=true (启动ARCH后台进程)
log_archive_dest=/vol4/arch/arch (设置存放脱机交易记录文件的位置及文件名开头) log_archive_format=-%s.log (设置脱机交易记录文件的后段文件名,%s代表记录文件的?log sequence number?)
2) 按以下步骤重启数据库并修改数据库设置 SVRMGR>connect internal; SVRMGR>shutdown; SVRMGR>startup mount;
SVRMGR>alter database archivelog; SVRMGR>alter database open;
用:SVRMGR>archive log list; 再次查看当前归档日志的设置模式 (3)数据库备份方法
数据库备份方法可以分为脱机执行数据库备份和联机执行数据库备份 1) 脱机执行数据库整体备份
当数据库shutdown normal或shutdown immediate指令正常关闭数据库系统时,系统触发一次检查点:checkpoint事件,并实现数据文件与联机重做日志文件的写入,并将该时间点同时记录在所有数据文件、联机重做日志文件和控制文件中,所以如果等数据库停止后
17