oracle--06查询语句

oracle——06查询语句

1.create user username identified b password;//建用户名和密码oracle ,oracle
2.grant connect,resource,dba to username;//授权 grant connect,resource,dba,sysdba to username;
3.connect username/password//进入。
4.select table_name,column_name from user_tab_columns where table_name='mview_log';//查询表中的表名,字
段名等等。
5. 如何执行脚本SQL文件? SQL>@PATH/filename.sql;
6.Oracle oledb 提供者在command中执行多条SQL语句与SQL SERVER有少许差别,SQL Server只需使用";"分割多条SQL
语句,而Oracle需要遵守ORACLE调用规范,即除分号分割外,还需以begin /end;包围语句体.
使用C#描述应如下所示:
this.oleDbCommand1.CommandText = "begin INSERT INTO GROUP_INFO (GROUP_ID, GROUP_NAME) VALUES (1, \'2
\'); INSERT INTO GROUP_INFO(GROUP_ID, GROUP_NAME) VALUES (2, \'2\'); end;";
7.查询用户下的所有表 select distinct table_name from user_tab_columns;
8.如何搜索出前N条记录?Select a.*,rownum from (select * from cardkind order by cardkind ) a where
rownum<n
9.查找用户下的所有表:select * from tab;
2、显示当前连接用户
SQL> show user
3、查看系统拥有哪些用户
SQL> select * from all_users;
4、新建用户并授权
SQL> create user a identified by a;(默认建在SYSTEM表空间下)
SQL> grant connect,resource to a;
5、连接到新用户
SQL> conn a/a
6、查询当前用户下所有对象
SQL> select * from tab;
7、建立第一个表
SQL> create table a(a number);
8、查询表结构
SQL> desc a
9、插入新记录
SQL> insert into a values(1);
10、查询记录
SQL> select * from a;
11、更改记录
SQL> update a set a=2;
12、删除记录
SQL> delete from a;
13、回滚
SQL> roll;
SQL> rollback;
14、提交
SQL> commit;
select * from
(select t.*,dense_rank() over (order by cardkind) rank from cardkind t)
where rank = 2;
46. 如何在字符串里加回车?
select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ;
47. 中文是如何排序的?
Oracle9i之前,中文是按照二进制编码进行排序的。
在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值
SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M 按照拼音排序
48. Oracle8i中对象名可以用中文吗?
可以
49. 如何改变WIN中SQL*Plus启动选项?
SQL*PLUS自身的选项设置我们可以在$ORACLE_HOME/sqlplus/admin/glogin.sql中设置。
50. 怎样修改oracel数据库的默认日期?
alter session set nls_date_format='yyyymmddhh24miss';
OR
可以在init.ora中加上一行
nls_date_format='yyyymmddhh24miss'
51. 如何将小表放入keep池中?
alter table xxx storage(buffer_pool keep);
52. 如何检查是否安装了某个patch?
check that oraInventory
53. 如何使select语句使查询结果自动生成序号?
select rownum,COL from table;
54. 如何知道数据裤中某个表所在的tablespace?
select tablespace_name from user_tables where table_name='TEST';
select * from user_tables中有个字段TABLESPACE_NAME,(oracle);
select * from dba_segments where …;
55. 怎么可以快速做一个和原表一样的备份表?
create table new_table as (select * from old_table);
55. 怎么在sqlplus下修改procedure?
select line,trim(text) t from user_source where name ='A' order by line;
56. 怎样解除PROCEDURE被意外锁定?
alter system kill session ,把那个session给杀掉,不过你要先查出她的session id
or
把该过程重新改个名字就可以了。
57. SQL Reference是个什么东西?
是一本sql的使用手册,包括语法、函数等等,oracle官方网站的文档中心有下载.
58. 如何查看数据库的状态?
unix下
ps -ef | grep ora
windows下
看服务是否起来
是否可以连上数据库
59. 请问如何修改一张表的主键?
alter table aaa
drop constraint aaa_key ;
alter table aaa
add constraint aaa_key primary key(a1,b1) ;
60. 改变数据文件的大小?
用 ALTER DATABASE .... DATAFILE .... ;
手工改变数据文件的大小,对于原来的 数据文件有没有损害。
61. 怎样查看ORACLE中有哪些程序在运行之中?
查看v$sessions表
62. 怎么可以看到数据库有多少个tablespace?
select * from dba_tablespaces;
63. 如何修改oracle数据库的用户连接数?
修改initSID.ora,将process加大,重启数据库.
64. 如何查出一条记录的最后更新时间?
可以用logminer 察看
65. 如何在PL/SQL中读写文件?
UTL_FILE包允许用户通过PL/SQL读写操作系统文件。
66. 怎样把"&"放入一条记录中?
insert into a values (translate ('at{&}t','at{}','at'));
67. EXP 如何加QUERY参数?
EXP USER/PASS FILE=A.DMP TABLES(BSEMPMS)
QUERY='"WHERE EMP_NO=\'S09394\'\" ﹔
68. 关于oracle8i支持简体和繁体的字符集问题?
ZHS16GBK可以支
69. Data Guard是什么软件?
就是Standby的换代产品
70. 如何创建SPFILE?
SQL> connect / as sysdba
SQL> select * from v$version;
SQL> create pfile from spfile;
SQL> CREATE SPFILE FROM PFILE='E:\ora9i\admin\eygle\pfile\init.ora';
文件已创建。
SQL> CREATE SPFILE='E:\ora9i\database\SPFILEEYGLE.ORA' FROM
PFILE='E:\ora9i\admin\eygle\pfile\init.ora';
文件已创建。
71. 内核参数的应用?
shmmax
含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了
最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。
设置方法:0.5*物理内存
例子:Set shmsys:shminfo_shmmax=10485760
shmmin
含义:共享内存的最小大小。
设置方法:一般都设置成为1。
例子:Set shmsys:shminfo_shmmin=1:
shmmni
含义:系统中共享内存段的最大个数。
例子:Set shmsys:shminfo_shmmni=100
shmseg
含义:每个用户进程可以使用的最多的共享内存段的数目。
例子:Set shmsys:shminfo_shmseg=20:
semmni
含义:系统中semaphore identifierer的最大个数。
设置方法:把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最大
的那个processes的那个值加10。
例子:Set semsys:seminfo_semmni=100
semmns
含义:系统中emaphores的最大个数。
设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的
processes的值的总和(除去最大的Processes参数)+最大的那个Processes×2+10×
Oracle实例的个数。
例子:Set semsys:seminfo_semmns=200
semmsl:
含义:一个set中semaphore的最大个数。
设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。
例子:Set semsys:seminfo_semmsl=-200
72. 怎样查看哪些用户拥有SYSDBA、SYSOPER权限?
SQL>conn sys/change_on_install
SQL>select * from V_$PWFILE_USERS;
73. 如何单独备份一个或多个表?
exp 用户/密码 tables=(表1,…,表2)
74. 如何单独备份一个或多个用户?
exp system/manager owner=(用户1,用户2,…,用户n) file=导出文件
75. 如何对CLOB字段进行全文检索?
SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)>0; 76. 如何显示当前连接用户?
SHOW USER
77. 如何查看数据文件放置的路径 ?
col file_name format a50
SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files
order by file_id;
78. 如何查看现有回滚段及其状态 ?
SQL> col segment format a30
SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE _ID,STATUS FROM
DBA_ROLLBACK_SEGS
79. 如何改变一个字段初始定义的Check范围?
SQL> alter table xxx drop constraint constraint_name;
之后再创建新约束:
SQL> alter table xxx add constraint constraint_name check();
80. Oracle常用系统文件有哪些?
通过以下视图显示这些文件信息:v$database,v$datafile,v$logfile v$controlfile
v$parameter;
81. 内连接INNER JOIN?
Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no;
82. 如何外连接?
Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);
Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;
83. 如何执行脚本SQL文件?
SQL>@$PATH/filename.sql;
84. 如何快速清空一个大表?
SQL>truncate table table_name;
85. 如何查有多少个数据库实例?
SQL>SELECT * FROM V$INSTANCE;
86. 如何查询数据库有多少表?
SQL>select * from all_tables;
87. 如何测试SQL语句执行所用的时间?
SQL>set timing on ;
SQL>select * from tablename;
88. CHR()的反函数是?
ASCII()
SELECT CHAR(65) FROM DUAL;
SELECT ASCII('A') FROM DUAL;
89. 字符串的连接
SELECT CONCAT(COL1,COL2) FROM TABLE ;
SELECT COL1||COL2 FROM TABLE ;
90. 怎么把select出来的结果导到一个文本文件中?
SQL>SPOOL C:\ABCD.TXT;
SQL>select * from table;
SQL >spool off;
91. 怎样估算SQL执行的I/O数 ?
SQL>SET AUTOTRACE ON ;
SQL>SELECT * FROM TABLE;
OR
SQL>SELECT * FROM v$filestat ;
可以查看IO数
92. 如何在sqlplus下改变字段大小?
alter table table_name modify (field_name varchar2(100));
改大行,改小不行(除非都是空的)
93. 如何查询某天的数据?
select * from table_name where trunc(日期字段)=to_date('2003-05-02','yyyy-mm-
dd');
94. sql 语句如何插入全年日期?
create table BSYEAR (d date);
insert into BSYEAR
select to_date('20030101','yyyymmdd')+rownum-1
from all_objects
where rownum <= to_char(to_date('20031231','yyyymmdd'),'ddd');
95. 如果修改表名?
alter table old_table_name rename to new_table_name;
96. 如何取得命令的返回状态值?
sqlcode=0
97. 如何知道用户拥有的权限?
SELECT * FROM dba_sys_privs ;
98. 从网上下载的ORACLE9I与市场上卖的标准版有什么区别?
从功能上说没有区别,只不过oracle公司有明文规定;从网站上下载的oracle产品不得用于商业用途,否则侵权。
99. 怎样判断数据库是运行在归档模式下还是运行在非归档模式下?
进入dbastudio,历程--〉数据库---〉归档查看。
100. sql>startup pfile和ifile,spfiled有什么区别?
pfile就是Oracle传统的初始化参数文件,文本格式的。
ifile类似于c语言里的include,用于把另一个文件引入
spfile是9i里新增的并且是默认的参数文件,二进制格式
startup后应该只可接pfile
101. 如何搜索出前N条记录?
SELECT * FROM empLOYEE WHERE ROWNUM < n ORDER BY empno;
102. 如何知道机器上的Oracle支持多少并发用户数?
SQL>conn internal ;
SQL>show parameter processes ;
103. db_block_size可以修改吗?
一般不可以﹐不建议这样做的。
104. 如何统计两个表的记录总数?
select (select count(id) from aa)+(select count(id) from bb) 总数 from dual;
105. 怎样用Sql语句实现查找一列中第N大值?
select * from
(select t.*,dense_rank() over (order by sal) rank from employee)
where rank = N;
106. 如何在给现有的日期加上2年?(
select add_months(sysdate,24) from dual;
107. USED_UBLK为负值表示什么意思?
It is "harmless".
108. Connect string是指什么?
应该是tnsnames.ora中的服务名后面的内容
109. 怎样扩大REDO LOG的大小?
建立一个临时的redolog组,然后切换日志,删除以前的日志,建立新的日志。
110. tablespace 是否不能大于4G?
没有限制.
111. 返回大于等于N的最小整数值?
SELECT CEIL(N) FROM DUAL;
112. 返回小于等于N的最小整数值?
SELECT FLOOR(N) FROM DUAL;
113. 返回当前月的最后一天?
SELECT LAST_DAY(SYSDATE) FROM DUAL;
114. 如何不同用户间数据导入?
IMP SYSTEM/MANAGER FILE=AA.DMP FROMUSER=USER_OLD TOUSER=USER_NEW ROWS=Y INDEXES=Y
;
115. 如何找数据库表的主键字段的名称?
SQL>SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and
table_name='TABLE_NAME';
116. 两个结果集互加的函数?
SQL>SELECT * FROM BSEMPMS_OLD INTERSECT SELECT * FROM BSEMPMS_NEW;
SQL>SELECT * FROM BSEMPMS_OLD UNION SELECT * FROM BSEMPMS_NEW;
SQL>SELECT * FROM BSEMPMS_OLD UNION ALL SELECT * FROM BSEMPMS_NEW;
117. 两个结果集互减的函数?
SQL>SELECT * FROM BSEMPMS_OLD MINUS SELECT * FROM BSEMPMS_NEW;
118. 如何配置Sequence?
建sequence seq_custid
create sequence seq_custid start 1 incrememt by 1;
建表时:
create table cust
{ cust_id smallint not null,
...}
insert 时:
insert into table cust
values( seq_cust.nextval, ...)
日期的各部分的常用的的写法
119>.取时间点的年份的写法:
SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL;
120>.取时间点的月份的写法:
SELECT TO_CHAR(SYSDATE,'MM') FROM DUAL;
121>.取时间点的日的写法:
SELECT TO_CHAR(SYSDATE,'DD') FROM DUAL;
122>.取时间点的时的写法:
SELECT TO_CHAR(SYSDATE,'HH24') FROM DUAL;
123>.取时间点的分的写法:
SELECT TO_CHAR(SYSDATE,'MI') FROM DUAL;
124>.取时间点的秒的写法:
SELECT TO_CHAR(SYSDATE,'SS') FROM DUAL;
125>.取时间点的日期的写法:
SELECT TRUNC(SYSDATE) FROM DUAL;
126>.取时间点的时间的写法:
SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') FROM DUAL;
127>.日期,时间形态变为字符形态
SELECT TO_CHAR(SYSDATE) FROM DUAL;
128>.将字符串转换成日期或时间形态:
SELECT TO_DATE('2003/08/01') FROM DUAL; 129>.返回参数的星期几的写法:
SELECT TO_CHAR(SYSDATE,'D') FROM DUAL;
130>.返回参数一年中的第几天的写法:
SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;
131>.返回午夜和参数中指定的时间值之间的秒数的写法:
SELECT TO_CHAR(SYSDATE,'SSSSS') FROM DUAL;
132>.返回参数中一年的第几周的写法:
SELECT TO_CHAR(SYSDATE,'WW') FROM DUAL;
虚拟字段
133. CURRVAL 和 nextval
为表创建序列
CREATE SEQUENCE EMPSEQ ... ;
SELECT empseq.currval FROM DUAL ;
自动插入序列的数值
INSERT INTO emp
VALUES (empseq.nextval, 'LEWIS', 'CLERK',
7902, SYSDATE, 1200, NULL, 20) ;
134. ROWNUM
按设定排序的行的序号
SELECT * FROM emp WHERE ROWNUM < 10 ;
135. ROWID
返回行的物理地址
SELECT ROWID, ename FROM emp WHERE deptno = 20 ;
136. 将N秒转换为时分秒格式?
set serverout on
declare
N number := 1000000;
ret varchar2(100);
begin
ret := trunc(n/3600) || '小时' || to_char(to_date(mod(n,3600),'sssss'),'fmmi"分
"ss"秒"') ;
dbms_output.put_line(ret);
end;
137. 如何查询做比较大的排序的进程?
SELECT b.tablespace, b.segfile#, b.segblk#, b.blocks, a.sid, a.serial#,
a.username, a.osuser, a.status
FROM v$session a,v$sort_usage b
WHERE a.saddr = b.session_addr
ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks ;
138. 如何查询做比较大的排序的进程的SQL语句?
select /*+ ORDERED */ sql_text from v$sqltext a
where a.hash_value = (
select sql_hash_value from v$session b
where b.sid = &sid and b.serial# = &serial)
order by piece asc ;
139. 如何查找重复记录?
SELECT * FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2);
140. 如何删除重复记录?
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2);
141. 如何快速编译所有视图?
SQL >SPOOL VIEW1.SQL
SQL >SELECT 'ALTER VIEW '||TNAME||'
COMPILE;' FROM TAB;
SQL >SPOOL OFF
然后执行VIEW1.SQL即可。
SQL >@VIEW1.SQL;
142. ORA-01555 SNAPSHOT TOO OLD的解决办法
增加MINEXTENTS的值,增加区的大小,设置一个高的OPTIMAL值。
143. 事务要求的回滚段空间不够,表现为表空间用满(ORA-01560错误),回滚段扩展到达
参数 MAXEXTENTS的值(ORA-01628)的解决办法.
向回滚段表空间添加文件或使已有的文件变大;增加MAXEXTENTS的值。
144. 如何加密ORACLE的存储过程?
下列存储过程内容放在AA.SQL文件中
create or replace procedure testCCB(i in number) as
begin
dbms_output.put_line('输入参数是'||to_char(i));
end;
SQL>wrap iname=a.sql;
PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001
Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved.
Processing AA.sql to AA.plb
运行AA.plb
SQL> @AA.plb ;
145. 如何监控事例的等待?
select event,sum(decode(wait_Time,0,0,1)) "Prev",
sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot"
from v$session_Wait
group by event order by 4;
146. 如何回滚段的争用情况?
select name, waits, gets, waits/gets "Ratio"
from v$rollstat C, v$rollname D
where C.usn = D.usn;
147. 如何监控表空间的 I/O 比例?
select B.tablespace_name name,B.file_name "file",A.phyrds pyr,
A.phyblkrd pbr,A.phywrts pyw, A.phyblkwrt pbw
from v$filestat A, dba_data_files B
where A.file# = B.file_id
order by B.tablespace_name;
148. 如何监控文件系统的 I/O 比例?
select substr(C.file#,1,2) "#", substr(C.name,1,30) "Name",
C.status, C.bytes, D.phyrds, D.phywrts
from v$datafile C, v$filestat D
where C.file# = D.file#;
149. 如何在某个用户下找所有的索引?
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
from user_ind_columns, user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
150. 如何监控 SGA 的命中率?
select a.value + b.value "logical_reads", c.value "phys_reads",
round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
from v$sysstat a, v$sysstat b, v$sysstat c
where a.statistic# = 38 and b.statistic# = 39
and c.statistic# = 40;
151. 如何监控 SGA 中字典缓冲区的命中率?
select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
from v$rowcache
where gets+getmisses <>0
group by parameter, gets, getmisses;
152. 如何监控 SGA 中共享缓存区的命中率,应该小于1% ?
select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
sum(reloads)/sum(pins) *100 libcache
from v$librarycache;
select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload
percent"
from v$librarycache;
153. 如何显示所有数据库对象的类别和大小?
select count(name) num_instances ,type ,sum(source_size) source_size ,
sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size)
error_size,
sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required
from dba_object_size
group by type order by 2;
154. 监控 SGA 中重做日志缓存区的命中率,应该小于1%
SELECT name, gets, misses, immediate_gets, immediate_misses,
Decode(gets,0,0,misses/gets*100) ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses) *100) ratio2
FROM v$latch WHERE name IN ('redo allocation', 'redo copy');
155. 监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts
(disk)');
156. 如何监控当前数据库谁在运行什么SQL语句?
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
157. 如何监控字典缓冲区?
SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM
V$ROWCACHE;
SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM
V$LIBRARYCACHE;
后者除以前者,此比率小于1%,接近0%为好。
SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
FROM V$ROWCACHE
158. 监控 MTS
select busy/(busy+idle) "shared servers busy" from v$dispatcher;
此值大于0.5时,参数需加大
select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where
type='dispatcher';
select count(*) from v$dispatcher;
select servers_highwater from v$mts;
servers_highwater接近mts_max_servers时,参数需加大
159. 如何知道当前用户的ID号?
SQL>SHOW USER;
OR
SQL>select user from dual;
160. 如何查看碎片程度高的表?
SELECT segment_name table_name , COUNT(*) extents
FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name
HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY
segment_name);
162. 如何知道表在表空间中的存储情况?
select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
tablespace_name='&tablespace_name' and segment_type='TABLE' group by
tablespace_name,segment_name;
163. 如何知道索引在表空间中的存储情况?
select segment_name,count(*) from dba_extents where segment_type='INDEX' and
owner='&owner'
group by segment_name;
164、如何知道使用CPU多的用户session?
11是cpu used by this session
select a.sid,spid,status,substr(a.program,1,40)
prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc;
165. 如何知道监听器日志文件?
以8I为例
$ORACLE_HOME/NETWORK/LOG/LISTENER.LOG
166. 如何知道监听器参数文件?
以8I为例
$ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA
167. 如何知道TNS 连接文件?
以8I为例
$ORACLE_HOME/NETWORK/ADMIN/TNSNAMES.ORA
168. 如何知道Sql*Net 环境文件?
以8I为例
$ORACLE_HOME/NETWORK/ADMIN/SQLNET.ORA
169. 如何知道警告日志文件?
以8I为例
$ORACLE_HOME/ADMIN/SID/BDUMP/SIDALRT.LOG
170. 如何知道基本结构?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/STANDARD.SQL
171. 如何知道建立数据字典视图?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/CATALOG.SQL
172. 如何知道建立审计用数据字典视图?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/CATAUDIT.SQL
173. 如何知道建立快照用数据字典视图?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/CATSNAP.SQL
本讲主要讲的是SQL语句的优化方法! 主要基于ORACLE9I的.
174. /*+ALL_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';
175. /*+FIRST_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP'; 176. /*+CHOOSE*/
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';
177. /*+RULE*/
表明对语句块选择基于规则的优化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';
178. /*+FULL(TABLE)*/
表明对表选择全局扫描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='CCBZZP';
179. /*+ROWID(TABLE)*/
提示明确表明对指定表根据ROWID进行访问.
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='CCBZZP';
180. /*+CLUSTER(TABLE)*/
提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
181. /*+INDEX(TABLE INDEX_NAME)*/
表明对表选择索引的扫描方法.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE
BSEMPMS */ FROM BSEMPMS WHERE SEX='M';
182. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明对表选择索引升序的扫描方法.


日期/时间 相关查询
获取当前月份的第一天

运行这个命令能快速返回当前月份的第一天。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month" 
    FROM DUAL;
获取当前月份的最后一天

这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

SELECT TRUNC (LAST_DAY (SYSDATE)) "Last day of current month" 
    FROM DUAL;
获取当前年份的第一天

每年的第一天都是1 月1日,这个查询语句可以使用在存储过程中,需要对当前年份第一天做一些计算的时候。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

SELECT TRUNC (SYSDATE, 'YEAR') "Year First Day" FROM DUAL;
获取当前年份的最后一天

类似于上面的查询语句。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

SELECT ADD_MONTHS (TRUNC (SYSDATE, 'YEAR'), 12) - 1 "Year Last Day" FROM DUAL
获取当前月份的天数

这个语句非常有用,可以计算出当前月份的天数。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

SELECT CAST (TO_CHAR (LAST_DAY (SYSDATE), 'dd') AS INT) number_of_days
  FROM DUAL;
获取当前月份剩下的天数

下面的语句用来计算当前月份剩下的天数。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

SELECT SYSDATE,
       LAST_DAY (SYSDATE) "Last",
       LAST_DAY (SYSDATE) - SYSDATE "Days left"
  FROM DUAL;
获取两个日期之间的天数

使用这个语句来获取两个不同日期自检的天数。

SELECT ROUND ( (MONTHS_BETWEEN ('01-Feb-2014', '01-Mar-2012') * 30), 0)
          num_of_days
  FROM DUAL;

OR

SELECT TRUNC(sysdate) - TRUNC(e.hire_date) FROM employees;
如果你需要查询一些特定日期的天数,可以使用第二个查询语句。这个例子是计算员工入职的天数。

显示当前年份截止到上个月每个月份开始和结束的日期

这个是个很聪明的查询语句,用来显示当前年份每个月的开始和结束的日期,你可以使用这个进行一些类型的计算。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), i) start_date,
       TRUNC (LAST_DAY (ADD_MONTHS (SYSDATE, i))) end_date
  FROM XMLTABLE (
          'for $i in 0 to xs:int(D) return $i'
          PASSING XMLELEMENT (
                     d,
                     FLOOR (
                        MONTHS_BETWEEN (
                           ADD_MONTHS (TRUNC (SYSDATE, 'YEAR') - 1, 12),
                           SYSDATE)))
          COLUMNS i INTEGER PATH '.');
获取直到目前为止今天过去的秒数(从 00:00 开始算)

SELECT (SYSDATE - TRUNC (SYSDATE)) * 24 * 60 * 60 num_of_sec_since_morning
  FROM DUAL;
获取今天剩下的秒数(直到 23:59:59 结束)

SELECT (TRUNC (SYSDATE+1) - SYSDATE) * 24 * 60 * 60 num_of_sec_left
  FROM DUAL;
数据字典查询

检查在当前数据库模式下是否存在指定的表

这是一个简单的查询语句,用来检查当前数据库是否有你想要创建的表,允许你重新运行创建表脚本,这个也可以检查当前用户是否已经创建了指定的表(根据这个查询语句在什么环境下运行来查询)。

SELECT table_name
  FROM user_tables
 WHERE table_name = 'TABLE_NAME';
检查在当前表中是否存在指定的列

这是个简单的查询语句来检查表里是否有指定的列,在你尝试使用 ALTER TABLE 来添加新的列新到表中的时候非常有用,它会提示你是否已经存在这个列。

SELECT column_name AS FOUND
  FROM user_tab_cols
 WHERE table_name = 'TABLE_NAME' AND column_name = 'COLUMN_NAME';
显示表结构

这 个查询语句会显示任何表的 DDL 状态信息。请注意我们已经将‘TABLE’作为第一个信息提交了。这个查询语句也可以用来获取任何数据库对象的 DDL 状态信息。举例说明,只需要把第一个参数替换成‘VIEW’,第二个修改成视图的名字,就可以查询视图的 DDL 信息了。

SELECT DBMS_METADATA.get_ddl ('TABLE', 'TABLE_NAME', 'USER_NAME') FROM DUAL;
获取当前模式

这是另一个可以获得当前模式的名字的查询语句。

SELECT SYS_CONTEXT ('userenv', 'current_schema') FROM DUAL;
修改当前模式

这是另一个可以修改当前模式的查询语句,当你希望你的脚本可以在指定的用户下运行的时候非常有用,而且这是非常安全的一个方式。

ALTER SESSION SET CURRENT_SCHEMA = new_schema;
数据库管理查询

数据库版本信息

返回 Oracle 数据库版本

SELECT * FROM v$version;
数据库默认信息

返回一些系统默认的信息

SELECT username,
       profile,
       default_tablespace,
       temporary_tablespace
  FROM dba_users;
数据库字符设置信息

显示数据库的字符设置信息

SELECT * FROM nls_database_parameters;
获取 Oracle 版本

SELECT VALUE
  FROM v$system_parameter
 WHERE name = 'compatible';
存储区分大小写的数据,但是索引不区分大小写

某些时候你可能想在数据库中查询一些独立的数据,可能会用 UPPER(..) = UPPER(..) 来进行不区分大小写的查询,所以就想让索引不区分大小写,不占用那么多的空间,这个语句恰好能解决你的需求 。

CREATE TABLE tab (col1 VARCHAR2 (10));

CREATE INDEX idx1
   ON tab (UPPER (col1));

ANALYZE TABLE a COMPUTE STATISTICS;
调整没有添加数据文件的表空间

另一个 DDL 查询来调整表空间大小

ALTER DATABASE DATAFILE '/work/oradata/STARTST/STAR02D.dbf' resize 2000M;
检查表空间的自动扩展开关

在给定的表空间中查询是否打开了自动扩展开关

SELECT SUBSTR (file_name, 1, 50), AUTOEXTENSIBLE FROM dba_data_files;

(OR)

SELECT tablespace_name, AUTOEXTENSIBLE FROM dba_data_files;
在表空间添加数据文件

在表空间中添加数据文件

ALTER TABLESPACE data01 ADD DATAFILE '/work/oradata/STARTST/data01.dbf'
    SIZE 1000M AUTOEXTEND OFF;
增加数据文件的大小

给指定的表空间增加大小

ALTER DATABASE DATAFILE '/u01/app/Test_data_01.dbf' RESIZE 2G;
查询数据库的实际大小

给出以 GB 为单位的数据库的实际大小

SELECT SUM (bytes) / 1024 / 1024 / 1024 AS GB FROM dba_data_files;
查询数据库中数据占用的大小或者是数据库使用细节

给出在数据库中数据占据的空间大小

SELECT SUM (bytes) / 1024 / 1024 / 1024 AS GB FROM dba_segments;
查询模式或者用户的大小

以 MB 为单位给出用户的空间大小

SELECT SUM (bytes / 1024 / 1024) "size"
  FROM dba_segments
 WHERE owner = '&owner';
查询数据库中每个用户最后使用的 SQL 查询

此查询语句会显示当前数据库中每个用户最后使用的 SQL 语句。

SELECT S.USERNAME || '(' || s.sid || ')-' || s.osuser UNAME,
         s.program || '-' || s.terminal || '(' || s.machine || ')' PROG,
         s.sid || '/' || s.serial# sid,
         s.status "Status",
         p.spid,
         sql_text sqltext
    FROM v$sqltext_with_newlines t, V$SESSION s, v$process p
   WHERE     t.address = s.sql_address
         AND p.addr = s.paddr(+)
         AND t.hash_value = s.sql_hash_value
ORDER BY s.sid, t.piece;
性能相关查询

查询用户 CPU 的使用率
这个语句是用来显示每个用户的 CPU 使用率,有助于用户理解数据库负载情况

SELECT ss.username, se.SID, VALUE / 100 cpu_usage_seconds
    FROM v$session ss, v$sesstat se, v$statname sn
   WHERE     se.STATISTIC# = sn.STATISTIC#
         AND NAME LIKE '%CPU used by this session%'
         AND se.SID = ss.SID
         AND ss.status = 'ACTIVE'
         AND ss.username IS NOT NULL
ORDER BY VALUE DESC;
查询数据库长查询进展情况

显示运行中的长查询的进展情况

SELECT a.sid,
         a.serial#,
         b.username,
         opname OPERATION,
         target OBJECT,
         TRUNC (elapsed_seconds, 5) "ET (s)",
         TO_CHAR (start_time, 'HH24:MI:SS') start_time,
         ROUND ( (sofar / totalwork) * 100, 2) "COMPLETE (%)"
    FROM v$session_longops a, v$session b
   WHERE     a.sid = b.sid
         AND b.username NOT IN ('SYS', 'SYSTEM')
         AND totalwork > 0
ORDER BY elapsed_seconds;
获取当前会话 ID,进程 ID,客户端 ID 等

这个专门提供给想使用进程 ID 和 会话 ID 做些 voodoo magic 的用户。

SELECT b.sid,
       b.serial#,
       a.spid processid,
       b.process clientpid
  FROM v$process a, v$session b
 WHERE a.addr = b.paddr AND b.audsid = USERENV ('sessionid');
V$SESSION.SID AND V$SESSION.SERIAL# 是数据库进程 ID

V$PROCESS.SPID 是数据库服务器后台进程 ID

V$SESSION.PROCESS 是客户端 PROCESS ID, ON windows it IS : separated THE FIRST # IS THE PROCESS ID ON THE client AND 2nd one IS THE THREAD id.

查询特定的模式或者表中执行的最后一个 SQL 语句

SELECT CREATED, TIMESTAMP, last_ddl_time
  FROM all_objects
 WHERE     OWNER = 'MYSCHEMA'
       AND OBJECT_TYPE = 'TABLE'
       AND OBJECT_NAME = 'EMPLOYEE_TABLE';
查询每个执行读取的前十个 SQL

SELECT *
  FROM (  SELECT ROWNUM,
                 SUBSTR (a.sql_text, 1, 200) sql_text,
                 TRUNC (
                    a.disk_reads / DECODE (a.executions, 0, 1, a.executions))
                    reads_per_execution,
                 a.buffer_gets,
                 a.disk_reads,
                 a.executions,
                 a.sorts,
                 a.address
            FROM v$sqlarea a
        ORDER BY 3 DESC)
 WHERE ROWNUM < 10;
在视图中查询并显示实际的 Oracle 连接

SELECT osuser,
         username,
         machine,
         program
    FROM v$session
ORDER BY osuser;
查询并显示通过打开连接程序打开连接的组

SELECT program application, COUNT (program) Numero_Sesiones
    FROM v$session
GROUP BY program
ORDER BY Numero_Sesiones DESC;
查询并显示连接 Oracle 的用户和用户的会话数量

SELECT username Usuario_Oracle, COUNT (username) Numero_Sesiones
    FROM v$session
GROUP BY username
ORDER BY Numero_Sesiones DESC;
获取拥有者的对象数量

SELECT owner, COUNT (owner) number_of_objects
    FROM dba_objects
GROUP BY owner
ORDER BY number_of_objects DESC;
实用/数学 相关的查询

把数值转换成文字
更多信息可以查看: Converting number into words in Oracle

SELECT TO_CHAR (TO_DATE (1526, 'j'), 'jsp') FROM DUAL;
输出:

one thousand five hundred twenty-six
在包的源代码中查询字符串

这个查询语句会在所有包的源代码上搜索‘FOO_SOMETHING’ ,可以帮助用户在源代码中查找特定的存储过程或者是函数调用。

--search a string foo_something in package source code
SELECT *
  FROM dba_source
 WHERE UPPER (text) LIKE '%FOO_SOMETHING%' 
AND owner = 'USER_NAME';
把用逗号分隔的数据插入的表中

当 你想把用逗号分隔开的字符串插入表中的时候,你可以使用其他的查询语句,比如 IN 或者是 NOT IN 。这里我们把‘AA,BB,CC,DD,EE,FF’转换成包含 AA,BB,CC 等作为一行的表,这样你就很容易把这些字符串插入到其他表中,并快速的做一些相关的操作。

WITH csv
     AS (SELECT 'AA,BB,CC,DD,EE,FF'
                   AS csvdata
           FROM DUAL)
    SELECT REGEXP_SUBSTR (csv.csvdata, '[^,]+', 1, LEVEL) pivot_char
      FROM DUAL, csv
CONNECT BY REGEXP_SUBSTR (csv.csvdata,'[^,]+', 1, LEVEL) IS NOT NULL;
查询表中的最后一个记录

这个查询语句很直接,表中没有主键,或者是用户不确定记录最大主键是否是最新的那个记录时,就可以使用这个语句来查询表中最后一个记录。

SELECT *
  FROM employees
 WHERE ROWID IN (SELECT MAX (ROWID) FROM employees);

(OR)

SELECT * FROM employees
MINUS
SELECT *
  FROM employees
 WHERE ROWNUM < (SELECT COUNT (*) FROM employees);
在 Oracle 中做行数据乘法

这个查询语句使用一些复杂的数学函数来做每个行的数值乘法。更多内容请查阅: Row Data Multiplication In Oracle

WITH tbl
     AS (SELECT -2 num FROM DUAL
         UNION
         SELECT -3 num FROM DUAL
         UNION
         SELECT -4 num FROM DUAL),
     sign_val
     AS (SELECT CASE MOD (COUNT (*), 2) WHEN 0 THEN 1 ELSE -1 END val
           FROM tbl
          WHERE num < 0)
  SELECT EXP (SUM (LN (ABS (num)))) * val
    FROM tbl, sign_val
GROUP BY val;
在 Oracle 生成随机数据

每个开发者都想能轻松生成一堆随机数据来测试数据库多好,下面这条查询语句就可以满足你,它可以在 Oracle 中生成随机的数据插入到表中。详细信息可以查看 Random Data in Oracle

SELECT LEVEL empl_id,
           MOD (ROWNUM, 50000) dept_id,
           TRUNC (DBMS_RANDOM.VALUE (1000, 500000), 2) salary,
           DECODE (ROUND (DBMS_RANDOM.VALUE (1, 2)),  1, 'M',  2, 'F') gender,
           TO_DATE (
                 ROUND (DBMS_RANDOM.VALUE (1, 28))
              || '-'
              || ROUND (DBMS_RANDOM.VALUE (1, 12))
              || '-'
              || ROUND (DBMS_RANDOM.VALUE (1900, 2010)),
              'DD-MM-YYYY')
              dob,
           DBMS_RANDOM.STRING ('x', DBMS_RANDOM.VALUE (20, 50)) address
      FROM DUAL
CONNECT BY LEVEL < 10000;
在 Oracle 中生成随机数值

这是 Oracle 普通的旧的随机数值生成器。这个可以生成 0-100 之间的随机数值,如果你想自己设置数值范围,那么改变乘数就可以了。

--generate random number between 0 and 100
SELECT ROUND (DBMS_RANDOM.VALUE () * 100) + 1 AS random_num FROM DUAL;
检查表中是否含有任何的数据

这个可以有很多中写法,你可以使用 count(*) 来查看表里的行的数量,但是这个查询语句比较高效和快速,而且我们只是想知道表里是否有任何的数据。

SELECT 1
  FROM TABLE_NAME
 WHERE ROWNUM = 1;

Oracle查询语句
select * from scott.emp ;



1.--dense_rank()分析函数(查找每个部门工资最高前三名员工信息)
select * from (select deptno,ename,sal,dense_rank() over(partition by deptno order by sal desc) a from scott.emp) where a<=3 order by deptno asc,sal desc ;
结果:

--rank()分析函数(运行结果与上语句相同)
select * from (select deptno,ename,sal,rank() over(partition by deptno order by sal desc) a from scott.emp ) where a<=3 order by deptno asc,sal desc ;
结果:

--row_number()分析函数(运行结果与上相同)
select * from(select deptno,ename,sal,row_number() over(partition by deptno order by sal desc) a from scott.emp) where a<=3 order by deptno asc,sal desc ;
--rows unbounded preceding 分析函数(显示各部门的积累工资总和)
select deptno,sal,sum(sal) over(order by deptno asc rows unbounded preceding) 积累工资总和 from scott.emp ;
结果:

--rows 整数值 preceding(显示每最后4条记录的汇总值)
select deptno,sal,sum(sal) over(order by deptno rows 3 preceding) 每4汇总值 from scott.emp ;
结果:

--rows between 1 preceding and 1 following(统计3条记录的汇总值【当前记录居中】)
select deptno,ename,sal,sum(sal) over(order by deptno rows between 1 preceding and 1 following) 汇总值 from scott.emp ;
结果:

--ratio_to_report(显示员工工资及占该部门总工资的比例)
select deptno,sal,ratio_to_report(sal) over(partition by deptno) 比例 from scott.emp ;
结果:

--查看所有用户
select * from dba_users ;
select count(*) from dba_users ;
select * from all_users ;
select * from user_users ;
select * from dba_roles ;
--查看用户系统权限
select * from dba_sys_privs ;
select * from user_users ;
--查看用户对象或角色权限
select * from dba_tab_privs ;
select * from all_tab_privs ;
select * from user_tab_privs ;
--查看用户或角色所拥有的角色
select * from dba_role_privs ;
select * from user_role_privs ;
-- rownum:查询10至12信息
select * from scott.emp a where rownum<=3 and a.empno not in(select b.empno from scott.emp b where rownum<=9);
结果:

--not exists;查询emp表在dept表中没有的数据
select * from scott.emp a where not exists(select * from scott.dept b where a.empno=b.deptno) ;
结果:

--rowid;查询重复数据信息
select * from scott.emp a where a.rowid>(select min(x.rowid) from scott.emp x where x.empno=a.empno);
--根据rowid来分页(一万条数据,查询10000至9980时间大概在0.03秒左右)
select * from scott.emp where rowid in(select rid from(select rownum rn,rid from(select rowid rid,empno from scott.emp order by empno desc) where rownum<10)where rn>=1)order by empno desc ;
结果:

--根据分析函数分页(一万条数据,查询10000至9980时间大概在1.01秒左右)
select * from(select a.*,row_number() over(order by empno desc) rk from scott.emp a ) where rk<10 and rk>=1;
结果:

--rownum分页(一万条数据,查询10000至9980时间大概在0.01秒左右)
select * from(select t.*,rownum rn from(select * from scott.emp order by empno desc)t where rownum<10) where rn>=1;
select * from(select a.*,rownum rn from (select * from scott.emp) a where rownum<=10) where rn>=5 ;
--left outer join:左连接
select a.*,b.* from scott.emp a left outer join scott.dept b on a.deptno=b.deptno ;
--right outer join:右连接
select a.*,b.* from scott.emp a right outer join scott.dept b on a.deptno=b.deptno ;
--inner join
select a.*,b.* from scott.emp a inner  join scott.dept b on a.deptno=b.deptno ;
--full join
select a.*,b.* from scott.emp a full join scott.dept b on a.deptno=b.deptno ;
select a.*,b.* from scott.emp a,scott.dept b where a.deptno(+)=b.deptno ;
select distinct ename,sal from scott.emp a group by sal having ;
select * from scott.dept ;
select * from scott.emp ;
--case when then end (交叉报表)
select ename,sal,case deptno when 10 then '会计部' when 20 then '研究部' when 30 then '销售部' else '其他部门' end 部门 from scott.emp ;
结果:

select ename,sal,case when sal>0 and sal<1500 then '一级工资' when sal>=1500 and sal<3000 then '二级工资' when sal>=3000 and sal<4500 then '三级工资' else '四级工资' end 工资等级 from scott.emp order by sal desc ;
结果:

--交叉报表是使用分组函数与case结构一起实现
select 姓名,sum(case 课程 when '数学' then 分数 end)数学,sum(case 课程 when '历史' then 分数 end)历史 from 学生 group by 姓名 ;
--decode 函数
select 姓名,sum(decode(课程,'数学',分数,null))数学,sum(decode(课程,'语文',分数,null))语文,sum(decode(课程,'历史','分数',null))历史 from 学生 group by 姓名 ;
--level。。。。connect by(层次查询)
select level,emp.* from scott.emp connect by prior empno = mgr order by level ;
结果:

--sys_connect_by_path函数
select ename,sys_connect_by_path(ename,'/') from scott.emp start with mgr is null connect by prior empno=mgr ;
结果:

--start with connect by prior 语法
select lpad(ename,3*(level),'')姓名,lpad(ename,3*(level),'')姓名 from scott.emp where job<>'CLERK' start with mgr is null connect by prior mgr = empno ;
--level与prior关键字
select level,emp.* from scott.emp start with ename='SCOTT' connect by prior empno=mgr;
select level,emp.* from scott.emp start with ename='SCOTT' connect by empno = prior mgr ;
结果:

--等值连接
select empno,ename,job,sal,dname from scott.emp a,scott.dept b where a.deptno=b.deptno and (a.deptno=10 or sal>2500);
结果:

--非等值连接
select a.ename,a.sal,b.grade from scott.emp a,scott.salgrade b where a.sal between b.losal and b.hisal ;
结果:

--自连接
select a.ename,a.sal,b.ename from scott.emp a,scott.emp b where a.mgr=b.empno ;
结果:

--左外连接
select a.ename,a.sal,b.ename from scott.emp a,scott.emp b where a.mgr=b.empno(+);
结果:

--多表连接
select * from scott.emp ,scott.dept,scott.salgrade where scott.emp.deptno=scott.dept.deptno and scott.emp.sal between scott.salgrade.losal and scott.salgrade.hisal ;
结果:

select * from scott.emp a join scott.dept b on a.deptno=b.deptno join scott.salgrade s on a.sal between s.losal and s.hisal where a.sal>1000;
select * from(select * from scott.emp a join scott.dept b on a.deptno=b.deptno where a.sal>1000) c join scott.salgrade s on c.sal between s.losal and s.hisal ;
--单行子查询
select * from scott.emp a where a.deptno=(select deptno from scott.dept where loc='NEW YORK');
select * from scott.emp a where a.deptno in (select deptno from scott.dept where loc='NEW YORK');
结果:

--单行子查询在 from 后
select scott.emp.*,(select deptno from scott.dept where loc='NEW YORK') a from scott.emp ;

--使用 in ,all,any 多行子查询
--in:表示等于查询出来的对应数据
select ename,job,sal,deptno from scott.emp where job in(select distinct job from scott.emp where deptno=10);
--all:表示大于所有括号中查询出来的对应的数据信息
select ename,sal,deptno from scott.emp where sal>all(select sal from scott.emp where deptno=30);
--any:表示大于括号查询出来的其中任意一个即可(只随机一个)
select ename,sal,deptno from scott.emp where sal>any(select sal from scott.emp where deptno=30);

--多列子查询
select ename,job,sal,deptno from scott.emp where(deptno,job)=(select deptno,job from scott.emp where ename='SCOTT');
select ename,job,sal,deptno from scott.emp where(sal,nvl(comm,-1)) in(select sal,nvl(comm,-1) from scott.emp where deptno=30);
--非成对比较
select ename,job,sal,deptno from scott.emp where sal in(select sal from scott.emp where deptno=30) and nvl(comm,-1) in(select nvl(comm,-1) from scott.emp where deptno=30);

--其他子查询
select ename,job,sal,deptno from scott.emp where exists(select null from scott.dept where scott.dept.deptno=scott.emp.deptno and scott.dept.loc='NEW YORK');
select ename,job,sal from scott.emp join(select deptno,avg(sal) avgsal,null from scott.emp group by deptno) dept on emp.deptno=dept.deptno where sal>dept.avgsal ;
create table scott.test(
       ename varchar(20),
       job varchar(20)
);
--drop table test ;
select * from scott.test ;
--Insert与子查询(表间数据的拷贝)
insert into scott.test(ename,job) select ename,job from scott.emp ;
--Update与子查询
update scott.test set(ename,job)=(select ename,job from scott.emp where ename='SCOTT' and deptno ='10');
--创建表时,还可以指定列名
create table scott.test_1(ename,job) as select ename,job from scott.emp ;
select * from scott.test_1 ;
--delete与子查询
delete from scott.test where ename in('');
--合并查询
--union语法(合并且去除重复行,且排序)
select ename,sal,deptno from scott.emp where deptno>10 union select ename,sal,deptno from scott.emp where deptno<30 ;
select a.deptno from scott.emp a union select b.deptno from scott.dept b ;
--union all(直接将两个结果集合并,不排序)
select ename,sal,deptno from scott.emp where deptno>10 union all select ename,sal,deptno from scott.emp where deptno<30 ;
select a.deptno from scott.emp a union all select b.deptno from scott.dept b ;
--intersect:取交集
select ename,sal,deptno from scott.emp where deptno>10 intersect select ename,sal,deptno from scott.emp where deptno<30;
--显示部门工资总和高于雇员工资总和三分之一的部门名及工资总和
select dname as 部门,sum(sal) as 工资总和 from scott.emp a,scott.dept b where a.deptno=b.deptno group by dname having sum(sal)>(select sum(sal)/3 from scott.emp c,scott.dept d where c.deptno=d.deptno);
结果:

--使用with得到以上同样的结果
with test as (select dname ,sum(sal) sumsal  from scott.emp ,scott.dept where scott.emp.deptno=scott.dept.deptno group by dname) select dname as 部门,sumsal as 工资总和 from scott.test where sumsal>(select sum(sumsal)/3 from scott.test);
结果:

--分析函数
select ename,sal,sum(sal) over(partition by deptno order by sal desc) from scott.emp ;
--rows n preceding(窗口子句一)
select deptno,sal,sum(sal) over(order by sal rows 5 preceding) from scott.emp ;
结果:

--rum(..) over(..)..
select sal,sum(1) over(order by sal) aa from scott.emp  ;
select deptno,ename,sal,sum(sal) over(order by ename) 连续求和,sum(sal) over() 总和,100*round(sal/sum(sal) over(),4) as 份额 from scott.emp;
结果:

select deptno,ename,sal,sum(sal) over(partition by deptno order by ename) 部门连续求和,sum(sal) over(partition by deptno) 部门总和,100*round(sal/sum(sal) over(),4) as 总份额 from scott.emp;
结果:

select deptno,sal,rank() over (partition by deptno order by sal),dense_rank() over(partition by deptno order by sal) from scott.emp order by deptno ;
结果;

select * from (select rank() over(partition by 课程 order by 分数 desc) rk,分析函数_rank.* from 分析函数_rank) where rk<=3 ;
--dense_rank():有重复的数字不跳着排列
--row_number()
select deptno,sal,row_number() over(partition by deptno order by sal) rm from scott.emp ;
结果:

--lag()和lead()
select deptno,sal,lag(sal) over(partition by deptno order by sal) 上一个,lead(sal) over(partition by deptno order by sal) from scott.emp ;
结果:

--max(),min(),avg()
select deptno,sal,max(sal) over(partition by deptno order by sal)最大,min(sal) over(partition by deptno order by sal)最小,avg(sal) over(partition by deptno order by sal)平均 from scott.emp ;
结果:

--first_value(),last_value()
select deptno,sal,first_value(sal) over(partition by deptno)最前,last_value(sal) over(partition by deptno )最后 from scott.emp ;
结果:

--分组补充 group by grouping sets
select deptno ,sal,sum(sal) from scott.emp group by grouping sets(deptno,sal);
select null,sal,sum(sal) from scott.emp group by sal union all select deptno,null,sum(sal) from scott.emp group by deptno ;
结果:

--rollup
select deptno,job,avg(sal) from scott.emp group by rollup(deptno,job) ;
--理解rollup等价于
select deptno,job,avg(sal) from scott.emp group by deptno,job union select deptno ,null,avg(sal) from scott.emp group by deptno union select null,null,avg(sal) from scott.emp ;
结果:

select deptno,job,avg(sal) a from scott.emp group by cube(deptno,job) ;
--理解CUBE
select deptno,job,avg(sal) from scott.emp group by cube(deptno,job) ;
--等价于
select deptno,job,avg(sal) from scott.emp group by grouping sets((deptno,job),(deptno),(job),());
结果:

--查询工资不在1500至2850之间的所有雇员名及工资
select ename,sal from scott.emp where sal not in(select sal from scott.emp where sal between 1500 and 2850 );
--部门10和30中的工资超过1500的雇员名及工资
select deptno,ename,sal from scott.emp a where a.deptno in(10,30) and a.sal>1500 order by sal desc ;
结果:

--在1981年2月1日至1981年5月1日之间雇佣的雇员名,岗位及雇佣日期,并以雇佣日期先后顺序排序
select ename as 姓名,job as 岗位,hiredate as 雇佣日期 from scott.emp a where a.hiredate between to_date('1981-02-01','yyyy-mm-dd') and to_date('1981-05-01','yyyy-mm-dd') order by a.hiredate asc ;
结果:

select * from scott.emp where hiredate >to_date('1981-02-01','yyyy-MM-dd');

--查询获得补助的所有雇佣名,工资及补助额,并以工资和补助的降序排序
select ename,sal,comm from scott.emp a where a.comm > all(0) order by comm desc;
--工资低于1500的员工增加10%的工资,工资在1500及以上的增加5%的工资并按工资高低排序(降序)
select ename as 员工姓名,sal as 补发前的工资,case when sal<1500 then (sal+sal*0.1) else (sal+sal*0.05) end 补助后的工资 from scott.emp order by sal desc ;
结果:

--查询公司每天,每月,每季度,每年的资金支出数额
select sum(sal/30) as 每天发的工资,sum(sal) as 每月发的工资,sum(sal)*3 as 每季度发的工资,sum(sal)*12 as 每年发的工资 from scott.emp;
结果:

--查询所有员工的平均工资,总计工资,最高工资和最低工资
select avg(sal) as 平均工资,sum(sal) as 总计工资,max(sal) as 最高工资,min(sal) as 最低工资 from scott.emp;
结果:

--每种岗位的雇员总数和平均工资
select job as 岗位,count(job) as 岗位雇员总数,avg(sal) as 平均工资 from scott.emp group by job order by 平均工资 desc;
结果:

--雇员总数以及获得补助的雇员数
select count(*) as 公司雇员总数,count(comm) as 获得补助的雇员人数 from scott.emp ;
--管理者的总人数
--雇员工资的最大差额
select max(sal),min(sal),(max(sal) - min(sal)) as 员工工资最大差额 from scott.emp ;
--每个部门的平均工资
select deptno,avg(sal) from scott.emp a group by a.deptno;
结果:

--查询每个岗位人数超过2人的所有职员信息
select * from scott.emp a,(select c.job,count(c.job) as sl from scott.emp c group by c.job ) b where b.sl>2 and a.job=b.job;
结果:

select * from scott.emp a where a.empno in(select mgr from scott.emp ) and (select count(mgr) from scott.emp)>2 ;
结果:

--处理重复行数据信息(删除,查找,修改)
select * from a1 a where not exists (select b.rd from (select rowid rd,row_number() over(partition by LOAN, BRANCH order by BEGIN_DATE desc) rn from a1) b where b.rn = 1 and a.rowid = b.rd);
--查询emp表数据信息重复问题
select * from scott.emp a where exists(select b.rd from(select rowid rd,row_number() over(partition by ename,job,mgr,hiredate,sal,comm,deptno order by empno asc) rn from scott.emp) b where b.rn=1 and a.rowid=b.rd);
--initcap:返回字符串,字符串第一个字母大写
select initcap(ename) Upp from scott.emp ;
结果:

--ascii:返回与指定的字符对应的十进制数
select ascii(a.empno) as 编号,ascii(a.ename) as 姓名,ascii(a.job) as 岗位 from scott.emp a ;
结果:

--chr:给出整数,返回对应的字符
select chr(ascii(ename)) as 姓名 from scott.emp ;
结果:

--concat:连接字符串
select concat(a.ename,a.job)|| a.empno as 字符连接 from scott.emp a;
结果:

--instr:在一个字符串中搜索指定的字符,返回发现指定的字符的位置
select instr(a.empno,a.mgr,1,1) from scott.emp a ;
--length:返回字符串的长度
select ename,length(a.ename) as 长度,a.job,length(a.job) as 长度 from scott.emp a ;
--lower:返回字符串,并将所返回的字符小写
select a.ename as 大写,lower(a.ename) as 小写 from scott.emp a ;
结果:

--upper:返回字符串,并将返回字符串都大写
select lower(a.ename) as 小写名字,upper(a.ename) as 大写名字 from scott.emp a ;
结果:

--rpad:在列的右边粘贴字符,lpad: 在列的左边粘贴字符(不够字符则用*来填满)
select lpad(rpad(a.ename,10,'*'),16,'*') as 粘贴 from scott.emp a ;
结果:

--like不同角度的使用
select * from scott.emp where ename like '%XXR%';
select * from scott.emp where ename like '%S';
select * from scott.emp where ename like 'J%';
select * from scott.emp where ename like 'S';
select * from scott.emp where ename like '%S_';
--每个部门的工资总和
select a.ename,sum(sal) from scott.emp a group by ename;
--每个部门的平均工资
select a.deptno,avg(sal) from scott.emp a group by deptno ;
--每个部门的最大工资
select a.deptno,max(sal) from scott.emp a group by deptno ;
--每个部门的最小工资
select a.deptno,min(sal) from scott.emp a group by deptno ;
--查询原工资占部门工资的比率
select deptno ,sal,ratio_to_report(sal) over(partition by deptno) sal_ratio from scott.emp ;
--查询成绩不及格的所有学生信息(提示:没有对应的表,只是意思意思。不及格人数大于等于三才能查)
select * from scott.emp where empno in(select distinct empno from scott.emp where 3<(select count(sal) from scott.emp where sal<3000) and empno in(select empno from scott.emp where sal<3000));
结果:

--查询每个部门的平均工资
select distinct deptno,avg(sal) from scott.emp group by deptno  order by deptno desc;
--union组合查出的结果,但要求查出来的数据类型必须相同
select sal from scott.emp where sal >=all(select sal from scott.emp ) union select sal from scott.emp ;
select * from scott.emp a where a.empno between 7227 and 7369 ;--只能从小到大
---------创建表空间  要用拥有create tablespace权限的用户,比如sys
create tablespace tbs_dat datafile 'c:\oradata\tbs_dat.dbf' size 2000M;
---------添加数据文件
alter tablespace tbs_dat add datafile 'c:\oradata\tbs_dat2.dbf' size 100M;
---------改变数据文件大小
alter database datafile 'c:\oradata\tbs_dat.dbf' resize 250M;
---------数据文件自动扩展大小
alter database datafile 'c:\oradata\tbs_dat.dbf' autoextend on next 1m maxsize 20m;
---------修改表空间名称
alter tablespace tbs_dat rename to tbs_dat1;
---------删除表空间  and datafiles 表示同时删除物理文件
drop tablespace tbs_dat including contents and datafiles;
--substr(s1,s2,s3):截取s1字符串,从s2开始,结束s3
select substr(job,3,length(job)) from scott.emp ;
--replace:替换字符串
select replace(ename,'LL','aa') from scott.emp;
select * from scott.test;
insert into scott.test(ename,job) values('weather','好');
insert into scott.test(ename,job) values('wether','差');
--soundex:返回一个与给定的字符串读音相同的字符串
select ename from scott.test where soundex(ename)=soundex('wether');
--floor:取整数
select sal,floor(sal) as 整数 from scott.emp ;
--log(n,s):返回一个以n为低,s的对数
select empno,log(empno,2) as 对数 from scott.emp ;
--mod(n1,n2):返回一个n1除以n2的余数
select empno,mod(empno,2) as 余数 from scott.emp ;
结果:

--power(n1,n2):返回n1的n2次方根
select empno,power(empno,2) as 方根 from scott.emp ;
--round和trunc:按照指定的精度进行舍入
select round(41.5),round(-41.8),trunc(41.6),trunc(-41.9) from scott.emp ;
--sign:取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
select sign(45),sign(-21),sign(0) from scott.emp ;
结果:

select * from scott.emp;
oracle相关的数据库SQL查询语句:
1.  在职员表中查询出基本工资比平均基本工资高的职工编号。
2.  查询一个或者多个部门的所有员工信息,该部门的所有员工工资都高于公司的平均工资。
3.  现有张三的出生日期:1985-01-15 01:27:36,请各自新建表,将此日期时间插入表中,并计算出张三的年龄,显示张三的生日。
4.  生日的输出格式要求为MM-DD(未满两位的用0不全),张三的生日为01-15。
5.  算年龄要求用三个方式实现。
6.  生日要求用两个方式实现。
7.  在数据库表中有以下字符数据,如:
13-1,14-2,13-15,13-2,13-108,13-3,13-10,13-200,13-18,100-11,14-1
现在希望通过一条SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排序,输出要拍成如下所示:
13-1,13-2,13-3,13-10,13-15,13-18,13-108,13-200,14-1,14-2,100-11
数据库表名:SellRecord;字段ListNumber;
8.  显示所有雇员的姓名以及满10年服务年限后的日期。
9.  显示雇员姓名,根据其服务年限,将最老的雇员排在最前面。
10显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日期所在月排序,将最早年份的职员排在最前面。
10.             显示假设一个月为30天的情况下所有雇员的日薪金。
11.             找出在(任何年份的)2月受聘的所有雇员(用两种方式实现)。
12.             对于每个雇员,显示其加入公司的天数。
13.             以年,月和日的方式显示所有雇员的服务年限(入职多少年/入职了多少月/入职了多少天)。
14.             找出各月最后一天受雇的所有雇员。
15.             找出早于25年之前受雇的雇员(用两种方式实现)。
16.             工资最低1500的职员增加10%,1500以上的增加5%的工资,用一条update语句实现(用两种方式实现)。
17.             按照部门统计每种岗位的平均工资,要求输出的格式如下图所示:




博客分类: oracle
oracleselectjoincountunion 
 

1、当在select语句中,同时使用where、group by和having子句时,它们的作用和执行顺序如下:
(1)where用于筛选由from指定的数据对象
(2)group by用于对where的结果进行分组
(3)having用于对group by分组后的数据进行过滤

2、count(*)与count(columnName|columnIndex)的区别:
count(*)会统计表中的null计算在内,而count(columnName|columnIndex)会忽略对应字段的null记录。

3、以join关键字指定的连接主要有四种:inner join、left outer join、right outer join和 full outer join。
(1)inner join是内连接,是系统默认的连接方式,可以省略inner,它会把所有满足条件的记录列出来。
(2)left outer join是左外连接,其中outer可以省略,它除了列出所有满足条件的记录外,还包括左表的所有行。
(3)right outer join是右外连接,其中outer可以省略,它除了列出所有满足条件的记录外,还包括右表的所有行。
(4)full outer join是全外连接,其中outer可以省略,它除了列出所有满足条件的记录外,还包括左表和右表的所有行。

4、select中的union子句
使用union子句可以将两个或两个以上的查询结果合并成一个结果集。其语法格式如下:
(query expression) union [all] (query expression) [union [all] (query expression)]
--使用关键字all表示合并的结果集中包括所有行,不去除重复行,而不使用all关键字则会去除重复行。
使用union的基本规则是:
(1)所有查询中的列数和列的顺序必须相同
(2)对应列的数据类型必须兼容


1、 查看当前用户的缺省表空间
SQL>select username,default_tablespace from user_users;
2、 查看当前用户的角色
SQL>select * from user_role_privs;
3、 查看当前用户的系统权限和表级权限
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
4、 查看用户下所有的表
SQL>select * from user_tables;
5、 查看用户下所有的表的列属性
SQL>select * from USER_TAB_COLUMNS where table_name=:table_Name;
6、 显示用户信息(所属表空间)
selectdefault_tablespace, temporary_tablespace
fromdba_users
where username = 'GAME';
7、 显示当前会话所具有的权限
SQL>select * from session_privs;
8、 显示指定用户所具有的系统权限
SQL>select * from dba_sys_privs where grantee='GAME';
9、 显示特权用户
select * from v$pwfile_users;
10、 显示用户信息(所属表空间)
selectdefault_tablespace,temporary_tablespace
fromdba_users where username='GAME';
11、 显示用户的PROFILE
select profile from dba_users where username='GAME';
二、 表
1、 查看用户下所有的表
SQL>select * from user_tables;
2、 查看名称包含log字符的表
SQL>select object_name,object_id from user_objects
whereinstr(object_name,'LOG')>0;
3、 查看某表的创建时间
SQL>select object_name,created from user_objects
object_name=upper('&table_name');
4、 查看某表的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
wheresegment_name=upper('&table_name'); where

5、 查看放在Oracle的内存区里的表
SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
三、 索引
1、 查看索引个数和类别
SQL>select index_name,index_type,table_name from user_indexes order by table_name;
2、 查看索引被索引的字段
SQL>select * from user_ind_columns where index_name=upper('&index_name');
3、 查看索引的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
wheresegment_name=upper('&index_name');
四、 序列号
1、 查看序列号,last_number是当前值
SQL>select * from user_sequences;
五、 视图
1、 查看视图的名称
SQL>select view_name from user_views;
2、 查看创建视图的select语句
SQL>set view_name,text_length from user_views;
SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
SQL>select text from user_views where view_name=upper('&view_name');
六、 同义词
1、 查看同义词的名称
SQL>select * from user_synonyms;
七、 约束条件
1、 查看某表的约束条件
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
fromuser_constraints where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name
fromuser_constraintsc,user_cons_columns cc
wherec.owner = upper('&table_owner') and c.table_name = upper('&table_name')
andc.owner = cc.owner and c.constraint_name = cc.constraint_name
order by cc.position;
八、 存储函数和过程
1、 查看函数和过程的状态
SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE';
2、 查看函数和过程的源代码
SQL>select text from all_source where owner=user and name=upper('&plsql_name');


九、 常用的数据字典:
dba_data_files:通常用来查询关于数据库文件的信息
dba_db_links:包括数据库中的所有数据库链路,也就是databaselinks。
dba_extents:数据库中所有分区的信息
dba_free_space:所有表空间中的自由分区
dba_indexs:关于数据库中所有索引的描述
dba_ind_columns:在所有表及聚集上压缩索引的列
dba_objects:数据库中所有的对象
dba_rollback_segs:回滚段的描述
dba_segments:所有数据库段分段的存储空间
dba_synonyms:关于同义词的信息查询
dba_tables:数据库中所有数据表的描述
dba_tabespaces:关于表空间的信息
dba_tab_columns:所有表描述、视图以及聚集的列
dba_tab_grants/privs:对象所授予的权限
dba_ts_quotas:所有用户表空间限额
dba_users:关于数据的所有用户的信息
dba_views:数据库中所有视图的文本

十、 常用的动态性能视图:
v$datafile:数据库使用的数据文件信息
v$librarycache:共享池中SQL语句的管理信息
v$lock:通过访问数据库会话,设置对象锁的所有信息
v$log:从控制文件中提取有关重做日志组的信息
v$logfile有关实例重置日志组文件名及其位置的信息
v$parameter:初始化参数文件中所有项的值
v$process:当前进程的信息
v$rollname:回滚段信息
v$rollstat:联机回滚段统计信息
v$rowcache:内存中数据字典活动/性能信息
v$session:有关会话的信息
v$sesstat:在v$session中报告当前会话的统计信息
v$sqlarea:共享池中使用当前光标的统计信息,光标是一块内存区域,有Oracle处理SQL语句时打开。
v$statname:在v$sesstat中报告各个统计的含义
v$sysstat:基于当前操作会话进行的系统统计
v$waitstat:出现一个以上会话访问数据库的数据时的详细情况。当有一个以上的会话访问同一信息时,可出现等待情况。


总结了一下这些,彻底区别了视图与数据字典,也不那么容易混淆。嘿嘿!!!

十一、 常用SQL查询:
1、查看表空间的名称及大小
selectt.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
fromdba_tablespaces t, dba_data_files d
wheret.tablespace_name = d.tablespace_name
group by t.tablespace_name;

2、查看表空间物理文件的名称及大小
selecttablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
fromdba_data_files
order by tablespace_name;

3、查看回滚段名称及大小
selectsegment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curextCurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name;

4、查看控制文件
select name from v$controlfile;

5、查看日志文件
select member from v$logfile;

6、查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name
fromdba_free_space
group by tablespace_name;
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND


A.TABLESPACE_NAME=C.TABLESPACE_NAME;

7、查看数据库库对象
select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;

8、查看数据库的版本
Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';

9、查看数据库的创建日期和归档方式
Select Created, Log_Mode, Log_ModeFromV$Database;

10、捕捉运行很久的SQL
column username format a12
columnopname format a16
column progress format a8
selectusername,sid,opname,
round(sofar*100 / totalwork,0) || '%' as progress,
time_remaining,sql_text
fromv$session_longops , v$sql
wheretime_remaining<> 0
andsql_address = address
andsql_hash_value = hash_value

11。查看数据表的参数信息
SELECT partition_name, high_value, high_value_length, tablespace_name,
pct_free, pct_used, ini_trans, max_trans, initial_extent,
next_extent, min_extent, max_extent, pct_increase, FREELISTS,
freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks,
empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size,
last_analyzed
FROM dba_tab_partitions
--WHERE table_name= :tname AND table_owner = :towner
ORDER BY partition_position

12.查看还没提交的事务
select * from v$locked_object;
select * from v$transaction;

13。查找object为哪些进程所用
select
p.spid,
s.sid,
s.serial# serial_num,
s.usernameuser_name,
a.typeobject_type,
s.osuseros_user_name,
a.owner,
a.objectobject_name,
decode(sign(48 - command),
1,
to_char(command), 'Action Code #' || to_char(command) ) action,
p.programoracle_process,
s.terminal terminal,
s.program program,
s.statussession_status
fromv$session s, v$access a, v$process p
wheres.paddr = p.addr and
s.type = 'USER' and
a.sid = s.sid and
a.object='SUBSCRIBER_ATTR'
order by s.username, s.osuser

14。回滚段查看
selectrownum, sys.dba_rollback_segs.segment_name Name, v$rollstat.extents
Extents, v$rollstat.rssizeSize_in_Bytes, v$rollstat.xactsXActs,
v$rollstat.gets Gets, v$rollstat.waits Waits, v$rollstat.writes Writes,
sys.dba_rollback_segs.status status from v$rollstat, sys.dba_rollback_segs,
v$rollname where v$rollname.name(+) = sys.dba_rollback_segs.segment_name and
v$rollstat.usn (+) = v$rollname.usn order by rownum

15。耗资源的进程(top session)
selects.schemanameschema_name, decode(sign(48 - command), 1,
to_char(command), 'Action Code #' || to_char(command) ) action, status
session_status, s.osuseros_user_name, s.sid, p.spid ,s.serial# serial_num, nvl(s.username, '[Oracle process]') user_name, s.terminal terminal,
s.program program, st.valuecriteria_value from v$sesstatst, v$session s , v$process p wherest.sid = s.sid and st.statistic# = to_number('38') and ('ALL' = 'ALL'
ors.status = 'ALL') and p.addr = s.paddr order by st.valuedesc, p.spidasc, s.usernameasc, s.osuserasc

16。查看锁(lock)情况
select /*+ RULE */ ls.osuseros_user_name, ls.usernameuser_name,
decode(ls.type, 'RW', 'Row wait enqueue lock', 'TM', 'DML enqueue lock', 'TX',
'Transaction enqueue lock', 'UL', 'User supplied lock') lock_type,
o.object_name object, decode(ls.lmode, 1, null, 2, 'Row Share', 3,
'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive', null)
lock_mode, o.owner, ls.sid, ls.serial# serial_num, ls.id1, ls.id2
fromsys.dba_objects o, ( select s.osuser, s.username, l.type,
l.lmode, s.sid, s.serial#, l.id1, l.id2 from v$session s,
v$lock l where s.sid = l.sid ) ls where o.object_id = ls.id1 and o.owner
<> 'SYS' order by o.owner, o.object_name

17。查看等待(wait)情况
SELECT v$waitstat.class, v$waitstat.count count, SUM(v$sysstat.value) sum_value
FROM v$waitstat, v$sysstat WHERE v$sysstat.name IN ('db block gets',
'consistent gets') group by v$waitstat.class, v$waitstat.count

18。查看sga情况
SELECT NAME, BYTES FROM SYS.V_$SGASTAT ORDER BY NAME ASC

19。查看catched object
SELECT owner, name, db_link, namespace, type, sharable_mem, loads, executions, locks, pins, kept FROM v$db_object_cache
20。查看V$SQLAREA
SELECT SQL_TEXT, SHARABLE_MEM, PERSISTENT_MEM, RUNTIME_MEM, SORTS,
VERSION_COUNT, LOADED_VERSIONS, OPEN_VERSIONS, USERS_OPENING, EXECUTIONS, USERS_EXECUTING, LOADS, FIRST_LOAD_TIME, INVALIDATIONS, PARSE_CALLS, DISK_READS, BUFFER_GETS, ROWS_PROCESSED FROM V$SQLAREA

21。查看object分类数量
select decode (o.type#,1,'INDEX' , 2,'TABLE' , 3 , 'CLUSTER' , 4, 'VIEW' , 5 ,
'SYNONYM' , 6 , 'SEQUENCE' , 'OTHER' ) object_type , count(*) quantity from
sys.obj$ o where o.type# > 1 group by decode (o.type#,1,'INDEX' , 2,'TABLE' , 3
, 'CLUSTER' , 4, 'VIEW' , 5 , 'SYNONYM' , 6 , 'SEQUENCE' , 'OTHER' ) union select
'COLUMN' , count(*) from sys.col$ union select 'DB LINK' , count(*) from

22。按用户查看object种类
select u.name schema, sum(decode(o.type#, 1, 1, NULL)) indexes,
sum(decode(o.type#, 2, 1, NULL)) tables, sum(decode(o.type#, 3, 1, NULL))
clusters, sum(decode(o.type#, 4, 1, NULL)) views, sum(decode(o.type#, 5, 1, NULL)) synonyms, sum(decode(o.type#, 6, 1, NULL)) sequences,
sum(decode(o.type#, 1, NULL, 2, NULL, 3, NULL, 4, NULL, 5, NULL, 6, NULL, 1))
7/11页
others from sys.obj$ o, sys.user$ u where o.type# >= 1 and u.user# =
o.owner# and u.name <> 'PUBLIC' group by u.name order by
sys.link$ union select 'CONSTRAINT' , count(*) from sys.con$

23。有关connection的相关信息
1)查看有哪些用户连接
selects.osuseros_user_name, decode(sign(48 - command), 1, to_char(command), 'Action Code #' || to_char(command) ) action, p.programoracle_process, statussession_status, s.terminal terminal, s.program program,
s.usernameuser_name, s.fixed_table_sequenceactivity_meter, '' query, 0 memory, 0 max_memory, 0 cpu_usage, s.sid, s.serial# serial_num fromv$session s, v$process p where s.paddr=p.addr and s.type = 'USER' order by s.username, s.osuser

2)根据v.sid查看对应连接的资源占用等情况
select n.name,
v.value,
n.class,
n.statistic#
from v$statname n,
v$sesstat v
wherev.sid = 71 and
v.statistic# = n.statistic#
order by n.class, n.statistic#

3)根据sid查看对应连接正在运行的sql
select /*+ PUSH_SUBQ */
command_type,
sql_text,
sharable_mem,
persistent_mem,
runtime_mem,
sorts,
version_count,
loaded_versions,
open_versions,
users_opening,
executions,
users_executing,
loads,
first_load_time,
invalidations,
parse_calls,
disk_reads,
buffer_gets,
rows_processed,
sysdatestart_time,
sysdatefinish_time,
'>' || address sql_address,
'N' status
fromv$sqlarea
where address = (select sql_address from v$session where sid = 71)

2)根据v.sid查看对应连接的资源占用等情况
select n.name,
v.value,
n.class,
n.statistic#
from v$statname n,
v$sesstat v
wherev.sid = 71 and
v.statistic# = n.statistic#
order by n.class, n.statistic#

3)根据sid查看对应连接正在运行的sql
select /*+ PUSH_SUBQ */
command_type,
sql_text,
sharable_mem,
persistent_mem,
runtime_mem,
sorts,
version_count,
loaded_versions,
open_versions,
users_opening,
executions,
users_executing,
loads,
first_load_time,
invalidations,
parse_calls,
disk_reads,
buffer_gets,
rows_processed,
sysdatestart_time,
sysdatefinish_time,
'>' || address sql_address,
'N' status
fromv$sqlarea
where address = (select sql_address from v$session where sid = 71)

24.查询表空间使用情况
select a.tablespace_name "表空间名称",
100-round((nvl(b.bytes_free,0)/a.bytes_alloc)*100,2) "占用率(%)",
round(a.bytes_alloc/1024/1024,2) "容量(M)",
round(nvl(b.bytes_free,0)/1024/1024,2) "空闲(M)",
round((a.bytes_alloc-nvl(b.bytes_free,0))/1024/1024,2) "使用(M)",
Largest "最大扩展段(M)",
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') "采样时间"
from (select f.tablespace_name,
sum(f.bytes) bytes_alloc,
sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes)) maxbytes
fromdba_data_files f
group by tablespace_name) a,
(select f.tablespace_name,
sum(f.bytes) bytes_free
fromdba_free_space f
group by tablespace_name) b,
(select round(max(ff.length)*16/1024,2) Largest,
ts.name tablespace_name
fromsys.fet$ ff, sys.file$ tf,sys.ts$ ts
wherets.ts#=ff.ts# and ff.file#=tf.relfile# and ts.ts#=tf.ts#
group by ts.name, tf.blocks) c
wherea.tablespace_name = b.tablespace_name and a.tablespace_name = c.tablespace_name

25. 查询表空间的碎片程度
selecttablespace_name,count(tablespace_name)
tablespace_name
having count(tablespace_name)>10;
altertablespace name coalesce;
alter table name deallocate unused;
create or replace view ts_blocks_v as
selecttablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space union all
selecttablespace_name,block_id,bytes,blocks,segment_name from dba_extents;
select * from ts_blocks_v;
selecttablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space from dba_free_space group by

group by tablespace_name;

26。查询有哪些数据库实例在运行
selectinst_name from v$active_instances;
//取得服务器的IP 地址
selectutl_inaddr.get_host_address from dual
//取得客户端的IP地址
select sys_context('userenv','host'),sys_context('userenv','ip_address') from dual



猜你喜欢

转载自zhyp29.iteye.com/blog/2300668