Oracle学习笔记(一)

1.COLUMN 某列 new_val  V

 表示是取到这个列的最后一条记录,并赋值给变量V,但是有一点要注意的是select查询出来的结果只能有一行

如:

select a.name, b.value 
from v$statname a, v$mystat b
where a.statistic# = b.statistic#
--and lower(a.name) like '%' || lower('&S')||'%'
and lower(a.name) = lower('&S')
/

如果我们用like 进行模糊匹配的话 结果可能有多行数据,这时V就无法被赋上值。

2.查询表空间的使用量、剩余量:

select * from sm$ts_used;

 select * from sm$ts_free;

比起用其它的视图写长长的一段脚本, 简便多了。

两个视图的定义:

SQL>select text from dba_views where  view_name =   'SM$TS_FREE';

TEXT
--------------------------------------------------------------------------------
select tablespace_name, sum(bytes) bytes from dba_free_space
group by tablespace_name

SQL>select text from dba_views where view_name = 'SM$TS_USED';

TEXT
--------------------------------------------------------------------------------
select tablespace_name, sum(bytes) bytes from dba_segments
group by tablespace_name

3. v$mystat,v$sesstat是用来分别统计会话级别和自实例起动以来数据库各种统计信息的。
两个视图结构一致,只是统计数据不一致。
desc v$mystat;
名称                                                  是否为空? 类型
----------------------------------------------------- -------- ------------------------------------
SID                                                             NUMBER
STATISTIC#                                                     NUMBER
VALUE                                                           NUMBER

SID表示会话编号,与v$session中SID相对应。
STATISTIC#  表示统计项
VALUE       表示统计项相关的值
v$mystat视图中只会有当前用户的会话信息,v$sesstat会有整个实例内所有会话信息。因此在v$sesstat中自然包括v&mystat的统计信息。

一般情况下v$mystat,v$sesstat会与v$statname一起配合使用。
SQL> desc v$statname;
Name       Type         Nullable Default Comments 
---------- ------------ -------- ------- -------- 
STATISTIC# NUMBER       Y                         
NAME       VARCHAR2(64) Y                         
CLASS      NUMBER       Y       

v$statname视图中STATISTIC#与v$mystat,v$sesstat中STATISTIC#字段是相关联的。而NAME则是对应的英文信息,比如说要查某条DML语句所产生的redo信息。可以这样写:
select value from v$mystat t,v$statname t1 where t.STATISTIC# = t1.STATISTIC# and t1.NAME = 'redo size'
其它信息也是如此,只需将t1.name换成相对应的英文名称即可。

4.
set define off关闭替代变量功能 

在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符号,SQL*Plus就会要你输入替代值。这就意味着你无法将一个含有该符号的字符串输入数据库或赋给变量,如字符串“SQL&Plus”系统会理解为以“SQL”打头的字符串,它会提示你输入替代变量 Plus的值,如果你输入ABC,则最终字符串转化为"SQLABC"。
set define off 则关闭该功能,“&”将作为普通字符,如上例,最终字符就为“SQL&Plus”

set define off关闭替代变量功能
set define on 开启替代变量功能
set define * 将默认替代变量标志符该为“*”(也可以设为其它字符)
5. 查看Oracle表空间是自动段空间管理还是手动的

 select tablespace_name,EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;//auto 表示自动 MANUAL表示手动
TABLESPACE_NAME                EXTENT_MAN SEGMEN                                
------------------------------ ---------- ------                                
SYSTEM                         LOCAL      MANUAL                                
UNDOTBS1                       LOCAL       MANUAL                                
TEMP                           LOCAL       MANUAL                                
EXAMPLE                        LOCAL       AUTO                                  
INDX                           LOCAL       AUTO                                  
TOOLS                          LOCAL     AUTO                                  
USERS                     LOCAL       AUTO                                   
ALS_INDEX1                     LOCAL       MANUAL                                
ALS_INDEX2                    LOCAL       MANUAL                                
ASSMDEFAULT                    LOCAL       MANUAL                                
ASSMTBS                      LOCAL       AUTO          


修改表所属表空间:

alter table test111 move tablespace ASSM;

create table test111 tablespace assm as select * from dba_objects;

5.Oracle用户导出和导入

导出Oracle scott方案下用户对象

exp scott/tiger@orcl  grants=n feedback=10000 file=e:\scott.dmp owner=scott

grants=n 表示不导出权限;

feedback表示10000条记录反馈一次——表现在终端就是一个黑点;

file就不用说了

owner指明从哪个用户下导出

导入Oracle scott方案下用户对象

首先要创建好表空间和用户

执行命令:
imp userid=ewsvi/ewsvi@orcl file=e:\scott.dmp fromuser=scott touser=ewsvi tables=(dictionary,dictionarytype)

其中,fromuser若为多个表空间的话,使用()将其括起来:fromuser=(a,b);

touser参数仿fromuser参数;

若只导入一部分表,使用tables参数,用()括起要导入的表;如果想全部导入,不需要指定tables参数

6. sqlplus 中定义变量
 
variable deptno number;
7.查询数据库中外键未加索引的列
select table_name, constraint_name,
     cname1 || nvl2(cname2,','||cname2,null) ||
     nvl2(cname3,','||cname3,null) || nvl2(cname4,','||cname4,null) ||
     nvl2(cname5,','||cname5,null) || nvl2(cname6,','||cname6,null) ||
     nvl2(cname7,','||cname7,null) || nvl2(cname8,','||cname8,null)
            columns
  from ( select b.table_name,
                b.constraint_name,
                max(decode( position, 1, column_name, null )) cname1,
                max(decode( position, 2, column_name, null )) cname2,
                max(decode( position, 3, column_name, null )) cname3,
                max(decode( position, 4, column_name, null )) cname4,
                max(decode( position, 5, column_name, null )) cname5,
                max(decode( position, 6, column_name, null )) cname6,
                max(decode( position, 7, column_name, null )) cname7,
                max(decode( position, 8, column_name, null )) cname8,
                count(*) col_cnt
           from (select substr(table_name,1,30) table_name,
                        substr(constraint_name,1,30) constraint_name,
                        substr(column_name,1,30) column_name,
                        position
                   from user_cons_columns ) a,
                user_constraints b
          where a.constraint_name = b.constraint_name
            and b.constraint_type = 'R'
          group by b.table_name, b.constraint_name
       ) cons
 where col_cnt > ALL
         ( select count(*)
             from user_ind_columns i
            where i.table_name = cons.table_name
              and i.column_name in (cname1, cname2, cname3, cname4,
                                    cname5, cname6, cname7, cname8 )
              and i.column_position <= cons.col_cnt
            group by i.index_name
         )
/

 8.

通过使用 SQL,可以为列名称和表名称指定别名(Alias)。

 

其实,select列的时候取别名有三种方法,这三种方法并不是所有数据库都适用。

方法一、直接在字段名称后面加上别名,中间以空格隔开。

方法二、以as关键字指定字段别名,as在select的字段和别名之间。

 

当别名没有被双引号括起来时,其显示结果为大写。如果别名中包含了特殊字符,或想让别名原样显示,你就要使用双引号把别名括起来。

SELECT empno AS "Employee Number",ename name,(sal+500)*12 "Annual Salary" FROM emp;

 

方法三、对于SQL Server 还提供了另外一种方法,之间用“=”号指定。“=”号放在select的字段和别名之间。

例子:

 

SQL Server Oracle

select Emp_Id as EmpId

, Emp_Name "Employee Name"

, Extemsion=Ext

, SUBSTRING(Emp_Id,1.2) "到职位年度"

from Employee

where Dept_Id='I200'

select Emp_Id as EmpId

, Emp_Name "Employee Name"

, Extemsion Ext

, SUBSTR(Emp_Id,1.2) "到职位年度"

from Employee

where Dept_Id='I200'

在Oracle数据库中,数据表别名是不能加as的,例如:

   select a.appname from appinfo a;-- 正确

   select a.appname from appinfo as a;-- 错误

   注释:这可能是为了防止和Oracle数据库中的存储过程中的关键字as冲突的问题

9.

Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: 
select ... from tablename start with 条件1 
connect by 条件2 
where 条件3; 
例: 
select * from table 
start with org_id = 'HBHqfWGWPy' 
connect by prior org_id = parent_id; 

     简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: 
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 
     用上述语法的查询可以取得这棵树的所有记录。 
     其中: 
     条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 
     条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 
     条件3 是过滤条件,用于对返回的所有记录进行过滤。 

     简单介绍如下: 
     早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: 
     第一步:从根节点开始; 
     第二步:访问该节点; 
     第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步; 
     第四步:若该节点为根节点,则访问完毕,否则执行第五步; 
     第五步:返回到该节点的父节点,并执行第三步骤。 

     总之:扫描整个树结构的过程也即是中序遍历树的过程。 

10.

Oracle 知道字段名,怎么查找它在那个表里,

 

例子:

 

字段为AAZ009,要为大写

 

select table_name from dba_tab_cols where column_name='AAZ009';

 

select table_name from user_tab_cols where column_name='AAZ009';

 11.Oracle来生成UUID,做法很简单,如下:

select sys_guid() from dual;
数据类型是 raw(16) 有32个字符。
posted @ 2013-05-15 10:31  十年半山  阅读(375)  评论(0编辑  收藏  举报