oracle 基本命令及常用的查询语句

1.create user username identified by 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)*/ 


1. select * from emp;

2. select empno, ename, job from emp;

3. select empno 编号, ename 姓名, job 工作 from emp;

4. select job from emp;

5. select distinct job from emp;

6. select distinct empno, job from emp;
说明:因为雇员编号不重复, 所以此时证明所有的列没有重复,所以不能消除掉重复的列.

7. 查询出雇员的编号, 姓名, 工作, 但是显示的格式:编号是: 7369 的雇员, 姓名是: smith, 工作是: clear
select '编号是: ' || empno || '的雇员, 姓名是: ' || ename || ', 工作是: ' || job from emp;

8. 求出每个雇员的姓名及年薪
select ename, sal * 12 income from emp;

9. 求出工资大于 1500 的所有雇员信息
select * from emp where sal > 1500;

10. 查询每月可以得到奖金的雇员信息
select * from emp where comm is not null;

11. 查询没有奖金的雇员信息
select * from emp where comm is null;

12. 查询出基本工资大于 1500 同时可以领取奖金的雇员信息
select * from emp where sal > 1500 and comm is not null;

13. 查询出基本工资大于 1500 或者可以领取奖金的雇员信息
select * from emp where sal > 1500 or comm is not null;

14. 查询出基本工资不大于 1500 或者不可以领取奖金的雇员信息
select * from emp where not(sal > 1500 and comm is not null);

15. 查询基本工资大于 1500, 但是小于 3000 的全部雇员信息
select * from emp where sal > 1500 and sal < 3000;

16. 查询基本工资大于等于 1500, 但是小于等于 3000 的全部雇员信息
select * from emp where sal >= 1500 and sal <= 3000;
select * from emp where sal between 1500 and 3000;

17. 查询出在 1981 年雇佣的全部雇员信息(1981 年 1 月 1 日 到 1981 年 12 月 31 日之间的雇佣的雇员)
select * from emp where hiredate between '1-1月-81' and '31-12月-81';

18. 要求查询出姓名是 smith 的雇员信息
select * from emp where ename = 'SMITH';

19. 要求查询出雇员是 7369, 7499, 7521 的雇员的具体信息
select * from emp where empno = 7369 or empno = 7499 or empno = 7521;
select * from emp where empno in(7369, 7499, 7521);

20. 要求查询出雇员不是 7369, 7499, 7521 的雇员的具体信息
select * from emp where empno not in(7369, 7499, 7521);

21. 要求查询出姓名是 smith, allen, king 的雇员信息
select * from emp where ename in('SMITH', 'ALLEN', 'KING');

22. 查询出所有雇员姓名中第二个字母包含 "M" 的雇员信息
        select * from emp where ename like '_M%';

23. 查询出雇员姓名中包含字母 M 的雇员信息
select * from emp where ename like '%M%';

24. 要求查询出在 1981 年雇佣的雇员信息
select * from emp where hiredate like '%81%';

25. 查询工资中包含 5 的雇员信息
select * from emp where sal like '%5%';

26. 查询雇员编号不是 7369 的雇员信息
select * from emp where empno != 7369;
select * from emp where empno <> 7369;

27. 要求按照工资由低到高排序
select * frm emp order by sal;
select * from emp order by sal asc;

28. 要求按照工资由高到低排序
select * from emp order by sal desc;

29. 要求查询出 20 部门的所有雇员信息, 查询的信息按照工资由高到低排序,如果工资相等,则按照雇佣日期由早到晚排序.
select * from emp where deptno = 20 order by sal desc, hiredate asc;

30. 将小写字母变为大写字母
select upper('hello') from dual;

31. 将大写字母变为小写字母
select lower('HELLO WORLD') from dual;

32. 要求查询出姓名是 smith 的雇员信息
select * from emp where ename = upper('smith');

33. 使用 initcap() 函数将单词的第一个字母大写
select initcap('hello world') from dual;

34. 将雇员表中的雇员姓名变为开头字母大写
select initcap(ename) from emp;

35. 将字符串 "hello" 和 "world" 进行串联
select concat('hello ', 'world') from dual;

36. 对字符串进行操作的常用字符处理函数
select substr('hello', 1, 3) 截取字符串, length('hello') 字符串的长度, replace('hello', 'l', 'x') 字符串替换 from dual;
select substr('hello', 0, 3) 截取字符串, length('hello') 字符串的长度, replace('hello', 'l', 'x') 字符串替换 from dual;

37. 显示所有雇员的姓名及姓名的后三个字符
select ename, substr(ename, length(ename) -2) from emp;
select ename, substr(ename, -3, 3) from emp;

38. 使用数值函数执行四舍五入操作
select round(789.536) from dual;

39. 要求将 789.536 数值保留两位小数
select round(789.536, 2) from dual;

40. 要求将 789.536 数值中的整数的十位进行四舍五入进位
select round(789.536, -2) from dual;

41. 采用 trunc() 函数不会保留任何小数,而且小数点也不会执行四舍五入的操作
select trunc(789.536) from dual;

42. 通过 trunc() 也可以指定小数点的保留位数
select trunc(789.536, 2) from dual;

43. 作用负数表示位数
select trunc(789.536, -2) from dual;

44. 使用 mod() 函数可以进行取余的操作
select mod(10, 3) from dual;

45. 显示 10 部门雇员进入公司的星期数(当前日期 - 雇佣日期 = 天数 / 7 = 星期数)
select empno, ename, round((sysdate - hiredate) / 7) from emp where deptno = 10;

46. 日期函数
months_between(): 求出给定日期范围的月数
add_months(): 在指定的日期上加上指定的月数, 求出之后的日期
next_day(): 指定日期的下一个日期
last_day(): 求出给定日期当月的最后一天日期

47. 
select empno, ename, months_between(sysdate, hiredate) from emp;
select empno, ename, round(months_between(sysdate, hiredate)) from emp;

48. select sysdate, add_months(sysdate, 4) from dual;

49. select next_day(sysdate, '星期一') from dual;

50. select last_day(sysdate) from dual;

51. 转换函数
to_char(): 转换成字符串
to_number(): 转换成数字
to_date(): 转换成日期

52. 查询所有雇员的雇员编号, 姓名, 雇佣日期
select empno, 
ename,
to_char(hiredate, 'yyyy') year,
to_char(hiredate, 'mm') months,
to_char(hiredate, 'dd') day
from emp;

select empno, ename, to_char(hiredate, 'yyyy-mm-dd') from emp;

select empno, ename, to_char(hiredate, 'fmyyyy-mm-dd') from emp;

53. 查询所有雇员的编号, 姓名和工资
select empno, ename, sal from emp;
select empno, ename, to_char(sal, '99,999') from emp;
select empno, ename, to_char(sal, 'L99,999') from emp;
select empno, ename, to_char(sal, '$99,999') from emp;

54. select to_number('123') + to_number('123') from dual;

55. 将一个字符串转换成日期类型
select to_date('2009-01-01', 'yyyy-mm-dd') from dual;

56. 求出每个雇员的年薪(要求加上奖金)
select empno, ename, sal, comm, (sal + comm) * 12 from emp;
select empno, ename, sal, comm, nvl(comm, 0), (sal + nvl(comm, 0)) * 12 income from emp;

57. decode() 函数类似于 if....elsif...else 语句
select decode(1, 1, '内容是 1', 2, '内容是 2', 3, '内容是 3') from dual;

58. 查询出雇员的编号, 姓名, 雇佣日期及工作, 要求将雇员的工作替换成以下信息:
select empno 雇员编号, 
ename 雇员姓名, 
hiredate 雇佣日期, 
decode(job, 
'CLERK', '业务员', 
'SALESMAN', '销售人员',
'MANAGER', '经理',
'ANALYST', '分析员',
'PRESIDENT', '总裁'
) 职位
from emp;

59. 笛卡尔积(交差连接)
select * from emp, dept;
select * from emp cross join dept;

60. 内连接
select * from emp e, dept d where e.deptno = d.deptno;
select * from emp e inner join dept d on e.deptno = d.deptno;
select * from emp e join dept d on e.deptno = d.deptno;


61. 自然连接
select * from emp natural join dept;
select * from emp e join dept d using(deptno);

62. 要求查询出雇员的编号, 姓名, 部门的编号, 名称, 地址
select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e, dept d where e.deptno = d.deptno;

63. 要求查询出雇员的姓名, 工作, 雇员的直接上级领导姓名
select e.ename, e.job, m.ename from emp e, emp m where e.mgr = m.empno;

64. 要求查询出雇员的姓名, 工作, 雇员的直接上级领导姓名以及部门名称
select e.ename, e.job, m.ename, d.dname from emp e, emp m, dept d where e.mgr = m.empno and e.deptno = d.deptno;

65. 要求查询出每个雇员的姓名, 工资, 部门名称, 工资在公司的等级(salgrade), 及其领导的姓名及工资所在公司的等级
select e.ename, e.sal, d.dname, s.grade, m.ename, m.sal, ms.grade
from emp e, dept d, salgrade s, emp m, salgrade ms
where e.deptno = d.deptno 
and e.sal between s.losal and s.hisal 
and e.mgr = m.empno
and m.sal between ms.losal and ms.hisal;

select e.ename, 
e.sal, 
d.dname, 
decode(s.grade, 1, '第五等级', 2, '第四等级', 3, '第三等级', 4, '第二等级', 5, '第一等级'), 
m.ename, 
m.sal, 
decode(ms.grade, 1, '第五等级', 2, '第四等级', 3, '第三等级', 4, '第二等级', 5, '第一等级')
from emp e, dept d, salgrade s, emp m, salgrade ms
where e.deptno = d.deptno and e.sal between s.losal and s.hisal and e.mgr = m.empno
and m.sal between ms.losal and ms.hisal;

66. select empno, ename, d.deptno, dname, loc from emp e, dept d where e.deptno = d.deptno;
    select empno, ename, d.deptno, dname, loc from emp e inner join dept d on e.deptno = d.deptno;

67. 左外连接
    select empno, ename, d.deptno, dname, loc from emp e, dept d where e.deptno = d.deptno(+);
    select empno, ename, d.deptno, dname, loc from emp e left outer join dept d on e.deptno = d.deptno;
    select empno, ename, d.deptno, dname, loc from emp e left join dept d on e.deptno = d.deptno(+);

68. 右外连接
    select empno, ename, d.deptno, dname, loc from emp e, dept d where e.deptno(+) = d.deptno;
    select empno, ename, d.deptno, dname, loc from emp e right outer join dept d on e.deptno = d.deptno;
    select empno, ename, d.deptno, dname, loc from emp e right join dept d on e.deptno = d.deptno;

69. select e.empno, e.ename, m.empno, m.ename from emp e, emp m where e.mgr = m.empno;

70. select e.empno, e.ename, m.empno, m.ename from emp e, emp m where e.mgr = m.empno(+);

71. 
select * from emp e, dept d where e.deptno = d.deptno and d.deptno = 30;
select * from emp e inner join dept d on e.deptno = d.deptno where d.deptno = 30;
select * from emp e join dept d on e.deptno = d.deptno where d.deptno = 30;
select * from emp e natural join dept d where deptno = 30;
select * from emp e join dept d using(deptno) where deptno = 30;

72. 
select e.ename, d.deptno, d.dname, d.loc from emp e right outer join dept d on e.deptno = d.deptno;
select e.ename, d.deptno, d.dname, d.loc from emp e right join dept d on e.deptno = d.deptno;
select e.ename, d.deptno, d.dname, d.loc from emp e, dept d where e.deptno(+) = d.deptno;

73. select count(ename) from emp;

74. select min(sal) from emp;

75. select max(sal) from emp;

76. select sum(sal) from emp;

77. select avg(sal) from emp;

78. select sum(sal) from emp where deptno = 20;

79. select avg(sal) from emp where deptno = 20;

80. 求出每个部门的雇员数量
select deptno, count(deptno) from emp group by deptno;
select deptno, count(empno) from emp group by deptno;

81. 求出每个部门的平均工资
select deptno, avg(sal) from emp group by deptno;

82. 按部门分组, 并显示部门的名称, 及每个部门的员工数
select d.dname, count(e.empno) from emp e, dept d 
where e.deptno = d.deptno
group by d.dname;

select d.deptno, d.dname, temp.c
from (select deptno, count(e.empno) c from emp e group by e.deptno) temp, dept d
where temp.deptno = d.deptno;

83. 要求显示出平均工资大于 2000 的部门编号和平均工资
select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000;

84. 显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于 5000, 输出结果按月工资的合计升序排序.
select job, sum(sal) su from emp where job <> 'SALESMAN' group by job having sum(sal) > 5000 order by su;

select temp.job, sum(temp.sal) s
from (select job, sal from emp e where job <> 'SALESMAN') temp
group by temp.job
having sum(temp.sal) > 5000
order by s;

85. 求出平均工资最高的部门工资
select max(avg(sal)) from emp group by deptno;

86. 要求查询出比雇员编号为 7654 工资高的所有雇员信息
select * from emp where sal >(select sal from emp where empno = 7654);

87. 要求查询出工资比 7654 高, 同时与 7788 从事相同工作的全部雇员信息
select * from emp 
where sal >(select sal from emp where empno = 7654)
and job = (select job from emp where empno = 7788);

88. 要求查询出工资最低的雇员姓名, 工作, 工资
select ename, job, sal from emp where sal = (select min(sal) from emp);

89. 要求查询出: 部门名称,部门的员工数,部门的平均工资,部门的最低收入雇员的姓名
select d.dname, temp.c, temp.a, e.ename 
from dept d, 
(select deptno, count(empno) c, avg(sal) a, min(sal) m from emp group by deptno) temp, 
emp e
where d.deptno = temp.deptno and e.sal = temp.m;

select d.deptno, temp.dname, temp.c, temp.a, e.ename, e.sal
from 
(select d.dname , count(e.empno) c, avg(e.sal) a, min(e.sal) m
from emp e, dept d
where e.deptno = d.deptno
group by d.dname) temp, 
emp e,
dept d
where temp.m = e.sal
and temp.dname = d.dname;

90. 求出每个部门的最低工资的雇员的信息
select * from emp where sal in(select min(sal) from emp group by deptno);
select * from emp where sal =any(select min(sal) from emp group by deptno);
select * from 
(select min(sal) m from emp group by deptno) temp,
emp e
where e.sal = temp.m;

91. 范例 90 中, 比子查询条件中最低(小)的工资要大的雇员信息
select * from emp where sal >any(select min(sal) from emp group by deptno);
select * from emp where sal > (select min(min(sal)) from emp group by deptno);

92. 范例 90 中, 比子查询条件中最高(大)的工资要小的雇员信息
select * from emp where sal <any(select min(sal) from emp group by deptno);
select * from emp where sal < (select max(min(sal)) from emp group by deptno);

93. 范例 90 中, 比子查询条件中最高(大)的工资要大的雇员信息
select * from emp where sal >all(select min(sal) from emp group by deptno);
select * from emp where sal > (select max(min(sal)) from emp group by deptno);

94. 范例 90 中, 比子查询条件中最低(小)的工资要小的雇员信息
select * from emp where sal <all(select min(sal) from emp group by deptno);
select * from emp where sal < (select min(min(sal)) from emp group by deptno);

95. 查找出 20 部门中没有奖金的雇员信息
select * from emp where (sal, nvl(comm, -1)) in (select sal, nvl(comm, -1) from emp where deptno = 20);
select * from emp where deptno = 20 and comm is null;

96. union 操作符返回两个查询选定的所有不重复的行
select deptno from emp union select deptno from dept;

97. union all 操作符合并两个查询选定的所有行,包括重复的行
select deptno from emp union all select deptno from dept;

98. intersect 操作符只返回两个查询都有的行
select deptno from emp intersect select deptno from dept;

99. minus 操作符只返回由第一个查询选定但是没有被第二个查询选定的行, 也就是在第一个查询结果中排除在第二个查询结果中出现的行
select deptno from dept minus select deptno from emp;
--------------------- 
转载:https://blog.csdn.net/qq_35624642/article/details/53222783 
 

猜你喜欢

转载自blog.csdn.net/LMAKE_nbsp/article/details/84186639